feat(data-engineering): 完成akshare→vn.py数据适配器系统
- 实现核心数据适配器(akshare_vnpy_adapter.py) * 数据库初始化(vn.py DbBarData表) * 股票列表获取(全市场A股) * 单只/全市场K线数据下载 * akshare→vn.py格式自动转换 * 批量插入优化(executemany) * 数据完整性验证 - 实现批量下载器(batch_downloader.py) * 断点续传支持(JSON进度文件) * 失败重试机制 * 进度实时保存 * 测试模式支持 - 实现测试脚本(test_adapter.py) * 单元测试覆盖所有核心功能 * 完整流程验证 - 完善文档 * README.md - 完整使用文档 * IMPLEMENTATION_REPORT.md - 实施详情报告 * VALIDATION_REPORT.md - 验证报告 * VALIDATION_REPORT_TEMPLATE.md - 验证报告模板 作者: 赵云(数据护军) 日期: 2026-03-24
This commit is contained in:
@@ -0,0 +1,454 @@
|
||||
# akshare → vn.py 数据适配器系统 - 实施报告
|
||||
|
||||
**项目**: 三国之量化交易
|
||||
**模块**: 数据工程 - akshare到vn.py数据同步
|
||||
**实施人**: 赵云(数据护军)
|
||||
**完成日期**: 2026-03-24
|
||||
|
||||
---
|
||||
|
||||
## 一、项目背景
|
||||
|
||||
根据《五虎上将多因子选股体系最终整合报告》第四部分要求,赵云负责开发 akshare→vnpy 数据适配器,完成全市场A股历史数据下载入库任务。
|
||||
|
||||
---
|
||||
|
||||
## 二、实施成果
|
||||
|
||||
### 2.1 核心模块完成情况
|
||||
|
||||
| 模块 | 文件 | 状态 | 功能描述 |
|
||||
|------|------|------|----------|
|
||||
| 数据适配器 | `akshare_vnpy_adapter.py` | ✅ 完成 | akshare数据获取、格式转换、批量入库 |
|
||||
| 批量下载器 | `batch_downloader.py` | ✅ 完成 | 全市场批量下载、断点续文件持、失败重试 |
|
||||
| 测试脚本 | `test_adapter.py` | ✅ 完成 | 单元测试、完整流程验证 |
|
||||
| 使用文档 | `README.md` | ✅ 完成 | 完整的使用说明和API文档 |
|
||||
| 验证报告模板 | `VALIDATION_REPORT_TEMPLATE.md` | ✅ 完成 | 数据验证报告模板 |
|
||||
|
||||
---
|
||||
|
||||
## 三、技术实现
|
||||
|
||||
### 3.1 整体架构
|
||||
|
||||
```
|
||||
akshare API
|
||||
↓
|
||||
AkshareToVnpyAdapter
|
||||
↓ (格式转换: akshare → vn.py)
|
||||
↓
|
||||
SQLite (vn.py database.db)
|
||||
↓
|
||||
DbBarData 表 (K线数据)
|
||||
```
|
||||
|
||||
### 3.2 核心功能
|
||||
|
||||
#### 1. 数据库初始化
|
||||
|
||||
```python
|
||||
adapter.initialize_database()
|
||||
```
|
||||
|
||||
- 自动创建 `DbBarData` 表
|
||||
- 创建联合索引:`(symbol, exchange, interval, datetime)`
|
||||
- 创建时间索引:`(datetime)`
|
||||
|
||||
#### 2. 股票列表获取
|
||||
|
||||
```python
|
||||
stock_list = adapter.get_stock_list()
|
||||
```
|
||||
|
||||
- 支持自动重试(默认3次)
|
||||
- 自动处理网络错误
|
||||
- 返回格式:`[code, name, price]`
|
||||
|
||||
#### 3. 单只股票数据下载
|
||||
|
||||
```python
|
||||
inserted = adapter.download_and_insert_stock_daily(
|
||||
code='600519',
|
||||
start_date='20240101',
|
||||
end_date='20241231'
|
||||
)
|
||||
```
|
||||
|
||||
- 自动解析交易所(SH/SZ/BJ)
|
||||
- 自动格式转换
|
||||
- 批量插入优化
|
||||
|
||||
#### 4. 全市场批量下载
|
||||
|
||||
```python
|
||||
stats = adapter.download_all_stock_daily(
|
||||
start_date='20240101',
|
||||
max_stocks=None, # None=全部下载
|
||||
resume_from=None # 断点续传
|
||||
)
|
||||
```
|
||||
|
||||
- 支持限制数量(测试模式)
|
||||
- 支持断点续传
|
||||
- 实时进度显示
|
||||
|
||||
#### 5. 数据完整性验证
|
||||
|
||||
```python
|
||||
integrity = adapter.verify_data_integrity()
|
||||
```
|
||||
|
||||
验证项:
|
||||
- 总记录数统计
|
||||
- 股票数量统计
|
||||
- 时间范围检查
|
||||
- 重复数据检测
|
||||
- 数据缺失检查
|
||||
|
||||
### 3.3 批量下载器特性
|
||||
|
||||
#### 断点续传
|
||||
|
||||
```python
|
||||
downloader = BatchDownloader(
|
||||
db_path='database.db',
|
||||
progress_file='download_progress.json'
|
||||
)
|
||||
|
||||
stats = downloader.download(
|
||||
resume=True, # 启用断点续传
|
||||
retry_failed=True # 自动重试失败的
|
||||
)
|
||||
```
|
||||
|
||||
进度保存在 `download_progress.json`:
|
||||
|
||||
```json
|
||||
{
|
||||
"last_code": "600519",
|
||||
"completed": ["000001", "000002", ...],
|
||||
"failed": ["600123", ...],
|
||||
"stats": {
|
||||
"total": 5000,
|
||||
"success": 3000,
|
||||
"failed": 5,
|
||||
"total_bars": 1500000
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 四、数据格式映射
|
||||
|
||||
### 4.1 akshare → vn.py 字段映射
|
||||
|
||||
| akshare 字段 | vn.py 字段 | 数据类型 | 说明 |
|
||||
|--------------|------------|----------|------|
|
||||
| 日期 | datetime | TEXT | 格式: YYYY-MM-DD HH:MM:SS |
|
||||
| 开盘 | open_price | REAL | 开盘价 |
|
||||
| 收盘 | close_price | REAL | 收盘价 |
|
||||
| 最高 | high_price | REAL | 最高价 |
|
||||
| 最低 | low_price | REAL | 最低价 |
|
||||
| 成交量 | volume | REAL | 成交量 |
|
||||
| 成交额 | turnover | REAL | 成交额(万元) |
|
||||
| - | open_interest | REAL | 持仓量(默认0) |
|
||||
|
||||
### 4.2 交易所映射
|
||||
|
||||
| 股票代码 | 交易所 | 说明 |
|
||||
|----------|--------|------|
|
||||
| 6xxxxx | SH | 上交所(主板) |
|
||||
| 0xxxxx | SZ | 深交所(主板) |
|
||||
| 3xxxxx | SZ | 深交所(创业板) |
|
||||
| 8xxxxx | BJ | 北交所 |
|
||||
|
||||
---
|
||||
|
||||
## 五、数据库表结构
|
||||
|
||||
### DbBarData 表(K线数据)
|
||||
|
||||
```sql
|
||||
CREATE TABLE IF NOT EXISTS dbbardata (
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
symbol TEXT NOT NULL,
|
||||
exchange TEXT NOT NULL,
|
||||
datetime TEXT NOT NULL,
|
||||
interval TEXT NOT NULL,
|
||||
volume REAL,
|
||||
turnover REAL,
|
||||
open_interest REAL,
|
||||
open_price REAL,
|
||||
high_price REAL,
|
||||
low_price REAL,
|
||||
close_price REAL,
|
||||
UNIQUE(symbol, exchange, datetime, interval)
|
||||
);
|
||||
|
||||
CREATE INDEX idx_bardata_symbol
|
||||
ON dbbardata(symbol, exchange, interval, datetime);
|
||||
|
||||
CREATE INDEX idx_bardata_datetime
|
||||
ON dbbardata(datetime);
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 六、性能优化
|
||||
|
||||
### 6.1 批量写入
|
||||
|
||||
- 使用 `executemany()` 代替逐条插入
|
||||
- 默认批量大小:1000 条/批
|
||||
- 预期写入速度:5000-10000 条/秒
|
||||
|
||||
### 6.2 事务控制
|
||||
|
||||
- 每个批次在一个事务中完成
|
||||
- 自动提交或回滚
|
||||
- 保证数据一致性
|
||||
|
||||
### 6.3 网络重试
|
||||
|
||||
- 自动重试机制(默认3次)
|
||||
- 重试延迟:5秒
|
||||
- 捕获连接错误和超时
|
||||
|
||||
### 6.4 索引优化
|
||||
|
||||
- 联合索引加速查询
|
||||
- 时间索引支持时间范围查询
|
||||
|
||||
---
|
||||
|
||||
## 七、使用方法
|
||||
|
||||
### 7.1 快速开始
|
||||
|
||||
```bash
|
||||
# 1. 进入目录
|
||||
cd data-engineering/
|
||||
|
||||
# 2. 运行测试
|
||||
python3 test_adapter.py
|
||||
|
||||
# 3. 下载全市场数据(测试模式:10只股票)
|
||||
# 编辑 batch_downloader.py,设置 max_stocks=10
|
||||
python3 batch_downloader.py
|
||||
|
||||
# 4. 下载全市场数据(完整模式)
|
||||
# 编辑 batch_downloader.py,设置 max_stocks=None
|
||||
python3 batch_downloader.py
|
||||
```
|
||||
|
||||
### 7.2 编程接口
|
||||
|
||||
```python
|
||||
from akshare_vnpy_adapter import AkshareToVnpyAdapter
|
||||
|
||||
# 创建适配器
|
||||
adapter = AkshareToVnpyAdapter('database.db')
|
||||
|
||||
try:
|
||||
# 初始化数据库
|
||||
adapter.initialize_database()
|
||||
|
||||
# 下载单只股票
|
||||
adapter.download_and_insert_stock_daily('600519', '20240101')
|
||||
|
||||
# 验证数据
|
||||
integrity = adapter.verify_data_integrity()
|
||||
print(integrity)
|
||||
|
||||
finally:
|
||||
adapter.close()
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 八、测试与验证
|
||||
|
||||
### 8.1 单元测试
|
||||
|
||||
运行 `test_adapter.py`,测试以下功能:
|
||||
|
||||
- ✅ 数据库初始化
|
||||
- ✅ 股票列表获取
|
||||
- ✅ 单只股票数据下载
|
||||
- ✅ 数据格式转换
|
||||
- ✅ 批量插入
|
||||
- ✅ 数据完整性验证
|
||||
|
||||
### 8.2 完整流程测试
|
||||
|
||||
1. 初始化数据库
|
||||
2. 下载5只测试股票
|
||||
3. 验证数据完整性
|
||||
4. 检查数据正确性
|
||||
|
||||
### 8.3 数据验证项
|
||||
|
||||
- [ ] 总记录数统计正确
|
||||
- [ ] 股票数量统计正确
|
||||
- [ ] 时间范围合理
|
||||
- [ ] 无重复数据
|
||||
- [ ] 无缺失数据
|
||||
- [ ] 价格逻辑正确(high >= low)
|
||||
|
||||
---
|
||||
|
||||
## 九、项目文件
|
||||
|
||||
```
|
||||
data-engineering/
|
||||
├── akshare_vnpy_adapter.py # 核心适配器
|
||||
├── batch_downloader.py # 批量下载器
|
||||
├── test_adapter.py # 测试脚本
|
||||
├── README.md # 使用文档
|
||||
├── VALIDATION_REPORT_TEMPLATE.md # 验证报告模板
|
||||
├── IMPLEMENTATION_REPORT.md # 本报告
|
||||
└── download_progress.json # 下载进度(自动生成)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 十、性能预估
|
||||
|
||||
### 10.1 数据规模
|
||||
|
||||
| 项目 | 数值 | 说明 |
|
||||
|------|------|------|
|
||||
| 全市场股票数 | ~5000 | A股总数 |
|
||||
| 平均交易日/年 | ~250 | 扣除节假日 |
|
||||
| 2年数据量 | 5000 × 500 = 250万条 | 2024-2026 |
|
||||
| 10年数据量 | 5000 × 2500 = 1250万条 | 历史回测 |
|
||||
|
||||
### 10.2 数据库大小
|
||||
|
||||
| 数据量 | 预估大小 |
|
||||
|--------|----------|
|
||||
| 10万条 | ~10 MB |
|
||||
| 50万条 | ~50 MB |
|
||||
| 250万条 | ~200 MB |
|
||||
| 1250万条 | ~1 GB |
|
||||
|
||||
### 10.3 下载时间预估
|
||||
|
||||
| 项目 | 数值 | 说明 |
|
||||
|------|------|------|
|
||||
| 单只股票下载 | ~1-2秒 | 网络依赖 |
|
||||
| 全市场下载 | ~5000-10000秒 | 约1.5-3小时 |
|
||||
| 数据库写入 | ~5000-10000条/秒 | 本地IO |
|
||||
|
||||
---
|
||||
|
||||
## 十一、已知限制
|
||||
|
||||
1. **网络依赖**: 需要稳定网络访问 akshare API
|
||||
2. **访问频率**: akshare有频率限制,不建议高并发
|
||||
3. **数据范围**: 新股上市时间短,历史数据有限
|
||||
4. **实时性**: akshare数据有延迟,非Tick级别
|
||||
|
||||
---
|
||||
|
||||
## 十二、下一步计划
|
||||
|
||||
### 短期(1-2周)
|
||||
|
||||
- [ ] 完成全市场数据下载测试
|
||||
- [ ] 编写完整的验证报告
|
||||
- [ ] 优化错误处理机制
|
||||
|
||||
### 中期(1个月)
|
||||
|
||||
- [ ] 接入聚宽(jqdatasdk)数据源
|
||||
- [ ] 接入Tushare Pro数据源
|
||||
- [ ] 实现多数据源统一接口
|
||||
|
||||
|
||||
|
||||
- [ ] 扩展分钟K线支持
|
||||
- [ ] 扩展Tick数据支持
|
||||
- [ ] 实现数据更新策略(增量更新)
|
||||
|
||||
---
|
||||
|
||||
## 十三、技术栈
|
||||
|
||||
- **Python**: 3.8+
|
||||
- **akshare**: 1.12+(数据源)
|
||||
- **SQLite**: 3.x(存储)
|
||||
- **pandas**: 数据处理
|
||||
- **tqdm**: 进度条
|
||||
- **requests**: HTTP请求
|
||||
|
||||
---
|
||||
|
||||
## 十四、风险与对策
|
||||
|
||||
### 14.1 风险识别
|
||||
|
||||
| 风险 | 影响 | 概率 | 对策 |
|
||||
|------|------|------|------|
|
||||
| akshare API不稳定 | 高 | 中 | 多重试、容错、备用数据源 |
|
||||
| 网络中断 | 高 | 低 | 断点续传、自动重连 |
|
||||
| 数据格式变更 | 中 | 低 | 代码注释、兼容性处理 |
|
||||
| 磁盘空间不足 | 中 | 低 | 监控、预警、清理旧数据 |
|
||||
|
||||
### 14.2 对策实施
|
||||
|
||||
✅ **断点续传**: 已实现
|
||||
✅ **自动重试**: 已实现(3次)
|
||||
✅ **错误日志**: 已记录
|
||||
⏸️ **磁盘监控**: 待实现
|
||||
⏸️ **备用数据源**: 待开发
|
||||
|
||||
---
|
||||
|
||||
## 十五、总结
|
||||
|
||||
### 15.1 完成情况
|
||||
|
||||
| 任务 | 状态 |
|
||||
|------|------|
|
||||
| akshare数据适配器开发 | ✅ 完成 |
|
||||
| vn.py数据库兼容 | ✅ 完成 |
|
||||
| 批量下载引擎 | ✅ 完成 |
|
||||
| 断点续传功能 | ✅ 完成 |
|
||||
| 失败重试机制 | ✅ 完成 |
|
||||
| 数据格式转换 | ✅ 完成 |
|
||||
| 数据完整性验证 | ✅ 完成 |
|
||||
| 使用文档编写 | ✅ 完成 |
|
||||
| 测试脚本开发 | ✅ 完成 |
|
||||
|
||||
### 15.2 代码质量
|
||||
|
||||
- ✅ 模块化设计
|
||||
- ✅ 清晰的代码结构
|
||||
- ✅ 完整的文档注释
|
||||
- ✅ 错误处理机制
|
||||
- ✅ 日志记录
|
||||
|
||||
### 15.3 项目价值
|
||||
|
||||
1. **数据基础**: 为选股策略提供可靠的数据源
|
||||
2. **vn.py兼容**: 无缝接入vn.py框架
|
||||
3. **可扩展性**: 易于扩展其他数据源
|
||||
4. **易用性**: 简单API,开箱即用
|
||||
|
||||
---
|
||||
|
||||
## 十六、致谢
|
||||
|
||||
感谢庞统副军师的任务分配和协调支持。
|
||||
|
||||
---
|
||||
|
||||
**报告完成时间**: 2026-03-24 12:45 (Asia/Shanghai)
|
||||
**报告人**: 赵云(数据护军)
|
||||
**项目**: 三国之量化交易
|
||||
|
||||
---
|
||||
|
||||
*"数据为兵,策略为将,风控为帅。兵精将勇,方能制胜市场!" — 赵云*
|
||||
Reference in New Issue
Block a user