记录一次 A2 样本冻结与 maxDD 格式化 bug(2026-09-30)
记录一次 A2 样本冻结与 maxDD 格式化 bug(2026-09-30)
样本冻结本身不是风险,真正的风险是把 stdout 里的 427.8% 当成写库真值。
2026-09-30 这天,我原本想给 Hyperliquid 的链上-DB 漂移巡检收个尾,结果先被 429 队列挡了一下,又去发了篇 10 月 1 日生效的房贷贴息热榜文;等回到 factor_ic OOS 扫描时,A2 侧样本已经连续二十多轮卡在 n=19,还顺手确认了一个 maxDD 的格式化 bug。
一、早上的 HL 对账巡检,被 429 拦了一下
按计划,我先在 C:/Users/Administrator/Documents/craw_app1_wz/defi_dashboard 下跑 Hyperliquid smart_money 账户的链上-DB 漂移检查,脚本是 _sm_sanity_check.py,只读,不加任何 --apply。结果对话里先冒出来一串 429 queue.full.title 和 429 queue.waiting.title,脚本的完整 stdout 一直没拿到。后面我又补了一条只读对账巡检,跑 hl_reconcile.py(默认 dry-run),同样被 429 卡住。
到晚上收工前,这两个 HL 相关检查都没拿到明确的 OK/ALERT 或者 ghost/orphan 结果。这让我有点不踏实:没有 ALERT 不等于没有脱钩,只是当天没跑成。
二、热榜发文:房贷贴息 10 月 1 日落地
HL 巡检被卡住之后,我顺手切到知乎热榜流程。fetch-hot.py 内部解析又返回 0 条(和 9-14 同样的情况),我改用 curl 直连主 API,手动解析出 30 条完整热榜。候选里 #1 是江苏高考满分作文,偏文艺评论;#12 OpenAI 用量减半,近期 AI 选题偏多;#11 联合国气候警告,9-06 已经写过 1.5℃ 话题。最终选定了 #18 的“房贷贴息 10 月 1 日实施”,热度 182 万,明天生效,时效性最强。
素材用人民网、央广网、工人日报、金融时报等 5 个来源交叉核实:9 月 29 日三部门发文,10 月 1 日实施,年化 1% 贴息,≤120㎡ 且 ≤150 万,贷款上限 100 万、最长 5 年,中央财政 90% 分担,免申即享。文章 11:23 发布上线,标题是《房贷贴息10月1日落地:不是降息,是中央财政第一次替刚需付利息》,URL 含 just_published=2。核心论点:中央财政首次直接补贴个人房贷,100 万贷款 5 年省约 4.6 万,贴息后 2.06% 资金成本逼近租金收益率,这是救“刚需的人”,不是救楼市。
三、下午主线:A2 OOS tracker 从第 94 次到第 100 次
发布完文章,我回到 factor_ic OOS 扫描。从 12:29 第 94 次执行开始,到 18:43 第 100 次,A2 侧每一轮的 Gate 实测值完全一致:
| Gate | 实测 | 阈值 | 判定 |
|---|---|---|---|
| Gate1 样本数 | 19 | ≥30(A2 更严) | ❌ |
| Gate2 binomial p | 0.6476(win 8/19,42.1%) | <0.05 | ❌ |
| Gate3 年化 Sharpe | −7.477(×√504) | ≥1.0 | ❌ |
| Gate4 maxDD | 写库 4.2782(≈4.28%) | ≤30% | ✅ |
| regime 上升率 | 63.2%(n=19) | ≥50% | ✅ OK |
决策路径一直是 regime=OK → Gate1 fail(19<30) → NO_ACTION。也就是说,虽然样本数离 A2 更严的 Gate1 阈值 30 还差 11 个,但 regime 上升率 63.2% 说明做多视角的市场环境没有恶化,纯粹是样本积累不足,所以每轮都只是正常攒样本,没触发 HALT / MID / BLOCK / GRADUATE,也没写 pending_log。
四、A1 SHORT 臂的 HALT 与 A2 的 OK 并存
下午我在跑 A2 的同时,也手动扫了 A1 SHORT 臂。A1 的实测要难看不少:
| 维度 | 实测 | 阈值 | 判定 |
|---|---|---|---|
| Gate1 样本数 | 31 | ≥20 | ✅ |
| Gate2 binomial p | 0.7201(win 14/31) | <0.05 | ❌ |
| Gate3 年化 Sharpe | −2.732 | ≥1.0 | ❌ |
| Gate4 maxDD | 320.9% | ≤30% | ❌ |
| regime 回落率 | 37.0%(n=27) | ≥50% | ❌ → HALT |
A1 的 regime 回落率 37.0% 低于它的 50% 阈值,所以直接进入 HALT,信号源被视为失效。A1 和 A2 完全反向独立判定:A1 是 SHORT 臂,regime 看回落率;A2 是 LONG 臂,regime 看上升率。当天 A1 处于 HALT,A2 却在 OK 状态,两者同时存在并不矛盾,但在 Gate1 达标前,两个 arm 都不会触发毕业或阻断动作。
五、maxDD 格式化 bug:一次差点误判的假警报
A2 每轮扫描的 stdout 里都打印 maxDD 427.8%,第一眼看确实吓人:最大回撤 427.8%,Gate4 根本不可能过。但脚本同时写库的值是 4.2782,也就是约 4.28%,远低于 30% 阈值,Gate4 实际是通过的。
我查了一下,这是一个共用 A1 文案的格式化 bug。A2 脚本复用了 A1 的打印模板,写库值没问题,但 stdout 把小数百分比直接按百分比格式输出,导致 4.2782 被放大到 427.8%。同样的问题还出现在 Gate1 标签上:stdout 打印的 (≥20) 是 A1 旧文案,A2 实际判定阈值是 ≥30。如果不看数据库,只看 stdout,很容易把 Gate4 判成失败,甚至触发不必要的干预。
六、遗留与下一步
当天收工前,还有几个尾巴没处理完:
_sm_sanity_check.py和hl_reconcile.py两个 HL 只读检查被 429 卡住,没有拿到明确的链上-DB 漂移结果,需要第二天补跑,确认有没有 ghost 仓位或 testnet reset 脱钩。- A2 样本从 09-29 起持续冻结在 n=19,离 Gate1 的 ≥30 阈值还差 11 个样本,短时间内不会触发任何动作。
- maxDD 格式化 bug 已经确认,但脚本还没改。下一步应该把 A2 的打印模板拆开,不要再复用 A1 的旧文案,尤其是百分比格式和 Gate1 阈值标注。