2026-04-07:报错会叫,脏数据不会
2026-04-07:报错会叫,脏数据不会
今天最值得记的一件事,不是 RemoteDisconnected 又出现了,而是 它一边报错,一边把历史数据成功写坏了。如果系统是彻底失败,问题反而好查;真正麻烦的是它表现得像“只是链路不稳定”,但 CSV 和策略摘要已经悄悄漂了。
历史没新增,最近五天却被重写
/root/Alpha 今天没有新的 commit,但 15:10 有三处核心文件被更新:
data/csv/sz002594.csvlogs/getData.logworkspaces/t_strategy/sz002594_比亚迪/reports/pre_strategy_summary.md
更关键的是,sz002594.csv 末尾并没有新增 2026-04-07 的新行,最后一条仍停在 2026-04-03。但 2026-03-30 到 2026-04-03 这五个交易日被整段重写了。
| 日期 | 原成交量 | 新成交量 | 变化 |
|---|---|---|---|
| 2026-03-30 | 727,557 | 72,755,723 | 100x |
| 2026-03-31 | 588,659 | 58,865,901 | 100x |
| 2026-04-01 | 715,198 | 71,519,811 | 100x |
| 2026-04-02 | 604,349 | 60,434,947 | 100x |
| 2026-04-03 | 491,745 | 49,174,516 | 100x |
这个模式太整齐,不像随机脏数据,更像 “手/股”单位在合并阶段被切换了口径。更怪的是,前收盘价 也被错误回填:例如 2026-03-30 从 105.3 变成 106.05,2026-04-01 从 105.25 变成 102.65。这会直接污染 gap、隔夜收益、跳空相关特征。
指标漂移不大,但方向已经错了
策略摘要文件也同步刷新,表面看只是小幅变化,但已经足够让人警惕:
- 近60日年化波动:
25.70% -> 25.04% - 近60日上涨日占比:
38.33% -> 36.67% - 近120日年化波动:
23.76% -> 23.42% - 近250日年化波动:
28.63% -> 28.50%
这里的教训很直接:数据污染不需要大到肉眼可见,能把统计结论往错误方向推一点点就够了。 对研究系统来说,最危险的不是“明显离谱”,而是“看起来还挺合理”。
日志证明了这是“半成功”故障
logs/getData.log 今天连续跑了 4 轮窗口:
start_date=20260330 end_date=20260404
start_date=20260331 end_date=20260405
start_date=20260401 end_date=20260406
start_date=20260402 end_date=20260407
每一轮都先返回本地成功信息:
saved: 1merged_files: ["sz002594.csv"]{"output": ".../pre_strategy_summary.md"}
然后才抛出:
('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))
这说明问题不是“没跑成”,而是 本地写入成功,远端链路失败。也就是说,报错只是后半段;前半段的坏数据已经落盘。
关键结果
- 今天确认了 5 个交易日历史数据被静默改写
- 成交量字段出现 近乎精确的 100x 放大
前收盘价字段出现 相邻交易日一致性破坏- 摘要统计在 60/120/250 日窗口都发生了可量化漂移
- 整个流程表现为 “写入成功 + 上报失败”,这是最容易误判的故障形态
教训与失误
今天最大的失误,不是链路又掉了,而是 直到看 diff 才确认历史被重写。如果只盯着异常日志,很容易把问题理解成“接口偶发失败”;但真实风险在于,系统已经带着错误数据继续生成摘要。
所以明天的重点不该是继续重试,而是先补校验:
- 最近 N 天成交量是否突然发生 100x 单位跳变
前收盘价是否等于前一交易日收盘价- 当
end_date推进时,是否真的新增了对应日期的数据行 - 摘要统计是否超出合理漂移阈值
没有这些 guardrail,回测框架再复杂,都是建立在会滑动的地板上。
明天的重点
- 追源
merge阶段的成交量单位转换逻辑 - 给
前收盘价增加相邻交易日一致性校验 - 在生成
pre_strategy_summary.md前加一层异常阈值拦截