You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

5.0 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

最后交易日获取接口

1. 功能概述

本接口用于获取期货合约的最后一个交易日支持通过TQSDK实时获取或使用模拟数据作为fallback。

2. 实现方案

2.1 核心代码位置

  • TQSDK适配器backend/service_implementation/qihuo_analyzer/data/api_adapters/tqsdk_adapter.py

    • 实现了get_last_trading_day(symbol)方法使用TQSDK获取最后一个交易日
  • 数据获取器backend/service_implementation/qihuo_analyzer/data/data_fetcher.py

    • 实现了get_last_trading_day(symbol)方法,作为适配器方法的包装
  • API服务backend/service_implementation/service/app.py

    • 添加了/api/last-trading-day接口提供HTTP访问方式

2.2 技术实现

TQSDK适配器实现

def get_last_trading_day(self, symbol: str) -> Optional[str]:
    """获取最后一个交易日
    
    Args:
        symbol: 合约代码,如 'CU2603'
        
    Returns:
        str: 最后一个交易日,格式为 'YYYY-MM-DD'
    """
    try:
        if TQSDK_AVAILABLE and self.api:
            # 转换合约代码为TQSDK格式
            tq_symbol = self._convert_symbol(symbol)
            
            # 获取日线数据
            klines = self.api.get_kline_serial(tq_symbol, 86400, data_length=30)  # 86400秒 = 1天
            
            # 等待数据准备就绪
            # 处理数据...
            
            # 转换为DataFrame并提取最后交易日
            if not df.empty:
                last_trading_day = df['datetime'].iloc[-1].strftime('%Y-%m-%d')
                return last_trading_day
        else:
            # 返回模拟数据
            import datetime
            last_trading_day = (datetime.datetime.now() - datetime.timedelta(days=1)).strftime('%Y-%m-%d')
            return last_trading_day
    except Exception as e:
        # 异常处理,返回模拟数据
        import datetime
        last_trading_day = (datetime.datetime.now() - datetime.timedelta(days=1)).strftime('%Y-%m-%d')
        return last_trading_day

API接口实现

# 最后交易日获取接口
@app.route('/api/last-trading-day', methods=['GET'])
def get_last_trading_day():
    try:
        symbol = request.args.get('symbol', 'CU2603')  # 默认使用CU2603合约
        last_trading_day = data_fetcher.get_last_trading_day(symbol)
        
        return jsonify({'status': 'success', 'data': {
            'symbol': symbol,
            'last_trading_day': last_trading_day
        }})
    except Exception as e:
        return jsonify({'status': 'error', 'message': str(e)}), 500

3. 使用方法

3.1 API接口调用

请求URLhttp://localhost:5000/api/last-trading-day

请求方法GET

参数说明

  • symbol(可选):合约代码,如 'CU2603',默认值为 'CU2603'

返回格式

{
  "status": "success",
  "data": {
    "symbol": "CU2603",
    "last_trading_day": "2026-02-23"
  }
}

示例请求

GET http://localhost:5000/api/last-trading-day?symbol=AU2603

示例响应

{
  "status": "success",
  "data": {
    "symbol": "AU2603",
    "last_trading_day": "2026-02-23"
  }
}

3.2 代码调用

from qihuo_analyzer.data.data_fetcher import DataFetcher

data_fetcher = DataFetcher()
data_fetcher.connect()
last_trading_day = data_fetcher.get_last_trading_day('CU2603')
print(f"最后一个交易日: {last_trading_day}")  # 输出:最后一个交易日: 2026-02-23

4. 技术特点

  1. 实时数据通过TQSDK获取实时的最后交易日数据
  2. 容错机制当TQSDK不可用时自动使用模拟数据
  3. 异常处理:实现了多层异常捕获,确保接口稳定性
  4. 灵活调用支持通过API接口或直接代码调用
  5. 默认值当未指定合约代码时默认使用CU2603合约

5. 注意事项

  1. 网络连接使用TQSDK获取数据需要稳定的网络连接
  2. 合约代码格式:请使用正确的合约代码格式,如 'CU2603'
  3. 数据延迟由于需要从TQSDK获取数据可能会有一定的网络延迟
  4. 模拟数据当TQSDK不可用时会返回前一天的日期作为模拟数据

6. 故障排查

6.1 常见问题

问题 可能原因 解决方案
返回模拟数据 TQSDK连接失败或网络问题 检查网络连接确保TQSDK账号配置正确
接口返回错误 合约代码格式错误 使用正确的合约代码格式,如 'CU2603'
数据延迟 网络延迟或TQSDK服务器响应慢 耐心等待,或使用模拟数据

6.2 日志查看

  • Python服务日志在启动Python服务的终端中查看
  • API日志通过访问API端点查看返回结果和错误信息

7. 总结

本接口提供了一种便捷的方式来获取期货合约的最后一个交易日支持实时数据和模拟数据两种模式。通过简单的API调用或代码调用用户可以轻松获取所需的最后交易日信息为交易策略和风险管理提供支持。