Files
sanguo_vnpy_v2/docs/deployment/data-download.md
T
claude_dev 1a88954126 feat(data): v2 数据下载(SSH模式 STOCK_MOUNT+rsync) + launchd定时 + 文档
- v1 data_platform 脚本复制到 v2/scripts/data_platform/ 维护
- daily_all_update.py: 路径用 STOCK_MOUNT env(SSH模式) + STOCK_LIMIT(验证)
- run_daily_update.sh: rsync拉NAS→本地 + v1增量 + 推NAS(SSH key免密,不挂载)
- launchd com.sanguo.data-update 每日15:30(替代crontab,macOS FDA限制)
- 验证: STOCK_LIMIT=2 updated=2 records=24 拉到当天
- 文档 docs/deployment/data-download.md
2026-07-07 19:41:07 +08:00

80 lines
3.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# A 股数据下载(v2 维护)
> 维护:Main Agent · 2026-07-07
> v1 数据下载脚本(`~/.openclaw/sanguo_projects/sanguo_vnpy/data_platform/`)移植到 v2
> 改 SSH 模式(免 SMB 挂载/密码/macFUSE),Mac launchd 定时(替代 crontab)。
## 架构
```
Mac Mini(常开)
launchd 每日 15:30
→ run_daily_update.sh
1. rsync 拉 NAS 现有 → Mac 本地(/tmp/stock_dl,增量;首次慢后续快)
2. 跑 v1 daily_all_update.py(多源 fallback + 增量 + 失败率熔断)
3. rsync 推 本地 → NAS/volume1/stock
↕ SSH key 免密(sanguo-nas,不依赖 SMB 挂载/密码)
NAS /volume1/stock(日线/15min parquet + vnpy DB
```
不挂载、不要密码、不装 macFUSE,用 `sanguo-nas` SSH key`~/.ssh/config`)。
## 脚本(`v2/scripts/data_platform/`
从 v1 `data_platform/` 复制(11 个脚本)。关键改动:
- **`daily_all_update.py`** — v1 全市场增量(日线 + 15min,多源 fallback:东财 4s + BaoStock + 腾讯,失败率熔断 >80% 终止)
- `STOCK_MOUNT` env:路径根(默认 `~/stock_mount` SMB 挂载点;SSH 模式包装脚本设 `/tmp/stock_dl`
- `STOCK_LIMIT` env:限制股票数(前 N,**验证用**,默认 0=全市场)
- **`run_daily_update.sh`** — 包装(rsync 拉 + v1 + 推),SSH 模式入口
- env`STOCK_LIMIT=N` / `SKIP_PULL=1`(验证跳过拉)
- 其他 v1 脚本:`backfill_15min_baostock.py`15min 回补)/ `realtime.py`(实时三源)/ `validator.py`(校验)等
## 定时(launchd,替代 crontab
`~/Library/LaunchAgents/com.sanguo.data-update.plist` — 每日 15:30 跑 `run_daily_update.sh`
```bash
launchctl load ~/Library/LaunchAgents/com.sanguo.data-update.plist
launchctl unload ~/Library/LaunchAgents/com.sanguo.data-update.plist
launchctl list | grep sanguo.data-update
```
**为何不用 crontab**macOS crontab 写(`crontab file`)需 Full Disk AccessClaude/终端无 FDA 时写操作卡死(读 OK)。launchd 用户级 plist`~/Library/LaunchAgents/`)不需 FDA,更稳。Mac 原生推荐方式。
## 验证(2026-07-07
```
STOCK_LIMIT=2 STOCK_MOUNT=/tmp/stock_dl_test python3 daily_all_update.py --skip-15min
→ updated: 2, records: 2406-19~07-07),000001 拉到 2026-07-07(今天),21.8s ✅
```
增量逻辑:v1 读本地现有 parquet 最后日期(`get_daily_last_date`)→ 拉 last+1 ~ 今天。**本地必须有现有 parquet**(rsync 拉或之前数据),否则 skip。
## v1 crontab 取消
v1 crontab `30 15 * * 1-5 .../sanguo_vnpy/data_platform/daily_update.sh` 取消——用 v2 launchd 替代。
> macOS crontab 写卡(FDA),`crontab -e` 手动去那行,或给终端 Full Disk Access。
v1 crontab 若残留无害(v1 脚本跑时 NAS 未挂载会 `ERROR: NAS未挂载,跳过更新`)。
## 全市场补全(首次)
`run_daily_update.sh` 首次跑:rsync 拉全市场现有(5264 parquet,几分钟)+ v1 增量(全市场 × 东财 4s 限频 ≈ 数小时,夜间)+ 推。
手动触发补全:
```bash
cd v2/scripts/data_platform
./run_daily_update.sh # 全量(日线+15min),夜间跑
./run_daily_update.sh --skip-15min # 只日线
```
## raw 双数据源(task #79,后续)
当前 parquet 是前复权/后复权(成交价显示失真,如浦发 110 元 vs 现价 ~10)。raw 不复权:
- BaoStock `adjustflag="3"`v1 `backfill_15min_baostock.py:131` 已用 raw 下 15min
- akshare `adjust=""`
task #79 接入 raw 双源(撮合/涨跌停/均价用 raw,策略信号用 qfq)。