12-Month Momentum on US Stocks: 4.06% CAGR vs 7.75% for the Index
Pure 12-month price momentum is one of the most replicated factors in academic finance. Jegadeesh and Titman documented it in 1993 and the finding has held in 40+ countries for three decades. On US stocks, it doesn't work. The strategy returned 4.06% annually from 2000 to 2025, against 7.75% for the S&P 500. Pure momentum in the world's most studied market is negative alpha by a meaningful margin.
Contents
- Method
- What We Found
- Backtest Methodology
- Limitations
- Takeaway
- Part of a Series
- References
- Run This Screen Yourself
Method
| Parameter | Value |
|---|---|
| Universe | NYSE, NASDAQ, AMEX (full exchange) |
| Rebalancing | Semi-annual (January, July) |
| Signal | 12-month return, skip last month (12M-1M) |
| Selection | Top 30 by momentum, equal weight |
| Cash rule | Fewer than 10 qualifying stocks |
| Data source | FMP via Ceta Research warehouse |
| Benchmark | S&P 500 (SPY) |
| Period | 2000–2025 |
| Market cap filter | > $1B USD (point-in-time, 45-day lag) |
The signal is the canonical "12-1" momentum from Jegadeesh and Titman (1993): price from 12 months ago to 1 month ago, skipping the most recent month. The most recent month is skipped because short-term momentum tends to reverse. Stocks with adjusted close below $1 at either lookback date are excluded to eliminate FMP split-adjustment artifacts.
What We Found
25-year summary (2000–2025):
| Metric | 12M Momentum | S&P 500 (SPY) |
|---|---|---|
| CAGR | 4.06% | 7.75% |
| Total Return | 175.8% | 570.3% |
| Sharpe Ratio | 0.079 | 0.382 |
| Max Drawdown | -64.50% | -36.65% |
| Down Capture | 154.33% | 100% |
| Up Capture | 112.92% | 100% |
| Cash Periods | 0 of 51 (0%) |
The down capture number is the core problem. 154.33% means when SPY falls, the momentum portfolio falls 54% harder on average. You're taking substantially more crash risk for negative excess return.
The Sharpe of 0.079 is near zero. Over the same period, SPY's Sharpe was 0.382. The momentum portfolio captures 112.92% of SPY's upside but 154.33% of its downside. In any sustained bull market, the strategy keeps up. In any sharp reversal, it falls harder. Over 25 years, the reversals cost more than the extra upside captured.
Year-by-year standouts:
| Year | 12M Momentum | SPY | Notes |
|---|---|---|---|
| 2000 | -24.7% | -10.5% | Tech momentum crash |
| 2008 | -59.5% | -34.3% | Worst year — momentum crash |
| 2009 | -1.8% | +24.7% | Missed the recovery |
| 2019 | +43.2% | +32.3% | Tech momentum surge |
| 2021 | -3.8% | +31.3% | Value rotation crushed momentum |
| 2022 | -28.9% | -19.0% | Rate shock |
| 2024 | +60.5% | +25.3% | AI/tech momentum — best year |
2008 and 2009 together. The double hit defines the US result. In 2008, the portfolio lost 59.5%, 25 points worse than SPY. Then in 2009, while SPY recovered 24.7%, momentum returned -1.8%. Stocks with the strongest 12-month momentum entering 2009 were the defensive names that hadn't fallen as much, not the beaten-down financials and cyclicals that led the recovery. Pure momentum got hurt in the crash and missed the bounce.
2021. The strategy returned -3.8% against SPY's +31.3%, the worst relative performance outside a crash year. Post-COVID momentum stocks peaked in late 2020. By mid-2021, the highest-momentum names were rotating out as value and cyclicals dominated. The portfolio was long the right names at the wrong time.
2024. The strategy's best year in the study at +60.5%. AI-driven momentum in tech and semiconductor names was real and sustained. One strong year doesn't fix the 25-year gap, but it illustrates that the factor still fires when conditions are right, trending bull markets with clear sector winners.
Backtest Methodology
- Data: FMP financial data via Ceta Research warehouse. Price data from
stock_eod(adjusted closes). - Point-in-time: Market cap filter uses annual
key_metricsfilings with 45-day lag. No look-ahead bias. - Signal: Price at T-12M to T-1M. The 1-month skip avoids short-term reversal contamination per Jegadeesh & Titman.
- Data quality: Stocks with adjusted close < $1 at either lookback date excluded (split-adjustment artifacts). Portfolio momentum capped at 500% per stock as a secondary artifact guard.
- Equal weight: 30 positions, 3.33% each. No intraperiod rebalancing.
- Transaction costs: Modeled as size-tiered commissions. See methodology.
- Benchmark: SPY ETF total return, dividends reinvested.
Limitations
Negative alpha, not marginal alpha. The 3.69% annual drag over 25 years compounds to a large difference. $1 became $2.76 vs $6.70 for SPY.
US is the most studied momentum market. Academic papers and systematic funds have documented and traded US momentum since the 1990s. Any alpha from the raw signal has been largely arbitraged. The factor is crowded in US equities.
Momentum crash risk is structural. The Daniel and Moskowitz (2016) mechanism, forced deleveraging of momentum positions at market turning points, is most acute where institutional momentum trading is heaviest. That's the US.
No adjustment for factor timing. Defensive momentum overlays (reducing exposure during high volatility) can improve drawdown. The pure signal tested here doesn't include them.
Takeaway
Pure price momentum doesn't generate alpha on US stocks over this period. The 4.06% CAGR vs 7.75% for SPY, 154.33% down capture, and Sharpe near zero make a weak case for standalone momentum on US equities.
The US result is consistent with academic theory: highly efficient, heavily traded markets price known anomalies faster. The stronger case for 12-month momentum is in less crowded markets. India shows +15% annual excess return with better downside protection. Germany has the highest Sharpe of the 18 exchanges studied. The pattern is geographic, the factor works where it hasn't been systematically traded to near-exhaustion.
Part of a Series
This is part of a multi-exchange 12-month momentum study:
- 12M Momentum: Global 18-Exchange Comparison, published April 14
- 12M Momentum: India 22.74% CAGR, published April 16
- 12M Momentum: Germany Best Sharpe in 18 Exchanges, published April 18
- 12M Momentum: UK Consistent Alpha, Low Down Capture, published April 20
References
- Jegadeesh, N. & Titman, S. (1993). Returns to Buying Winners and Selling Losers. Journal of Finance, 48(1), 65-91.
- Carhart, M. (1997). On Persistence in Mutual Fund Performance. Journal of Finance.
- Asness, C., Moskowitz, T. & Pedersen, L. (2013). Value and Momentum Everywhere. Journal of Finance.
- Daniel, K. & Moskowitz, T. (2016). Momentum Crashes. Journal of Financial Economics.
Run This Screen Yourself
The current 12-month momentum screen for US stocks is live on Ceta Research:
cetaresearch.com/data-explorer?q=PL_Mgf8mjo
-- 12-Month Momentum US Screen
-- Live at: cetaresearch.com/data-explorer?q=PL_Mgf8mjo
WITH universe AS (
SELECT p.symbol, p.companyName, p.exchange, k.marketCap / 1e9 AS market_cap_billions
FROM profile p JOIN key_metrics_ttm k ON p.symbol = k.symbol
WHERE k.marketCap > 1000000000 AND p.isActivelyTrading = true
AND p.exchange IN ('NYSE', 'NASDAQ', 'AMEX')
),
price_12m_ago AS (
SELECT symbol, adjClose AS price_12m,
ROW_NUMBER() OVER (PARTITION BY symbol ORDER BY ABS(CAST(dateEpoch AS BIGINT) -
CAST(EXTRACT(EPOCH FROM (CURRENT_DATE - INTERVAL '365' DAY))::BIGINT AS BIGINT))) AS rn
FROM stock_eod
WHERE CAST(date AS DATE) BETWEEN CURRENT_DATE - INTERVAL '395' DAY
AND CURRENT_DATE - INTERVAL '335' DAY
AND adjClose > 0
),
price_1m_ago AS (
SELECT symbol, adjClose AS price_1m,
ROW_NUMBER() OVER (PARTITION BY symbol ORDER BY ABS(CAST(dateEpoch AS BIGINT) -
CAST(EXTRACT(EPOCH FROM (CURRENT_DATE - INTERVAL '30' DAY))::BIGINT AS BIGINT))) AS rn
FROM stock_eod
WHERE CAST(date AS DATE) BETWEEN CURRENT_DATE - INTERVAL '45' DAY
AND CURRENT_DATE - INTERVAL '15' DAY
AND adjClose > 0
)
SELECT u.symbol, u.companyName, u.exchange,
ROUND(u.market_cap_billions, 2) AS market_cap_billions,
ROUND((p1m.price_1m - p12.price_12m) / p12.price_12m * 100, 1) AS return_12m_1m_pct
FROM universe u
JOIN price_12m_ago p12 ON u.symbol = p12.symbol AND p12.rn = 1
JOIN price_1m_ago p1m ON u.symbol = p1m.symbol AND p1m.rn = 1
WHERE p12.price_12m > 1.0 AND p1m.price_1m > 1.0
AND (p1m.price_1m - p12.price_12m) / p12.price_12m <= 5.0
ORDER BY return_12m_1m_pct DESC NULLS LAST
LIMIT 30;