源文件:research/quant_digests/2026-04-03_1020_adaptive-regime-switch-trend-mr-alpha.md
README.md + src/strategies/adaptive_regime.py + config/settings.yaml + src/engine/backtest.py + src/engine/portfolio.py)MA crossover + DI confirmation,震荡态做 BB overshoot + RSI fade,高波动态降仓/停手,赌的是“不同市场状态该由不同 alpha 接管”,而不是任何时候都死跑同一套信号这轮最值得 intake 的,不是 repo 里“又有 9 个策略”的广度,而是它已经把一条可独立成卡的完整策略写清楚了:先用 ATR expansion + ADX 判断当前更像波动爆发、趋势推进还是区间来回,再把趋势 alpha 和均值回复 alpha 分开接管。
不是靠 README 里空泛讲逻辑,而是源码把 regime 判定、两个 raw alpha sleeve、仓位切换、ATR trailing stop、手续费/滑点、单笔仓位上限和 drawdown kill switch 都写死了。
先把这句说死:
> base alpha 不是单独的 ADX,也不是单独的 filter。它的本体是“一条可交易的 regime-switched dual-alpha strategy”——趋势态吃 continuation,区间态吃 overshoot snapback。
更直白一点:
所以它不是纯 filter / regime / overlay,而是一个能独立下单、独立回测、独立做风控的完整 raw alpha 壳。
这轮虽然不是“新论文 headline alpha”,但它仍然值得进本轮 intake,原因很直接:
LEARNING_TRACK 明确把“趋势跟随、波动管理、市场状态过滤”列为核心模块;FACTOR_BACKLOG 也把 ATR position sizing、volatility regime filter 置于高优先级。这个 repo 给的是一张现成的“把这些模块焊在一起”的策略卡。但“什么时候该让哪条 alpha 接管”这一层,还缺一张足够简单、足够可复现的完整卡。
15m existence test 很容易,随后可自然下钻到 5m。所以更准确的定位是:
> 这不是拿 regime 当主角的一篇 filter digest,而是一条把两类 raw alpha 装进同一个状态机里的“完整策略候选”。
andreaambrosiohype-backtesting2026-03-12T16:34:49Z,pushed 2026-03-12T20:35:33Z,default branch mainCrypto & equities backtesting framework — Hyperliquid HIP-3, funding arb, basis trade, momentum, mean reversionREADME.mdsrc/strategies/adaptive_regime.pyconfig/settings.yamlsrc/engine/backtest.pysrc/engine/portfolio.pyadaptive_regime.py 默认参数:
adx_period = 14adx_trend_threshold = 25adx_range_threshold = 20atr_expansion = 1.5状态判断顺序:
1.5x → volatileADX > 25 → trendingADX < 20 → rangingneutral这里最有价值的不是阈值本身,而是它承认一件很现实的事:
> “趋势存在” 和 “波动正在失控” 不是一回事。
也就是说,作者没有把所有强运动都当趋势继续追,而是先给“波动爆发”单独留了一个档位。
趋势态用的不是复杂模型,而是很透明的一套:
fast_ma = 8slow_ma = 24plus_di / minus_di 方向确认开仓条件:
fast <= slow,当前 fast > slow,且 +DI > -DIfast >= slow,当前 fast < slow,且 -DI > +DI翻成人话:
所以这里的 raw alpha 是:
> 趋势态下的 own-price continuation。
震荡态参数:
bb_period = 20bb_std = 2.0rsi_period = 14rsi_oversold = 30rsi_overbought = 70开仓条件:
price <= lower_band 且 RSI < 30price >= upper_band 且 RSI > 70这条线的 desk 读法很清楚:
> 只有在 ADX 已经低到更像区间时,才允许把 BB 触边当 overshoot,而不是把它误读成趋势中继。
这恰好解决了很多均值回复系统的第一死因:
所以这里的 raw alpha 是:
> 区间态下的 overshoot snapback。
源码里高波动态没有单独设计新 signal,而是直接把仓位从:
position_size_pct = 0.15vol_regime_size = 0.08也就是说:
这点很符合当前 desk 需要的诚实口径:
> 高波动态更像风险挡位,不是另一个 magical alpha。
无论 long / short,源码都用:
trailing_stop_atr = 2.0trailing_high - 2*ATR 平仓trailing_low + 2*ATR 平仓config/settings.yaml + portfolio.py)initial_capital = 100000commission_bps = 2.0slippage_bps = 1.0max_position_pct = 0.25max_drawdown_pct = 0.15portfolio.py 还明确实现了:
15% drawdown 后 kill switch 强平并停机所以这不是“只有 signal,没有实现细节”的 idea note;它已经是:
的完整闭环。
README 给出的 repo 内置回测结果(90 天 hourly Hyperliquid 数据,标的含 BTC / ETH / SOL / HYPE / TURBO / MEME / WIF):
+2.78%0.991.2111.32%34.9%211这组数不能吹成“production-ready alpha 已证实”,因为:
5m/15m;但它至少说明两件事:
2bps fee + 1bp slippage”的壳里并非完全塌掉。如果把这条东西误读成“ADX 大于 25 就买、低于 20 就反着做”,会完全错过重点。
更准确的拆法应该是:
ATR expansion + ADX所以它最值钱的地方不是 invent 新因子,而是把一个我们经常嘴上说、但不常写成完整代码的判断落地了:
> 不同 market regime,应该让不同 alpha 接管。
这件事和当前素材池的直接关系也很强:
1m / 3m / 5m / 15m 的关系必须诚实:repo 当前展示的是 hourly Hyperliquid 结果,不是 short-cycle production 结果。
所以正确落地方式不是“直接把 hourly PnL 当证据”,而是:
15m 做 existence test;5m 看 trade count / cost / whipsaw;1m / 3m 暂时只当 execution 层,不建议一上来拿来当主信号级别。因为它回答的是更靠近实盘的一句:
> 当 trend alpha 和 mean-reversion alpha 都可能成立时,应该由谁在什么时候上场?
这比继续再堆一张“又一个单腿 raw alpha”更接近后续 desk 组合层。
但它又没有跳得太远,因为:
标的: BTC / ETH / SOL perp
bar: 15m
状态机:
ADX(14) > 25 → trend sleeveADX(14) < 20 → range sleeveATR_now / ATR_prev > 1.5 → volatile size-downtrend sleeve:
EMA8/EMA24 crossover+DI > -DI 才做多;-DI > +DI 才做空range sleeve:
BB20, 2σRSI14 < 30 做多 / RSI14 > 70 做空统一 exit:
2 * ATR(14) trailing stoptime-stop 作为 desk 版补充成本:
8 / 12 / 20 / 30 bps先只回答一句:
> 在 15m perp 上,regime switching 是否比“永远只跑 trend”或“永远只跑 MR”更耐成本?
同一 universe、同一成本,平行跑:
要回答的问题:
15m 才是真正主要贡献者?如果 15m 有存在证据,再做:
重点看:
第一刀不要优化参数,先比较:
如果 router 连“把两条已知 raw alpha 接起来”都做不好,就没必要继续给它加更多状态机。
优先测:
ADX trend threshold = 22 / 25 / 28ADX range threshold = 18 / 20 / 22ATR expansion = 1.3 / 1.5 / 1.8EMA fast/slow = 8/24, 10/30BB std = 1.8 / 2.0 / 2.2必须分开统计:
否则最后很容易只得到一个总 Sharpe,却不知道是哪一条腿在赚钱。
0.08 只是 repo 默认值,不是 desk 真理。如果这轮只记一件事,我希望记住的是:
> 这份 2026 repo 最值得 desk intake 的,不是“ADX 也能做策略”,而是它把两条不同 raw alpha——趋势 continuation 与区间 mean reversion——通过一个极简状态机接成了完整壳。
对当前 short-cycle desk 来说,这张卡的价值在于:
trend + volatility + regime 三块;15m -> 5m 的 ablation;README.md(repo root)src/strategies/adaptive_regime.pyconfig/settings.yamlsrc/engine/backtest.py / src/engine/portfolio.pyresearch/quant_digests/2026-04-03_1020_adaptive-regime-switch-trend-mr-alpha.md