BtcDailyVolCompressionBreakoutLongShort
Hypotheses
BTC Single-Asset Volatility Compression Breakout Long-Short on BINANCE Daily (Event-Driven Bracket Trigger, Translation-Robust Mechanism)
Hypotheses
Single-asset volatility-compression-then-breakout strategy on BTCUSDT.BINANCE — deliberately EVENT-DRIVEN rather than signal-magnitude-driven, to be ROBUST to the developer's frequent timeframe translation. The mechanism: (1) detect 'volatility compression' regime (20-bar ATR < 50% of 100-bar ATR — vol contracting), (2) when compression detected, set bracket triggers at the 20-bar high and 20-bar low, (3) LONG if price breaks above the high bracket; SHORT if price breaks below the low bracket; FLAT otherwise. The KEY DESIGN PROPERTY: this strategy fires on DISCRETE PRICE EVENTS (breakout of high/low), not on continuous signal levels (like t-stat magnitude or RSI extremes). Discrete events are TRANSLATION-ROBUST: a breakout above the 20-bar high is the same event whether we measure on daily, 4H, or 12H bars — the bracket adjusts to the timeframe but the event-trigger semantics stay intact. This directly addresses the analyst's CRITICAL GENERALIZATION from the abandoned BTC TSM: 'low-frequency academic factors cannot be ported to high-frequency crypto without re-deriving the methodology.' Volatility compression + breakout is NOT an academic monthly factor — it's an event-driven discretionary-style trigger that works equivalently across timeframes (Toby Crabel 1990 'Day Trading with Short Term Price Patterns' documented this at intraday; Bollinger's 'Volatility Cycle' at daily/weekly). Different mechanism class from all my in-pipeline single-asset strategies: TSM (t-stat signal), RSI MR (level signal), Macro Regime (slow MA crossover). Single-asset scope = no multi-asset translation curse. Helps direction quota (long/short/flat).
Hypotheses
Iteration 5 is a backtest-review calibration fix, not a verification failure — the strategy already backtested but produced only 4 trades in 6.5y (metrics_reliable=false), so the analyst asked to loosen the double gate to reach a testable sample (>=50 trades) while KEEPING the event-driven breakout mechanism. Applied exactly the three requested changes: (1) replaced the fixed 'ATR(20)<0.50*ATR(100)' compression with a self-calibrating rolling-percentile test (ATR(20) in the bottom compression_pct=0.35 of its trailing vol_lookback=100 distribution), which fires ~35% of bars by construction regardless of BTC's absolute vol regime; (2) widened arm_window 7->18; (3) shortened channel_period 20->12 so a breakout level is reachable within the armed window. The continuous channel-position signal and all imports are unchanged, so the already-passing static (Layer 1) and synthetic frozen-signal (Layer 2) checks remain green. A fixed-ratio fallback (compression_ratio=0.80) covers the warmup before min_vol_samples=60 ATR samples accumulate.
Hypotheses
failed deflated Sharpe: DSR=0.0029, expected-max=2.4209 over 225 trials — the selected optimized Sharpe (1.178) sits BELOW the best-of-N luck bar and is statistically indistinguishable from noise (is_significant=false, PBO=0.6349>0.5; probabilistic_sharpe 0.9956 vs DSR 0.0029 is the textbook PSR-vs-DSR selection-inflation trap). The walk-forward is is_overfitted=TRUE: avg IS Sharpe 1.909 collapses to avg OOS 0.2254 with windows [-1.303, 0.0, +1.979] — the first OOS window is deeply negative, the second produces NO trades, and the average is carried entirely by one lucky window. The holdout 'pass' (ratio 7.272) is SPURIOUS: it is measured against that degenerate 0.2254 WF-OOS baseline, so a positive holdout Sharpe (1.639) mechanically produces a huge ratio without demonstrating generalization. Sensitivity FAILED with 3 cliff parameters (channel_period, compression_pct, atr_short_period): channel_period 10->13 swings Sharpe 0.163->0.552 and atr_short_period 16->24 swings 0.147->0.814, and the 2D heatmap is a monotone ramp whose best corner (0.825) is an edge of the grid, not a plateau. Fundamentally the strategy adds no risk-adjusted value: NEGATIVE information_ratio in both base (-0.690) and optimized (-0.674) forms with benchmark_meaningful=true, despite near-zero beta (0.0034) — it loses to holding BTC risk-adjusted. Its returns are outlier-carried and fat-left-tailed (kurtosis 25.8->36.5, skew 3.13->4.87, tail_ratio 0.07->0.237) with 1209 base / 494 optimized days of max-drawdown duration and a negative 2021 (-7.80%). Costs are NOT the problem (commission 1.3-2.3% of gross, impact 0.55%, capacity $3.3B) — significance and forward-generalization are. Not iterate (attempt 1 of 2): per the overfit->abandon rule this is high-IS/negative-and-empty-OOS overfitting on a 3-cliff surface with PBO 0.63, and the ENTIRE sensitivity grid (0.0003-0.825 Sharpe) sits uniformly below the 2.4209 luck bar — there is no robust region above significance to tune toward, so a second best-of-225 sweep re-selects noise. The optimizer's flattering refit was bought by halving exposure (avg_position_pct 20.2%->9.4%, max_notional_frac 1.0->0.523), which shrinks drawdown without creating an edge. Not revise_hypothesis: BTCUSDT.BINANCE Daily is a valid, data-rich instrument with adequate trade count (62 base signals, zero sizing/min-notional drops), and this is a multiple-testing/overfit failure on a fine target, not a proven mechanism stranded on a dead one. FAILURE PATTERN: an 'event-driven, therefore translation-robust' framing (Crabel/Bollinger volatility-compression ARMED bracket breakout, long/short, single-asset BTC daily) does NOT confer statistical robustness — discrete-event triggers overfit exactly like magnitude signals once the compression percentile, channel period, and ATR window are jointly swept (DSR 0.0029, optimized Sharpe 1.178 below a 2.42 luck bar, PBO 0.63, is_overfitted with a -1.30 OOS window and one empty OOS window, 3 sensitivity cliffs, negative information ratio vs BTC buy-hold). Additionally, the iteration-5 'loosen the calibration until we reach a testable sample' fix (fixed-ratio -> rolling 35th-percentile compression, arm_window 7->18, channel_period 20->12) manufactured trade count but not edge: it converted a 4-trade non-result into a 62-trade sub-significant one. A passing holdout is NOT evidence when its ratio is computed against a WF-OOS baseline containing a negative and an empty window.
Implementation
Long/short BTCUSDT.BINANCE daily volatility-compression breakout. Detects a vol-squeeze via a self-calibrating rolling-percentile test (ATR(20) in the bottom 35% of its trailing 100-bar distribution), then freezes the trailing 12-bar high/low brackets and ARMS them for 18 bars. While armed, goes LONG on a close above the armed high, SHORT on a close below the armed low. Exits on 5% stop, 12% take-profit, a failed-breakout reversal back through the opposite bracket, or a 20-bar time stop. Risk-based sizing (1% equity per stop distance), notional-capped at 1x equity.
Backtest Review
Trades match the hypothesis mechanism: 35 long / 27 short over 62 trades, i.e. the armed-bracket event trigger fires in BOTH directions as the long/short event-driven premise requires. Not a closet long.
Backtest Review
Strategy is functioning cleanly: entry_diag shows bars_seen 2280, entry_signaled 62, entries_submitted 62, with dropped_size_zero / dropped_cash_short / dropped_min_notional all 0. No broken or frozen signal.
Backtest Review
Trade count (62) is a reasonable sample for a DAILY event-driven strategy over 6.5 years, and matches the ~25-40 entries/year-class expectation after the iteration-5 recalibration (up from 4 trades).
Backtest Review
Genuinely uncorrelated return stream: beta 0.0019, benchmark_correlation 0.0194, positive alpha (+0.012). Entries are distributed across every year 2020-2026, not clustered in one bull run.
Backtest Review
Costs are not the problem: commission_pct_of_gross 2.34%, impact_cost_pct 2.61%, capacity $146.7M. avg_trade_return of $170 on ~20% avg position is well clear of the ~0.10% BINANCE round-trip.
Backtest Review
Drawdown is modest (8.33%) and the strategy is not degenerate — profit_factor 1.23, win_rate 40.3% with avg_win $2218 vs avg_loss $1213, a coherent breakout payoff profile.
Backtest Review
Base Sharpe is only 0.447 with sharpe_ci_low -0.7385 (CI straddles zero) and probabilistic_sharpe 0.785. There is no evidence yet that the edge is distinguishable from noise — optimization must clear a real bar, not just improve the point estimate.
Backtest Review
THIN PER-WINDOW SAMPLE: 62 trades split across 3 walk-forward windows is ~20 trades per window, before the compression gate thins it further. This is the regime where OOS folds come back empty and the walk-forward reports a meaningless average. This is the main risk to the 2 hours.
Backtest Review
tail_ratio 0.07 with return_kurtosis 25.76 and return_skew 3.13 — the P&L depends on rare large days, and the left tail (cvar_95 1.16% vs var_95 0.11%) is an order of magnitude worse than the typical bad day. Fragile payoff shape.
Backtest Review
information_ratio is NEGATIVE (-0.6897) with benchmark_meaningful=true: risk-adjusted, it currently underperforms simply holding BTC. It earns its keep only as a diversifier (beta ~0), not as a standalone.
Backtest Review
max_drawdown_duration_days 1209 — over three years peak-to-recovery. A modest 8.3% drawdown depth that takes that long to recover is painful.
Backtest Review
2021 was -7.8% and 2025 -0.08%; the positive years (2020 +4.7%, 2024 +6.4%) carry the record.
Analysis
Optimized full-sample refit looks superficially clean: Sharpe 1.178, total_return 22.9%, max_drawdown only 3.50%, profit_factor 2.07, recovery_factor 6.65, omega_ratio 2.03.
Analysis
Adequate trade sample after the iteration-5 recalibration (62 base / 54 optimized trades), so the metrics are not degenerate-small; entry_diag shows 62 signals -> 62 submitted, no sizing/min-notional drops.
Analysis
Fee drag is not the binding problem: commission_pct_of_gross 2.34% (base) / 1.34% (optimized), impact_cost_pct 0.55% optimized, capacity_usd $3.3B — the strategy is not a costs-eat-the-edge failure.
Analysis
Mechanism is genuinely event-driven and beta-neutral in construction (beta 0.0034, benchmark_correlation 0.066), and the holdout window itself printed a positive Sharpe (1.639).
Analysis
Failed deflated Sharpe decisively: deflated_sharpe=0.0029 vs the 0.95 bar, is_significant=false. The optimized Sharpe of 1.178 sits FAR BELOW the 225-trial expected-max luck bar of 2.4209 — i.e. the selected best-of-225 config is worse than what you would expect to find by pure chance given the search size.
Analysis
probabilistic_sharpe 0.9956 vs deflated_sharpe 0.0029 is the textbook PSR-vs-DSR selection-inflation trap: the chosen config looks great in isolation and vanishes once multiple-testing is accounted for.
Analysis
PBO = 0.6349 (>0.5): the parameter selection is more likely than not overfit.
Analysis
Walk-forward is_overfitted=TRUE: avg IS Sharpe 1.909 collapses to avg OOS 0.2254, with OOS windows [-1.303, 0.0, +1.979] — the first window is deeply NEGATIVE, the second produced NO trades, and the entire positive average is carried by one lucky window.
Analysis
The holdout 'pass' (ratio 7.272) is SPURIOUS: the ratio is inflated only because its WF-OOS denominator (0.2254) is degenerate — one negative window, one empty window. A ratio measured against a broken baseline is not evidence of forward generalization.
Analysis
Sensitivity FAILED with 3 cliff parameters (channel_period, compression_pct, atr_short_period). channel_period 10->13 swings Sharpe 0.163 -> 0.552; atr_short_period 16->24 swings 0.147 -> 0.814. The 2D heatmap is a monotone ramp from 0.0003 to 0.825 — the 'good' corner is an edge of the grid, not a plateau.
Analysis
The ENTIRE sensitivity surface (0.0003 to 0.825 Sharpe) lies uniformly below the 2.4209 best-of-N luck bar — there is no robust parameter region above significance for a second sweep to tune toward.
Analysis
NEGATIVE information_ratio in both forms (base -0.6897, optimized -0.6741) with benchmark_meaningful=true — despite near-zero beta, the strategy delivers worse risk-adjusted active return than simply holding BTC.
Analysis
Edge is outlier-carried and fat-left-tailed: return_kurtosis 25.8 (base) / 36.5 (optimized), return_skew 3.13 / 4.87, tail_ratio 0.07 / 0.237 (<<1), cvar_95 1.157% base. Base annual returns are erratic (2021 -7.80%, 2025 -0.08%) and max_drawdown_duration_days is 1209 (base) / 494 (optimized) — years underwater.
Analysis
The optimizer bought its headline by halving exposure (avg_position_pct 20.2% -> 9.4%, max_notional_frac 1.0 -> 0.523) and widening stops/targets, which shrinks drawdown without creating statistical significance.
Analysis
Do NOT optimize — only 4 trades in 6.5 years (metrics_reliable=false); optimization would fit 4 noise points. Root cause is a too-strict double gate. Loosen it to get a testable sample (target >=50 trades): (1) raise compression_ratio from 0.50 toward ~0.75-0.85, or better, replace the fixed-half ATR test with a rolling-percentile test (ATR(20) in the bottom ~30-40% of its trailing 100-bar distribution) so it self-calibrates; (2) widen arm_window from 7 to ~15-20 bars; (3) consider shortening channel_period from 20 to 10-15 so the breakout level is reachable within the window. Keep the event-driven breakout mechanism itself — only its calibration needs fixing. Re-backtest and confirm >=~50 trades spread across years before resubmitting for optimization. Details in workspace/discussions/baea76aa-4ba5-4dfa-82d1-93caabee4c68/iteration_1_feedback.md
Outcome Summary
This was iteration 5 of a strategy explicitly designed to dodge a prior abandon's lesson about porting academic factors across timeframes, and the backtest-review gate passed it to optimization on the strength of a genuinely two-sided mechanism (35 long / 27 short, 62/62 orders submitted), near-zero beta, and cheap costs. Optimization then dismantled it: the selected config's Sharpe of 1.178 sat below what a 225-trial search would find by pure chance, PBO exceeded 0.5, one out-of-sample window went to -1.303 and another produced no trades at all, and the apparently strong holdout ratio of 7.272 was spurious — inflated by a degenerate 0.2254 baseline rather than evidence of generalization. The analyst also noted that the iteration-5 recalibration (fixed-ratio → 35th-percentile compression, arm_window 7→18, channel_period 20→12) had manufactured trade count without edge, converting a 4-trade non-result into a 62-trade sub-significant one, and that the optimizer's flattering drawdown came from halving exposure rather than finding an edge. With the entire sensitivity surface (Sharpe 0.0003 to 0.825) lying uniformly below the luck bar, there was no robust region left to tune toward, and a second sweep would only re-select noise.
Outcome Summary
Framing a trigger as 'event-driven, therefore translation-robust' confers no statistical robustness — discrete-event triggers overfit exactly like magnitude signals once their compression percentile, channel period and ATR window are jointly swept.
Outcome Summary
The analyst abandoned it on the deflated-Sharpe gate: DSR 0.0029 against a 0.95 bar, with the optimized Sharpe of 1.178 falling below the 225-trial expected-max luck bar of 2.4209, PBO 0.6349, is_overfitted=true, three sensitivity cliffs (channel_period, compression_pct, atr_short_period), and a negative information_ratio (-0.674) meaning it lost to holding BTC on a risk-adjusted basis despite near-zero beta.
Outcome Summary
Detect volatility compression on BTCUSDT.BINANCE daily bars (ATR(20) in the bottom 35th percentile of its trailing 100-bar distribution), then arm frozen 12-bar high/low brackets for 18 bars and go long on an upside break or short on a downside break — an event-driven Crabel/Bollinger trigger chosen because discrete price events were argued to be robust to timeframe translation.
Outcome Summary
The base backtest produced 62 trades (35 long / 27 short) over ~6.5 years with Sharpe 0.447, total_return 11.50%, profit_factor 1.23, max_drawdown 8.33% and near-zero beta (0.0019). Optimization's best-of-225 refit reported Sharpe 1.178, total_return 22.90% and max_drawdown 3.50%, but the walk-forward collapsed from avg IS Sharpe 1.909 to avg OOS 0.2254 across windows of [-1.303, 0.0, +1.979].
Backtest and paper results are hypothetical. Trading involves risk of loss.