|
|
|
@ -0,0 +1,161 @@
|
|
|
|
|
|
|
|
# 最后交易日获取接口
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
## 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适配器实现
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```python
|
|
|
|
|
|
|
|
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接口实现
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```python
|
|
|
|
|
|
|
|
# 最后交易日获取接口
|
|
|
|
|
|
|
|
@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'
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
**返回格式**:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```json
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
"status": "success",
|
|
|
|
|
|
|
|
"data": {
|
|
|
|
|
|
|
|
"symbol": "CU2603",
|
|
|
|
|
|
|
|
"last_trading_day": "2026-02-23"
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
**示例请求**:
|
|
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
GET http://localhost:5000/api/last-trading-day?symbol=AU2603
|
|
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
**示例响应**:
|
|
|
|
|
|
|
|
```json
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
"status": "success",
|
|
|
|
|
|
|
|
"data": {
|
|
|
|
|
|
|
|
"symbol": "AU2603",
|
|
|
|
|
|
|
|
"last_trading_day": "2026-02-23"
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
### 3.2 代码调用
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```python
|
|
|
|
|
|
|
|
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调用或代码调用,用户可以轻松获取所需的最后交易日信息,为交易策略和风险管理提供支持。
|