6.6 KiB
6.6 KiB
akshare → vn.py 数据适配器系统
项目概述
本项目实现了从 akshare 数据源获取A股历史数据,并批量写入 vn.py SQLite 数据库的完整解决方案。
作者: 赵云(数据护军) 完成日期: 2026-03-24
功能特性
1. 数据适配器 (akshare_vnpy_adapter.py)
- ✅ 自动初始化 vn.py 数据库表结构
- ✅ 获取全市场A股股票列表
- ✅ 下载单只/全市场历史K线数据
- ✅ 数据格式自动转换(akshare → vn.py)
- ✅ 批量插入优化(使用 executemany)
- ✅ 数据完整性验证
- ✅ 支持日期范围筛选
- ✅ 支持复权类型选择(不复权/前复权/后复权)
2. 批量下载器 (batch_downloader.py)
- ✅ 断点续传支持(保存进度到JSON文件)
- ✅ 失败重试机制
- ✅ 进度实时保存
- ✅ 统计信息跟踪
- ✅ 测试模式(可限制下载数量)
3. 测试脚本 (test_adapter.py)
- ✅ 单元测试
- ✅ 完整流程验证
- ✅ 数据完整性验证
数据库结构
DbBarData 表(K线数据)
| 字段 | 类型 | 说明 |
|---|---|---|
| id | INTEGER | 主键(自增) |
| symbol | TEXT | 股票代码 |
| exchange | TEXT | 交易所(SH/SZ/BJ) |
| datetime | TEXT | K线时间 |
| interval | TEXT | 周期(1d/1w/1m等) |
| open_price | REAL | 开盘价 |
| high_price | REAL | 最高价 |
| low_price | REAL | 最低价 |
| close_price | REAL | 收盘价 |
| volume | REAL | 成交量 |
| turnover | REAL | 成交额(元) |
| open_interest | REAL | 持仓量 |
DbTickData 表(TICK数据)
包含完整五档行情数据(预留)
使用方法
1. 基本用法
from akshare_vnpy_adapter import AkshareToVnpyAdapter
# 创建适配器
adapter = AkshareToVnpyAdapter('database.db')
try:
# 初始化数据库
adapter.initialize_database()
# 下载单只股票
inserted = adapter.download_and_insert_stock_daily(
code='600519', # 茅台
start_date='20240101',
end_date='20241231'
)
print(f"插入 {inserted} 条K线")
# 验证数据完整性
integrity = adapter.verify_data_integrity()
print(integrity)
finally:
adapter.close()
2. 批量下载全市场数据
from batch_downloader import BatchDownloader
downloader = BatchDownloader(
db_path='database.db',
progress_file='download_progress.json'
)
try:
# 批量下载
stats = downloader.download(
start_date='20240101', # 开始日期
max_stocks=None, # None=全部,可设置如100测试
resume=True, # 断点续传
retry_failed=True # 重试失败的
)
# 验证数据
integrity = downloader.verify()
finally:
downloader.close()
3. 运行测试
# 运行单元测试
python3 test_adapter.py
# 运行完整下载(测试模式:50只股票)
python3 batch_downloader.py
# 修改配置后运行完整下载(全市场)
# 编辑 batch_downloader.py 中的 config
python3 batch_downloader.py
数据格式映射
akshare → vn.py 字段映射
| akshare | vn.py | 说明 |
|---|---|---|
| date | datetime | 日期时间 |
| open | open_price | 开盘价 |
| high | high_price | 最高价 |
| low | low_price | 最低价 |
| close | close_price | 收盘价 |
| volume | volume | 成交量 |
| money | turnover | 成交额 |
| - | open_interest | 持仓量(默认0) |
交易所映射
| 股票代码前缀 | 交易所 |
|---|---|
| 6xxxxx | SH(上交所) |
| 0xxxxx | SZ(深交所) |
| 3xxxxx | SZ(深交所) |
| 8xxxxx | BJ(北交所) |
性能优化
1. 批量写入
- 使用
executemany代替逐条插入 - 默认批量大小:1000 条/批
2. 事务控制
- 每个批次在一个事务中完成
- 自动提交或回滚
3. 索引优化
(symbol, exchange, interval, datetime)联合索引datetime单独索引
4. 连接管理
- 复用数据库连接
- 自动关闭
断点续传
进度保存在 download_progress.json 文件中:
{
"last_code": "600519",
"completed": ["000001", "000002", "600000", ...],
"failed": ["600123", "600456", ...],
"start_time": "2026-03-24T12:00:00",
"stats": {
"total": 5000,
"success": 3000,
"failed": 5,
"total_bars": 1500000
}
}
数据完整性验证
验证结果示例:
{
"total_bars": 150.5万,
"total_stocks": 3000,
"min_date": "2024-01-01 09:30:00",
"max_date": "2026-03-23 15:00:00",
"low_count_samples": 0,
"has_duplicates": false,
"duplicates_count": 0,
"status": "OK"
}
配置文件
batch_downloader.py 配置
config = {
'db_path': '/path/to/database.db',
'progress_file': '/path/to/download_progress.json',
'start_date': '20240101', # 开始日期
'max_stocks': None, # None=全部,测试时可设置
'resume': True, # 断点续传
'retry_failed': True # 重试失败的
}
日志文件
akshare_vnpy_adapter.log- 适配器日志batch_downloader.log- 批量下载日志
错误处理
1. 网络错误
自动重试(akshare内置重试机制)
2. 数据库错误
- 重复数据自动忽略(UNIQUE约束)
- 事务回滚保证一致性
3. 格式转换错误
- 记录错误日志
- 跳过错误数据,继续处理
已知限制
- 网络依赖: 需要稳定网络连接访问 akshare API
- 数据频率: akshare有访问频率限制,批量下载需要控制并发
- 数据范围: 历史数据可能有限(新股上市时间短)
- TICK数据: 当前只实现了K线数据,TICK数据待扩展
下一步计划
- ✅ akshare 数据适配器 - 已完成
- ⏸️ 聚宽(jqdatasdk)适配器 - 待开发
- ⏸️ Tushare Pro 适配器 - 待开发
- ⏸️ Wind 适配器 - 待调研
- ⏸️ TICK数据支持 - 待扩展
- ⏸️ 分钟K线支持 - 待扩展
性能指标(预期)
- K线数据: 5000只股票 × 500交易日 = 250万条
- 数据库大小: 约 200-300 MB
- 下载时间: 约 2-4 小时(网络依赖)
- 写入速度: 约 5000-10000 条/秒
技术栈
- Python 3.8+
- akshare(数据源)
- SQLite(存储)
- pandas(数据处理)
- tqdm(进度条显示)
许可证
MIT License
贡献
欢迎提交 Issue 和 Pull Request!
联系方式
作者:赵云(数据护军) 项目:三国之量化交易 仓库:sanguo_quant_live
"数据为兵,策略为将,风控为帅" — 赵云