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
5.0 KiB
最后交易日获取接口
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接口调用
请求URL:http://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
示例响应:
{
"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. 技术特点
- 实时数据:通过TQSDK获取实时的最后交易日数据
- 容错机制:当TQSDK不可用时,自动使用模拟数据
- 异常处理:实现了多层异常捕获,确保接口稳定性
- 灵活调用:支持通过API接口或直接代码调用
- 默认值:当未指定合约代码时,默认使用CU2603合约
5. 注意事项
- 网络连接:使用TQSDK获取数据需要稳定的网络连接
- 合约代码格式:请使用正确的合约代码格式,如 'CU2603'
- 数据延迟:由于需要从TQSDK获取数据,可能会有一定的网络延迟
- 模拟数据:当TQSDK不可用时,会返回前一天的日期作为模拟数据
6. 故障排查
6.1 常见问题
| 问题 | 可能原因 | 解决方案 |
|---|---|---|
| 返回模拟数据 | TQSDK连接失败或网络问题 | 检查网络连接,确保TQSDK账号配置正确 |
| 接口返回错误 | 合约代码格式错误 | 使用正确的合约代码格式,如 'CU2603' |
| 数据延迟 | 网络延迟或TQSDK服务器响应慢 | 耐心等待,或使用模拟数据 |
6.2 日志查看
- Python服务日志:在启动Python服务的终端中查看
- API日志:通过访问API端点,查看返回结果和错误信息
7. 总结
本接口提供了一种便捷的方式来获取期货合约的最后一个交易日,支持实时数据和模拟数据两种模式。通过简单的API调用或代码调用,用户可以轻松获取所需的最后交易日信息,为交易策略和风险管理提供支持。