[sanguo_vnpy_v2] P0:三表 income/cashflow 冻结在07-20,balance仍在更——错位致 live_21 今早误清仓48万 #49

Open
opened 2026-09-01 04:55:37 +00:00 by claude_dev · 1 comment
Owner

现象(2026-09-01 09:32 实录)

live_21 (value_selection_ex) 选股漏斗 L1=174 L2=206 L3=0 L4=496 L5=55 L6=42 → final=0,全市场 821 只 L3(近4季ROE>各季均值)全灭(08-25/26 同漏斗 L3=348、final=2)。final=0 → 目标持仓 0 → 今早 09:32 把整仓清了(600276 恒瑞 5300股 + 603288 海天 7000股 ≈ 48.0万)——数据 bug 导致的真实卖出。shadow_62 同决策(双轨一致地中招)。

根因:三表两冻一更,REPORT_DATE 对不齐

VPS C:\sanguo_vnpy_v2\data\static\ 下(600276.SH 为证):

表 parquet+marker mtime 最新报告期
income 2026-07-20 01:26(冻结6周) 2026-03-31 一季报
cashflow 2026-07-20 08:27(冻结6周) 2026-03-31 一季报
balance 2026-09-01 06:27(今晨仍在更) 2026-06-30 中报(NOTICE 2026-08-20)

ROE = PARENT_NETPROFIT(income) / TOTAL_PARENT_EQUITY(balance) 按 REPORT_DATE 对齐取近4季:income 止步 Q1'26、balance 已到 Q2'26 → 只对得上 3 季 → roe_series 长度 3 < 4 → 所有股票被 L3 剔除。

佐证:L5/L6(纯 income 的 yoy 字段)与 08-25 一字不差(55/42)= income 纹丝未动;L2(纯 balance)微变 200→206 = balance 在更新。

管线侧证据

  • data/static/logs/ 的 akshare_static_*.log 每天三班次(19:00/19:30/02:00)都在跑,近log: akshare_static_20260901_020002.log(最后写入 09-01 12:47)
  • 即:akshare 静态管线的 balance 阶段有效,income/cashflow 阶段自 07-20 起无效(marker 不再更新)
  • marker 文件形态 .600276.SH_income.akshare(每股票每表一个)

为什么潜伏 6 周才爆

Q1'26 一季报 4 月已全量到位,income 冻结后近4季窗口(Q1'26~Q2'25)在 7-8 月仍完整可用;中报季(08-31 截止)balance 抢先吃到 Q2'26 才把错位引爆。

待办(数据 session)

  1. 查 akshare 静态管线 income/cashflow 阶段 07-20 起失败/跳过的原因(看 07-20 后的 akshare_static log income 相关行;akshare 接口变更?)
  2. 修复 + 回灌 07-20→今 的 income/cashflow 中报数据
  3. 加「表级新鲜度」防线:income/balance/cashflow 最新 NOTICE_DATE 相差 >N 天即告警(这次若在,07-21 就会响)

影响面

  • value_selection(live_21 + shadow_62):final=0 清仓;数据修复前每天 final=0(无额外卖出伤害,策略停摆等数据)
  • 数据修复后次日 09:30 selection 自动恢复正常并重新建仓,无需人工干预仓位

关联

  • live-ops session 已修另一独立 bug:sqlite 跨线程(9f264f8),与本题无关
  • 本 issue 由 09-01 开盘巡检发现(@live-ops session)
## 现象(2026-09-01 09:32 实录) live_21 (value_selection_ex) 选股漏斗 `L1=174 L2=206 L3=0 L4=496 L5=55 L6=42 → final=0`,**全市场 821 只 L3(近4季ROE>各季均值)全灭**(08-25/26 同漏斗 L3=348、final=2)。final=0 → 目标持仓 0 → **今早 09:32 把整仓清了(600276 恒瑞 5300股 + 603288 海天 7000股 ≈ 48.0万)——数据 bug 导致的真实卖出**。shadow_62 同决策(双轨一致地中招)。 ## 根因:三表两冻一更,REPORT_DATE 对不齐 VPS `C:\sanguo_vnpy_v2\data\static\` 下(600276.SH 为证): | 表 | parquet+marker mtime | 最新报告期 | |----|---------------------|-----------| | income | **2026-07-20 01:26(冻结6周)** | 2026-03-31 一季报 | | cashflow | **2026-07-20 08:27(冻结6周)** | 2026-03-31 一季报 | | balance | **2026-09-01 06:27(今晨仍在更)** | **2026-06-30 中报**(NOTICE 2026-08-20) | ROE = PARENT_NETPROFIT(income) / TOTAL_PARENT_EQUITY(balance) 按 REPORT_DATE 对齐取近4季:income 止步 Q1'26、balance 已到 Q2'26 → 只对得上 3 季 → roe_series 长度 3 < 4 → **所有股票被 L3 剔除**。 佐证:L5/L6(纯 income 的 yoy 字段)与 08-25 一字不差(55/42)= income 纹丝未动;L2(纯 balance)微变 200→206 = balance 在更新。 ## 管线侧证据 - `data/static/logs/` 的 `akshare_static_*.log` 每天三班次(19:00/19:30/02:00)都在跑,近log: `akshare_static_20260901_020002.log`(最后写入 09-01 12:47) - 即:**akshare 静态管线的 balance 阶段有效,income/cashflow 阶段自 07-20 起无效**(marker 不再更新) - marker 文件形态 `.600276.SH_income.akshare`(每股票每表一个) ## 为什么潜伏 6 周才爆 Q1'26 一季报 4 月已全量到位,income 冻结后近4季窗口(Q1'26~Q2'25)在 7-8 月仍完整可用;**中报季(08-31 截止)balance 抢先吃到 Q2'26 才把错位引爆**。 ## 待办(数据 session) 1. [ ] 查 akshare 静态管线 income/cashflow 阶段 07-20 起失败/跳过的原因(看 07-20 后的 akshare_static log income 相关行;akshare 接口变更?) 2. [ ] 修复 + 回灌 07-20→今 的 income/cashflow 中报数据 3. [ ] 加「表级新鲜度」防线:income/balance/cashflow 最新 NOTICE_DATE 相差 >N 天即告警(这次若在,07-21 就会响) ## 影响面 - value_selection(live_21 + shadow_62):final=0 清仓;数据修复前每天 final=0(无额外卖出伤害,策略停摆等数据) - 数据修复后次日 09:30 selection 自动恢复正常并重新建仓,无需人工干预仓位 ## 关联 - live-ops session 已修另一独立 bug:sqlite 跨线程(9f264f8),与本题无关 - 本 issue 由 09-01 开盘巡检发现(@live-ops session)
Author
Owner

09-01 傍晚重要进展(开盘巡检后跟踪)

income 已开始自愈:白天发现 akshare_static 02:00 马拉松批次(跑到 12:47 还没完,实际跑了 16h+)全宇宙重写 income——18:40 时点 5552/5553 个 income parquet mtime≥08-31;600276 income 14:41 已补进 2026-06-30 中报,与 balance 完全对齐。

cashflow 仍冻结(仅 45/5530 动过),但 get_value_metrics 对 cashflow 只用年报口径(_latest_n_annual,Q4'25 年报 3 月已到位)→ L4/FCF 不受影响,非阻塞。

根因图景修正(供数据session排查)

不是「管线死了」而是双速错位:

  • balance 走的快路每天更新(09-01 06:27 完成全量+中报)
  • income/cashflow 的日增量路径自 07-20 起无效(600276 的 Q2'26 中报 NOTICE=08-20,若是增量正常,08-2x 就该进来;实际 marker 停在 07-20)
  • 只有 02:00 全量马拉松批次能带回 income 数据,但单趟 16h+(02:00→18:00+),工作日跑完已错过当日 09:32 选股
  • 中报季 balance 先到、income 后到 → 09-01 上午出现 L3=0 错位窗口(清仓事故),14:41 income 对齐后窗口关闭

待办更新

  1. 仍需查:日增量路径 07-20 起 income/cashflow 无效的原因(marker 逻辑?接口变更?)
  2. 02:00 全量批次的时长(16h)与 19:00/19:30/02:00 三班次的重叠风险(今晚 02:00 批次可能还没跑完,19:00 班次又将启动)
  3. 明早 09:32 验证:value_selection L3 应恢复(今日对齐后的数据),若恢复则 live_21/shadow_62 自动重新建仓,仓位无需人工干预
  4. 表级新鲜度防线仍建议加(balance vs income 最新 NOTICE_DATE 差>N 天告警)

09-01 事故复盘结论

  • 清仓已成事实(live_21 卖 600276+603288≈48万,shadow_62 同步);数据对齐后明早自动重建,损失=一轮换仓摩擦
  • 恒等式 09-01 仍 PASS(未归因 4242 与本题无关,是 002646 的 600 股 QMT 明细行缺失,另案)
## 09-01 傍晚重要进展(开盘巡检后跟踪) **income 已开始自愈**:白天发现 akshare_static 02:00 马拉松批次(跑到 12:47 还没完,实际跑了 16h+)全宇宙重写 income——18:40 时点 **5552/5553 个 income parquet mtime≥08-31**;600276 income 14:41 已补进 **2026-06-30 中报**,与 balance 完全对齐。 **cashflow 仍冻结(仅 45/5530 动过)**,但 get_value_metrics 对 cashflow 只用**年报口径**(_latest_n_annual,Q4'25 年报 3 月已到位)→ L4/FCF 不受影响,非阻塞。 ## 根因图景修正(供数据session排查) 不是「管线死了」而是**双速错位**: - balance 走的快路每天更新(09-01 06:27 完成全量+中报) - income/cashflow 的**日增量路径自 07-20 起无效**(600276 的 Q2'26 中报 NOTICE=08-20,若是增量正常,08-2x 就该进来;实际 marker 停在 07-20) - 只有 02:00 全量马拉松批次能带回 income 数据,但**单趟 16h+**(02:00→18:00+),工作日跑完已错过当日 09:32 选股 - 中报季 balance 先到、income 后到 → 09-01 上午出现 L3=0 错位窗口(清仓事故),14:41 income 对齐后窗口关闭 ## 待办更新 1. [ ] 仍需查:日增量路径 07-20 起 income/cashflow 无效的原因(marker 逻辑?接口变更?) 2. [ ] 02:00 全量批次的时长(16h)与 19:00/19:30/02:00 三班次的重叠风险(今晚 02:00 批次可能还没跑完,19:00 班次又将启动) 3. [ ] 明早 09:32 验证:value_selection L3 应恢复(今日对齐后的数据),若恢复则 live_21/shadow_62 自动重新建仓,仓位无需人工干预 4. [ ] 表级新鲜度防线仍建议加(balance vs income 最新 NOTICE_DATE 差>N 天告警) ## 09-01 事故复盘结论 - 清仓已成事实(live_21 卖 600276+603288≈48万,shadow_62 同步);数据对齐后明早自动重建,损失=一轮换仓摩擦 - 恒等式 09-01 仍 PASS(未归因 4242 与本题无关,是 002646 的 600 股 QMT 明细行缺失,另案)
Sign in to join this conversation.