qbuntuqbuntu
marginalno_edge· equity· breakout· momentum· volatility

Volatility Breakout (US S&P 500)

slug: volatility-breakout-us-sp500

Volatility Breakout (US S&P 500) backtest. Median Sharpe across 720 parameter sets is +0.25. p-value is 0.52. Max DD is -11.1%. Period: 2022-02-01 to 2026-09-01. Best Sharpe +1.21 is not the representative figure.

Verdict: marginal. Some parameter set has a p-value under 0.10, but the median itself misses promising (Sharpe > 0.5 and p-value < 0.05). Primary reason: no_edge. It is not regime, frequency, or cost, and the median does not clear the bar.

Performance summary

Sharpe (median)
+0.25
Max DD
-11.1%
Win rate
—
Alpha (ann.)
—
p-value
0.52
backtest period: 2022-02-01 → 2026-09-01
Sharpe across 720 grid runs:median 0.25best 1.21 (not representative)worst -0.67p25–p75 0.03–0.48

Hypothesis

Stocks with rising short-term ATR relative to long-term ATR are experiencing volatility expansion, signaling breakout opportunities. Applied to S&P 500 constituents.

Why it didn't work

Across 720 grid combinations, median Sharpe=0.25, best=1.21. Primary failure mode: no_edge.

Facts (5)

Best grid Sharpe ratio is 1.21 (p=0.011).
period 2022-02-01–2026-09-01; cost=5bps
sharpe_ratio1.21
Median Sharpe across 720 grid runs is 0.25.
Full grid of 720 parameter combinations.
sharpe_ratio0.25
Median Sharpe in DOWN regime is -0.14 across 720 runs.
Regime=DOWN, N225 SMA20/SMA60 classification.
sharpe_ratio-0.14
Median Sharpe in FLAT regime is -0.09 across 720 runs.
Regime=FLAT, N225 SMA20/SMA60 classification.
sharpe_ratio-0.09
Median Sharpe in UP regime is 0.60 across 720 runs.
Regime=UP, N225 SMA20/SMA60 classification.
sharpe_ratio0.60

Runs (30)

runparamssharpeUPFLATDOWN
atr_short=5, atr_long=20, holding_days=1, n_stocks=5, cost_bps=5, regime_gate=False
r-volatility-breakout-us-sp500-0000
atr_long: 20
cost_bps: 5
n_stocks: 5
-0.05-0.88+0.89-0.33
atr_short=5, atr_long=20, holding_days=1, n_stocks=5, cost_bps=5, regime_gate=True
r-volatility-breakout-us-sp500-0001
atr_long: 20
cost_bps: 5
n_stocks: 5
+0.08-0.64+0.89-0.33
atr_short=5, atr_long=20, holding_days=1, n_stocks=5, cost_bps=10, regime_gate=False
r-volatility-breakout-us-sp500-0002
atr_long: 20
cost_bps: 10
n_stocks: 5
-0.36-1.23+0.62-0.70
atr_short=5, atr_long=20, holding_days=1, n_stocks=5, cost_bps=10, regime_gate=True
r-volatility-breakout-us-sp500-0003
atr_long: 20
cost_bps: 10
n_stocks: 5
-0.18-0.84+0.62-0.70
atr_short=5, atr_long=20, holding_days=1, n_stocks=20, cost_bps=5, regime_gate=False
r-volatility-breakout-us-sp500-0008
atr_long: 20
cost_bps: 5
n_stocks: 20
-0.02-0.55+0.70+0.11
atr_short=5, atr_long=20, holding_days=20, n_stocks=5, cost_bps=5, regime_gate=False
r-volatility-breakout-us-sp500-0036
atr_long: 20
cost_bps: 5
n_stocks: 5
-0.43+0.15-0.62-2.46
atr_short=5, atr_long=20, holding_days=20, n_stocks=5, cost_bps=10, regime_gate=False
r-volatility-breakout-us-sp500-0038
atr_long: 20
cost_bps: 10
n_stocks: 5
-0.52+0.06-0.69-2.63
atr_short=5, atr_long=20, holding_days=20, n_stocks=20, cost_bps=10, regime_gate=False
r-volatility-breakout-us-sp500-0046
atr_long: 20
cost_bps: 10
n_stocks: 20
-0.67-0.40-0.80-1.15
atr_short=5, atr_long=40, holding_days=10, n_stocks=5, cost_bps=5, regime_gate=False
r-volatility-breakout-us-sp500-0072
atr_long: 40
cost_bps: 5
n_stocks: 5
-0.15+0.42-0.26-1.91
atr_short=5, atr_long=60, holding_days=1, n_stocks=20, cost_bps=5, regime_gate=True
r-volatility-breakout-us-sp500-0105
atr_long: 60
cost_bps: 5
n_stocks: 20
+0.41+0.18+0.68+0.40
atr_short=5, atr_long=60, holding_days=20, n_stocks=10, cost_bps=10, regime_gate=False
r-volatility-breakout-us-sp500-0138
atr_long: 60
cost_bps: 10
n_stocks: 10
+0.05+0.24-0.21-0.06
atr_short=5, atr_long=120, holding_days=1, n_stocks=5, cost_bps=5, regime_gate=False
r-volatility-breakout-us-sp500-0144
atr_long: 120
cost_bps: 5
n_stocks: 5
+0.04-0.02+0.17-0.13
atr_short=5, atr_long=120, holding_days=10, n_stocks=10, cost_bps=5, regime_gate=False
r-volatility-breakout-us-sp500-0172
atr_long: 120
cost_bps: 5
n_stocks: 10
+0.74+1.10-0.21+1.27
atr_short=10, atr_long=20, holding_days=5, n_stocks=5, cost_bps=5, regime_gate=True
r-volatility-breakout-us-sp500-0205
atr_long: 20
cost_bps: 5
n_stocks: 5
+0.04+0.61-0.77+0.10
atr_short=10, atr_long=20, holding_days=20, n_stocks=20, cost_bps=10, regime_gate=False
r-volatility-breakout-us-sp500-0238
atr_long: 20
cost_bps: 10
n_stocks: 20
-0.23+0.58-0.65-1.72
atr_short=10, atr_long=40, holding_days=10, n_stocks=10, cost_bps=10, regime_gate=True
r-volatility-breakout-us-sp500-0271
atr_long: 40
cost_bps: 10
n_stocks: 10
-0.32+0.35-0.37-1.53
atr_short=10, atr_long=60, holding_days=5, n_stocks=10, cost_bps=5, regime_gate=False
r-volatility-breakout-us-sp500-0304
atr_long: 60
cost_bps: 5
n_stocks: 10
+0.10+0.30-0.09-0.30
atr_short=10, atr_long=120, holding_days=1, n_stocks=5, cost_bps=5, regime_gate=True
r-volatility-breakout-us-sp500-0337
atr_long: 120
cost_bps: 5
n_stocks: 5
+0.27+0.84-0.87+0.85
atr_short=10, atr_long=120, holding_days=10, n_stocks=20, cost_bps=10, regime_gate=False
r-volatility-breakout-us-sp500-0370
atr_long: 120
cost_bps: 10
n_stocks: 20
+0.09+0.97-0.65-0.38
atr_short=14, atr_long=20, holding_days=5, n_stocks=10, cost_bps=10, regime_gate=True
r-volatility-breakout-us-sp500-0403
atr_long: 20
cost_bps: 10
n_stocks: 10
+0.42+0.24+0.32+1.25
atr_short=14, atr_long=40, holding_days=1, n_stocks=10, cost_bps=5, regime_gate=False
r-volatility-breakout-us-sp500-0436
atr_long: 40
cost_bps: 5
n_stocks: 10
+0.55+0.75+0.04+0.94
atr_short=14, atr_long=40, holding_days=20, n_stocks=5, cost_bps=5, regime_gate=True
r-volatility-breakout-us-sp500-0469
atr_long: 40
cost_bps: 5
n_stocks: 5
+0.37+0.26+1.28-0.45
atr_short=14, atr_long=60, holding_days=5, n_stocks=20, cost_bps=10, regime_gate=False
r-volatility-breakout-us-sp500-0502
atr_long: 60
cost_bps: 10
n_stocks: 20
+0.04+0.22-0.90+0.93
atr_short=14, atr_long=120, holding_days=1, n_stocks=10, cost_bps=10, regime_gate=True
r-volatility-breakout-us-sp500-0535
atr_long: 120
cost_bps: 10
n_stocks: 10
+0.42+0.70-0.59+1.80
atr_short=14, atr_long=120, holding_days=20, n_stocks=10, cost_bps=5, regime_gate=False
r-volatility-breakout-us-sp500-0568
atr_long: 120
cost_bps: 5
n_stocks: 10
+0.76+1.13+0.08+0.80
atr_short=20, atr_long=40, holding_days=1, n_stocks=5, cost_bps=5, regime_gate=False
r-volatility-breakout-us-sp500-0576
atr_long: 40
cost_bps: 5
n_stocks: 5
+0.85+1.10+0.64+0.47
atr_short=20, atr_long=40, holding_days=10, n_stocks=5, cost_bps=10, regime_gate=False
r-volatility-breakout-us-sp500-0602
atr_long: 40
cost_bps: 10
n_stocks: 5
+0.04+0.48-0.09-1.22
atr_short=20, atr_long=60, holding_days=1, n_stocks=5, cost_bps=5, regime_gate=False
r-volatility-breakout-us-sp500-0624
atr_long: 60
cost_bps: 5
n_stocks: 5
+1.21+1.60+0.48+1.23
atr_short=20, atr_long=60, holding_days=5, n_stocks=5, cost_bps=5, regime_gate=False
r-volatility-breakout-us-sp500-0636
atr_long: 60
cost_bps: 5
n_stocks: 5
+0.53+1.19+0.29-2.74
atr_short=20, atr_long=60, holding_days=20, n_stocks=20, cost_bps=5, regime_gate=True
r-volatility-breakout-us-sp500-0669
atr_long: 60
cost_bps: 5
n_stocks: 20
+0.32+1.06-0.39-1.30

Target universe

S&P 500 constituents, ~503 stocks

Related strategies

source: qbuntu-analysis · kabu STATION REST API + J-Quants daily bars
computed asof: 2026-09-24T02:22:15

Related strategies