# 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) **报告人**: 赵云(数据护军) **项目**: 三国之量化交易 --- *"数据为兵,策略为将,风控为帅。兵精将勇,方能制胜市场!" — 赵云*