Strategy audit
Ranking of every registered open strategy by out-of-sample Sharpe and drawdown-adjusted return, with deprecation candidates. · Generated 2026-06-10 · backtest-only
Method
- Runs: backtest/run_backtest.py --mode compare --strategy all, both registries (spot + futures), symbols BTC/USDT, ETH/USDT, SOL/USDT, timeframes 1h + 4h, --since 2025-06-10 (12 months). 12 compare runs, all completed.
- Fee model: default binanceus (0.1% taker per side). Close stack: default (open-signal-as-close, no SL/TP) — isolates entry quality, which is what this audit ranks.
- Aggregation: per strategy, mean Sharpe / mean total return / worst max DD / summed trades across the 6 (symbol, timeframe) runs. Spot and futures rows deduped to "both" when byte-identical; momentum differs and is listed per registry.
- Market context: a deep bear — buy-and-hold BTC -44.3%, ETH -40.2%, SOL -61.2%. The vs B&H column (mean return minus same-run buy-and-hold) separates real entry edge from market beta.
Caveats
- Backtest-only. state.db is not in this checkout (production DB lives on the server), so live leaderboard / lifetime stats were unavailable.
- Long/flat path only. Compare mode never opens shorts; bidirectional strategies are measured on their long leg only; short-only strategies produce 0 trades and are unmeasurable here.
- Bar-level granularity; no intra-bar trigger races; no funding or leverage modeling in this mode.
Ranking
Sorted by mean Sharpe across the 6 runs. Click a column header to sort.
| Strategy |
Registry |
Mean Sharpe |
Mean return % |
vs B&H % |
Worst max DD % |
Trades |
Verdict |
| squeeze_momentum |
both |
0.03 |
-0.6 |
+47.9 |
-58.5 |
131 |
keep |
| breakout |
futures |
0.01 |
-1.1 |
+47.5 |
-52.2 |
260 |
keep |
| supertrend |
both |
0.00 |
0.0 |
— |
0.0 |
0 |
bug — never trades |
| delta_neutral_funding |
futures |
0.00 |
0.0 |
— |
0.0 |
0 |
n/a (needs funding data) |
| bear_pullback_st |
futures |
0.00 |
0.0 |
— |
0.0 |
0 |
n/a (short-only, unmeasured) |
| vwap_rejection_st |
futures |
0.00 |
0.0 |
— |
0.0 |
0 |
n/a (short-only, unmeasured) |
| hold |
both |
0.00 |
0.0 |
— |
0.0 |
0 |
n/a (placeholder) |
| mean_reversion_pro |
both |
-0.20 |
-12.8 |
+35.8 |
-59.8 |
17 |
watch |
| chart_pattern |
both |
-0.27 |
-11.5 |
+37.1 |
-60.5 |
185 |
watch |
| momentum_pro |
both |
-0.32 |
-12.0 |
+36.5 |
-55.9 |
51 |
watch |
| range_scalper |
both |
-0.38 |
-14.2 |
+34.4 |
-55.9 |
9 |
deprecate (M1 degenerate; M5 gross <= 0) |
| donchian_breakout |
both |
-0.42 |
-17.6 |
+31.0 |
-55.5 |
355 |
deprecate (#985: no gate/profile clears protocol OOS + held-outs) |
| ichimoku_cloud |
both |
-0.43 |
-8.5 |
+40.1 |
-65.5 |
173 |
watch |
| order_blocks |
both |
-0.52 |
-19.9 |
+28.7 |
-63.4 |
295 |
watch |
| amd_ifvg |
both |
-0.53 |
-19.6 |
+28.9 |
-63.4 |
87 |
deprecate (#1023: DST/session-timing corrected + 15m rebaseline; passes OOS but failed 2023/2024 held-outs on both 15m and 1h/4h) |
| sweep_squeeze_combo |
both |
-0.55 |
-29.4 |
+19.2 |
-73.5 |
26 |
watch |
| momentum |
spot |
-0.58 |
-22.1 |
+26.5 |
-58.1 |
126 |
watch |
| sma_crossover |
both |
-0.68 |
-24.0 |
+24.5 |
-70.7 |
360 |
watch |
| volume_weighted |
both |
-0.72 |
-26.6 |
+22.0 |
-64.6 |
287 |
watch |
| session_breakout |
futures |
-0.79 |
-28.4 |
+20.2 |
-67.3 |
371 |
deprecate (#1031: short leg failed bull-year held-outs) |
| atr_breakout |
both |
-0.89 |
-22.7 |
+25.9 |
-69.8 |
389 |
watch |
| tema_cross |
both |
-0.90 |
-17.9 |
+30.6 |
-49.5 |
451 |
watch |
| momentum |
futures |
-0.92 |
-30.2 |
+18.4 |
-62.3 |
287 |
watch |
| bollinger_bands |
both |
-1.08 |
-44.0 |
+4.6 |
-60.5 |
344 |
deprecate |
| adx_trend |
both |
-1.10 |
-38.5 |
+10.1 |
-76.1 |
204 |
deprecate |
| liquidity_sweeps |
both |
-1.10 |
-42.0 |
+6.6 |
-63.0 |
127 |
deprecate (short leg failed held-outs) |
| rsi |
both |
-1.11 |
-45.3 |
+3.3 |
-63.8 |
118 |
deprecate |
| triple_ema |
both |
-1.12 |
-32.6 |
+16.0 |
-58.1 |
512 |
deprecate |
| rsi_macd_combo |
both |
-1.13 |
-46.0 |
+2.6 |
-64.6 |
180 |
deprecate |
| tema_cross_bd |
futures |
-1.16 |
-41.8 |
+6.8 |
-65.9 |
806 |
watch (short leg unmeasured) |
| ema_crossover |
both |
-1.33 |
-40.8 |
+7.8 |
-66.8 |
559 |
deprecate |
| stoch_rsi |
both |
-1.42 |
-46.6 |
+1.9 |
-65.2 |
664 |
deprecate |
| pairs_spread |
spot |
-1.45 |
-47.9 |
+0.7 |
-72.0 |
374 |
deprecate |
| mean_reversion |
both |
-1.46 |
-49.5 |
-0.9 |
-70.5 |
496 |
deprecate |
| triple_ema_bidir |
futures |
-1.55 |
-46.6 |
+2.0 |
-69.8 |
800 |
watch (short leg unmeasured) |
| heikin_ashi_ema |
both |
-1.56 |
-48.7 |
-0.2 |
-74.9 |
801 |
deprecate |
| parabolic_sar |
both |
-1.84 |
-55.8 |
-7.3 |
-72.6 |
1327 |
deprecate |
| macd |
both |
-1.86 |
-55.6 |
-7.1 |
-80.8 |
1264 |
deprecate |
| consolidation_range |
futures |
-1.88 |
-58.5 |
-9.9 |
-74.5 |
624 |
watch (short leg unmeasured) |
| vwap_reversion |
both |
-1.88 |
-59.5 |
-10.9 |
-78.9 |
1504 |
deprecate |
Deprecation candidates (18)
Bar: mean Sharpe ≤ -1.0 across all 6 runs, ≥100 trades, edge vs B&H ≤ ~+16pts. Removal is a separate PR — the registry --list-json output must stay byte-identical until then.
- vwap_reversion — Worst in registry: -59.5% mean, 1,504 trades, edge -10.9pts below buy-and-hold; pure fee churn.
- macd — -55.6% mean over 1,264 trades, -80.8% worst DD, below B&H.
- parabolic_sar — -55.8% over 1,327 trades, below B&H; whipsaws every regime.
- heikin_ashi_ema — -48.7% over 801 trades, zero edge vs B&H.
- mean_reversion — -49.5% over 496 trades, negative edge; superseded by mean_reversion_pro (regime-filtered variant).
- pairs_spread — -47.9%, +0.7pt edge; spot-only and structurally homeless (no second-leg execution in live).
- stoch_rsi — -46.6% over 664 trades, +1.9pt edge; pure churn.
- rsi_macd_combo — -46.0%, +2.6pt edge; the combo inherits both parents' weaknesses.
- rsi — -45.3%, +3.3pt edge over 118 trades.
- liquidity_sweeps — Long leg was -16.94% gross in M5; #1022 short-leg screen passes protocol OOS but fails 2023/2024 held-outs with SOL liquidations.
- range_scalper — #987 current-cache M1 is degenerate in every window (0/3 held-outs) and M5 remains gross-negative (-7.46% gross over 7 trades).
- session_breakout — #1031 short leg: gross edge real on OOS (Sharpe up to 2.50) but bear gate + atr_stop + zscore all fail the 2023/2024 bull-year held-outs (best 1/3); the short edge can't survive an uptrend and exits amputate the long-hold winners.
- amd_ifvg — #1023: session timing was UTC-fixed/DST-unaware and the M5 deprecate baseline ran on 1h/4h, not the designed 15m. Corrected to NY-anchored ICT killzones (DST-aware civil sessions) and rebaselined at 15m + 1h/4h. The corrected baseline clears protocol OOS but fails the 2023 and 2024 held-out years on both timeframes (1/3 held-out) — competitive only in chop, lags incumbents in trends. Concept disproven on a sound implementation.
- donchian_breakout — #985 full M1: the long leg (shipped default) fails every window ungated, and no mechanism rescues it — ADX trending_up gate and composite trending_up_clean gate flip IS only, the entry_period plateau wanders per window (30 passes 2023, 40 passes 2024, nothing passes 2025H1), the best tuned config (period 40 + gate) fails the one protocol-OOS look on DDadj, and the #977 M4 dual profile (20/55 on the ADX switch) fails all five windows. The short leg has a real OOS edge (Sharpe 1.62 gated vs bar -0.75) but fails the 2023/2024 bull-year held-outs at every period and under both classifiers (best 1/3) — the #1031 session_breakout failure shape. Both sides measured per the M5 unscreened_short requirement.
- bollinger_bands — -44.0%, +4.6pt edge over 344 trades.
- ema_crossover — -40.8% over 559 trades; dominated by sma_crossover and tema_cross.
- adx_trend — -38.5%, -76.1% worst DD; trend filter that doesn't filter.
- triple_ema — -32.6% over 512 trades; dominated by tema_cross (-17.9% on the same idea).
Bug found: supertrend_strategy produces zero signals on any input: the recursive band update seeds from NaN (rolling-ATR warmup), so final_upper/final_lower stay NaN for the entire series — verified empirically (8,783 bars, 0 signals, direction stuck at -1). Any live config running supertrend has been silently flat. It is a band-seeding bug, not a performance verdict.
Out-of-sample check
| Strategy |
OOS return % |
OOS Sharpe |
Trades |
Edge vs B&H |
Holds? |
| momentum_pro |
-3.1 |
-0.09 |
5 |
+27.3 |
yes — best OOS |
| chart_pattern |
-6.4 |
-0.37 |
23 |
+24.0 |
yes |
| breakout |
-6.8 |
-0.39 |
33 |
+23.6 |
yes |
| squeeze_momentum |
-11.7 |
-0.78 |
21 |
+18.7 |
mostly |
| mean_reversion_pro |
-18.6 |
-1.84 |
2 |
+11.8 |
weak (2 trades) |
| donchian_breakout |
-20.5 |
-1.53 |
43 |
+9.9 |
weak |
| ichimoku_cloud |
-26.6 |
-2.73 |
23 |
+3.8 |
no |
| range_scalper |
-38.3 |
-2.69 |
5 |
-7.9 |
no — worse than B&H |
Top-4 ordering is stable in and out of sample (BTC/USDT 1h, since 2026-01-01; B&H -30.4%): squeeze_momentum, breakout, momentum_pro, chart_pattern keep a 19-27pt edge over buy-and-hold in the unseen window. ichimoku_cloud's in-sample edge evaporates OOS and stays watch; range_scalper underperforms holding and #987 moves it to deprecate after M1/M5 confirmed a degenerate, gross-negative sample.
Verdicts on the five candidate strategies
Multi-timeframe confluence CONFIRM
The single biggest failure mode is high-frequency long entries fighting a year-long downtrend: every strategy with 300+ trades churned to -30%..-60%, and 4h runs consistently beat their 1h twins. An HTF trend gate over an LTF pullback entry attacks exactly this; highest-conviction candidate.
Regime-adaptive entry CONFIRM
Style alone did not decide outcomes: squeeze/breakout top the table while unfiltered mean reversion is the bottom — yet mean_reversion_pro, the ADX-gated variant, ranks in the top tier of strategies that traded. Regime selectivity, not entry style, separated winners from losers.
Volatility-targeted momentum CONFIRM
Raw momentum is mid-table, but momentum_pro (confirmation-gated) posted the best out-of-sample edge of any strategy on very few, selective trades. ATR-normalized sizing plus efficiency confirmation addresses the churn that killed macd/parabolic_sar. Build it bidirectional.
Funding-rate aware perps entry BLOCKED
The audit could not evaluate funding signals at all: delta_neutral_funding runs 0 trades because the backtest path has no funding data. Untested rather than disproven; add funding-data support to the backtester first, otherwise the strategy cannot clear its own gate.
Volume-profile / liquidity levels CUT
The existing structure/liquidity family is mid-to-bottom tier: order_blocks -0.52, amd_ifvg -0.53, sweep_squeeze_combo -0.55, liquidity_sweeps -1.10 mean Sharpe — none survived fees and none shows OOS promise. Cut it (or fold untested-level confluence into candidate 1).