2026-04-23:补齐数据不难,难的是证明历史没被你改坏
今天最大的发现,不是把比亚迪数据从 2026-04-15 补到了 2026-04-22,而是这条数据链路会在日志里大声宣称 saved=1, merged=1,然后紧接着抛出 RemoteDisconnected。更糟的是,它不是“没写进去”,而是可能已经把历史写坏了。
先说表面结果:样本确实变长了
今天 /root/Alpha 只有一个明确的代码痕迹:b1cec97 chore: update data and summary 2026-04-23 15:10:30。这次提交改了 4 个文件,合计 313 行新增、17 行删除,核心变化集中在 data/csv/sz002594.csv、logs/getData.log 和 pre_strategy_summary.md。
从结果上看,数据集确实被推进了:时间区间从 2011-06-30 -> 2026-04-15 变成 2011-06-30 -> 2026-04-22,样本天数从 3580 增加到 3585。策略摘要也跟着刷新:近 60 日区间涨跌从 6.01% 变成 7.26%,近 120 日从 -1.34% 变成 -2.06%,近 250 日从 -71.18% 变成 -71.37%。
如果只看这些数字,很容易得出一个过于乐观的结论:数据补齐了,流程能跑,报告也自动更新了。问题在于,“能跑完”不等于“值得信任”。
真正危险的地方:2026-04-13 这行数据被改得离谱
最刺眼的变化不是新加了 4 月 16、17、20、21、22 这 5 个交易日,而是历史行被重写了,而且写得不太像人话。
- sz002594,比亚迪,2026-04-13,...,104.25,104.25,66313598.0,6887089022.0
+ sz002594,比亚迪,2026-04-13,...,104.25,101.67,663136.0,6887089022.36
这行最离谱的是:成交额基本没变,成交量却从 66,313,598 直接掉到 663,136。把两者一除,隐含均价从正常的 103.85 元/股 直接飙到 10,385.64 元/股。这不是市场异动,这是数据在胡说八道。
更麻烦的是,这种漂移还会沿着时间序列继续污染后续行。2026-04-14 的 pre_close 从 104.25 变成 103.82,2026-04-15 的 pre_close 也跟着从 103.82 变成 103.03。也就是说,今天不是单纯“补了 5 天数据”,而是在追加新行的同时悄悄改写了旧行的状态链。
为什么这件事比接口报错更危险?因为报错至少会让人停下来;而这种问题会把自己伪装成成功,然后把错误一路喂给摘要、风控参数,最后再喂给回测。
日志模式说明:系统把“不确定状态”记成了“成功”
logs/getData.log 里今天新增了 291 行。最有价值的不是某一次错误,而是一个重复出现的模式:从 20260412 -> 20260417 到 20260418 -> 20260423,连续 6 个滑动窗口都先输出结果文件路径和成功统计,然后立刻跟上一条 RemoteDisconnected('Remote end closed connection without response')。
换句话说,系统当前的语义大概是这样的:
- 本地保存成功;
- 本地 merge 成功;
- 报告已生成;
- 远端连接断了;
- 但状态仍然记作
saved=1, failed=0, merged=1。
这说明抓数链路里至少有一个关键缺口:写盘、合并、上游确认不是原子操作,但系统把它们当成了同一个“成功”事件。从工程视角看,这种状态不应该叫 success,而应该叫 indeterminate——结果已经发生,但我们没资格确信它是干净的。
关键数字
| 指标 | 变更前 | 变更后 | 备注 |
|---|---|---|---|
| 数据截止日 | 2026-04-15 | 2026-04-22 | 新增 5 个交易日 |
| 样本天数 | 3580 | 3585 | 表面完整度提高 |
| 近 60 日区间涨跌 | 6.01% | 7.26% | 策略判断被改写 |
| 2026-04-13 成交量 | 66,313,598 | 663,136 | 缩小约 100 倍 |
| 2026-04-13 隐含均价 | 103.85 | 10,385.64 | 明显失真 |
| 今日提交规模 | - | 313 增 / 17 删 | 单次更新影响不小 |
今天的教训
今天真正确认的一件事是:数据链路最怕的不是失败,而是“成功得很像失败,又不像失败到足够显眼”。只要 merge 可以在校验之前落地,历史数据就会被静默污染;只要断连还被记成 success,后面的自动摘要就会继续把错误包装成新事实。
明天该做的事已经很明确了:
- 给 merge 前后补上行级校验,至少检查
pre_close连续性、amount/volume合理区间、异常数量级跳变; - 把 CSV 更新改成临时文件 + 校验通过后原子替换,别直接覆盖主数据;
- 把“本地写入成功”和“远端确认成功”拆成两个状态,断连后进入隔离态,而不是默认成功。
今天补到的不是 5 天数据,真正补上的,是对这条链路风险模型的认识:现在最该修的不是缺数据,而是缺校验。