qbuntuqbuntu
rejectedno_edge· equity· factor· momentum· time-series

Time-Series Momentum (US S&P 500)

slug: ts-momentum-us-sp500

Time-Series Momentum (US S&P 500) backtest. Median Sharpe across 120 parameter sets is -0.31. p-value is 0.39. Max DD is -9.3%. Period: 2022-02-01 to 2026-09-01. Best Sharpe +0.94 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

Time-series momentum follows the sign of each asset's own past return. It is not a cross-sectional ranking. If the median Sharpe is negative, a stretch that worked in one regime is not the result.

Performance summary

Sharpe (median)
-0.31
Max DD
-9.3%
Win rate
—
Alpha (ann.)
—
p-value
0.39
backtest period: 2022-02-01 → 2026-09-01
Sharpe across 120 grid runs:median -0.31best 0.94 (not representative)worst -1.44p25–p75 -0.55–-0.03

Hypothesis

Moskowitz, Ooi, Pedersen (2012): each stock's own past return predicts its future return. Applied to S&P 500 constituents.

Why it didn't work

Across 120 grid combinations, median Sharpe=-0.31, best=0.94. Primary failure mode: no_edge.

Facts (5)

Best grid Sharpe ratio is 0.94 (p=0.045).
period 2022-02-01–2026-09-01; cost=5bps
sharpe_ratio0.94
Median Sharpe across 120 grid runs is -0.31.
Full grid of 120 parameter combinations.
sharpe_ratio-0.31
Median Sharpe in DOWN regime is -0.07 across 120 runs.
Regime=DOWN, N225 SMA20/SMA60 classification.
sharpe_ratio-0.07
Median Sharpe in FLAT regime is -0.66 across 120 runs.
Regime=FLAT, N225 SMA20/SMA60 classification.
sharpe_ratio-0.66
Median Sharpe in UP regime is -0.02 across 120 runs.
Regime=UP, N225 SMA20/SMA60 classification.
sharpe_ratio-0.02

Runs (30)

runparamssharpeUPFLATDOWN
formation_days=20, holding_days=1, threshold_pct=0, cost_bps=5
r-ts-momentum-us-sp500-0000
cost_bps: 5
holding_days: 1
threshold_pct: 0
+0.36+0.45+0.16+0.53
formation_days=20, holding_days=1, threshold_pct=0, cost_bps=10
r-ts-momentum-us-sp500-0001
cost_bps: 10
holding_days: 1
threshold_pct: 0
-0.39-0.53-0.56+0.02
formation_days=20, holding_days=1, threshold_pct=0.05, cost_bps=5
r-ts-momentum-us-sp500-0002
cost_bps: 5
holding_days: 1
threshold_pct: 0.05
+0.63+0.89+0.29+0.70
formation_days=20, holding_days=1, threshold_pct=0.1, cost_bps=5
r-ts-momentum-us-sp500-0004
cost_bps: 5
holding_days: 1
threshold_pct: 0.1
+0.94+1.38+0.31+1.07
formation_days=20, holding_days=5, threshold_pct=0, cost_bps=10
r-ts-momentum-us-sp500-0007
cost_bps: 10
holding_days: 5
threshold_pct: 0
-0.42-0.20-0.97+0.24
formation_days=20, holding_days=5, threshold_pct=0.1, cost_bps=10
r-ts-momentum-us-sp500-0011
cost_bps: 10
holding_days: 5
threshold_pct: 0.1
-0.25-0.18-0.46+0.05
formation_days=20, holding_days=10, threshold_pct=0.05, cost_bps=10
r-ts-momentum-us-sp500-0015
cost_bps: 10
holding_days: 10
threshold_pct: 0.05
-0.68-0.19-1.18-0.83
formation_days=20, holding_days=20, threshold_pct=0, cost_bps=10
r-ts-momentum-us-sp500-0019
cost_bps: 10
holding_days: 20
threshold_pct: 0
-0.28-0.04-0.80-0.04
formation_days=20, holding_days=20, threshold_pct=0.1, cost_bps=10
r-ts-momentum-us-sp500-0023
cost_bps: 10
holding_days: 20
threshold_pct: 0.1
-0.03+0.37-0.60+0.16
formation_days=20, holding_days=60, threshold_pct=0, cost_bps=5
r-ts-momentum-us-sp500-0024
cost_bps: 5
holding_days: 60
threshold_pct: 0
-0.13+0.15-0.41-0.27
formation_days=20, holding_days=60, threshold_pct=0.1, cost_bps=5
r-ts-momentum-us-sp500-0028
cost_bps: 5
holding_days: 60
threshold_pct: 0.1
-0.12+0.03-0.33-0.09
formation_days=60, holding_days=1, threshold_pct=0.05, cost_bps=5
r-ts-momentum-us-sp500-0032
cost_bps: 5
holding_days: 1
threshold_pct: 0.05
+0.01+1.22-0.81-0.62
formation_days=60, holding_days=5, threshold_pct=0, cost_bps=5
r-ts-momentum-us-sp500-0036
cost_bps: 5
holding_days: 5
threshold_pct: 0
-0.45-0.35-0.89+0.74
formation_days=60, holding_days=5, threshold_pct=0.1, cost_bps=5
r-ts-momentum-us-sp500-0040
cost_bps: 5
holding_days: 5
threshold_pct: 0.1
-0.18-0.18-0.43+0.60
formation_days=60, holding_days=10, threshold_pct=0.05, cost_bps=5
r-ts-momentum-us-sp500-0044
cost_bps: 5
holding_days: 10
threshold_pct: 0.05
-0.66+0.06-1.26-0.78
formation_days=60, holding_days=20, threshold_pct=0, cost_bps=5
r-ts-momentum-us-sp500-0048
cost_bps: 5
holding_days: 20
threshold_pct: 0
-0.49-0.21-0.65-0.70
formation_days=60, holding_days=20, threshold_pct=0.1, cost_bps=5
r-ts-momentum-us-sp500-0052
cost_bps: 5
holding_days: 20
threshold_pct: 0.1
-0.38-0.05-0.66-0.43
formation_days=60, holding_days=60, threshold_pct=0.05, cost_bps=5
r-ts-momentum-us-sp500-0056
cost_bps: 5
holding_days: 60
threshold_pct: 0.05
-0.17-0.03-0.00-1.20
formation_days=120, holding_days=1, threshold_pct=0, cost_bps=5
r-ts-momentum-us-sp500-0060
cost_bps: 5
holding_days: 1
threshold_pct: 0
-0.69+0.11-1.43-1.12
formation_days=120, holding_days=1, threshold_pct=0, cost_bps=10
r-ts-momentum-us-sp500-0061
cost_bps: 10
holding_days: 1
threshold_pct: 0
-1.44-0.84-2.21-1.58
formation_days=120, holding_days=1, threshold_pct=0.1, cost_bps=10
r-ts-momentum-us-sp500-0065
cost_bps: 10
holding_days: 1
threshold_pct: 0.1
-0.84-0.03-1.79-0.99
formation_days=120, holding_days=5, threshold_pct=0.05, cost_bps=10
r-ts-momentum-us-sp500-0069
cost_bps: 10
holding_days: 5
threshold_pct: 0.05
-0.76-0.62-1.35+0.46
formation_days=120, holding_days=10, threshold_pct=0, cost_bps=10
r-ts-momentum-us-sp500-0073
cost_bps: 10
holding_days: 10
threshold_pct: 0
-1.19-0.49-1.97-1.29
formation_days=120, holding_days=10, threshold_pct=0.1, cost_bps=10
r-ts-momentum-us-sp500-0077
cost_bps: 10
holding_days: 10
threshold_pct: 0.1
-0.69+0.06-1.39-0.84
formation_days=120, holding_days=20, threshold_pct=0.05, cost_bps=10
r-ts-momentum-us-sp500-0081
cost_bps: 10
holding_days: 20
threshold_pct: 0.05
-0.49-0.33-0.56-0.74
formation_days=120, holding_days=60, threshold_pct=0, cost_bps=10
r-ts-momentum-us-sp500-0085
cost_bps: 10
holding_days: 60
threshold_pct: 0
+0.18+0.21+0.16+0.07
formation_days=120, holding_days=60, threshold_pct=0.1, cost_bps=10
r-ts-momentum-us-sp500-0089
cost_bps: 10
holding_days: 60
threshold_pct: 0.1
+0.21+0.22+0.24+0.06
formation_days=250, holding_days=1, threshold_pct=0, cost_bps=5
r-ts-momentum-us-sp500-0090
cost_bps: 5
holding_days: 1
threshold_pct: 0
-0.53-0.07-1.73+0.03
formation_days=250, holding_days=1, threshold_pct=0.1, cost_bps=5
r-ts-momentum-us-sp500-0094
cost_bps: 5
holding_days: 1
threshold_pct: 0.1
-0.51-0.11-1.24-0.34
formation_days=250, holding_days=5, threshold_pct=0.05, cost_bps=5
r-ts-momentum-us-sp500-0098
cost_bps: 5
holding_days: 5
threshold_pct: 0.05
-0.07-0.26-0.31+1.93

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:27

Related strategies