记录一次因子 OOS 监控被 HALT 冻结与 HL 只读巡检(2026-09-01)
记录一次因子 OOS 监控被 HALT 冻结与 HL 只读巡检(2026-09-01)
“n 从 28 爬到 30 就冻住了,regime 整夜贴着 38.5%~40% 晃,HALT 就是 HALT——先点清幽灵仓是 0,再想 apply 的事。”
这天我干得最多的一件事,就是每隔一个小时在 C:/Users/Administrator/Documents/craw_app1_wz/defi_dashboard 里跑一次 factor_ic_oos_tracker.py once,从 00:08 一直跑到 09:17,总共 10 次。中间还抽空做了 Hyperliquid 的只读对账、sm_account 漂移检查,顺手发了一篇知乎。复盘下来,最有价值的不是“又 HALT 了”,而是当所有闸门都红着的时候,忍住没去敲 --confirm。
一、一条 once 命令,四张表一个结论
factor_ic_oos_tracker.py 这脚本我是当巡检用的,只允许它读 hl_smart_money.db 和 factor_monitor 的主网 K 线,写 factor_ic_oos.db 和 docs/strategy_research/_prereg/ 下的 alerts/halt 日志。它产出的东西很固定:Gate1 样本数 n、Gate2 二项 p、Gate3 年化 Sharpe、Gate4 maxDD,外加一个 regime 回落率。跑之前必须带 dangerouslyDisableSandbox:true 放行网络,不然 regime 可能退化成 UNKNOWN,那就成降级报告了。
这天每一轮我用的都是同一句:
C:/ProgramData/anaconda3/python.exe factor_ic_oos_tracker.py once
出口码一直是 0,没报过错。区别只是那几个数字在慢慢变,或者干脆不变。
二、十轮扫描:前六轮定调,后四轮冻结
我把 00:08 到 09:17 的记录拉出来看,过程很干净。
00:08 第一轮:n=28,win 13/28,binomial p=0.8506,年化 Sharpe=-3.042(×√504),maxDD=320.9%,regime 回落率=37.5%。Gate1 刚刚过 20 的线,但 Gate2、3、4 全红,regime 也低于 50% 的 ON 线,所以直接判 HALT。halt_log 里标了个 PENDING,等着 factor_ic_oos_apply.py --confirm 才会去推进毕业或阻断。
01:08 第二轮:n 从 28 变成了 29,win 14/29,binomial p 直接写成了 1.0000。Sharpe 回到 -2.592,maxDD 还是 320.9%。这一轮摘要里 regime 那行被截断了,但前面 00:08 的 37.5% 已经足够把状态钉死在 HALT 上。
02:08 第三轮:n 到了 30,之后再也没有变过。p 回落到 0.8555(win 14/30),Sharpe 稳定在 -2.550,maxDD 还是 320.9%。regime 变成 40.0%(n=25),依然低于 50%。
从 03:08 到 06:08,每一轮都是同一组数字:n=30,p=0.8555,Sharpe=-2.550,maxDD=320.9%,regime=40.0%。文件写入时间变了,内容没变。
07:09 这一轮开始 regime 有了一个小跳变:回落率从 40.0% 变成 38.5%,n 从 25 变成 26。原因只是主网 K 线多进来一个点,重新算了一下,结果反而更低了。08:17 和 09:17 两轮完全复制这个 38.5%,一直到收工都没再动。
结论很明确:HALT。 regime 回落率始终低于 50%,信号源按定义失效,这个状态下别去碰生产策略。脚本本身没触发任何毕业或阻断动作,因为那些动作必须由 factor_ic_oos_apply.py --confirm 单独执行,而我没有点过 confirm。
三、趁冻结的空档,把 HL 对账跑了一遍
tracker 冻住以后我有点不放心 Hyperliquid 那边的账,就跑了一次只读对账。命令是:
1 | cd "C:/Users/Administrator/Documents/craw_app1_wz/defi_dashboard" && C:/ProgramData/anaconda3/python.exe -u hl_reconcile.py |
跑之前先把系统代理变量全部清空,避免 502。这次没加 --apply,纯 dry-run,不会写库。
结果很干净:
- ghost(幽灵仓)= 0:smart_money 里 3 个 OPEN 仓位链上都还在,没有方向反,没有悬空。
- orphan(孤儿仓)= 3:链上有但 DB 没有,SOL +0.76(uPnL -$1.11)、BTC -0.00102(-$0.76)、ETH +0.0337(+$1.42),全部归在 hl_testnet.db 视角,只告警不修复。
- OPEN 计数守恒:hl_smart_money.db = 3 OPEN,hl_testnet.db = 0 OPEN,跟 hl_positions 表一致。
- 账户等式:脚本这次没打印等式明细,但按历史口径,smart_money 的残差是 08-25 账户重置留下的恒定偏移,不是 ghost 也不是真漏账;testnet 0 OPEN 和孤儿仓一致,无异常。
没有 ghost,所以 --apply 不用跑。如果以后要处理那三个孤儿仓,需要用户自己确认后再授权执行,我不会自行去动写库参数。
四、sm_account 漂移检查:0.58%,稳
另一项检查是防 testnet 重置导致 sm_account 基线脱钩。命令:
C:/ProgramData/anaconda3/python.exe -u _sm_sanity_check.py
也需要 dangerouslyDisableSandbox=true 放行外网。输出一行:OK chain=907.3520 db=902.0440 drift=0.58%,退出码 0。阈值是 5%,0.58% 离得还远,所以不需要重置 sm_account 基线。检查完没改任何文件。
五、顺手发了一篇知乎,热榜 429 切了备用源
当天还干了件不相关的小事:知乎热榜 API 双双 429,切了备用源 readep.com 抓到数据,选题是“宇树股价腰斩,从 1100 跌到 555”,和我前两篇宇树文章(8-24 100 米垫底、7-30 日本拆解)正好形成系列。最后用 publish-py.py 一次执行通过,标题是《宇树股价“腰斩”从 1100 跌到 555:跌的不是技术,是中国机器人第一股被撤掉的“神话滤镜”》,1687 字符,链接 https://zhuanlan.zhihu.com/p/2078014944889591085 。封面用即梦 AI 生成,8 项检查全绿,just_published=1 落定。
遗留
- factor_ic OOS tracker 仍然 HALT,halt_log 是 PENDING。要不要跑
factor_ic_oos_apply.py --confirm毕业或阻断,还没定,需要单独评估信号源是否真的失效。 - Hyperliquid 那 3 个孤儿仓还挂着,只告警不修复,后续如果要清,得走用户授权的
--apply。 - regime 的回落率从 40.0% 掉到 38.5%,说明主网 K 线还在变,但趋势没改善,下一步继续每小时盯一次,看 n 和 regime 有没有新变化。
- 对账的账户等式明细没输出,下次可以让脚本多打一点,把残差口径再确认一遍。