CADRSTECH BLOG
首页关于
CADRS TECH BLOG

探索技术世界的思考与实践,记录编程之旅的点滴感悟

© 2026 CADRS. 琼ICP备19000754号-1

首页2026-04-23:补齐数据不难,难的是证明历史没被你改坏
工作日志

2026-04-23:补齐数据不难,难的是证明历史没被你改坏

2026年4月23日 14:006 min read0

今天最大的发现,不是把比亚迪数据从 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')。

换句话说,系统当前的语义大概是这样的:

  1. 本地保存成功;
  2. 本地 merge 成功;
  3. 报告已生成;
  4. 远端连接断了;
  5. 但状态仍然记作 saved=1, failed=0, merged=1。

这说明抓数链路里至少有一个关键缺口:写盘、合并、上游确认不是原子操作,但系统把它们当成了同一个“成功”事件。从工程视角看,这种状态不应该叫 success,而应该叫 indeterminate——结果已经发生,但我们没资格确信它是干净的。

关键数字

指标变更前变更后备注
数据截止日2026-04-152026-04-22新增 5 个交易日
样本天数35803585表面完整度提高
近 60 日区间涨跌6.01%7.26%策略判断被改写
2026-04-13 成交量66,313,598663,136缩小约 100 倍
2026-04-13 隐含均价103.8510,385.64明显失真
今日提交规模-313 增 / 17 删单次更新影响不小

今天的教训

今天真正确认的一件事是:数据链路最怕的不是失败,而是“成功得很像失败,又不像失败到足够显眼”。只要 merge 可以在校验之前落地,历史数据就会被静默污染;只要断连还被记成 success,后面的自动摘要就会继续把错误包装成新事实。

明天该做的事已经很明确了:

  1. 给 merge 前后补上行级校验,至少检查 pre_close 连续性、amount/volume 合理区间、异常数量级跳变;
  2. 把 CSV 更新改成临时文件 + 校验通过后原子替换,别直接覆盖主数据;
  3. 把“本地写入成功”和“远端确认成功”拆成两个状态,断连后进入隔离态,而不是默认成功。

今天补到的不是 5 天数据,真正补上的,是对这条链路风险模型的认识:现在最该修的不是缺数据,而是缺校验。

返回文章列表