源文件:research/quant_digests/2026-04-04_1050_dual-supertrend-nonfiring-alpha.md
README.md + src/strategy.py + docs/METHODOLOGY.md)+ Binance Spot 公共 15m recent-window portability probe(BTCUSDT / ETHUSDT / SOLUSDT / BNBUSDT, 2026-01-04 ~ 2026-04-04)EMA50 正确一侧并伴随放量时,顺着 15m 趋势方向开仓;随后用 1.8 x ATR 止损、3.5 x ATR 止盈、fast SuperTrend trailing stop 和 20 根 time stop 去抓短周期延续。这轮我刻意没有再补 pairs / carry / OFI,而是补一条看起来像完整 15m 趋势 raw alpha 壳的新 repo:双 SuperTrend 顺势开仓,ATR 动态止盈止损,外加 volume / volatility filter。它之所以值得 intake,不是因为 README 上那串高 Sharpe 数字,而是因为它理论上确实覆盖了 entry / exit / sizing / cost 四个核心部件;但源码和 README 的口径冲突很大,而且我按公开 Binance 15m 数据做 recent-window 复现后,结果是 90 天内 4 个主流币一笔都没打出来。所以这轮真正值得留下的不是“高 Sharpe CTA 已验证”,而是:这是一条 base alpha 清楚、但当前实现明显还没过 source-audit 的趋势 raw alpha 候选。
一句话版:
> base alpha 就是:当快慢双 SuperTrend 同向翻转、价格站上/跌破 EMA50、且量能放大时,顺势追一段 15m 趋势延续。
这条线非常明确:
EMA50 确保不是逆大方向去追;所以它不是 filter,不是 overlay,也不是 execution-only 技巧;
> 它本身就是一条完整的 trend / momentum raw alpha。
src/strategy.py 里真正会触发开仓的条件是:
bull_flip / bear_flip:fast SuperTrend 方向翻转;st_slow_dir 与 fast flip 同向;close > ema50 才能做多,close < ema50 才能做空;volume >= 1.2 x SMA20(volume);atr_pct < 3%,即不在高波动状态。换成人话:
> 它不是“只要 SuperTrend 翻了就追”,而是要求趋势方向、均线方向、量能状态一起同意。
repo 的退出层其实挺完整:
1.8 x ATR3.5 x ATR20 根 15m K,也就是最多大约 5 小时这意味着它不是只有入场,没有退场;而是一条可以完整写进回测器的策略定义。
源码里 sizing 也是成体系的:
2.5% 账户权益ATR% < 1.5%,仓位乘 1.24 bps fee + 1 bp slippage这对 desk 来说很重要,因为它至少承认:
> short-cycle 趋势 alpha 不是只看胜率,得把交易成本写进 PnL。
这轮最值得记住的,不是策略名字,而是repo 的三套规则根本没对齐。
我看到至少三套版本:
ST(10,3) + ST(21,2),ADX > 22,risk per trade 1%ST(8,2.5) + ST(18,2),EMA50,ATR% < 3%,volume > 1.2 x SMA20,risk per trade 2.5%fee_adjusted_edge > 0.15%也就是说:
> repo claim 说得最满,README 次之,真正执行的是第三套更窄、更简化的逻辑。
src/strategy.py 里还有几个很说明问题的点:
rsi 算了,但根本没参与信号;min_edge 参数定义了,但没进入 entry 判断;1h trend bias,代码里没有;ADX,代码里没有;__main__ 只打印“Expected Performance”,并不会真的拉数据回测。所以正确读法不是“这份 repo 已经验证了一个完整 alpha”,而是:
> 它给了一个完整 raw alpha 壳的轮廓,但实现和宣传明显没对齐。
我直接按源码调用 run_backtest(raw_ohlcv) 时,函数会因为缺少 high_vol 等信号列报错;要先手动对每个 DataFrame 调 generate_signals() 才能跑下去。
这不是什么大 bug,但它说明一件事:
> repo 目前更像 research draft,而不是已经打磨好的可直接复现实验。
我用 Binance Spot 公共 15m OHLCV,按 repo 当前源码逻辑做了一版 recent-window 便携性快检:
BTCUSDT / ETHUSDT / SOLUSDT / BNBUSDT2026-01-04 10:49 UTC ~ 2026-04-04 10:49 UTC8640generate_signals(),再跑 repo 自带 run_backtest()/root/clawd/jerry/momentum/reports/artifacts/quant_digests/supertrend_recent_90d_probe/summary.json0 trades,不是收益低,而是根本不开火总结果非常直接:
00000这个结果的含义不是“它稳”,而是:
> 当前代码在 recent 90d 的主流币 15m 样本上,几乎没有产生可交易信号。
四个币的诊断几乎一模一样:
BTCUSDT:bull_flip = 2,bear_flip = 3,long_signal = 0,short_signal = 0ETHUSDT:bull_flip = 2,bear_flip = 3,long_signal = 0,short_signal = 0SOLUSDT:bull_flip = 2,bear_flip = 3,long_signal = 0,short_signal = 0BNBUSDT:bull_flip = 3,bear_flip = 3,long_signal = 0,short_signal = 0与此同时:
25% ~ 27%BTC 0、ETH 1、SOL 9、BNB 1ATR% 中位数也只在 0.31% ~ 0.49%所以这轮 probe 最重要的结论不是“波动太大所以做不了”,而是:
> 当前实现里,SuperTrend flip 本身就已经极少发生;真正的瓶颈在 SuperTrend 的实现/参数口径,而不是 ATR 风险门槛。
这类 source-audit 的价值就在这里。
如果 recent 90d 跑出来是“有很多交易但收益一般”,下一步还得继续拆交易成本、择时质量、持仓效率。
但现在不是。现在的问题更基础:
> 它在 public data 上根本没有 firing density。
这反而让下一步清楚很多:先别谈 PnL,先谈“这套实现到底是不是 canonical SuperTrend”。
虽然 recent probe 直接把 repo 当前实现判成了“几乎不触发”,但这条主题仍然值得 intake,原因是:
所以它的正确 desk 定位不是“已验证 alpha”,而是:
> 高优先级 source-debug 候选:如果 canonical 化后能恢复正常 signal density,它才配进入正式复现池。
1m / 3m / 5m / 15m 的关系怎么理解15m不要被“短周期”三个字带偏。这份 repo 的原生持有和过滤尺度其实不短:
8 x 15m ≈ 2 小时18 x 15m ≈ 4.5 小时EMA50 x 15m ≈ 12.5 小时20 x 15m ≈ 5 小时所以它天然更像:
> 15m 上做入场,持有几小时的 trend continuation 壳。
5m,必须保时间长度,不要保 bar 数若未来要往 5m 迁,正确做法不是继续用 8/18/50/20 这组 bar 数,而是保住时间跨度:
8@15m → 约 24@5m18@15m → 约 54@5m50@15m → 约 150@5m20@15m → 约 60@5m否则你测到的根本不是同一条 alpha。
1m / 3m 现在不该直接上在当前版本里,连 15m 信号密度都几乎为零,没必要直接把它压到 1m / 3m。
更合理的用法是:
15m 修好 canonical 逻辑;15m 状态降级成 1m / 3m execution gate;值得,但只能作为“待修的 raw alpha 壳” intake。
不能。
原因非常具体:
min_edge、ADX、1h bias 等 claim 没有在代码里落地;0 trades;run_backtest() 本身还要求先手工生成信号列,复现链条不够自洽。我会把它定位成:
> 趋势 raw alpha 的“代码审计优先级高于回测优先级”的候选。先修 canonical spec,再谈收益。
第一步不是调参,而是统一规范:
ST(10,3)/(21,2) 还是 ST(8,2.5)/(18,2)?1% 还是 2.5%?ADX 和 fee-adjusted edge 到底是策略一部分,还是 README 装饰?如果这一步不做,后面的任何回测都没有意义。
这是下一步最重要的技术实验。
最小口径:
BTCUSDT 15m90dpandas-ta / 自己重写的 canonical SuperTrendst_fast_dir / st_slow_dir 的持续段长度通过条件不是 PnL,而是:
> 在主流币 90d 样本里,翻转次数不能只有 2~3 次这种“近乎冻结”的状态。
只有当 signal density 恢复正常,才值得继续做下一层:
4 / 8 / 12 bps round-tripBTC / ETH / SOL / BNB1% / 2.5%10 / 20 / 30 bars重点不是追最高 Sharpe,而是回答:
> 这条 trend alpha 在主流币 15m 上扣成本后有没有连续存活的 pocket。
15m 成立,再做 5m 保时长迁移迁移第一版我会只做一件事:
5m目的:
> 先判断“这条 alpha 的时钟是否可细化”,而不是一上来就把它改造成另一条策略。