qbuntuqbuntu

Cross-Sectional Momentum (US S&P 500)

slug: momentum-cross-sectional-us-sp500
performance summary
Sharpe (median)
+0.76
Max DD
-14.8%
Win rate
Alpha (ann.)
p-value
0.13
backtest period: 2022-04-012026-06-01
Sharpe across 960 grid runs:median 0.76best 2.28 (not representative)worst -0.67p25–p75 0.421.05

Hypothesis

Jegadeesh & Titman (1993): stocks with high past returns continue to outperform over intermediate horizons. LONG winners, SHORT losers. Applied to S&P 500 constituents.

Why it didn't work

Across 960 grid combinations, median Sharpe=0.76, best=2.28. Primary failure mode: no_edge.

Facts (7)

Average monthly return correlation with other strategies in DOWN regime: 0.15
Pairwise Pearson correlation of monthly returns across 42 strategies, filtered to DOWN regime months (N=3, N225 < SMA20 < SMA60)
correlation0.15
Average monthly return correlation with other strategies (full period): 0.04
Pairwise Pearson correlation of monthly returns across 42 strategies, full backtest period
correlation0.04
Best grid Sharpe ratio is 2.28 (p=0.00014).
period 2022-04-01–2026-06-01; cost=5bps
sharpe_ratio2.28
cite ↗ /cite/momentum-cross-sectional-us-sp500-fact-best-sharpevia r-momentum-cross-sectional-us-sp500-0869
Median Sharpe across 960 grid runs is 0.76.
Full grid of 960 parameter combinations.
sharpe_ratio0.76
Median Sharpe in DOWN regime is 0.90 across 960 runs.
Regime=DOWN, N225 SMA20/SMA60 classification.
sharpe_ratio0.90
Median Sharpe in FLAT regime is 0.23 across 960 runs.
Regime=FLAT, N225 SMA20/SMA60 classification.
sharpe_ratio0.23
Median Sharpe in UP regime is 1.11 across 960 runs.
Regime=UP, N225 SMA20/SMA60 classification.
sharpe_ratio1.11

Runs (30)

runparamssharpeUPFLATDOWN
formation_days=60, holding_days=1, n_stocks=5, skip_days=0, cost_bps=5, regime_gate=False
r-momentum-cross-sectional-us-sp500-0000
cost_bps: 5
n_stocks: 5
skip_days: 0
+0.58+1.70-0.38+0.29
formation_days=60, holding_days=1, n_stocks=5, skip_days=0, cost_bps=5, regime_gate=True
r-momentum-cross-sectional-us-sp500-0001
cost_bps: 5
n_stocks: 5
skip_days: 0
+0.20+0.81-0.38+0.29
formation_days=60, holding_days=1, n_stocks=5, skip_days=0, cost_bps=10, regime_gate=False
r-momentum-cross-sectional-us-sp500-0002
cost_bps: 10
n_stocks: 5
skip_days: 0
+0.43+1.51-0.51+0.17
formation_days=60, holding_days=1, n_stocks=5, skip_days=0, cost_bps=10, regime_gate=True
r-momentum-cross-sectional-us-sp500-0003
cost_bps: 10
n_stocks: 5
skip_days: 0
+0.09+0.70-0.51+0.17
formation_days=60, holding_days=1, n_stocks=5, skip_days=21, cost_bps=5, regime_gate=False
r-momentum-cross-sectional-us-sp500-0008
cost_bps: 5
n_stocks: 5
skip_days: 21
-0.44+0.65-1.27-0.89
formation_days=60, holding_days=1, n_stocks=5, skip_days=21, cost_bps=10, regime_gate=True
r-momentum-cross-sectional-us-sp500-0011
cost_bps: 10
n_stocks: 5
skip_days: 21
-0.67+0.35-1.38-1.01
formation_days=60, holding_days=1, n_stocks=50, skip_days=0, cost_bps=5, regime_gate=False
r-momentum-cross-sectional-us-sp500-0036
cost_bps: 5
n_stocks: 50
skip_days: 0
+0.14+1.16-0.67-0.26
formation_days=60, holding_days=5, n_stocks=5, skip_days=0, cost_bps=10, regime_gate=True
r-momentum-cross-sectional-us-sp500-0051
cost_bps: 10
n_stocks: 5
skip_days: 0
+0.61+0.82+0.16+1.39
formation_days=60, holding_days=10, n_stocks=5, skip_days=0, cost_bps=5, regime_gate=False
r-momentum-cross-sectional-us-sp500-0096
cost_bps: 5
n_stocks: 5
skip_days: 0
+0.21+0.88-0.32-0.20
formation_days=60, holding_days=10, n_stocks=50, skip_days=21, cost_bps=5, regime_gate=True
r-momentum-cross-sectional-us-sp500-0141
cost_bps: 5
n_stocks: 50
skip_days: 21
+0.03+1.13-0.79-0.06
formation_days=60, holding_days=20, n_stocks=50, skip_days=5, cost_bps=10, regime_gate=False
r-momentum-cross-sectional-us-sp500-0186
cost_bps: 10
n_stocks: 50
skip_days: 5
-0.02+0.53-0.35-0.55
formation_days=60, holding_days=60, n_stocks=5, skip_days=0, cost_bps=5, regime_gate=False
r-momentum-cross-sectional-us-sp500-0192
cost_bps: 5
n_stocks: 5
skip_days: 0
+0.56+0.99+0.41-1.61
formation_days=60, holding_days=60, n_stocks=50, skip_days=5, cost_bps=5, regime_gate=False
r-momentum-cross-sectional-us-sp500-0232
cost_bps: 5
n_stocks: 50
skip_days: 5
+0.24+0.94+0.20-2.82
formation_days=120, holding_days=1, n_stocks=50, skip_days=0, cost_bps=5, regime_gate=True
r-momentum-cross-sectional-us-sp500-0277
cost_bps: 5
n_stocks: 50
skip_days: 0
-0.04+0.73-0.56-0.61
formation_days=120, holding_days=5, n_stocks=20, skip_days=21, cost_bps=10, regime_gate=False
r-momentum-cross-sectional-us-sp500-0322
cost_bps: 10
n_stocks: 20
skip_days: 21
+0.36+0.09-0.35+2.48
formation_days=120, holding_days=10, n_stocks=20, skip_days=5, cost_bps=10, regime_gate=True
r-momentum-cross-sectional-us-sp500-0367
cost_bps: 10
n_stocks: 20
skip_days: 5
+0.60+1.46-0.47+1.46
formation_days=120, holding_days=20, n_stocks=20, skip_days=5, cost_bps=5, regime_gate=False
r-momentum-cross-sectional-us-sp500-0412
cost_bps: 5
n_stocks: 20
skip_days: 5
+0.90+1.21+0.30+1.47
formation_days=120, holding_days=60, n_stocks=20, skip_days=0, cost_bps=5, regime_gate=True
r-momentum-cross-sectional-us-sp500-0457
cost_bps: 5
n_stocks: 20
skip_days: 0
+1.25+1.67+1.09-0.48
formation_days=180, holding_days=1, n_stocks=10, skip_days=21, cost_bps=10, regime_gate=False
r-momentum-cross-sectional-us-sp500-0502
cost_bps: 10
n_stocks: 10
skip_days: 21
+0.21+0.45-0.06-0.22
formation_days=180, holding_days=5, n_stocks=10, skip_days=5, cost_bps=10, regime_gate=True
r-momentum-cross-sectional-us-sp500-0547
cost_bps: 10
n_stocks: 10
skip_days: 5
+1.13+1.17+0.45+2.43
formation_days=180, holding_days=10, n_stocks=10, skip_days=5, cost_bps=5, regime_gate=False
r-momentum-cross-sectional-us-sp500-0592
cost_bps: 5
n_stocks: 10
skip_days: 5
+1.01+1.02+0.48+2.03
formation_days=180, holding_days=20, n_stocks=10, skip_days=0, cost_bps=5, regime_gate=True
r-momentum-cross-sectional-us-sp500-0637
cost_bps: 5
n_stocks: 10
skip_days: 0
+1.08+2.10-0.18+1.36
formation_days=180, holding_days=60, n_stocks=5, skip_days=21, cost_bps=10, regime_gate=False
r-momentum-cross-sectional-us-sp500-0682
cost_bps: 10
n_stocks: 5
skip_days: 21
+0.75+0.88+0.47+0.84
formation_days=250, holding_days=1, n_stocks=5, skip_days=0, cost_bps=5, regime_gate=False
r-momentum-cross-sectional-us-sp500-0720
cost_bps: 5
n_stocks: 5
skip_days: 0
+0.94+1.51+0.32-0.14
formation_days=250, holding_days=1, n_stocks=5, skip_days=21, cost_bps=5, regime_gate=False
r-momentum-cross-sectional-us-sp500-0728
cost_bps: 5
n_stocks: 5
skip_days: 21
+1.04+1.62+0.01+0.20
formation_days=250, holding_days=5, n_stocks=5, skip_days=5, cost_bps=5, regime_gate=True
r-momentum-cross-sectional-us-sp500-0773
cost_bps: 5
n_stocks: 5
skip_days: 5
+1.63+1.55+1.58+2.15
formation_days=250, holding_days=10, n_stocks=5, skip_days=0, cost_bps=10, regime_gate=False
r-momentum-cross-sectional-us-sp500-0818
cost_bps: 10
n_stocks: 5
skip_days: 0
+0.96+0.92+0.78+1.32
formation_days=250, holding_days=10, n_stocks=50, skip_days=21, cost_bps=10, regime_gate=True
r-momentum-cross-sectional-us-sp500-0863
cost_bps: 10
n_stocks: 50
skip_days: 21
+1.31+1.64+0.71+1.67
formation_days=250, holding_days=20, n_stocks=5, skip_days=5, cost_bps=5, regime_gate=True
r-momentum-cross-sectional-us-sp500-0869
cost_bps: 5
n_stocks: 5
skip_days: 5
+2.28+2.43+2.26+1.65
formation_days=250, holding_days=20, n_stocks=50, skip_days=21, cost_bps=5, regime_gate=True
r-momentum-cross-sectional-us-sp500-0909
cost_bps: 5
n_stocks: 50
skip_days: 21
+1.74+1.84+1.73+1.25

Target universe

S&P 500 constituents, ~503 stocks

Related strategies

source: qbuntu-analysis · kabu STATION REST API + J-Quants daily bars
computed asof: 2026-07-27T03:36:14

Related strategies