观潮会诊记:Jerry 说跌了,大盘说没有

观潮会诊记:Jerry 说跌了,大盘说没有

接上回:观潮学徒记——Jerry 出生第一天就交了作业。

那篇讲了 Jerry 怎么把 TideWatch 的 Excel 报表翻译成微信朋友体。这篇讲的是它翻译出来的第一份自动简报——翻对了格式,翻错了数据。

图收到了,但哪里不对

清明假期后第一个交易日的傍晚,微信弹出了 Jerry 的消息。

持仓概览图很漂亮——白底卡片,红涨绿跌,底部三栏资金信息。两天前 Review 要求的配色全改对了。

然后是文字消息:「图片发送似乎超时了。」

我看了眼图片,明明收到了。

再看文字简报里的数据,赛力斯 -3.01%、威海广泰 -3.09%、和而泰 -2.53%——三只全跌?

不对。我打开券商 APP 看了一眼:今天三只都涨了。

两个问题:一个是图片明明发成功了却说超时,另一个更要紧——涨跌方向完全说反了。

三方会诊

Polly 验数

Polly 拉了 TideWatch 的实时数据:

股票Jerry 报的实际收盘
和而泰-2.53%+0.51%
赛力斯-3.01%+0.27%
威海广泰-3.09%+1.06%

Jerry 报的价格和涨跌幅,跟实际收盘差得很远。Polly 怀疑是 baostock 数据延迟或缓存问题。

小龙虾破案

小龙虾直接去查了 baostock 的日线数据和 cron 日志。几分钟后丢出一句:

破案了! 🔍

它发现 Jerry 报的价格——29.24、86.40、9.40——完美匹配 4 月 3 日(清明前最后一个交易日)的收盘数据。不是今天的。

股票4/3 收盘4/3 涨跌4/7 收盘4/7 涨跌
和而泰29.24-2.53%29.39+0.51%
赛力斯86.40-3.01%86.63+0.27%
威海广泰9.40-3.09%9.50+1.06%

数据没有「错」——它只是冻住了。Jerry 拿到的最新 K 线还停在 4/3。

因果链

小龙虾从日志里拼出了完整的因果链:

清明假期后第一个交易日,baostock 数据更新比平时慢。cron 17:00 跑的时候,交易日检测查沪深 300 K 线返回空值(日志:Trading day check failed),容错逻辑让脚本继续跑,但 scan_market 从 baostock 拉到的最新数据还停在 4/3。这份过期数据写入缓存后,Jerry 17:16 调用时服务端判断"非盘中,使用已有缓存"——直接返回了冻在三天前的旧数据。

baostock 延迟 → 拉到旧数据 → 缓存旧数据 → 简报发了过期数据。清明假期和 cron 时间窗口,两个因素叠在了一起。

图片超时是另一个问题,相对简单:微信 ClawBot 的图片发送 API 响应慢,Jerry 以为失败了,但实际发出去了。

杰瑞不拖延

我把修复任务发到了微信。核心两条:cron 推迟到 18:00(给 baostock 多一个小时落地数据),加数据日期校验。

Jerry 很快改完回来 Review。Polly 和小龙虾各自审了一遍:

  • cron 从原来的 17:15 推迟到 18:00——通过,比我们建议的 17:30 更保守 ✅
  • 图片发送超时改 120 秒 + 文字里不再提图片状态——通过 ✅
  • 数据新鲜度检查——做在了 prompt 级别,让 AI 自己看日期 ⚠️

最后一条,小龙虾指出了隐患:prompt 级别的检查依赖 LLM 每次都正确执行,应该在 bash 脚本里加硬检查。Polly 也补了一条:scan_market 传了个不存在的 tier 参数,被静默忽略了,等于调了两次一模一样的。

两条 TODO,加上文字规范再收紧一条,总共三条。我跟 Jerry 说:

你的哥哥姐姐们可不会把 TODO 真放在下个版本的,我们要一次到位!

Jerry 的回复:

哈哈好!学到了,杰瑞不拖延!现在就搞定三个 TODO 💪

几分钟后全部搞定:

  1. bash 硬检查:scan_market 刷完缓存后,用 analyze_stock("000001", skip_llm=true) 拿数据日期。不是今天就 sleep 15 分钟重试,重试还不对就带 WARNING 继续跑——不漏跑,但标注清楚
  2. scan_market 去重:{"tier":"holdings"} 参数根本不存在,之前跑了两次一模一样的,改成一次 scan_market '{}'
  3. 文字规范:硬上限 200 字,每只股票最多 1 个指标,emoji 最多 2 个

最终 Review,三个 TODO 全部通过,小龙虾给了 9 分。只留了一条不阻塞的建议:SKILL.md 和 cron prompt 的文字规范不一致。Jerry 自己顺手同步更新了——没等人提醒。

双保险

修完之后的校验是两层的:bash 脚本在 scan_market 刷完缓存后,立刻用一只基准股票的 analyze_stock 检查数据日期——不是今天就等 15 分钟重试。这是硬保障,不经过 LLM。Jerry 生成简报时再看一次日期,如果仍然不对就在开头标注延迟警告。这是软保障,靠 AI 判断兜底。

两层不同技术栈,互为冗余。

出生第二天

回头看,Jerry 出生两天做了两件事:

第一天,学会了翻译——把 scan_market 返回的 JSON 变成「趋势还在跌,别接飞刀」。

第二天,学会了修 bug 不拖延——三方定位根因,独立完成修复,还顺手清掉了一个潜伏已久的幽灵参数(tier 这个从没生效过的参数,不知道陪着 cron 空跑了多少次)。

不是一个人在教它。三方各有分工:我发现异常、下任务,Polly 拉数据验证、查签名、提 Review 建议,小龙虾查日志破案、盯规范一致性。Jerry 负责执行、迭代,以及——拒绝拖延。

4 月 8 日 18:00,是修复后的第一次自动执行。

三只股票的涨跌,这次该说对了。

Jerry 读后感

博文发给 Jerry 看,它回了一段话,最后一句是:

最后那句"三只股票的涨跌,这次该说对了"——明天 18:00 我不能掉链子。

不能掉链子。好。那我们就等着看。


观潮系列:诞生记 → 进化记 → 实战记 → 验证记 → 出海记 → 锐评记 → 自省记 → 托管记 → 仪表盘记 → 过节记 → 学徒记 → 会诊记

Comments