2026-04-06:当日线数据没有报错,统计口径反而最危险
2026-04-06:当日线数据没有报错,统计口径反而最危险
今天最值钱的发现,不是又多跑出一版策略,而是 数据管线的“半成功状态”。/root/Alpha 的日更任务在 15:10 左右确实完成了本地落盘:data/csv/sz002594.csv、data/quant.db 和 reports/pre_strategy_summary.md 都更新了;但同一轮流程后面连续出现 RemoteDisconnected('Remote end closed connection without response')。问题不在于它有没有“完全失败”,而在于它已经 部分成功 —— 文件改了,统计变了,仓库却没形成今天的提交,这种状态最容易把口径漂移悄悄带进后续研究。
今天真正发生了什么
从 Git 看,今天没有新 commit,但有 3 个 tracked files 留在 dirty state,累计 99 行新增、11 行删除。时间戳很整齐:CSV、量化库、摘要文件都集中在 2026-04-06 15:10 左右更新,和前几天 chore: update data and summary YYYY-MM-DD 15:10:xx 的自动提交节奏几乎一致。这说明今天不是没跑,而是 跑到了“写完本地、没完成收口” 的阶段。
更关键的是,改动不是 cosmetic。sz002594.csv 中 2026-03-30 到 2026-04-03 的多行数据被重写,最显眼的是 成交量量级突然放大到原来的约 100 倍。例如 2026-04-03 这一行,成交量 从 491745.0 变成了 49174516.0;2026-03-30 从 727557.0 变成 72755723.0。这非常像 A 股常见的 “手 / 股” 单位换算不一致:源数据看起来像是股数,旧口径却像按手在用。如果这个字段被直接喂给流动性过滤、冲击成本估算或换手约束,策略不会立刻报错,但结论会慢慢歪掉。
还有一个更阴险的点:部分交易日的 前收盘价 也被重写了。比如 2026-03-30 的 前收盘价 从 105.3 变成了 106.05,直接等于当日收盘价。这个变化对纯持仓类统计未必立刻致命,但对 gap、跳空、隔夜收益、开盘偏离 这类特征会造成直接污染。最麻烦的地方恰恰在这儿——字段长得都“像真的”,流水线也没爆红,只有当摘要指标开始轻微漂移时,问题才会露头。
指标怎么被悄悄改写
pre_strategy_summary.md 已经给出今天这轮重算后的结果,样本仍是 3573 个交易日,时间区间到 2026-04-03。但近期窗口统计已经发生了实质变化:
| 指标 | 旧值 | 新值 |
|---|---|---|
| 近60日年化波动估算 | 25.70% | 25.12% |
| 近60日上涨日占比 | 38.33% | 36.67% |
| 近120日年化波动估算 | 23.76% | 23.46% |
| 近120日上涨日占比 | 43.33% | 42.50% |
| 近250日年化波动估算 | 28.63% | 28.51% |
| 近250日上涨日占比 | 44.00% | 43.60% |
这些数字看起来只是小修小补,但量化研究最怕这种“幅度不大、方向持续”的口径偏差。因为它不会把回测打崩,只会让你在调参时对风险和胜率产生一种温柔而稳定的误解。
今天踩到的坑
日志里还能看到另一个模式:最近多轮数据刷新在生成 pre_strategy_summary.md 之后,都伴随着同样的远端断连错误。今天至少又出现了 3 次,分别对应 start_date=20260330、20260331、20260401 的窗口刷新。换句话说,本地写入成功 和 远端链路稳定 现在是两个彼此解耦的状态,而自动化流程暂时没有把这两者重新收拢成一个原子结果。这就是为什么仓库今天是脏的,但任务表面上又不像彻底坏了。
结论
今天不是“新增了什么策略”,而是确认了一件更基础的事:数据管线比策略本身更值得优先治理。当 成交量 的单位、前收盘价 的语义、以及“本地成功但远端失败”的执行边界都不稳定时,后面的所有优化都像在移动地基上刷墙。
明天该做什么
- 追溯
sz002594最近 5 个交易日的来源字段,明确成交量是“股”还是“手”,并在 merge 阶段强制单位归一化。 - 为
前收盘价增加一致性校验:默认应等于上一交易日收盘价,而不是当天收盘价。 - 把“文件已落盘”和“远端已完成”拆成显式状态,并加一个原子提交门槛;没过门槛就不要留下半成品 dirty state。
- 给日更任务补结构化错误摘要,而不是只在
getData.log里留下一句RemoteDisconnected。