|
|
# 统一数据获取接口开发文档
|
|
|
|
|
|
## 1. 概述
|
|
|
|
|
|
本开发文档描述了AlphaFutures系统中统一数据获取接口的设计与实现。该接口采用适配器设计模式,支持多种数据源(TQSDK、RQData等),为系统提供统一的数据获取出口,实现业务逻辑与数据获取的解耦。
|
|
|
|
|
|
### 1.1 设计目标
|
|
|
|
|
|
- **统一接口**:为所有数据源提供一致的API接口
|
|
|
- **可扩展性**:支持轻松添加新的数据源适配器
|
|
|
- **配置灵活**:通过配置选择不同的数据源
|
|
|
- **容错处理**:包含错误处理和降级机制
|
|
|
- **模拟数据**:支持无账号时的模拟数据功能
|
|
|
|
|
|
### 1.2 技术栈
|
|
|
|
|
|
- Python 3.8+
|
|
|
- 抽象基类(ABC)
|
|
|
- 工厂模式
|
|
|
- 依赖注入
|
|
|
- 环境变量配置
|
|
|
|
|
|
## 2. 架构设计
|
|
|
|
|
|
### 2.1 整体架构
|
|
|
|
|
|
```
|
|
|
业务逻辑层
|
|
|
↑
|
|
|
| 依赖注入
|
|
|
↓
|
|
|
统一数据获取层 (DataFetcher)
|
|
|
↑
|
|
|
| 工厂模式
|
|
|
↓
|
|
|
适配器抽象层 (BaseDataAdapter)
|
|
|
↑
|
|
|
| 继承实现
|
|
|
↓
|
|
|
具体适配器实现
|
|
|
├── TQSdkAdapter
|
|
|
├── RQDataAdapter
|
|
|
└── 其他适配器...
|
|
|
```
|
|
|
|
|
|
### 2.2 核心设计模式
|
|
|
|
|
|
1. **适配器模式**:将不同数据源的接口转换为统一接口
|
|
|
2. **工厂模式**:根据配置创建对应的适配器实例
|
|
|
3. **依赖注入**:业务逻辑通过统一接口获取数据,不直接依赖具体实现
|
|
|
|
|
|
## 3. 核心组件
|
|
|
|
|
|
### 3.1 抽象基类 (BaseDataAdapter)
|
|
|
|
|
|
定义了所有数据适配器必须实现的接口方法,确保一致性。
|
|
|
|
|
|
**文件路径**:`qihuo_analyzer/data/api_adapters/base_adapter.py`
|
|
|
|
|
|
**核心方法**:
|
|
|
- `connect()` - 连接数据源
|
|
|
- `disconnect()` - 断开连接
|
|
|
- `get_kline_data()` - 获取K线数据
|
|
|
- `get_tick_data()` - 获取tick数据
|
|
|
- `get_contract_info()` - 获取合约信息
|
|
|
- `get_market_data()` - 获取市场数据
|
|
|
- `get_all_symbols()` - 获取所有品种列表
|
|
|
|
|
|
### 3.2 具体适配器
|
|
|
|
|
|
#### 3.2.1 TQSDK适配器
|
|
|
|
|
|
**文件路径**:`qihuo_analyzer/data/api_adapters/tqsdk_adapter.py`
|
|
|
|
|
|
实现了TQSDK的所有接口方法,包含错误处理和模拟数据支持。
|
|
|
|
|
|
#### 3.2.2 RQData适配器
|
|
|
|
|
|
**文件路径**:`qihuo_analyzer/data/api_adapters/rqdata_adapter.py`
|
|
|
|
|
|
实现了RQData的所有接口方法,包含错误处理和模拟数据支持。
|
|
|
|
|
|
### 3.3 适配器工厂
|
|
|
|
|
|
**文件路径**:`qihuo_analyzer/data/api_adapters/adapter_factory.py`
|
|
|
|
|
|
根据配置创建对应的适配器实例,支持通过环境变量选择数据源类型。
|
|
|
|
|
|
### 3.4 统一数据获取器
|
|
|
|
|
|
**文件路径**:`qihuo_analyzer/data/data_fetcher.py`
|
|
|
|
|
|
使用统一接口获取数据,替代直接API调用,为业务逻辑提供一致的数据获取方式。
|
|
|
|
|
|
## 4. 实现细节
|
|
|
|
|
|
### 4.1 配置管理
|
|
|
|
|
|
#### 4.1.1 环境变量配置
|
|
|
|
|
|
| 环境变量 | 说明 | 默认值 |
|
|
|
|---------|------|--------|
|
|
|
| DATA_ADAPTER_TYPE | 数据适配器类型 (tqsdk/rqdata) | tqsdk |
|
|
|
| TQSDK_USERNAME | TQSDK账号 | 无 |
|
|
|
| TQSDK_PASSWORD | TQSDK密码 | 无 |
|
|
|
| RQDATA_USERNAME | RQData账号 | 无 |
|
|
|
| RQDATA_PASSWORD | RQData密码 | 无 |
|
|
|
|
|
|
#### 4.1.2 账号配置
|
|
|
|
|
|
- **TQSDK**:设置`TQSDK_USERNAME`和`TQSDK_PASSWORD`环境变量
|
|
|
- **RQData**:设置`RQDATA_USERNAME`和`RQDATA_PASSWORD`环境变量
|
|
|
- **未配置账号**:自动使用模拟数据
|
|
|
|
|
|
### 4.2 错误处理
|
|
|
|
|
|
所有适配器都包含完整的错误处理机制:
|
|
|
|
|
|
1. **连接错误**:捕获连接异常,返回错误信息并使用模拟数据
|
|
|
2. **数据获取错误**:捕获API调用异常,返回错误信息并使用模拟数据
|
|
|
3. **参数错误**:验证输入参数,返回错误信息
|
|
|
|
|
|
### 4.3 模拟数据
|
|
|
|
|
|
当API连接失败或未配置账号时,自动使用模拟数据:
|
|
|
|
|
|
- **K线数据**:生成随机波动的价格数据
|
|
|
- **Tick数据**:生成随机的成交数据
|
|
|
- **合约信息**:返回基本合约信息
|
|
|
- **市场数据**:返回模拟的市场行情
|
|
|
- **品种列表**:返回内置的品种列表
|
|
|
|
|
|
### 4.4 数据格式统一
|
|
|
|
|
|
所有适配器返回的数据格式保持一致:
|
|
|
|
|
|
- **K线数据**:包含时间、开盘价、最高价、最低价、收盘价、成交量
|
|
|
- **Tick数据**:包含时间、最新价、成交量、持仓量、买价、买量、卖价、卖量
|
|
|
- **合约信息**:包含合约代码、交易所、品种类型、合约大小等
|
|
|
- **市场数据**:包含最新价、涨跌幅、成交量、持仓量等
|
|
|
- **品种列表**:包含品种代码、交易所、品种名称等
|
|
|
|
|
|
## 5. 使用方法
|
|
|
|
|
|
### 5.1 基本使用
|
|
|
|
|
|
```python
|
|
|
from qihuo_analyzer.data.data_fetcher import DataFetcher
|
|
|
|
|
|
# 创建数据获取器实例(自动使用配置的适配器)
|
|
|
fetcher = DataFetcher()
|
|
|
|
|
|
# 获取K线数据
|
|
|
kline_data = fetcher.get_kline_data(
|
|
|
symbol="SHFE.rb2409",
|
|
|
interval=3600, # 1小时
|
|
|
start_time="2024-01-01 00:00:00",
|
|
|
end_time="2024-01-02 00:00:00"
|
|
|
)
|
|
|
|
|
|
# 获取Tick数据
|
|
|
tick_data = fetcher.get_tick_data(
|
|
|
symbol="SHFE.rb2409",
|
|
|
start_time="2024-01-01 09:00:00",
|
|
|
end_time="2024-01-01 11:30:00"
|
|
|
)
|
|
|
|
|
|
# 获取合约信息
|
|
|
contract_info = fetcher.get_contract_info("SHFE.rb2409")
|
|
|
|
|
|
# 获取市场数据
|
|
|
market_data = fetcher.get_market_data(["SHFE.rb2409", "DCE.i2409"])
|
|
|
|
|
|
# 获取所有品种列表
|
|
|
symbols = fetcher.get_all_symbols()
|
|
|
```
|
|
|
|
|
|
### 5.2 手动指定适配器
|
|
|
|
|
|
```python
|
|
|
from qihuo_analyzer.data.api_adapters.adapter_factory import DataAdapterFactory
|
|
|
|
|
|
# 手动创建特定适配器
|
|
|
adapter = DataAdapterFactory.create_adapter("rqdata")
|
|
|
adapter.connect()
|
|
|
|
|
|
# 使用适配器获取数据
|
|
|
data = adapter.get_kline_data("SHFE.rb2409", 3600, start_time, end_time)
|
|
|
|
|
|
# 断开连接
|
|
|
adapter.disconnect()
|
|
|
```
|
|
|
|
|
|
## 6. 配置说明
|
|
|
|
|
|
### 6.1 Windows环境变量配置
|
|
|
|
|
|
1. **打开系统属性**:右键"此电脑" → "属性" → "高级系统设置"
|
|
|
2. **环境变量**:点击"环境变量"按钮
|
|
|
3. **添加系统变量**:在"系统变量"区域点击"新建"
|
|
|
4. **设置变量**:
|
|
|
- 变量名:`DATA_ADAPTER_TYPE`
|
|
|
- 变量值:`tqsdk` 或 `rqdata`
|
|
|
5. **设置账号变量**(可选):
|
|
|
- TQSDK:添加 `TQSDK_USERNAME` 和 `TQSDK_PASSWORD`
|
|
|
- RQData:添加 `RQDATA_USERNAME` 和 `RQDATA_PASSWORD`
|
|
|
6. **重启应用**:配置生效需要重启应用程序
|
|
|
|
|
|
### 6.2 临时配置
|
|
|
|
|
|
在Python代码中临时设置环境变量:
|
|
|
|
|
|
```python
|
|
|
import os
|
|
|
|
|
|
# 设置适配器类型
|
|
|
os.environ["DATA_ADAPTER_TYPE"] = "rqdata"
|
|
|
|
|
|
# 设置RQData账号
|
|
|
os.environ["RQDATA_USERNAME"] = "your_username"
|
|
|
os.environ["RQDATA_PASSWORD"] = "your_password"
|
|
|
|
|
|
# 然后创建DataFetcher实例
|
|
|
from qihuo_analyzer.data.data_fetcher import DataFetcher
|
|
|
fetcher = DataFetcher()
|
|
|
```
|
|
|
|
|
|
## 7. 测试验证
|
|
|
|
|
|
### 7.1 测试脚本
|
|
|
|
|
|
**文件路径**:`test_data_adapters.py`
|
|
|
|
|
|
测试脚本验证了所有适配器的功能:
|
|
|
|
|
|
- 连接测试
|
|
|
- 数据获取测试
|
|
|
- 错误处理测试
|
|
|
- 模拟数据测试
|
|
|
|
|
|
### 7.2 运行测试
|
|
|
|
|
|
```bash
|
|
|
# 在项目根目录运行测试
|
|
|
python test_data_adapters.py
|
|
|
```
|
|
|
|
|
|
### 7.3 测试结果
|
|
|
|
|
|
测试输出示例:
|
|
|
|
|
|
```
|
|
|
=== 测试 tqsdk 适配器 ===
|
|
|
创建TQSDK数据适配器
|
|
|
连接API...
|
|
|
TQSDK账号密码未配置,将使用模拟数据
|
|
|
连接结果: 失败
|
|
|
API连接失败,跳过测试
|
|
|
|
|
|
=== 测试 rqdata 适配器 ===
|
|
|
创建RQData数据适配器
|
|
|
连接API...
|
|
|
RQData账号密码未配置,将使用模拟数据
|
|
|
连接结果: 失败
|
|
|
API连接失败,跳过测试
|
|
|
|
|
|
=== 测试完成 ===
|
|
|
```
|
|
|
|
|
|
## 8. 未来扩展
|
|
|
|
|
|
### 8.1 添加新适配器
|
|
|
|
|
|
要添加新的数据源适配器,只需:
|
|
|
|
|
|
1. **创建适配器类**:继承`BaseDataAdapter`
|
|
|
2. **实现接口方法**:实现所有抽象方法
|
|
|
3. **注册适配器**:在工厂类中添加适配器类型
|
|
|
|
|
|
**示例**:
|
|
|
|
|
|
```python
|
|
|
# 在adapter_factory.py中添加
|
|
|
ADAPTERS = {
|
|
|
"tqsdk": TQSdkAdapter,
|
|
|
"rqdata": RQDataAdapter,
|
|
|
"new_adapter": NewAdapter # 新适配器
|
|
|
}
|
|
|
```
|
|
|
|
|
|
### 8.2 增强功能
|
|
|
|
|
|
未来可考虑的增强功能:
|
|
|
|
|
|
- **缓存机制**:添加数据缓存,减少重复API调用
|
|
|
- **多数据源融合**:支持从多个数据源获取数据并融合
|
|
|
- **数据源健康检查**:定期检查数据源可用性
|
|
|
- **数据质量监控**:监控数据完整性和准确性
|
|
|
- **异步数据获取**:支持异步API调用,提高性能
|
|
|
|
|
|
## 9. 故障排除
|
|
|
|
|
|
### 9.1 常见问题
|
|
|
|
|
|
1. **API连接失败**
|
|
|
- 检查账号配置是否正确
|
|
|
- 检查网络连接
|
|
|
- 检查API服务是否正常
|
|
|
|
|
|
2. **数据获取失败**
|
|
|
- 检查合约代码是否正确
|
|
|
- 检查时间范围是否合理
|
|
|
- 检查API权限是否足够
|
|
|
|
|
|
3. **适配器初始化失败**
|
|
|
- 检查环境变量配置
|
|
|
- 检查依赖包是否安装
|
|
|
- 检查Python版本是否兼容
|
|
|
|
|
|
### 9.2 日志与调试
|
|
|
|
|
|
- **日志级别**:可通过配置调整日志级别
|
|
|
- **调试模式**:设置环境变量`DEBUG=True`启用调试模式
|
|
|
- **错误信息**:详细的错误信息会记录到日志中
|
|
|
|
|
|
## 10. 依赖管理
|
|
|
|
|
|
### 10.1 核心依赖
|
|
|
|
|
|
| 依赖包 | 版本 | 用途 |
|
|
|
|--------|------|------|
|
|
|
| tqsdk | ^1.9.15 | TQSDK数据源支持 |
|
|
|
| rqdatac | ^2.0.0 | RQData数据源支持 |
|
|
|
| pandas | ^1.3.0 | 数据处理 |
|
|
|
| numpy | ^1.20.0 | 数值计算 |
|
|
|
|
|
|
### 10.2 安装依赖
|
|
|
|
|
|
```bash
|
|
|
# 安装依赖包
|
|
|
pip install -r requirements.txt
|
|
|
```
|
|
|
|
|
|
## 11. 总结
|
|
|
|
|
|
统一数据获取接口的实现成功解决了多数据源集成的问题,为AlphaFutures系统提供了:
|
|
|
|
|
|
- **灵活性**:支持多种数据源,可根据需要切换
|
|
|
- **可靠性**:包含错误处理和降级机制
|
|
|
- **可扩展性**:支持轻松添加新的数据源
|
|
|
- **一致性**:为业务逻辑提供统一的数据接口
|
|
|
- **可维护性**:代码结构清晰,易于维护和测试
|
|
|
|
|
|
该设计不仅满足了当前的需求,也为未来的功能扩展和性能优化奠定了基础。 |