源文件:research/quant_digests/2026-03-19_2110_ema-slope-ntz-reentry-veto-gate.md
这次看的主来源是 GitHub 仓库 asaflu / bitcoin-ema-analyzer (2026)。它的重点不是“再发明一个 EMA 交叉”,而是把 EMA slope 明确写成一个 三状态机:BULL / BEAR / NTZ(no-trade zone),并且把“回到 NTZ”当成退出条件。
NTZ 出入状态 这层 veto 逻辑”,不是把这个仓库当 15m 直接开仓 alpha。ema_slope.py 直接把信号写成“越过 ±阈值才开仓、回到阈值内就平仓”的状态机;仓库报告里的 timeframe 对照显示该框架在低周期(含 15m、5m)明显恶化。backtest_report_20260209_082259.html 的 timeframe 对照看:15m total_return≈-14.63%、5m≈-28.17%,而 4h≈+41.37%、1d≈+11.15%(同一报告口径)。这更像“高周期趋势状态特征”,不是低周期裸信号。smooth_bars=3, ma_length=15, ntz=5)对应 total_return≈180.09%, win_rate≈35%, max_drawdown≈-24.46%,说明它的边际收益主要来自“少量趋势段捕捉 + 低胜率大盈亏比”,并不天然等价于 15m continuation 可执行性。engine.py 实际只完整支持 long 进出(SELL 被当作平多分支),所以它更像“方向状态实验框架”,不是可直接照搬的双向实盘引擎。它和三条收口线是直接相关的:
NTZ,可直接记为 follow-up 衰竭,提前 veto/减仓。NTZ→趋势侧 的再出带确认。在 15m crypto 上,NTZ re-entry veto 作为共享覆盖层,能降低假延续损耗(尤其 4~8 bars 内反抽反杀),即使不提高胜率,也应改善成本后回撤与尾部亏损。
ma = EMA(close, L);raw = ma - ma.shift(s);slope_norm = 100 * raw / (rolling_max(raw,n)-rolling_min(raw,n))。slope_norm > +θ => BULL;< -θ => BEAR;否则 NTZ。N 根内重回 NTZ,则立即失效;N 根内由 BEAR 回 NTZ,同样失效;N ∈ {2,4,6},θ ∈ {8,10,12} 做小网格。6/10 bps per side1) baseline(三条线原规则) 2) baseline + static slope gate 3) baseline + NTZ re-entry veto(本轮主测)
post_cost_returnmax_drawdown 与 left-tail(5% trade pnl)false_follow_through_4bars(触发后 4 根内反向失效占比)slope 归一化会受滚动窗口极值影响;不同波动 regime 下阈值可迁移性有限,需做 θ 稳定性检查。NTZ 设得过宽,会把 trade density 压到不可用;若过窄,又退化成“几乎一直交易”。indicators/ema_slope.py).backtesting/engine.py).backtest_report_20260209_082259.html).