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
This commit is contained in:
@@ -0,0 +1,79 @@
|
||||
# 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 Access,Claude/终端无 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: 24(06-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)。
|
||||
Reference in New Issue
Block a user