今天最有价值的发现,不是 sz002594 补进了 4 月 7 日这一根新 K 线,而是同一轮回填把 3 月 30 日到 4 月 3 日 这 5 个交易日又重写了一遍。成交量单位终于从“手”统一成了“股”,但 前收盘价 链条还是被写坏了——几乎整齐地贴成了“等于当日收盘价”,直接把这几天的收益率压成了 0。
今天的 git 变更只有一个提交:4cea358 chore: update data and summary 2026-04-08 15:10:32。表面看只是常规数据更新,实际 diff 很有信息量:sz002594.csv 改了 6 行,新增 2026-04-07,同时回写了 2026-03-30 ~ 2026-04-03。
这次回写里,成交额几乎没变,成交量却精确放大 100 倍。这说明旧数据大概率混用了“手”和“股”,而新数据把单位纠正回了“股”。例如:
| 日期 | 成交量(旧) | 成交量(新) | 倍数 | 前收盘价(旧) | 前收盘价(新) |
|---|---|---|---|---|---|
| 2026-03-30 | 727,557 | 72,755,723 | 100x | 105.30 | 106.05 |
| 2026-03-31 | 588,659 | 58,865,901 | 100x | 106.05 | 105.25 |
| 2026-04-01 | 715,198 | 71,519,811 | 100x | 105.25 | 102.65 |
| 2026-04-02 | 604,349 | 60,434,947 | 100x | 102.65 | 101.65 |
| 2026-04-03 | 491,745 | 49,174,516 | 100x | 101.65 | 99.01 |
问题在后一列:回填后的 前收盘价 基本都等于当日收盘价。对收益计算来说,这不是小误差,而是直接把一根真实的 K 线改写成 0% 收益的假数据。4 月 7 日新追加的一行看起来正常,但前面 5 天被“修量不修链”,整个收益序列还是脏的。
摘要文件 pre_strategy_summary.md 今天最值得看。样本天数只是从 3573 增到 3574,但近端窗口统计却明显变脸:
| 指标 | 更新前 | 更新后 | 变化 |
|---|---|---|---|
| 全样本区间涨跌 | 289.04% | 284.99% | -4.05 pct |
| 近60日区间涨跌 | 1.32% | -0.13% | -1.45 pct |
| 近60日年化波动 | 25.70% | 24.19% | -1.51 pct |
| 近60日上涨日占比 | 38.33% | 36.67% | -1.66 pct |
| 近120日区间涨跌 | -9.34% | -11.41% | -2.07 pct |
为什么只加一天数据,窗口画像却像换了一套市场?答案不是行情,而是数据链条本身被改写了。今天新增的 4 月 7 日收盘价是 97.98,相对 4 月 3 日的 99.01,单日跌幅约 -1.04%;但真正拉低统计稳定性的,不是这根新 K 线,而是那 5 根被重写成“零收益”的旧 K 线。
更麻烦的是,这不是孤例。检查最近 60 个交易日,前收盘价 != 前一交易日收盘价 的记录有 15 天,占了 25%。也就是说,摘要模块现在读到的并不是“市场怎么走”,而是“回填器最近怎么写”。
logs/getData.log 里今天留下了一串很典型的半成功轨迹。窗口从 20260330→20260404 一直滚到 20260403→20260408,前 4 轮都是:
RemoteDisconnected('Remote end closed connection without response')这类顺序最危险。因为它不会让本地看起来“失败”,但会把同一批数据反复回写,直到远端链路走通为止。于是我们今天看到的不是一次干净更新,而是一串 带副作用的重放。如果回填逻辑本身对 前收盘价 处理不稳,重试次数越多,摘要越漂。
assert prev_close[t] == close[t-1]
assert abs((amount / volume) - close) / close < 0.2
这种检查应该在摘要生成前就拦住,而不是事后再靠 diff 猜哪里坏了。
今天不是“补了一天数据”这么简单,而是确认了两件事:
真正该修的,不是摘要模板,而是回填链路的写入原子性和字段校验顺序。只要 prev_close 还能在重试里被静默改坏,任何基于近期收益、波动、上涨日占比的策略前置判断都会被带偏。
前收盘价 == 前一日收盘价;pre_strategy_summary.md。