源文件:research/quant_digests/2026-04-13_1913_crowdedlong-fragility-cascade-alpha.md
backend/core/fragility.py + backend/core/cascade_engine.py + backend/core/factor_scoring.py)+ Binance USDⓈ-M 15m public-data portability probe15m 级别的价格下跌 + OI 同步下掉,往往不是普通回撤,而是 forced unwind 开始;其后续 15m~60m 更容易沿下行方向继续重定价。repo 里的 exhaustion / bounce 只是第二阶段,不是 alpha 本体。> base alpha = crowded-long fragility → liquidation-unwind continuation。
不是“funding 高了就空”。 也不是“OI 高了就危险”。 更不是把 fragility 当成一个抽象风险分数挂在看板上。
这份 repo 真正适合 desk 拆出来的,是一条 事件驱动 raw alpha:
翻成人话:
uponly-tradesAutonomous crypto perpetual futures trading bot with Nautilus-inspired strategy filters2026-04-14T01:30:22+07:00(shallow clone 本地可见)backend/core/fragility.pybackend/core/cascade_engine.pybackend/core/factor_scoring.pyreports/artifacts/quant_digests/2026-04-13_yolobot_fragility_cascade_probe.pyreports/artifacts/quant_digests/yolobot_fragility_cascade_probe_summary_2026-04-13.jsonreports/artifacts/quant_digests/yolobot_fragility_cascade_probe_detail_2026-04-13.csv> 这份 repo 表面看像“多策略 perp bot 拼装体”,但真正值得 desk 收下的,是 fragility score → cascade state machine 这条两阶段 event-driven raw alpha 壳;第一阶段先做 crowded-side unwind continuation,第二阶段再做 exhaustion bounce。
> 证明不靠 README 口号,而靠源码结构本身:fragility.py 先把拥挤/脆弱方向状态化,cascade_engine.py 再把 Phase A/B/C/D/E 串成完整交易生命周期;我再用 Binance 公共 funding + OI + top-trader ratio + 15m return 做一个公开 proxy,得到 BTC/ETH 核心 lane 在近一个月 12 个事件里,事件后 15m 平均空头收益 +5.96 bps、事件后 60m 平均空头收益 +14.29 bps。
因为它补的是当前池子里相对少的一类:
fragility 虽然长得像风险分数;5m/15m desk 很自然。5m 子腿;fragility.py:不是温度计,而是“哪边先爆”的 pre-entry gatecompute_fragility_score() 把 7 类因子揉成一个 0~100 的脆弱度分数,并同时给出 fragile_direction:
OI percentile(最高给 20 分)Funding velocity / squeeze risk(最高给 15 分)CVD divergence(最高给 15 分)Bid depth decay(最高给 10 分)Orderbook imbalance trend(最高给 10 分)Whale pulse(最高给 5 分)Volume climax(最高给 5 分)分层阈值:
>= 90:EXTREME>= 70:HIGH>= 50:MODERATE>= 30:ELEVATED关键不在“分数高低”,而在: > repo 明确在问“现在更脆的是多头还是空头”。
这就已经不是 generic risk overlay 语言了,而是 交易方向 admission 语言。
factor_scoring.py:fragility 是刻意放在主方向投票之外的这个文件很重要,因为它明确把系统拆成两层:
MOMENTUM / TREND / VOLUME / STRUCTURE / DERIVATIVESliq cluster / bid depth decay / OB imbalance trend / volume climax ...翻成人话:
fragility 负责回答“哪边会先被爆、有没有必要 override 原方向”。对 desk 来说,这个拆法非常有价值,因为它允许你:
cascade_engine.py:真正有价值的是 5-phase 生命周期,不是一个静态信号repo 把 cascade 写成了一个状态机:
fragility >= 90 时启动R5_ANOMALY / R6_CRISIS7 个 exhaustion signal 里满足 4+Supertrend reclaim 或 VWAP reclaimfragility < 30 且进入 R4_REVERSAL,或超时 4h其中最有用的是 Phase B/C/D:
repo 注释里直接写了:
Cascade active (force-close fragile positions, trail shorts)如果脆弱的是多头,Phase B 的第一反应就是: > 顺着下跌方向继续做。
这就是本轮认为最该先测的 raw alpha leg。
源码里写的 7 个 exhaustion signal 包括:
CVD reversalVolume climaxBid depth recoveringFunding stabilized15m RSI extremePrice stabilizingMinimum cascade duration > 30 min这很像 desk 会接受的结构:
repo 不是说一看到跌狠了就反手, 而是要求:
EXHAUSTIONSupertrend reclaim OR VWAP reclaim也就是说: > repo 里真正可以迁移的不是“逢暴跌抄底”,而是“先做瀑布延续,再等结构 reclaim 做 bounce”。
repo 的完整 fragility 需要:
这些并不都能用一组简单公共历史接口无损复原。
所以本轮只做一个 公开、低门槛、最小可复现 proxy,专门近似 repo 的“多头脆弱并开始被打”这条支路:
fundingRate > 0:多头付费,方向先验偏拥挤多头|funding| 位于近期高分位(fund_abs_pct >= 0.6)openInterestValue 位于近期高分位(oi_value_pct >= 0.6)topLongShortPositionRatio 位于近期高分位(tls_pct >= 0.8)15m 收益 <= -0.20%15m OI 变化 <= -0.25%翻成人话: > 先要求 crowding 明确存在,再要求“价格跌 + OI 掉”这脚 liquidation-style unwind 已经开始。
/fapi/v1/klines/futures/data/openInterestHist/futures/data/topLongShortPositionRatio/fapi/v1/fundingRate15m 可稳定更新;funding 为 8h2026-03-13 19:15 UTC 至 2026-04-13 19:00 UTCBTCUSDT / ETHUSDT / SOLUSDT15m 和后四根 15m(约 60m)空头收益BTCUSDT:
515m 平均空头收益:+10.76 bps60m 平均空头收益:+21.13 bps15m / 60m 胜率:都为 80%这说明: > 至少在 BTC 上,“crowded long + down bar + OI flush” 更像 cascade 开始,而不是已经跌完。
ETHUSDT:
715m 平均空头收益:+2.54 bps60m 平均空头收益:+9.40 bps57.1% / 57.1%翻成人话:
把 BTC + ETH 合并看:
1215m 平均空头收益:+5.96 bps60m 平均空头收益:+14.29 bps这很像一个 desk 可接受的第一版结论: > 先别把它当“全市场全币通用”;但在 BTC/ETH 主流 perp 上,已经值得继续做第二轮更细的分层实验。
SOLUSDT:
215m 空头收益均值是负的(-10.27 bps)60m 空头收益均值是正的(+32.18 bps)这个结果最合理的读法不是“SOL 也行”,而是: > SOL 当前样本太少,暂时更像需要单独分 asset behavior 的第二阶段对象。
60m 内 drift,而不是单根秒杀型信号三资产合并:
1415m 平均空头收益:+3.64 bps60m 平均空头收益:+16.85 bps这意味着:
15m~60m 的延续漂移;15m admission5m child execution<= 60m 的 hard time stop因为它已经能独立回答:
所以它不是“给别的 alpha 加一层 veto”那么简单。 它本身就是: > event-driven liquidation-continuation raw alpha。
不要把 repo 读成一个单点信号。 更准确的 desk 拆法是:
当前阶段,显然应先做第 1 条。
第一版 desk shell 我会这样写:
满足以下同时成立时,允许开空:
15m 跌幅达到阈值15m OI 同时明显下掉15m 收盘后,不直接追最后一秒;5m:优先级:
60m hard timer25~35 bps NAVBTC/ETH 最多同向 2 笔SOL 放进第一批 live paper list15m 端均值也没有豪华到可以无脑 taker 两边乱扫;2 bps / 4 bps / 6 bps当前 probe 没有复刻:
所以当前结果更像: > 证明“这条原理值得测”,还不是证明“repo 全状态机已经可直接照抄上线”。
明细里能看到某些 2026-03-16 的 BTC/ETH 事件, 事件后下一根并没有继续下,而是直接反抽。
这说明需要再加一层:
换句话说:
fragility → cascade 有用;所以不要一开始就做“统一阈值全市场广播”。
下一轮不要再把所有事件揉在一起。 至少拆成两套 label:
t+1 / t+2 / t+4 空头收益VWAP reclaim / 15m RSI extreme / OI 停跌fragility下一轮建议补进:
takerlongshortRatioglobalLongShortAccountRatioaggTrades 近似 delta/CVD目标不是炫技,而是把 repo 里 7 因子中的至少 5 个,用公共接口近似出来。
第一轮正式回测建议:
BTCUSDT / ETHUSDT15m admission + 5m execution15m / 30m / 60m 三档2/4/6 bps 三档0.5 x 15m ATR 与事件 K 高点二选一最应该马上补的不是更多 fancy features, 而是一个简单 veto:
> 若事件 bar 的 vol_z 已经极端高,且下一根出现 OI 不再继续下掉,则不追 continuation,改等 bounce。
这一步很可能直接决定这条线能不能从“研究有趣”变成“实盘可做”。
如果只问一句“这轮该不该进素材池”,我的答案是:该,而且优先级不低。
但要把结论说准:
> 应进入素材池的,不是“YoloBotV2 全家桶”,而是其中 crowded-side fragility → unwind continuation → exhaustion reclaim 这条事件状态机。当前最值得先做的 leg 是 BTC/ETH 上的 continuation short;bounce leg 留到第二轮。
一句话落地: > 先把它当成 15m 事件 admission、5m 子执行的 liquidation-continuation raw alpha 去测;不要一上来就把它写成万能风险面板,也不要急着先赌末端反转。