源文件:research/quant_digests/2026-04-01_0113_donchian-overshoot-fade-threshold-alpha.md
README.md + notebooks/04_breakout_strategy.py + notebooks/05_breakout_extension.py + notebooks/06_pairs_strategy.py + notebooks/07_pairs_strategy_vol_filter.py + report/tables/*.csv source audit15m 收盘价显著穿出过去 200 根 Donchian 区间后,做 过度延伸后的回归;赚的不是 breakout continuation,而是 极端偏离回到区间内部 的均值回复。高波动只是 admission layer,不是 alpha 本体。先回答一句:这篇东西的 base alpha 是什么?
答案很清楚:
> single-asset intraday overextension mean reversion。 > 具体说,就是 BTC 在 15m 上向上/向下显著穿出一个很长的历史区间后,下一段更容易先往区间里回,而不是立刻继续顺着突破方向跑。
它不是 filter,也不是纯执行优化,更不是“看 breakout 名字就默认 trend”。 这份 repo 里最值得 desk 抄的,反而是一条 可独立交易、带完整出入场与成本口径的单币均值回复 raw alpha。
更关键的是,它不是拍脑袋挑出来的。repo 自己先测了三条线:
这很适合当前 desk:不是再补一个共享 filter,而是补一条 原生 15m、公开数据可复现、完整策略骨架清楚 的 raw alpha。
主来源:
*COMP0051 Algorithmic Trading Coursework*
repo 表面上把其中一条模块叫作 breakout_strategy,但代码实际上写的是:
upper_band = rolling_max(200).shift(1)lower_band = rolling_min(200).shift(1)long_entry = close < lower_bandshort_entry = close > upper_band也就是:
200 根低点 -> 做多200 根高点 -> 做空这不是 trend-following breakout;这是 Donchian overshoot fade。
而且 baseline 版本已经带了一个很朴素但有用的 admission:
rolling_vol = std(ret, 50)60% 分位数时才允许入场。翻成人话:
> 不是“安静区间的小假突破”去做回归,而是专抓高波动里真正甩出区间的那种 overextension。
conditional_returns.csv 给的 BTC→ETH / BTC→DOGE 条件前瞻收益几乎都不显著:
1-bar 前瞻均值只有 -0.8934 bps,t-stat -0.9292;3-bar 前瞻均值 1.5082 bps,t-stat 1.3315;1~3 bar 前瞻收益,p-value 也都远不显著。cross_correlations.csv 也很直白:
lag 0 同步相关很高(BTC→ETH 0.865996;BTC→DOGE 0.770541);lag ±1~4 基本都在零附近。也就是说,这个 repo 自己给的证据更像在说: 别再把“BTC 先动、alts 跟随”默认当 15m 可收费 raw alpha。
pairs_summary.csv 里只有 BTC–ETH 真正通过 cointegration:
p = 0.0065p = 0.0015392.37 bars,约 98.09 小时但落到真实交易规则和 5 bps 成本后,pairs_performance.csv 的样本外结果并不好:
-2000.32 USD-1.297128 笔交易,平均每笔 -71.7 USD说明这份 repo 里,统计上 cointegrated 不等于 短周期交易后还能剩下净边。
repo 的 breakout_extension_comparison.csv 反而给出很清楚的答案:
#### Baseline:200-bar 区间外侧直接反手 + 高波动 admission
9260.84 USD1.51133661.11%#### Test A:在 baseline 上再加 10 bps breach threshold
9872.83 USD1.67223562.86%#### Test B:再进一步改成 20%~80% 中间波动带过滤
-9406.37 USD-2.235044.12%这个对 desk 非常重要:
> 最值钱的不是“多加 filter”,而是“极端偏离本身 + 轻量 threshold”。 > 过度精致的 regime band 反而把 alpha 自己掐死了。
这条线的正确分层应该是:
10 bps 额外穿透阈值所以它是 raw alpha 主体清楚、filter 只是辅助 的好题,而不是“一个需要挂靠别的主信号的共享 gate”。
BTCUSDT spot 或 perp)15m5 bps all-in 开始取 05_breakout_extension.py 里样本外更优的 Test A:
upper_band = max(close, 200).shift(1)lower_band = min(close, 200).shift(1)rolling_vol = std(ret, 50)vol_filter = rolling_vol > in-sample 60th percentileclose < lower_band * (1 - 0.001)close > upper_band * (1 + 0.001)也就是:
source 规则很简单:
40 根 15m bar(约 10 小时)。第一版 desk 化时,我会保留这个骨架,不急着加太多复杂出场。
source 用的是固定 100,000 USD gross notional。
真正落到 desk,建议第一版改成:
rolling 50-bar vol 做 volatility targeting;target_sigma / rolling_vol 的反比;source 的成本模型是:
5 bps 计费;+1 -> -1 这种翻向按两次交易算;这点很重要,因为 pairs 那条线正是被成本打穿的。
虽然 repo 原生是 15m,但它对短周期 desk 仍然很实用,因为它回答的是一个更一般的问题:
> 当价格以“足够极端”的方式离开一个慢窗口区间时,下一段到底更像 continuation 还是 snap-back?
这个问题完全可以向下迁移。
#### A. 保持“时钟长度”不变 把 source 的 15m 配置平移到 5m:
N=200 -> 600 bars(仍约 50 小时)VOL_WINDOW=50 -> 150 barsMAX_HOLD=40 -> 120 barsthreshold = 10 bps 保持不变这测的是:同样 2 天左右慢窗下,5m 更细粒度执行能不能把均值回复吃得更干净。
#### B. 保持“bar 数”不变 直接在 5m 继续用:
N=200VOL_WINDOW=50MAX_HOLD=40这测的是:更快的 micro-overshoot 有没有自己的独立 alpha。
我会优先先跑 A,再跑 B。因为 A 更像 source faithful transfer,B 更像新 alpha 分支。
repo 给了一个很少见但很实用的结论:
10 bps threshold,OOS 更好;这说明当前这条 alpha 更像:
翻成人话就是:
> 别把 entry 做得比 alpha 还聪明。 > 如果市场已经给了你“跑出 200-bar 区间还多走 10 bps”的极端信息,就别再用漂亮但过拟合的 vol band 去替市场做第二层否决。
我会把它放进当前研究池,而且优先级不低,原因有四个:
如果这轮还要继续补 raw alpha 素材池,我宁愿先补这种: 简单、极端、成本后仍有机会活的单币回归, 而不是再写一个听起来更 fancy 的 shared gate。
我建议直接按三阶段跑,别再停在“看起来挺合理”。
BTCUSDT spot + perp 各跑一遍15mN=200VOL_WINDOW=50vol > 60th pctthreshold=10 bpsMAX_HOLD=403 / 5 / 8 / 10 bps第一问只看一件事:5 bps 以上它还活不活。
跑两组转译:
600 / 150 / 120200 / 50 / 40然后比较:
10 bpsk × ATR 或 k × rolling sigma若 15m/5m 都还能活,再加三层现实化:
也就是:
touch band 可能不够;breach by 10 bps 才比较像可收费 alpha;repo 的 Test B 已经给了负面证据。
desk 要验证的,是不是:
因为这份 repo 里:
所以第一轮别贪多,先把 BTC 单币打透。
BTCUSDT spot / perpetual15m 先跑,5m 次之notebooks/04_breakout_strategy.pynotebooks/05_breakout_extension.pynotebooks/06_pairs_strategy.pynotebooks/07_pairs_strategy_vol_filter.pyreport/tables/breakout_extension_comparison.csvreport/tables/pairs_performance.csvreport/tables/pairs_summary.csvreport/tables/conditional_returns.csvreport/tables/cross_correlations.csv15m/5m 最小复现