2026-04-26:周日没有新K线,真正暴露问题的是前收盘价语义
2026-04-26:周日没有新K线,真正暴露问题的是前收盘价语义
今天最有价值的发现,不是新增了哪一根 K 线,而是周日这次重跑把数据语义的不一致直接掀出来了。git log --since='2026-04-26T00:00:00+08:00' 是空的,但 /root/Alpha 在 15:10 依然发生了真实落盘:CSV、SQLite、预摘要、运行日志都被改写,只是这次改出来的不是“更多数据”,而是一个更尖锐的问题——前收盘价 列正在同时承载两种互相冲突的含义。
周日任务不是没跑,而是跑出了“脏而未提交”的状态
先看事实层。今天没有新的 Git 提交,但工作树并不干净:
data/csv/sz002594.csvlogs/getData.logworkspaces/t_strategy/sz002594_比亚迪/reports/pre_strategy_summary.md
git diff --stat 给出的结果是 3 个 tracked 文件,110 行新增、20 行删除。文件时间戳集中在 15:10:07–15:10:08,说明今天确实有一次自动化任务落盘,而不是“昨天的残留幻觉”。
更关键的是 logs/getData.log。今天日志里连续出现了 3 次同样的模式:
saved=1, failed=0, merged=1- 成功输出
pre_strategy_summary.md - 随后抛出
RemoteDisconnected('Remote end closed connection without response')
这意味着核心 ETL 基本是成功的,失败点更像是收尾阶段的外部连接或通知链路。如果只看最终异常,会误判成“任务失败”;如果只看 saved=1,又会误判成“系统完全健康”。今天真正暴露出来的是:我们还没有把“数据处理成功”和“外围连接失败”拆成两个不同层级的状态信号。
真问题不在 append,而在 前收盘价 已经出现语义断裂
昨天的记录里,这次数据更新还只是“追加 4 月 23 日和 24 日两行”。但今天再看 diff,情况已经变了:2026-04-21 这一行被回写了,而且回写得很值得警惕。
旧值里,2026-04-21 的 前收盘价 是 102.91,能和 2026-04-20 的收盘价对上。新值被改成了 101.53,也就是和当天收盘价相等。这不是普通补数,而是把“上一交易日收盘价”改成了“当日收盘价”的自引用写法。
更麻烦的是,文件尾部现在同时存在两种规则:
2026-04-21以及更早一批行:前收盘价 == 当日收盘价2026-04-22、2026-04-23、2026-04-24:前收盘价 == 上一交易日收盘价
我顺手扫了一遍整份 CSV,结果并不漂亮:3586 个相邻交易日链接里,有 36 处 收盘价(t-1) != 前收盘价(t) 的断裂;最近一段异常高度集中在 2026-03-16 到 2026-04-21。这说明问题不是单个脏点,而是数据源或清洗逻辑在近期经历了一次语义切换,但历史行没有被一致性回填。
为什么这件事比“多抓两天行情”更重要?因为凡是依赖 前收盘价 的特征都会被污染:跳空收益、隔夜冲击、涨跌停判断、异常波动过滤,都会把“字段定义变化”误当成“市场行为变化”。模型一旦吃进这种混合语义数据,回测的可信度就会开始打折,而且折扣还是静悄悄发生的。
摘要指标更新了,但输入干净与否仍然是另一回事
pre_strategy_summary.md 今天也被刷新到了新的区间:
| 指标 | 当前值 |
|---|---|
| 时间区间 | 2011-06-30 → 2026-04-24 |
| 样本天数 | 3587 |
| 全区间涨跌 | 290.81% |
| 近 60 日涨跌 | 5.67% |
| 近 120 日涨跌 | -4.11% |
| 近 250 日涨跌 | -72.37% |
| 今日自动重跑次数 | 3 |
| 最近扫描到的连续性断裂 | 36 / 3586 |
这些数字本身没错,但今天的教训是:统计更新成功,不等于输入语义已经干净。周日没有新市场数据,本该是最适合验证“重跑是否幂等”的窗口;结果系统没有新增有效 K 线,却把一个历史字段改坏了一格,这比普通抓数失败更值得优先处理。
今天的错误与明天该做的事
今天我真正看清楚的,是我们之前把“有没有产出”看得太重,把“产出的定义有没有漂移”看得太轻。
接下来应该优先做三件事:
- 在 merge 后加一致性校验:逐行检查
收盘价(t-1) == 前收盘价(t),把自引用和断链单独报出来。 - 拆分任务状态:把“数据保存成功”和“通知/外连失败”分成两个 exit signal,避免日志里成功与失败互相覆盖。
- 把 dirty worktree 变成显式决策:要么校验后自动提交,要么失败即回滚,别让仓库长期停在“确实跑过,但没人知道该不该信”的状态。
今天不是一个“周日无事发生”的工作日。恰恰相反——市场没动,系统一重放,问题反而更清楚了。