qbuntuqbuntu
rejectedno_edge· equity· gap· intraday· mean-reversion

Gap Reversal (US S&P 500)

slug: gap-reversal-short-us-sp500

Gap Reversal (US S&P 500) backtest. Median Sharpe across 1,728 parameter sets is -0.41. p-value is 0.31. Max DD is -5.7%. Period: 2022-01-03 to 2026-09-21. Best Sharpe +0.80 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.

What was tested

Gap reversal is a short-horizon bet that an opening gap fills. The gap is easy to see. After costs, only the median counts. A large best Sharpe with a negative median stays rejected.

Performance summary

Sharpe (median)
-0.41
Max DD
-5.7%
Win rate
—
Alpha (ann.)
—
p-value
0.31
backtest period: 2022-01-03 → 2026-09-21
Sharpe across 1728 grid runs:median -0.41best 0.80 (not representative)worst -1.16p25–p75 -0.67–-0.09

Hypothesis

Overnight gaps in S&P 500 stocks tend to reverse within the same or next few trading days. Shorting positive gaps and buying negative gaps captures this mean-reversion effect.

Why it didn't work

Across 1728 grid combinations, median Sharpe=-0.41, best=0.80. Primary failure mode: no_edge.

Facts (5)

Best grid Sharpe ratio is 0.80 (p=0.08).
period 2022-01-03–2026-09-21; cost=3bps; side=LONG
sharpe_ratio0.80
Median Sharpe across 1728 grid runs is -0.41.
Full grid of 1728 parameter combinations.
sharpe_ratio-0.41
Median Sharpe in DOWN regime is -0.71 across 1728 runs.
Regime=DOWN, N225 SMA20/SMA60 classification.
sharpe_ratio-0.71
Median Sharpe in FLAT regime is -0.65 across 1728 runs.
Regime=FLAT, N225 SMA20/SMA60 classification.
sharpe_ratio-0.65
Median Sharpe in UP regime is -2.30 across 1728 runs.
Regime=UP, N225 SMA20/SMA60 classification.
sharpe_ratio-2.30

Runs (30)

runparamssharpeUPFLATDOWN
top_n=10, min_gap_size=0.03, hold_days=1, side=SHORT, cost_bps=3
r-gap-reversal-short-us-sp500-0000
side: "SHORT"
top_n: 10
cost_bps: 3
+0.40-1.08+1.00+4.53
top_n=10, min_gap_size=0.03, hold_days=1, side=SHORT, cost_bps=5
r-gap-reversal-short-us-sp500-0001
side: "SHORT"
top_n: 10
cost_bps: 5
+0.29-1.25+0.82+4.36
top_n=10, min_gap_size=0.03, hold_days=1, side=SHORT, cost_bps=10
r-gap-reversal-short-us-sp500-0002
side: "SHORT"
top_n: 10
cost_bps: 10
+0.01-1.68+0.39+3.92
top_n=10, min_gap_size=0.03, hold_days=1, side=BOTH, cost_bps=3
r-gap-reversal-short-us-sp500-0006
side: "BOTH"
top_n: 10
cost_bps: 3
+0.06-0.86-0.06+1.91
top_n=10, min_gap_size=0.03, hold_days=1, regime_gate=nikkei-sma20, side=SHORT, cost_bps=3
r-gap-reversal-short-us-sp500-0009
side: "SHORT"
top_n: 10
cost_bps: 3
+0.78—+1.00+4.53
top_n=10, min_gap_size=0.03, hold_days=1, regime_gate=nikkei-sma60, side=SHORT, cost_bps=3
r-gap-reversal-short-us-sp500-0018
side: "SHORT"
top_n: 10
cost_bps: 3
+0.57-1.18+0.86+4.53
top_n=10, min_gap_size=0.03, hold_days=5, side=SHORT, cost_bps=3
r-gap-reversal-short-us-sp500-0081
side: "SHORT"
top_n: 10
cost_bps: 3
-0.51-2.01+0.07-1.29
top_n=10, min_gap_size=0.03, hold_days=5, regime_gate=nikkei-sma20, side=SHORT, cost_bps=5
r-gap-reversal-short-us-sp500-0091
side: "SHORT"
top_n: 10
cost_bps: 5
-0.11—-0.01-1.38
top_n=10, min_gap_size=0.05, hold_days=3, regime_gate=nikkei-sma20, side=LONG, cost_bps=10
r-gap-reversal-short-us-sp500-0176
side: "LONG"
top_n: 10
cost_bps: 10
-0.05-2.30+1.27-0.40
top_n=10, min_gap_size=0.07, hold_days=2, regime_gate=nikkei-sma60, side=SHORT, cost_bps=3
r-gap-reversal-short-us-sp500-0261
side: "SHORT"
top_n: 10
cost_bps: 3
-0.46-3.48-0.70-5.10
top_n=10, min_gap_size=0.1, hold_days=1, side=SHORT, cost_bps=3
r-gap-reversal-short-us-sp500-0324
side: "SHORT"
top_n: 10
cost_bps: 3
-0.15-1.27-0.53+11.33
top_n=10, min_gap_size=0.1, hold_days=1, regime_gate=nikkei-sma60, side=LONG, cost_bps=10
r-gap-reversal-short-us-sp500-0347
side: "LONG"
top_n: 10
cost_bps: 10
-0.32-2.79-1.16+3.54
top_n=10, min_gap_size=0.1, hold_days=3, side=BOTH, cost_bps=10
r-gap-reversal-short-us-sp500-0386
side: "BOTH"
top_n: 10
cost_bps: 10
-1.16-4.43-1.65-10.02
top_n=20, min_gap_size=0.03, hold_days=1, side=SHORT, cost_bps=5
r-gap-reversal-short-us-sp500-0433
side: "SHORT"
top_n: 20
cost_bps: 5
+0.30-1.17+0.53+5.66
top_n=20, min_gap_size=0.03, hold_days=5, side=LONG, cost_bps=10
r-gap-reversal-short-us-sp500-0518
side: "LONG"
top_n: 20
cost_bps: 10
+0.68-0.97+0.97+5.40
top_n=20, min_gap_size=0.05, hold_days=3, regime_gate=nikkei-sma20, side=SHORT, cost_bps=3
r-gap-reversal-short-us-sp500-0603
side: "SHORT"
top_n: 20
cost_bps: 3
-0.41—-1.41-1.72
top_n=20, min_gap_size=0.07, hold_days=2, regime_gate=nikkei-sma20, side=LONG, cost_bps=5
r-gap-reversal-short-us-sp500-0688
side: "LONG"
top_n: 20
cost_bps: 5
-0.76-2.88-2.04-3.24
top_n=20, min_gap_size=0.1, hold_days=1, regime_gate=nikkei-sma20, side=BOTH, cost_bps=10
r-gap-reversal-short-us-sp500-0773
side: "BOTH"
top_n: 20
cost_bps: 10
-0.32-2.79-1.11+4.19
top_n=20, min_gap_size=0.1, hold_days=5, regime_gate=nikkei-sma60, side=LONG, cost_bps=3
r-gap-reversal-short-us-sp500-0858
side: "LONG"
top_n: 20
cost_bps: 3
-0.41-4.01+3.53-14.11
top_n=50, min_gap_size=0.03, hold_days=3, regime_gate=nikkei-sma60, side=BOTH, cost_bps=5
r-gap-reversal-short-us-sp500-0943
side: "BOTH"
top_n: 50
cost_bps: 5
+0.11-0.54+0.53+0.33
top_n=50, min_gap_size=0.03, hold_days=5, side=LONG, cost_bps=3
r-gap-reversal-short-us-sp500-0948
side: "LONG"
top_n: 50
cost_bps: 3
+0.80-0.64+1.24+5.40
top_n=50, min_gap_size=0.05, hold_days=3, side=LONG, cost_bps=3
r-gap-reversal-short-us-sp500-1029
side: "LONG"
top_n: 50
cost_bps: 3
+0.04-1.93+1.75-0.65
top_n=50, min_gap_size=0.07, hold_days=2, side=BOTH, cost_bps=5
r-gap-reversal-short-us-sp500-1114
side: "BOTH"
top_n: 50
cost_bps: 5
-0.90-2.97-1.02-3.36
top_n=50, min_gap_size=0.1, hold_days=1, regime_gate=nikkei-sma20, side=SHORT, cost_bps=10
r-gap-reversal-short-us-sp500-1199
side: "SHORT"
top_n: 50
cost_bps: 10
-0.08—-1.04+10.41
top_n=50, min_gap_size=0.1, hold_days=5, regime_gate=nikkei-sma20, side=BOTH, cost_bps=3
r-gap-reversal-short-us-sp500-1284
side: "BOTH"
top_n: 50
cost_bps: 3
-0.76-4.01-0.28-12.06
top_n=100, min_gap_size=0.03, hold_days=1, side=SHORT, cost_bps=3
r-gap-reversal-short-us-sp500-1296
side: "SHORT"
top_n: 100
cost_bps: 3
+0.41-0.99+0.57+6.89
top_n=100, min_gap_size=0.03, hold_days=3, regime_gate=nikkei-sma60, side=SHORT, cost_bps=10
r-gap-reversal-short-us-sp500-1370
side: "SHORT"
top_n: 100
cost_bps: 10
-0.40+1.15-2.12-1.30
top_n=100, min_gap_size=0.05, hold_days=2, regime_gate=nikkei-sma60, side=BOTH, cost_bps=3
r-gap-reversal-short-us-sp500-1455
side: "BOTH"
top_n: 100
cost_bps: 3
-0.94-2.19-2.16-3.23
top_n=100, min_gap_size=0.07, hold_days=2, side=SHORT, cost_bps=5
r-gap-reversal-short-us-sp500-1540
side: "SHORT"
top_n: 100
cost_bps: 5
-0.46-3.04-0.10-5.27
top_n=100, min_gap_size=0.1, hold_days=1, side=LONG, cost_bps=10
r-gap-reversal-short-us-sp500-1625
side: "LONG"
top_n: 100
cost_bps: 10
-0.32-2.79-1.16+3.54

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