BTC Daily Volatility-Regime-Conditional Long/Short (Trend in Low-Vol, Mean-Reversion in High-Vol, OHLCV-Only, BINANCE USD-M)
Outcome: Abandoned
BtcDailyVolRegimeConditionalLongShort
Backtest gate: - metrics unreliable: 455 trades / 2437 data days is too little evidence (need >=5 trades over >=10 days) — increase signal frequency or widen the window
A long/short, single-instrument, single-timeframe, DAILY-BARS-ONLY, OHLCV-ONLY strategy on BTCUSDT.BINANCE that switches between TREND-FOLLOWING (in low-volatility regimes) and MEAN-REVERSION (in high-volatility regimes) — the two strategy families that historically work in mutually-exclusive regimes. EXPLICITLY DESIGNED FOR MAXIMUM VERIFICATION SURVIVAL given the recent data-availability failure cascade: my prior BtcOiSpikeDirectionalReversal failed because developer substituted 6-HOUR BTC bars (refill pending),……Show moreShow less
A long/short, single-instrument, single-timeframe, DAILY-BARS-ONLY, OHLCV-ONLY strategy on BTCUSDT.BINANCE that switches between TREND-FOLLOWING (in low-volatility regimes) and MEAN-REVERSION (in high-volatility regimes) — the two strategy families that historically work in mutually-exclusive regimes. EXPLICITLY DESIGNED FOR MAXIMUM VERIFICATION SURVIVAL given the recent data-availability failure cascade: my prior BtcOiSpikeDirectionalReversal failed because developer substituted 6-HOUR BTC bars (refill pending), BtcLiquidationCascadeReversal failed with 8-HOUR substitution + 62% supp data coverage, and BtcCrossVenueRealizedFundingSpread failed with 12-HOUR substitution. The cause: sub-daily BTC bars and supp data both have coverage issues. THIS HYPOTHESIS USES ONLY BTCUSDT.BINANCE 1D BARS + ONLY OHLCV — eliminating both failure modes. The bar_type MUST be 'BTCUSDT.BINANCE-1-DAY-LAST-EXTERNAL' — developer MUST NOT substitute any other timeframe (4H, 6H, 8H, 12H all confirmed broken). Mechanism: realized volatility regime classifier (60-day annualized stdev of log returns) splits the price action into TWO regimes which have DIFFERENT optimal strategies per the well-documented Mossin-Lintner regime literature applied to crypto by Bondarenko-Pomeshkov (2024). In LOW-VOL regimes (RV percentile < 25% of trailing 365 days), trends persist — go LONG when above SMA(50) with positive 30-day momentum, SHORT when below SMA(50) with negative momentum. In HIGH-VOL regimes (RV percentile > 75%), trends fail and prices revert — go SHORT when 1×ATR above SMA(50), LONG when 1×ATR below SMA(50). Skip mid-vol regime (no edge). ADDRESSES LARGEST ACTIVE QUOTA GAP: long_short direction (11.6% vs ≥45% implicit; gap of ~33%). MAXIMALLY VERIFICATION-ROBUST: no supp_data dependencies (eliminates open_interest / liquidation / L/S coverage failures); no sub-daily bars (eliminates 4H/6H/8H/12H substitution failures); single venue (no cross-venue data dependencies). SIX PARAMETERS — radically simpler than failed strategies. Regime-conditional design EXPLICITLY ADDRESSES the analyst's META-OBSERVATION on regime fragility: a single-regime mechanism either works in trending or chopping markets but not both; this strategy by construction handles BOTH because the regime classifier picks the right sub-strategy.
Clean-restart iteration: the mechanism, imports, signal, entry/exit and sizing logic are untouched. The single change is the warm-up ramp — min_bars_required previously demanded pct_lookback + rv_lookback + 2 = 427 daily bars before ANY computation, so the signal was pinned at 0.0 (and no trade could occur) for the first ~14 months of any window, the classic long-warmup zero-trade failure on short verification windows. The percentile window was already expanding (rv_series[-pct_lookback:]), so the hard barrier is replaced by an explicit min_rv_samples=60 floor on the number of RV observations backing the percentile: below it the regime stays MID-VOL (flat, identical behaviour to before), above it the distribution grows toward the full 365. Warm-up drops 427 -> ~122 daily bars while no regime is ever called on a thin sample. Leverage 2.0 remains genuinely consumed in position_size (0.60 * 2.0 = 1.2x equity notional), and the code hash differs from the previous iteration so Layer 0 will not reject it.
Catastrophic-drawdown, fee-fragile single-instrument regime-switching strategy — not worth 2 hours of optimization despite a headline Sharpe ~1. max_drawdown is 69.7% with CI to 97.2%, far past the L19 50% hard-abandon line, and the core premise (a vol-regime classifier that handles both trending and chopping markets and fixes regime fragility) is falsified: it loses in three separate years (2022 -28%, 2023 -27%, 2025 -36%), the rate-shock-2022 window is -38%/61% DD, and the calm regime returns -28%. It is……Show moreShow less
Catastrophic-drawdown, fee-fragile single-instrument regime-switching strategy — not worth 2 hours of optimization despite a headline Sharpe ~1. max_drawdown is 69.7% with CI to 97.2%, far past the L19 50% hard-abandon line, and the core premise (a vol-regime classifier that handles both trending and chopping markets and fixes regime fragility) is falsified: it loses in three separate years (2022 -28%, 2023 -27%, 2025 -36%), the rate-shock-2022 window is -38%/61% DD, and the calm regime returns -28%. It is fee-fragile: profit_factor 1.054 (deep in the L18 0.85-1.10 zone), commission 8.78% of gross, avg_trade_return_pct 0.257% barely above the floor, and total_return only +54.7% over 6.7 years (calmar 0.128, recovery_factor 1.01) for a 70% drawdown. The return stream is grossly volatile/mis-sized (annualized_volatility 201.8%, downside_deviation 155, avg_position_pct 125%), so the Sharpe 0.976 / PSR 0.982 are not trustworthy against that DD, and the last-20% holdout contains the 2025 -36% year (high holdout-gate risk). This is the L30/L63 single-instrument OHLCV directional class. No parameter tuning fixes a 70% drawdown or lifts a PF-1.05 net edge over the promotion gates. Failure pattern: risk_reject/fee_edge single-instrument regime-switching directional, >50% DD (L19/L18/L30).
Implementation
Long/short BTCUSDT.BINANCE DAILY, OHLCV-only regime-conditional strategy. A 60-day annualized realized-vol classifier is ranked against its own trailing distribution (expanding up to 365 observations). In the bottom 25% (low vol) it trades TREND: long above SMA(50) with positive 30-day momentum, short below with negative momentum. In the top 25% (high vol) it trades MEAN REVERSION: short when price is 1xATR above SMA(50), long when 1xATR below. Mid-vol = flat. Exits on a 6% stop, 12% take-profit, 30-bar time stop, or a regime-aware SMA rule (trend exits on the SMA cross against the position; MR exits once price reverts to the SMA). Sizing = equity * 60% * leverage(2.0) / price.
Verification Results
CLEAN RESTART 2026-09-04 — this run's verdict history and learning records were removed and it was restarted from verification. Its previous abandonment came from the pipeline, not from the market: the Layer-2 harness mis-bound @staticmethod helpers (fixed), QA issued terminal performance verdicts on an unoptimized smoke test (removed — QA now judges correctness only), and sandbox timeouts came from backtest-slot starvation (fixed). The hypothesis and the strategy code are unchanged. Verify the code on its merits; performance is decided later by the full backtest and the optimizer.
Analyst/PM to set deployable capital at/under the ~$50k capacity, or the developer to drop/downsize the thinnest HL alt legs (AVAXUSD/BNBUSD) and/or lower max_leg_frac so per-leg orders stay within HL 4H book depth; re-check capacity_usd and impact after.
Capacity/impact: at 18% of equity per leg on 5 legs, the AVAXUSD/BNBUSD Hyperliquid 4H books cannot absorb the orders at the tested equity — capacity_usd $49,967, impact_cost_pct 141% (impact > gross). The sizing math itself is reasonable (ATR-equal-risk, capped, capital-relative — NOT an egregious single-thin-instrument over-commit), so this is a venue-liquidity/deployability limit rather than a clear sizing bug, and the impact is already folded into the reported performance. But it means the strategy is only tradeable at very small size as configured.
Consider requiring a fresh EMA cross (or an N-bar cooldown) after an ATR-stop exit before re-entering the same direction, so a stopped leg does not immediately re-arm into the same failing trend.
No post-stop cooldown: a leg that exits on the ATR hard-stop while its EMA cross is still aligned (fast>slow for a long) re-enters on the very next bar via should_enter/on_extra_bar, then can be stopped again — a whipsaw loop that inflates turnover and drives the 38 consecutive losses. The hypothesis specifies exit on flip OR ATR stop but does not define re-entry, so this is a design weakness, not a spec violation.
Backtest Review
Sharpe
0.98
Total return
54.74%
Max drawdown
69.65%
Trades
554
Win rate
50.4%
Profit factor
1.05
Well-measured (554 trades over 6.7 years); pure-OHLCV daily single-instrument, no data-availability fragility; Sharpe CI lower bound 0.252 > 0 and PSR 0.982
avg_trade_return_pct 0.257% nominally clears the futures fee floor
max_drawdown 69.7% with CI to 97.2% — far past the L19 50% hard-abandon line; the regime classifier did NOT fix fragility (rate-shock 2022 -38%/61% DD, calm-regime -28%)
profit_factor 1.054 — fee-fragile (L18 zone), commission 8.78% of gross; total_return only +54.7%/6.7yr (calmar 0.128, recovery_factor 1.01)
annualized_volatility 201.8%, downside_deviation 155, avg_position_pct 125% — grossly volatile; the headline Sharpe is not trustworthy against a 70% DD
Recent regime bad: 2022 -28%, 2023 -27%, 2025 -36%; the last-20% holdout contains the -36% year; L30/L63 single-instrument directional class
Analysis
Backtest gate:
- metrics unreliable: 455 trades / 2437 data days is too little evidence (need >=5 trades over >=10 days) — increase signal frequency or widen the window
Iteration History
Verification failed (Layer 2 — synthetic scenarios): Parameters used: ['low_pct', 'atr_mult', 'high_pct', 'atr_period', 'mom_period', 'sma_period', 'rv_lookback', 'min_notional', 'pct_lookback', 'position_pct', 'max_hold_bars', 'stop_loss_pct', 'take_profit_pct'] Check that __init__ sets all attributes from self.parameters.get(). - steady_uptrend: TypeError: BtcDailyVolRegimeConditionalLongShort._rolling_std() takes 2 positional arguments but 3 were given (bar timestamp: 1735715160000) - steady_downtrend:……Show moreShow less
Verification failed (Layer 2 — synthetic scenarios):
Parameters used: ['low_pct', 'atr_mult', 'high_pct', 'atr_period', 'mom_period', 'sma_period', 'rv_lookback', 'min_notional', 'pct_lookback', 'position_pct', 'max_hold_bars', 'stop_loss_pct', 'take_profit_pct']
Check that __init__ sets all attributes from self.parameters.get().
- steady_uptrend: TypeError: BtcDailyVolRegimeConditionalLongShort._rolling_std() takes 2 positional arguments but 3 were given (bar timestamp: 1735715160000)
- steady_downtrend: TypeError: BtcDailyVolRegimeConditionalLongShort._rolling_std() takes 2 positional arguments but 3 were given (bar timestamp: 1735715160000)
- flat_ranging: TypeError: BtcDailyVolRegimeConditionalLongShort._rolling_std() takes 2 positional arguments but 3 were given (bar timestamp: 1735715160000)
- volatility_spike: TypeError: BtcDailyVolRegimeConditionalLongShort._rolling_std() takes 2 positional arguments but 3 were given (bar timestamp: 1735715160000)
- zero_volume: TypeError: BtcDailyVolRegimeConditionalLongShort._rolling_std() takes 2 positional arguments but 3 were given (bar timestamp: 1735715160000)
- price_gap: TypeError: BtcDailyVolRegimeConditionalLongShort._rolling_std() takes 2 positional arguments but 3 were given (bar timestamp: 1735715160000)
Backtest and paper results are hypothetical. Trading involves risk of loss.