Files
sanguo_vnpy_v2/docs/static_data_cache_plan.md
T
claude_dev 774170ec05 feat(data): 数据源融合 P0 补全 + 每日增量脚本
采集层(多源各下):
- baostock: 日线全字段全量(baostock_daily_fullmarket) + 15min全市场 + 静态(基础/复权/分红/季频/三表) + 成份股
- akshare: 静态(估值/龙虎榜/大宗/融资融券/北向/指数成分/行业/股本/解禁/业绩预告)
- xtdata(miniQMT): build_daily_from_xtdata + daily_update_xtdata

数据补全 P0:
- ETF全市场: universe 扩展 沪深A股∪ETF∪基金(7414), dividend_type='front' 前复权
- 历史成份股(治幸存者偏差): index_const_hist_download 深证/国证 adjust_cni 4指数 + 中证1000/2000快照 + 新浪交叉校验
- 退市K线: baostock_delisted_download + import_delisted_to_db(实证 Day1 fetch_all_stocks 已含退市)

灌库:
- import_baostock_to_db: daily_baostock_full(5537股/1826万行,18字段)+ bs_index_constituent + bs_adjust_factor
- INSERT OR REPLACE 幂等, WAL+busy_timeout, dbbardata 不碰

每日增量 #7(用户决策A: VPS直跑):
- daily_update_static: login探针防黑名单graceful skip + LOOKBACK7 + query_stock_basic含退市 + INSERT OR REPLACE + QUERY_COUNT守48000/天

设计文档: spec(13节三层融合) + P0 plan + 数据gap设计
2026-07-22 10:34:22 +08:00

106 lines
7.3 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股静态数据全量缓存到 VPS — 设计与采集计划
> 2026-07-19 立。目标:全市场 A股静态/基本面/参考数据全量缓存到 VPS 本地(parquet),作选股(基本面)与回测数据源。
## 原则(用户钦定)
1. **尽量多缓存**——能下的全下,避免限流/网络依赖。
2. **串行可,等待长可接受**——不追求并发速度,稳定性优先。
3. **准确性第一**——下错不如不下,每类数据必须验证。
4. **建立每日自动更新**——历史一次灌满 + 每日增量。
5. 用途:基本面选股 + 回测。盘中实时当日数据(实盘)未来再做。
## 为什么缓存优于实时取(背景)
历史静态数据(含"日频"的历史部分)永不改变。本地缓存:秒级读盘/零网络依赖/可复现快照/不触发限流。实时取历史:慢/不稳/不可复现/反复触发封 IP。**唯一非静态是"今天未收盘/未公布"的部分,日终收盘后即变静态。**
## 范围(全量 ~2GB)
| 组 | 类别 | 频率 | 源 | 估算 |
|---|---|---|---|---|
| A 基础元数据 | 基础信息(代码/名称/交易所/板块/上市退市/状态) | 静态 | baostock | 1MB |
| | 行业分类(申万/中信/概念) | 静态 | akshare | 30MB |
| | 指数成分+权重(300/500/1000/国证2000) | 月 | akshare | 50MB |
| B 财务 | 三大报表(资产/利润/现金流) | 季 | baostock | 150MB |
| | 季频衍生指标(ROE/EPS/毛利率/净利增速/负债率/杜邦) | 季 | baostock | 200MB |
| | 业绩预告/快报 | 季事件 | akshare | 30MB |
| C 股本/公司行为 | 股本结构变动 | 事件 | akshare | 50MB |
| | 十大股东+十大流通股东 | 季 | akshare | 250MB |
| | 分红送转配股 | 事件 | baostock | 40MB |
| | 限售解禁 | 事件 | akshare | 20MB |
| D 估值/复权(日频) | 估值快照(PE/PB/PS/PF/股息率/市值/流通市值) | 日 | akshare | 300MB |
| | 复权因子(qfq/hfq) | 日 | baostock | 150MB |
| E 市场参考(日频,可选) | 龙虎榜/大宗交易/融资融券/北向/ST停复牌 | 日 | akshare | ~360MB |
## 存储格式与目录
**parquet(每类一个目录)**,VPS `C:\sanguo_vnpy_v2\data\static\<type>\`。匹配现有 15min/daily parquet 模式,回测 pandas 直读,增量 append/overwrite 幂等。
```
data/static/
basic/ 基础信息(全量刷新,1文件 or per-stock)
industry/ 行业分类
index_const/ 指数成分
balance/ 资产负债表(per-stock parquet)
income/ 利润表
cashflow/ 现金流量表
indicator/ 季频财务指标(ROE/EPS/...)
forecast/ 业绩预告/快报
share_capital/ 股本结构
top_holders/ 十大股东
dividend/ 分红送转
lockup_release/ 限售解禁
valuation/ 估值日频(PE/PB/市值)
adjust_factor/ 复权因子
dragon_tiger/ 龙虎榜
block_trade/ 大宗交易
margin/ 融资融券
northbound/ 北向资金
```
## 数据源映射 + 串行约束(关键)
| 源 | 数据 | 并发约束 |
|---|---|---|
| **baostock** | 基础信息/复权因子/分红/季频指标/三表 | **单登录串行,跟15min共用登录→必须等15min跑完才能开**(并发=IP封6-24h) |
| **akshare** | 估值/龙虎榜/大宗/融资融券/北向/指数成分/行业/股本/十大股东/解禁/业绩预告 | 不同源,可与baostock错峰;东财源要限速防反爬 |
## 准确性协议(每类数据强制)
1. **断点续传 marker + 失败/空数据区分**(复用 15min 的 empty-vs-failed 修复)
2. **下载后抽样验证(≥10只)**:字段完整 / 日期覆盖(回溯到2020) / 值合理性(PE>0、ROE合理区间、volume≥0、OHLC 自洽)
3. **行数 + 覆盖率统计**写入日志
4. **幂等写入**(per-stock parquet overwrite;INSERT OR REPLACE 若入 DB),staging 隔离→验证→合并(用户铁律:绝不直写主库/主目录未验)
5. (可选)跨源抽检:baostock 季频财务 vs miniQMT PershareIndex 抽几只对一对
## 每日自动更新机制
Windows schtask `sanguo-static-daily`,每日盘后 **16:30**`daily_update_static.py`:
- **日频类(估值/龙虎榜/大宗/融资融券/北向)**:追加当日(或近N日补漏)
- **小表全量刷新**:基础信息/行业/指数成分/分红(事件少,全量省得算增量)
- **财报季(4/8/10月底后)**:追加新季报(三表/季频/十大股东)
- **复权因子**:每日刷新(除权事件会改累计因子)
- 失败告警 + 断点续传 + **绝不破坏既有数据**(只 append/replace 单日单股)
- 串行 baostock 部分 + 限速 akshare 部分,单进程跑完
## 执行阶段
- **Phase 0(进行中)**:15min baostock,ETA 07-19 ~22:30
- **Phase 1**:baostock 静态下载脚本(基础/复权/分红/季频/三表)— **构建 now,运行须等15min完**
- **Phase 2**:akshare 静态下载脚本(估值/龙虎榜/大宗/融资融券/北向/指数成分/行业/股本/十大股东/解禁/业绩预告)— **构建+可now起**(不同源)
- **Phase 3**:每类抽样验证 → 修问题
- **Phase 4**:每日更新 schtask + 验证增量
## akshare 调查结果(2026-07-19 确认,15类端点实证)
**15类中 11 类端点直接可用,4 类有替代。财务类全部"单股一次拉全历史"(完美绕开 baostock per-quarter 百万调用)。全量 ~2.5-3GB,单线程 17-22h(可挂机,不同源可与 baostock 并行)。**
确认端点(4种模式):
- **per-stock(5500股×1调用)**:估值`stock_value_em` / 北向`stock_hsgt_individual_em` / 股本`stock_share_change_cninfo` / 十大流通`stock_gdfx_free_top_10_em`(×20报告期) / **三大报表`stock_balance/profit/cash_flow_sheet_by_report_em`(319/203/254列全历史)** / 财务摘要`stock_financial_abstract`
- **per-date(交易日×1调用)**:龙虎榜`stock_lhb_detail_em` / 大宗`stock_dzjy_mrmx(symbol="A股")` / 融资融券沪`stock_margin_detail_sse` / 解禁`stock_restricted_release_detail_em`
- **per-period(报告期×1调用)**:业绩预告`stock_yjyg_em` / 业绩快报`stock_yjkb_em`
- **one-shot**:指数成分`index_stock_cons_csindex`(300/500/1000) / 行业`sw_index_first_info`(申万,东财`stock_board_industry_name_em`ConnectionError 弃用)
**有问题/替代**:`stock_margin_detail_szse`(深融资融券)超时频繁→先跳过;`stock_gdfx_holding_detail_em(date)`按日全市场超时→改个股循环;`stock_a_indicator_lg`新版删→用`stock_value_em`
**大小明细**:估值150MB / 三大报表1.2GB / 财务摘要300MB / 北向120MB / 融资融券500MB / 十大流通60MB / 其余<100MB各。**总~2.5-3GB**。
**优先级**:P0 三大报表+财务摘要(~1.5GB,~10h,核心财务)→ P1 估值+北向+融资融券(~770MB,~3h)→ P2 龙虎榜/大宗/解禁/业绩预告/股本/指数/行业(~300MB,~1h)。
## 部署架构(自愈链,2026-07-19)
- **15min baostock**:schtask `sanguo-bs15min` + 自愈.bat(ping-sleep 30min重试)。2026-07-19 12:00 baostock全球故障(Mac+VPS同挂10002007),自愈中,恢复即续 from marker 2847。
- **baostock静态**:schtask `sanguo-bs-static` + 自愈.bat(**wait15**等15min "ALL DONE" → 自动接力 → ping-sleep自愈)。脚本`baostock_static_download.py`已部署(basic/adjust_factor/dividend,rs.fields动态取字段)。
- **akshare静态**:schtask `sanguo-bs-akshare`(待建)+ 自愈.bat。脚本构建中。**不同源,可与baostock并行**。
- 监控:cron 779cbb71 每30min probe_all + 异常自修 + 完成报告。caffeinate防睡眠。
- **.bat sleep 用 `ping -n N 127.0.0.1`**(timeout.exe在SYSTEM schtask下失效,见 memory schtasks-system-bat-gotchas)。