auto-sync: 2026-03-25 23:50:25
This commit is contained in:
@@ -0,0 +1,89 @@
|
|||||||
|
# 赵云工作区历史备份归档 - 20240325
|
||||||
|
|
||||||
|
## 📁 归档信息
|
||||||
|
- **归档日期**: 2026-03-25
|
||||||
|
- **归档人员**: 赵云(数据工程将军)
|
||||||
|
- **归档原因**: 赵云工作区标准化重建前的历史备份
|
||||||
|
- **归档位置**: `archive/zhaoyun-data-old-backup-20240325/`
|
||||||
|
|
||||||
|
## 📊 内容摘要
|
||||||
|
本目录包含赵云工作区在标准化重建前的历史版本,作为版本控制和历史参考。
|
||||||
|
|
||||||
|
## 📋 文件清单
|
||||||
|
|
||||||
|
### 1. 重要文档报告
|
||||||
|
- `IMPLEMENTATION_REPORT.md` - 实施报告文档
|
||||||
|
- `TASK_COMPLETION_REPORT.md` - 任务完成报告
|
||||||
|
- `VALIDATION_REPORT.md` - 验证报告
|
||||||
|
- `VALIDATION_REPORT_TEMPLATE.md` - 验证报告模板
|
||||||
|
- `sanguo_vnpy_data_sync_research.md` - vnPy数据同步研究报告
|
||||||
|
- `README.md` - 原工作区说明文档
|
||||||
|
|
||||||
|
### 2. Python脚本文件
|
||||||
|
- `batch_downloader.py` - 批量数据下载器(历史版本)
|
||||||
|
- `test_adapter.py` - 数据适配器测试工具(历史版本)
|
||||||
|
- `akshare_vnpy_adapter.py` - AKShare到vnPy数据适配器(历史版本)
|
||||||
|
|
||||||
|
### 3. 数据文件
|
||||||
|
- `data/database_test.db` - 测试数据库文件
|
||||||
|
|
||||||
|
## 🗑️ 已清理文件
|
||||||
|
根据主公指令,已清理以下不需要的缓存文件:
|
||||||
|
- `akshare_vnpy_adapter.log` - 日志文件
|
||||||
|
- `__pycache__/` - Python编译缓存目录
|
||||||
|
|
||||||
|
## 🔄 归档原因
|
||||||
|
1. **标准化重建**:赵云工作区按照workflow-rules.md标准结构重建
|
||||||
|
2. **版本控制**:保留历史版本,便于追溯和参考
|
||||||
|
3. **数据安全**:防止重要历史成果物丢失
|
||||||
|
|
||||||
|
## 📈 新旧版本对比
|
||||||
|
### 旧版本结构(本归档)
|
||||||
|
```
|
||||||
|
zhaoyun-data-old-backup/
|
||||||
|
├── *.py # Python脚本混合存放
|
||||||
|
├── *.md # 文档混合存放
|
||||||
|
├── data/ # 数据文件
|
||||||
|
└── __pycache__/ # Python缓存(已清理)
|
||||||
|
```
|
||||||
|
|
||||||
|
### 新版本结构(标准化)
|
||||||
|
```
|
||||||
|
zhaoyun-data/
|
||||||
|
├── README.md # 标准化工作区说明
|
||||||
|
├── research/ # 调研报告目录
|
||||||
|
├── scripts/ # 分类脚本目录
|
||||||
|
│ ├── data_acquisition/ # 数据获取脚本
|
||||||
|
│ ├── data_cleaning/ # 数据清洗脚本
|
||||||
|
│ ├── data_validation/ # 数据验证脚本
|
||||||
|
│ ├── data_quality/ # 质量检查脚本
|
||||||
|
│ └── common_tools/ # 通用工具脚本
|
||||||
|
├── data/ # 标准数据目录
|
||||||
|
│ ├── raw/ # 原始数据
|
||||||
|
│ ├── processed/ # 处理后的数据
|
||||||
|
│ └── running_data/ # 运行数据
|
||||||
|
├── reports/ # 报告文档目录
|
||||||
|
└── references/ # 参考资料目录
|
||||||
|
```
|
||||||
|
|
||||||
|
## 🎯 归档价值
|
||||||
|
1. **历史参考**:提供历史版本对比参考
|
||||||
|
2. **技术演进**:记录赵云数据工程技术的发展历程
|
||||||
|
3. **版本回溯**:在需要时可以回溯到特定历史版本
|
||||||
|
4. **知识传承**:保留历史技术方案和经验教训
|
||||||
|
|
||||||
|
## ⚠️ 注意事项
|
||||||
|
1. 本归档为只读参考,不建议直接使用
|
||||||
|
2. 新版本结构更符合workflow-rules.md标准
|
||||||
|
3. 建议以新版本结构为基准进行后续开发
|
||||||
|
4. 历史文件可作为技术参考,但需注意兼容性
|
||||||
|
|
||||||
|
## 📝 归档管理
|
||||||
|
- **归档人**: 赵云
|
||||||
|
- **审核人**: 诸葛亮军师
|
||||||
|
- **归档时间**: 2026-03-25
|
||||||
|
- **归档状态**: 已完成
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**赵云确认**:本历史备份已按照主公指令和目录规则完成归档处理,缓存文件已清理,重要历史成果物已妥善保存。🧮
|
||||||
Executable
+74
@@ -0,0 +1,74 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# 自动双向同步脚本
|
||||||
|
# 每分钟运行一次,双向同步本地和远程Gitee
|
||||||
|
# 错误处理:失败了记录日志不继续错误扩散
|
||||||
|
|
||||||
|
PROJECT_DIR="/Users/chufeng/.openclaw/sanguo_projects/sanguo_quant_live"
|
||||||
|
LOG_FILE="$PROJECT_DIR/auto-sync.log"
|
||||||
|
MAX_RETRIES=2
|
||||||
|
|
||||||
|
# 确保目录存在
|
||||||
|
cd "$PROJECT_DIR" || {
|
||||||
|
echo "[$(date)] ERROR: Failed to cd into $PROJECT_DIR" >> "$LOG_FILE"
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
echo "[$(date)] Starting auto sync..." >> "$LOG_FILE"
|
||||||
|
|
||||||
|
# 第一步:git pull 拉取远程变更
|
||||||
|
echo "[$(date)] Step 1: git pull origin main" >> "$LOG_FILE"
|
||||||
|
git pull origin main
|
||||||
|
exit_code=$?
|
||||||
|
|
||||||
|
if [ $exit_code -ne 0 ]; then
|
||||||
|
echo "[$(date)] WARNING: git pull failed with exit code $exit_code" >> "$LOG_FILE"
|
||||||
|
# pull失败不推送,避免冲突
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "[$(date)] git pull success" >> "$LOG_FILE"
|
||||||
|
|
||||||
|
# 第二步:检查本地是否有变更
|
||||||
|
git diff --quiet
|
||||||
|
exit_code=$?
|
||||||
|
|
||||||
|
if [ $exit_code -eq 0 ]; then
|
||||||
|
# 没有变更,正常退出
|
||||||
|
echo "[$(date)] No local changes, exiting." >> "$LOG_FILE"
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 有变更,进行提交
|
||||||
|
echo "[$(date)] Step 2: Found local changes, committing..." >> "$LOG_FILE"
|
||||||
|
|
||||||
|
git add .
|
||||||
|
exit_code=$?
|
||||||
|
if [ $exit_code -ne 0 ]; then
|
||||||
|
echo "[$(date)] ERROR: git add failed with exit code $exit_code" >> "$LOG_FILE"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
git commit -m "auto-sync: $(date '+%Y-%m-%d %H:%M:%S')"
|
||||||
|
exit_code=$?
|
||||||
|
if [ $exit_code -ne 0 ]; then
|
||||||
|
echo "[$(date)] ERROR: git commit failed with exit code $exit_code" >> "$LOG_FILE"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 推送到远程
|
||||||
|
echo "[$(date)] Step 3: Pushing to origin/main..." >> "$LOG_FILE"
|
||||||
|
|
||||||
|
for i in $(seq 1 $MAX_RETRIES); do
|
||||||
|
git push origin main
|
||||||
|
exit_code=$?
|
||||||
|
if [ $exit_code -eq 0 ]; then
|
||||||
|
echo "[$(date)] Push success! Sync complete." >> "$LOG_FILE"
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
echo "[$(date)] Push attempt $i failed, retrying..." >> "$LOG_FILE"
|
||||||
|
sleep 2
|
||||||
|
done
|
||||||
|
|
||||||
|
echo "[$(date)] ERROR: Push failed after $MAX_RETRIES attempts" >> "$LOG_FILE"
|
||||||
|
exit 1
|
||||||
@@ -1,329 +0,0 @@
|
|||||||
# 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. 基本用法
|
|
||||||
|
|
||||||
```python
|
|
||||||
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. 批量下载全市场数据
|
|
||||||
|
|
||||||
```python
|
|
||||||
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. 运行测试
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# 运行单元测试
|
|
||||||
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` 文件中:
|
|
||||||
|
|
||||||
```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
|
|
||||||
}
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 数据完整性验证
|
|
||||||
|
|
||||||
验证结果示例:
|
|
||||||
|
|
||||||
```python
|
|
||||||
{
|
|
||||||
"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 配置
|
|
||||||
|
|
||||||
```python
|
|
||||||
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. 格式转换错误
|
|
||||||
|
|
||||||
- 记录错误日志
|
|
||||||
- 跳过错误数据,继续处理
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 已知限制
|
|
||||||
|
|
||||||
1. **网络依赖**: 需要稳定网络连接访问 akshare API
|
|
||||||
2. **数据频率**: akshare有访问频率限制,批量下载需要控制并发
|
|
||||||
3. **数据范围**: 历史数据可能有限(新股上市时间短)
|
|
||||||
4. **TICK数据**: 当前只实现了K线数据,TICK数据待扩展
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 下一步计划
|
|
||||||
|
|
||||||
1. ✅ akshare 数据适配器 - **已完成**
|
|
||||||
2. ⏸️ 聚宽(jqdatasdk)适配器 - 待开发
|
|
||||||
3. ⏸️ Tushare Pro 适配器 - 待开发
|
|
||||||
4. ⏸️ Wind 适配器 - 待调研
|
|
||||||
5. ⏸️ TICK数据支持 - 待扩展
|
|
||||||
6. ⏸️ 分钟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
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
*"数据为兵,策略为将,风控为帅" — 赵云*
|
|
||||||
Reference in New Issue
Block a user