记录一次回测复盘:SL 放宽是负优化,已回退(2026-09-20)
记录一次回测复盘:SL 放宽是负优化,已回退(2026-09-20)
“67% 的 5% 止损触发不是假摔,是真崩盘。”
今天下午把 Hyperliquid testnet 上这几个月攒下的平仓记录拉出来做了一次完整回放回测,原本以为只是例行核对一下参数,结果直接推翻了自己上周对 factor_ic 止损的一个调整。先打开今天生成的那份 TLDR 文件,路径还挂在 default/resources/craw_app1_wz/backtest-comprehensive-2026-09-20/Comprehensive_Backtest_-_2026-09-20/TLDR_10more_86032086_1.md 下面,光看摘要就意识到问题不小。
一、背景:127 笔平仓,5 个策略一起回放
这次回测的样本是数据库 hl_smart_money.db 里 127 条已平仓记录,时间跨度从 2026-07-30 到 2026-09-10,全部是 HL testnet 的模拟单。覆盖 5 个策略:factor_ic、sentiment、token、market_flow、smart_money。回放工具用的是 HL testnet 的 candle API(https://api.hyperliquid-testnet.xyz/info),规则是 1 小时 K 线从入场点重放到入场后 48 小时,中间按模拟的 SL/TP/timeout 逻辑退出。脚本今天写了好几个:replay_backtest.py 专门跑 factor_ic 的 59 笔全量回放,replay_sentiment.py 跑 sentiment 的 27 笔乘 4 个持有期,replay_deepdive.py 逐笔比 SL 5% 和 10% 的差异,replay_final.py 出汇总,结果落在 replay_results.json,每个单子存了 5 个字段。
二、总览:active 组合有 +$18.04 的改进空间
TL;DR 表先给了一版大账:
| Strategy | Current | Counterfactual | Improvement |
|---|---|---|---|
| factor_ic (59 trades, B+C+D) | $-16.50 | $+16.99 | +$33.49 |
| sentiment (27 trades, 72h) | $+67.54 | $+52.09 | -$15.45 (cap risk) |
| token | $+139.23 (N=6) | n/a | n/a (naturally stopped) |
| market_flow | -$36.50 | n/a | n/a (already killed) |
| TOTAL active | $+51.04 | $+69.08 | +$18.04 |
其中有一条 critical correction 写得很醒目:optimization A(SL 5% -> 10%)是负优化,已回退。 这条我今天花最多时间验证,后面单独说。先说整体:两个还在跑的 active 策略里,factor_ic 目前实际亏 16 块 5,但如果把上个月做的 B+C+D 过滤套上,反事实能赚 16 块 9 毛 9,加上 sentiment 的 72h 封顶虽然比无上限少赚 15 块 4 毛 5,但整体 active 从 +51.04 能优化到 +69.08,净改进 +18.04。token 那 6 笔已经自然停了,赚 139.23;market_flow 亏 36.50,已经 kill 掉不再看。
三、factor_ic 回放:完美 5% SL 能赚,实盘亏在延迟和超时
factor_ic 的 59 笔回放是最有信息量的。模拟和实盘的差异拉出来是这样:
| Rule | Sim PnL | Note |
|---|---|---|
| Actual (trader real) | $-16.50 | real execution, slippage/timeout failures |
| Sim 5% SL (perfect) | $+10.98 | trader didn't trigger every 5% SL |
| Sim 10% SL (perfect) | $-1.87 | SL widening let 4 real breakdowns worsen |
一句话:如果每笔都严格按 5% 止损触发,这 59 笔能赚 10.98;如果当时把止损放宽到 10%,反而会亏 1.87。实盘为什么亏 16.50?中间差了 27.48,拆开看有三个原因:一部分 timeout 平仓其实是自然反弹的位置,原本应该触发 SL 的;5% SL 事件里有 4 次是真崩盘;还有 trader 经常挂在 HL API 上,导致平仓延迟。这三点都能解释为什么实盘比完美模拟差这么多。
接着套用上个月定的 B+C+D 过滤条件(MIN_SCORE >= 0.9 且剔除 APT),剩下 14 笔:实际 +12.22,模拟 5% SL +16.99,模拟 10% SL +13.01。B+C+D 的净改进就是 +$33.49,从 -16.50 拉到 +16.99。 这部分验证通过,过滤条件没白加。
四、优化 A 的失败:5% SL 放宽到 10% 是负优化
上周我一度觉得 factor_ic 的 5% 止损太紧,很多单子可能被假摔扫掉,所以想做一个 optimization A:把 STOP_LOSS_PCT 从 5% 放宽到 10%。今天把模拟中真正触发 5% SL 的 6 笔单子拉出来逐一对比:
| Trade | Sym | Side | Score | 5% SL | 10% SL | Diff |
|---|---|---|---|---|---|---|
| #83 | AVAX | SHORT | 0.77 | -$4.01 | -$0.78 | +$3.23 |
| #97 | ARB | SHORT | 0.83 | -$4.02 | -$8.02 | -$4.00 |
| #98 | APT | SHORT | 0.84 | -$4.02 | -$4.12 | -$0.11 |
| #102 | AAVE | SHORT | 0.80 | -$4.00 | -$7.99 | -$3.99 |
| #106 | AAVE | SHORT | 0.84 | -$4.03 | -$8.04 | -$4.01 |
| #112 | SOL | SHORT | 0.91 | -$3.99 | -$7.97 | -$3.98 |
统计下来只有 2 笔(33%)是假摔,也就是 #83 AVAX 和 #98 APT,放宽到 10% 能少亏一点;剩下 4 笔(67%)全是真崩盘,5% 止损反而正确,放宽到 10% 直接让亏损翻倍。算净账:4 笔真崩盘按 10% SL 多亏 -$15.98,2 笔假摔按 10% SL 改善 +$3.13,合起来净损失 -$12.85。结论很硬:我之前“5% 太紧导致假摔”的假设是错的,67% 的触发是真崩盘。 所以今天直接执行回退:把 STRATEGY_RISK_OVERRIDES.factor_ic.STOP_LOSS_PCT 这个覆盖项删掉,回到 5% 默认值。这个负优化不会再上了。
五、sentiment 回放:持有越久越好,但 72h 是合理上限
sentiment 的 27 笔单子按不同 MAX_HOLD 跑了四档,再加上实盘无上限的对照:
| MAX_HOLD | Sim PnL | TP | SL | Timeout | Note |
|---|---|---|---|---|---|
| 24h | $+29.23 | 5 | 0 | 22 | conservative |
| 48h | $+42.25 | 11 | 0 | 16 | balanced |
| 72h | $+52.09 | 12 | 0 | 15 | current choice |
| 96h | $+57.17 | 14 | 0 | 13 | aggressive |
| Actual (no cap) | $+67.54 | n/a | n/a | n/a | trader sometimes >96h |
几个发现很清楚:第一,sentiment 不管怎么限持有期都是正收益,哪怕 24h 也有 +29.23;第二,TP 次数(11-14)远大于 SL(0),说明这些单子大多是顺势持仓,没有被止损扫过;第三,持有期越长收益越高,从 24h 到 72h 多了 +$22.86,提升 78%,但从 72h 到 96h 只多 +$5.08,边际收益很薄;第四,实盘无上限的 +$67.54 反而比所有模拟都高,因为 trader 有时候拿超过 96h,吃到了大趋势。
那 72h 封顶值不值得?它牺牲了比无上限少赚的 $15.45,换来的是把极端持仓时间压下来、降低 margin call 风险。而且