qbuntuqbuntu

Mean Reversion (US S&P 500)

slug: mean-reversion-us-sp500

Mean Reversion (US S&P 500) backtest. Median Sharpe across 1,024 parameter sets is -0.25. p-value is 0.40. Max DD is -18.1%. Period: 2022-02-01 to 2026-09-01. Best Sharpe +1.04 is not the representative figure.

Verdict: rejected. The median reaches neither promising (Sharpe > 0.5 and p-value < 0.05) nor marginal (Sharpe > 0.05 and best p-value < 0.10). 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
-18.1%
Win rate
—
Alpha (ann.)
—
p-value
0.40
backtest period: 2022-02-01 → 2026-09-01
Sharpe across 1024 grid runs:median -0.25best 1.04 (not representative)worst -1.95p25–p75 -0.74–0.09

Hypothesis

Stocks deviating from fair value (measured by z-score, RSI, Bollinger, or MRS) revert to the mean. LONG oversold, SHORT overbought. Applied to S&P 500 constituents.

Why it didn't work

Across 1024 grid combinations, median Sharpe=-0.25, best=1.04. Primary failure mode: no_edge.

Facts (5)

Best grid Sharpe ratio is 1.04 (p=0.027).
period 2022-02-01–2026-09-01; cost=5bps
sharpe_ratio1.04
Median Sharpe across 1024 grid runs is -0.25.
Full grid of 1024 parameter combinations.
sharpe_ratio-0.25
Median Sharpe in DOWN regime is -0.14 across 1024 runs.
Regime=DOWN, N225 SMA20/SMA60 classification.
sharpe_ratio-0.14
Median Sharpe in FLAT regime is -0.42 across 1024 runs.
Regime=FLAT, N225 SMA20/SMA60 classification.
sharpe_ratio-0.42
Median Sharpe in UP regime is -0.36 across 1024 runs.
Regime=UP, N225 SMA20/SMA60 classification.
sharpe_ratio-0.36

Runs (30)

runparamssharpeUPFLATDOWN
indicator=zscore, lookback=10, holding_days=1, n_stocks=5, cost_bps=5, regime_gate=False
r-mean-reversion-us-sp500-0000
cost_bps: 5
lookback: 10
n_stocks: 5
-0.35-0.10-0.92+0.30
indicator=zscore, lookback=10, holding_days=1, n_stocks=5, cost_bps=5, regime_gate=True
r-mean-reversion-us-sp500-0001
cost_bps: 5
lookback: 10
n_stocks: 5
-0.43-0.22-0.92+0.30
indicator=zscore, lookback=10, holding_days=1, n_stocks=5, cost_bps=10, regime_gate=False
r-mean-reversion-us-sp500-0002
cost_bps: 10
lookback: 10
n_stocks: 5
-0.68-0.43-1.23-0.05
indicator=zscore, lookback=10, holding_days=1, n_stocks=5, cost_bps=10, regime_gate=True
r-mean-reversion-us-sp500-0003
cost_bps: 10
lookback: 10
n_stocks: 5
-0.71-0.45-1.23-0.05
indicator=zscore, lookback=10, holding_days=1, n_stocks=50, cost_bps=5, regime_gate=False
r-mean-reversion-us-sp500-0012
cost_bps: 5
lookback: 10
n_stocks: 50
-0.94-0.81-1.47-0.44
indicator=zscore, lookback=10, holding_days=20, n_stocks=5, cost_bps=5, regime_gate=False
r-mean-reversion-us-sp500-0048
cost_bps: 5
lookback: 10
n_stocks: 5
+0.03-0.45-0.08+1.25
indicator=zscore, lookback=10, holding_days=20, n_stocks=10, cost_bps=5, regime_gate=True
r-mean-reversion-us-sp500-0053
cost_bps: 5
lookback: 10
n_stocks: 10
+0.50+0.47+0.33+0.76
indicator=zscore, lookback=20, holding_days=10, n_stocks=10, cost_bps=5, regime_gate=True
r-mean-reversion-us-sp500-0101
cost_bps: 5
lookback: 20
n_stocks: 10
+0.01+0.01-0.30+0.26
indicator=zscore, lookback=40, holding_days=5, n_stocks=10, cost_bps=5, regime_gate=True
r-mean-reversion-us-sp500-0149
cost_bps: 5
lookback: 40
n_stocks: 10
-0.63-0.37-1.17-0.34
indicator=zscore, lookback=60, holding_days=1, n_stocks=5, cost_bps=5, regime_gate=False
r-mean-reversion-us-sp500-0192
cost_bps: 5
lookback: 60
n_stocks: 5
-0.74-0.66-1.41+0.64
indicator=zscore, lookback=60, holding_days=1, n_stocks=10, cost_bps=10, regime_gate=False
r-mean-reversion-us-sp500-0198
cost_bps: 10
lookback: 60
n_stocks: 10
-1.23-1.44-1.38-0.31
indicator=zscore, lookback=60, holding_days=20, n_stocks=10, cost_bps=10, regime_gate=False
r-mean-reversion-us-sp500-0246
cost_bps: 10
lookback: 60
n_stocks: 10
0.00-0.52+0.21+1.06
indicator=rsi, lookback=10, holding_days=10, n_stocks=10, cost_bps=10, regime_gate=False
r-mean-reversion-us-sp500-0294
cost_bps: 10
lookback: 10
n_stocks: 10
-0.29-0.14-0.67-0.07
indicator=rsi, lookback=20, holding_days=1, n_stocks=50, cost_bps=10, regime_gate=False
r-mean-reversion-us-sp500-0334
cost_bps: 10
lookback: 20
n_stocks: 50
-1.95-2.57-1.45-1.53
indicator=rsi, lookback=20, holding_days=5, n_stocks=10, cost_bps=10, regime_gate=True
r-mean-reversion-us-sp500-0343
cost_bps: 10
lookback: 20
n_stocks: 10
-0.45-0.46-0.62-0.05
indicator=rsi, lookback=40, holding_days=1, n_stocks=10, cost_bps=10, regime_gate=True
r-mean-reversion-us-sp500-0391
cost_bps: 10
lookback: 40
n_stocks: 10
-1.09-1.47-0.82-0.87
indicator=rsi, lookback=40, holding_days=20, n_stocks=10, cost_bps=10, regime_gate=True
r-mean-reversion-us-sp500-0439
cost_bps: 10
lookback: 40
n_stocks: 10
-0.21-0.74+0.06-0.22
indicator=rsi, lookback=60, holding_days=10, n_stocks=10, cost_bps=10, regime_gate=True
r-mean-reversion-us-sp500-0487
cost_bps: 10
lookback: 60
n_stocks: 10
+0.24-0.24+0.19+1.32
indicator=bollinger_pct, lookback=10, holding_days=1, n_stocks=5, cost_bps=5, regime_gate=False
r-mean-reversion-us-sp500-0512
cost_bps: 5
lookback: 10
n_stocks: 5
-0.35-0.10-0.92+0.30
indicator=bollinger_pct, lookback=10, holding_days=5, n_stocks=20, cost_bps=5, regime_gate=False
r-mean-reversion-us-sp500-0536
cost_bps: 5
lookback: 10
n_stocks: 20
-0.63-0.38-1.11-0.67
indicator=bollinger_pct, lookback=20, holding_days=1, n_stocks=20, cost_bps=5, regime_gate=False
r-mean-reversion-us-sp500-0584
cost_bps: 5
lookback: 20
n_stocks: 20
-1.11-1.11-1.41-0.44
indicator=bollinger_pct, lookback=20, holding_days=20, n_stocks=20, cost_bps=5, regime_gate=False
r-mean-reversion-us-sp500-0632
cost_bps: 5
lookback: 20
n_stocks: 20
-0.17-0.31-0.30+0.33
indicator=bollinger_pct, lookback=40, holding_days=10, n_stocks=20, cost_bps=5, regime_gate=False
r-mean-reversion-us-sp500-0680
cost_bps: 5
lookback: 40
n_stocks: 20
-0.09-0.59+0.21+0.64
indicator=bollinger_pct, lookback=60, holding_days=5, n_stocks=20, cost_bps=5, regime_gate=False
r-mean-reversion-us-sp500-0728
cost_bps: 5
lookback: 60
n_stocks: 20
-0.50-0.50-0.70-0.16
indicator=mrs, lookback=10, holding_days=1, n_stocks=20, cost_bps=5, regime_gate=False
r-mean-reversion-us-sp500-0776
cost_bps: 5
lookback: 10
n_stocks: 20
+0.04-0.34-0.43+1.91
indicator=mrs, lookback=10, holding_days=20, n_stocks=5, cost_bps=5, regime_gate=True
r-mean-reversion-us-sp500-0817
cost_bps: 5
lookback: 10
n_stocks: 5
+1.04+0.78+0.96+1.91
indicator=mrs, lookback=10, holding_days=20, n_stocks=20, cost_bps=5, regime_gate=True
r-mean-reversion-us-sp500-0825
cost_bps: 5
lookback: 10
n_stocks: 20
+0.49+0.81+0.18+0.21
indicator=mrs, lookback=20, holding_days=10, n_stocks=20, cost_bps=5, regime_gate=True
r-mean-reversion-us-sp500-0873
cost_bps: 5
lookback: 20
n_stocks: 20
+0.53+0.38+0.69+0.54
indicator=mrs, lookback=40, holding_days=5, n_stocks=20, cost_bps=5, regime_gate=True
r-mean-reversion-us-sp500-0921
cost_bps: 5
lookback: 40
n_stocks: 20
-0.21+0.80-0.91-0.80
indicator=mrs, lookback=60, holding_days=1, n_stocks=20, cost_bps=5, regime_gate=True
r-mean-reversion-us-sp500-0969
cost_bps: 5
lookback: 60
n_stocks: 20
-0.55-0.17-1.29-0.08

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-24T21:54:26

Related strategies