Skip to content

View original

BtcSpot30DayDrawdownAccumulationRecoveryLong

Hypotheses

BTC Spot 30-Day Drawdown Accumulation with Recovery Exit

Hypotheses

A long-only single-instrument accumulation strategy on BTCUSDT spot (BINANCE_SPOT) using daily (1D) bars and ONLY OHLCV data. Distinctly different from the existing portfolio: this is the only spot strategy (CASH account, long-only, no leverage), the only long-holding-period accumulation mechanic, and intentionally low-frequency (~3-6 trades per year on average) so the higher 0.20% spot round-trip fee is negligible against the 8-25% expected per-trade move. The hypothesis: BTC has a structurally bullish multi-year drift (~50-100% annual returns historically), but exhibits frequent drawdowns of 10-20% from local highs that are ALMOST ALWAYS recovered within 30-60 days during non-bear regimes. A simple 'buy when price is >=12% below the 30-day high' rule captures these drawdowns systematically without trying to time the exact bottom. The strategy uses a 200-day SMA regime filter to avoid catching falling knives in true bear markets — only triggers when price is above the 200-day SMA (long-term uptrend confirmed). Just 4 parameters (drawdown_threshold, lookback, regime_sma, max_hold) keeps the overfitting surface minimal. The strategy ALSO works as a portfolio diversifier: most existing strategies are short-term futures trades; this provides exposure to the long-term equity curve of BTC and is uncorrelated with their alpha.

Hypotheses

Iteration 4 aligns the code exactly to the hypothesis by removing the sources of code↔hypothesis drift the semantic auditor flagged: (1) drawdown_threshold default corrected 0.10 -> 0.12 so should_enter fires at the stated 12%-below-30-day-high rule; (2) removed the undisclosed fast-SMA momentum filter (fast_sma / sma_slope_lookback / max_sma_decline and the momentum_ok entry gate) so entry is governed only by the 12% drawdown AND the 200-day regime SMA as described; (3) deleted the dead ATR machinery (atr_period, _atr, _trs, TR accumulation) that was computed but never used. The parameter set is now the 4 named hypothesis knobs (lookback, drawdown_threshold, regime_sma, max_hold) plus the minimal recovery-exit/sizing mechanics the title's 'Recovery Exit' requires. calculate_signal returns the continuous drawdown fraction (negated out-of-regime) every bar; the entry decision is thresholded in should_enter. Sizing is capital-relative via get_account_equity() at 30% notional for a low-risk long-term-exposure diversifier.

Hypotheses

Overfit closet-long failure on optimization attempt 1. The walk-forward is is_overfitted=TRUE: avg IS Sharpe 14.9 collapses to avg OOS 0.0 with all three OOS windows exactly [0.0, 0.0, 0.0] — the optimizer's thinner config (drawdown_threshold 0.12->0.179, max_hold 60->39, trades 33->13) produces no realized out-of-sample edge. The untouched time-ordered HOLDOUT FAILED (holdout_sharpe 0.0, ratio 0). The multiple-testing gate fails decisively: DSR=0.0289 (vs 0.95), PBO=0.6667 (>0.5), is_significant=false, sharpe_ci_low -1.67 straddling 0, and the optimized Sharpe 5.98 sits far below the 225-trial expected-max luck bar of 16.68 — probabilistic_sharpe 0.8555 vs DSR 0.0289 is the textbook PSR-vs-DSR selection-inflation trap. Sensitivity FAILED with 3 cliff parameters (stop_pct, regime_sma, drawdown_threshold). Fundamentally, this is a closet long: base alpha -0.0148 and information_ratio -0.67 with benchmark_meaningful=true — a long-only BTC spot dip-buyer that loses to simply holding BTC risk-adjusted — and it misses promotion thresholds outright (Sharpe 1.33<1.5, max_dd 24.6%>10%, 33 trades<100). Not iterate (attempt 1 of 2): the OOS windows are uniformly zero on a 3-cliff surface with PBO 0.67 and negative alpha, so there is no robust region to tune toward and a second best-of-225 sweep re-overfits. Not revise_hypothesis: per the overfit->abandon rule this is high-IS/zero-OOS overfitting on a valid instrument, and the mechanism is a negative-alpha closet-long — pointing the same dip-buy-and-hold expression at another asset re-creates the same underperform-buy-hold problem. FAILURE PATTERN: a long-only single-asset BTC spot 'buy the 12% drawdown in a 200-SMA uptrend and hold for recovery' accumulation is structurally a closet long — it carries negative alpha/information-ratio vs its own BTC buy-hold, and once optimized it thins trades until all three walk-forward OOS windows and the holdout go to exactly 0.0 (is_overfitted, DSR 0.029, PBO 0.67, optimized Sharpe below the 16.68 luck bar, 3 sensitivity cliffs). A respectable-looking base Sharpe (1.33) and a clean narrative do not rescue a strategy that adds no risk-adjusted value over holding the asset and fails every forward-generalization gate.

Implementation

Long-only BTCUSDT spot (BINANCE_SPOT, CASH, no leverage) accumulation on DAILY bars using ONLY OHLCV. Buys when price is >=12% below the 30-day rolling high, but only when price is above the 200-day SMA (confirmed secular uptrend, avoids falling knives). Holds for the recovery, exiting on a +12% take-profit, full recovery to the prior high, a 15% catastrophe stop, or a 60-bar time stop. Intentionally low-frequency so the 0.20% spot round-trip fee is negligible.

Backtest Review

Trade frequency (33 trades / ~9yr ≈ 3.7/yr) matches the hypothesized ~3-6/yr low-frequency accumulation design — fee-negligible by construction

Backtest Review

Mechanism matches hypothesis: 33 long trades, 0 shorts, dip-buying in-regime; entry diagnostics clean (33 signaled, 33 submitted, 0 dropped)

Backtest Review

Genuine edge at base: Sharpe 1.33, Sortino 2.56, win_rate 0.667, positive expectancy, profit_factor 1.15

Backtest Review

Low time-in-market (32.9% exposure) supports the stated diversifier role; large capacity ($150M)

Backtest Review

Negative alpha (-0.015) and information_ratio (-0.67) vs BTC buy-hold — it underperforms simply holding BTC risk-adjusted

Backtest Review

Thin profit_factor (1.15) and 33-trade sample make the 4-param optimization prone to curve-fitting; watch OOS/holdout closely

Backtest Review

Long max_drawdown_duration (~1679 days) and max_dd 24.6% — recovery-exit logic tolerates extended underwater periods

Analysis

Clean, minimal 4-economic-parameter design with a sound narrative (dip-buy in confirmed uptrend, hold for recovery)

Analysis

Low fee drag (commission_pct_of_gross 2.6%) — the low-frequency spot thesis on fees holds

Analysis

Base config is not degenerate (Sharpe 1.33, win_rate 0.67, profit_factor 1.15)

Analysis

Walk-forward is_overfitted=TRUE: avg IS Sharpe 14.9 collapses to avg OOS 0.0 across all three windows [0.0, 0.0, 0.0]

Analysis

Holdout FAILED: holdout_sharpe 0.0, ratio 0 — no forward edge

Analysis

DSR=0.0289 (<0.95), PBO=0.6667 (>0.5), is_significant=false, sharpe_ci_low -1.67 straddles 0; optimized Sharpe 5.98 below the 16.68 expected-max luck bar

Analysis

Sensitivity FAILED with 3 cliff parameters (stop_pct, regime_sma, drawdown_threshold)

Analysis

Closet long: negative alpha (-0.0148) and negative information_ratio (-0.67) vs its own BTC buy-hold (benchmark_meaningful=true) — loses to simply holding BTC risk-adjusted

Analysis

Fails promotion thresholds directly: Sharpe 1.33<1.5, max_drawdown 24.6%>10%, 33 trades<100

Analysis

Code↔hypothesis misalignment found by the semantic auditor — the code does NOT implement the hypothesis. Re-code the strategy to implement the hypothesis EXACTLY (instrument, timeframe, direction, the named edge/mechanic, sizing). Concrete issues: Hypothesis states the entry rule as 'buy when price is >=12% below the 30-day high', but config/code default drawdown_threshold is 0.10 (10%); should_enter fires at signal>=0.10 = 10% below the 30-day high, a concrete 12%-vs-10% mismatch. | Hypothesis claims 'Just 4 parameters (drawdown_threshold, lookback, regime_sma, max_hold)' to minimize overfitting, but the code actually reads 13 tunable parameters, including a full fast-SMA momentum filter (fast_sma, sma_slope_lookback, max_sma_decline) and exit/sizing params beyond the 4 named. | Code adds an undisclosed second entry gate: momentum_ok from a 50-day fast-SMA decline filter (max_sma_decline=0.08) is ANDed with the regime filter to permit entry, yet the hypothesis narrative describes only the 200-day regime SMA. | self._atr / atr_period is computed every bar (from _trs) but never used in any entry, exit, or sizing logic — dead leftover from the removed ATR-trailing stop, unrelated to the stated hypothesis mechanics.

Outcome Summary

The strategy proposed accumulating BTC spot on ≥12% drawdowns from the 30-day high within a 200-day-SMA-confirmed uptrend, intentionally trading only a few times per year so spot fees stayed negligible. Its base backtest looked respectable — Sharpe 1.33, 66.7% win rate over 33 trades — and the pre-optimization review said 'optimize', but it already carried negative alpha and information ratio against BTC buy-and-hold. Optimization exposed the flaw decisively: in-sample Sharpe of ~14.9 collapsed to exactly 0.0 across all three walk-forward OOS windows and the holdout, with PBO 0.667, deflated Sharpe 0.0289, and three sensitivity cliffs. After 4 iterations the analyst abandoned it as an overfit closet-long that failed every forward-generalization gate and added no risk-adjusted value over simply holding BTC.

Outcome Summary

A long-only single-asset dip-buy-and-hold expression is structurally a closet long — a respectable base Sharpe and clean narrative don't rescue a strategy that adds no risk-adjusted value over holding the asset and thins to zero OOS edge once optimized.

Outcome Summary

The backtest-review gate passed it to optimization, but the post-optimization analyst verdict was 'abandon': the strategy was flagged is_overfitted=TRUE with zero out-of-sample and holdout edge, failed the multiple-testing gates (DSR 0.029 vs 0.95, PBO 0.667, not significant), and was judged a negative-alpha closet-long that loses to simply holding BTC.

Outcome Summary

A long-only, low-frequency BTCUSDT spot accumulation strategy that systematically buys ≥12% drawdowns from the 30-day high while price is above the 200-day SMA (confirmed uptrend) and holds through the recovery, aiming to be a fee-negligible portfolio diversifier.

Outcome Summary

The base backtest over ~9 years (2017–2026) posted a Sharpe of 1.33, Sortino 2.56, 66.7% win rate, profit factor 1.15, and 24.6% max drawdown across 33 long trades (~3.7/yr), but carried negative alpha (-0.0148) and information ratio (-0.67) versus BTC buy-and-hold. After optimization, all three walk-forward OOS windows and the holdout collapsed to exactly 0.0 Sharpe (avg IS Sharpe 14.9 → OOS 0.0), with PBO 0.667, deflated Sharpe 0.0289, and 3 sensitivity cliffs.
Strategy report

Backtest and paper results are hypothetical. Trading involves risk of loss.