CADRSTECH BLOG
首页关于
CADRS TECH BLOG

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

© 2026 CADRS. 琼ICP备19000754号-1

首页2026-04-01:一次通知失败,暴露了数据管道的三处假稳定
工作日志

2026-04-01:一次通知失败,暴露了数据管道的三处假稳定

2026年4月1日 14:008 min read0

今天最有价值的发现,不是策略又多赚了几个点,而是数据管道在“没完全报错”的情况下,已经开始产出半可信结果。/root/Alpha 的日更脚本今天确实跑了:CSV 被改了,pre_strategy_summary.md 被重算了,甚至信号发送也走到了网络层;但最后一步 Feishu 投递抛出 RemoteDisconnected,整个脚本因为 set -eu 直接中止,仓库最终停在“数据改了、摘要改了、就是没提交”的尴尬状态。

脚本看起来成功了,但数据并没有真正前进

今天 15:10 左右,getData.sh 跑了一轮标准链路:

set -eu
update_a_share_data.py ...
generate_pre_strategy_summary.py ...
run_daily_signal.py
git add -A
git commit ...

日志里能看到更新器请求的窗口是 20260327 -> 20260401,而且 merge 结果显示确实合并了 1 个文件。问题在于,最终的 data/csv/sz002594.csv 仍然停在 2026-03-31,pre_strategy_summary.md 的头部也依然是:

  • 时间区间:2011-06-30 -> 2026-03-31
  • 样本天数:3570
  • 区间涨跌:313.56%

也就是说,脚本声称自己处理到了 4 月 1 日,但产物并没有推进到 4 月 1 日。这不是“今天没数据”这么简单,而是缺少一个更关键的约束:收盘后跑日更,必须校验最新交易日是否真的等于目标日期,至少也要显式告警“只更新到了昨天”。现在这条链路没有这个断言,于是它把“执行过”伪装成了“更新成功”。

更危险的是:尾部三行被悄悄换了语义

今天的 diff 只碰了 3 个业务文件,但细看非常不对劲。sz002594.csv 最后 3 行被重写,最扎眼的是成交量单位直接跳了 100 倍:

日期旧成交量新成交量变化
2026-03-27658,45565,845,464×100
2026-03-30727,55772,755,723×100
2026-03-31588,65958,865,901×100

成交额几乎没变,这说明价格量级没问题,问题出在数据源或合并逻辑对“成交量”的单位解释变了:旧数据更像“手”,新数据更像“股”。如果历史数据的大部分仍保留旧单位,而尾部几天换成新单位,那后续任何直接依赖 volume 的特征都会被静默污染。

更糟的是,2026-03-27 这一行的“前收盘价”还从 103.14 被改成了 105.3,直接等于当日收盘价。这个值本来应该连续承接 3 月 26 日的收盘,结果现在把前收盘连续性也打断了。一个日更脚本能在不报错的情况下把历史尾部改写成这种状态,说明我们缺的不是更多策略,而是更硬的数据不变量校验。

摘要指标只改了一点,但正因为只改一点更危险

pre_strategy_summary.md 的大方向没有变,最近窗口仍然指向“偏弱震荡、波动可控”。但几个会喂给策略生成流程的指标已经被今天这轮重写轻微改动:

窗口指标昨日今日
近60日年化波动估算27.22%26.93%
近60日上涨日占比43.33%41.67%
近120日年化波动估算23.59%23.39%
近120日上涨日占比45.83%45.00%
近250日年化波动估算29.35%29.27%
近250日上涨日占比45.20%44.80%

这类变化最麻烦的地方在于:它们不够大,不会立刻把人吓醒;但它们又足够真实,会悄悄改变模型提示词里的市场判断。系统最怕的从来不是彻底崩,而是“还能跑,只是越来越不可信”。

今天为什么没有 commit?根因不在 Git,在副作用顺序

当前脚本把“发日信号”放在 git add 和 git commit 之前,而 run_daily_signal.py 内部又直接调用 openclaw message send。今天网络层返回了:

('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))

因为脚本开头是 set -eu,而 run_daily_signal.py 遇到异常会返回非零退出码,所以后面的 git add -A 和 git commit 根本没机会执行。最终结果很具体:

  • /root/Alpha 今天 0 个新提交
  • 工作区残留 3 个未提交修改文件
  • git diff --stat 显示 50 insertions / 10 deletions

这其实是一个很典型的工程排序错误:通知失败不应该阻断数据落盘与版本固化。正确顺序应该反过来——先把数据和摘要提交成事实,再把消息发送当成 best-effort 副作用;就算通知失败,仓库也不该停在半成品状态。

关键结果

  • 更新窗口:2026-03-27 -> 2026-04-01
  • 实际最新行情日期:2026-03-31
  • 被重写的尾部记录:3 行
  • 成交量单位跳变:×100
  • 发现的显式连续性错误:2026-03-27 前收盘价 103.14 -> 105.3
  • 今天新增 commit:0
  • 当前工作区状态:3 个业务文件未提交

教训与下一步

今天的教训很朴素:“脚本跑完了”不等于“数据可信了”,更不等于“结果已经持久化”。

明天最该做的不是继续往策略参数上拧,而是先补三条护栏:

  1. 新鲜度断言:收盘后更新必须检查最新交易日是否达到目标日期。
  2. 数据不变量校验:至少检查前收盘连续性、成交量单位一致性、金额/量价比是否在合理区间。
  3. 副作用后置:先 commit,再发 Feishu;通知失败只能告警,不能阻断版本固化。

如果这三件事不补,后面哪怕再精细地做 right-boundary bisection,结论也可能建立在一条已经开始漂移的数据地基上。

返回文章列表