Sector Mean Reversion: Buying What the Market Hates Worked for 26 Years on US Stocks

We tested buying the bottom 2 sectors by 12-month return on US large caps, quarterly, from 2000 to 2025. The result: 10.60% CAGR vs 8.02% for the S&P 500, a 1273% total return, and a 53.85% quarterly win rate over 104 periods. Beta-adjusted, the alpha is +0.75%.

Growth of $10,000 invested in Sector Mean Reversion vs S&P 500 from 2000 to 2025, showing the strategy outperforming with stronger recoveries after the dot-com bust and 2009 financial crisis

We tested a simple contrarian idea on US stocks from 2000 to 2025: at the start of each quarter, find the two worst-performing sectors by 12-month return and buy every large-cap stock in them. Quarterly rebalance, equal weight, 104 periods. The result was 10.60% annualized vs 8.02% for the S&P 500, a 1273% total return, and a portfolio that was invested in every one of the 104 quarters. The strategy works because beaten-down sectors tend to recover. It fails when they keep falling.

Contents

  1. Method
  2. What is Sector Mean Reversion?
  3. One thing to know about "Financial Services"
  4. The Screen
  5. What We Found
  6. 26 years. +2.58% annual alpha over the S&P 500.
  7. Year-by-year returns
  8. 2000-2003: The strategy's clearest demonstration
  9. 2009: The best year
  10. 2015: The worst year
  11. 2020: Tech-driven market, strategy misses it
  12. 2019-2025: A long flat stretch
  13. Backtest Methodology
  14. Limitations
  15. Takeaway
  16. Part of a Series
  17. References
  18. Run This Screen Yourself

Data: FMP financial data warehouse, 2000-2025. Updated August 2026.


Method

Data source: Ceta Research (FMP financial data warehouse) Universe: NYSE + NASDAQ + AMEX, market cap > $1B USD Period: 2000-2025 (26 years, 104 quarterly periods) Rebalancing: Quarterly (January, April, July, October), equal weight all qualifying stocks in selected sectors Execution: Entry at the next available close after the signal date, not the signal-day close Benchmark: S&P 500 Total Return (SPY) Cash rule: Hold cash if fewer than 5 sectors qualify, or if fewer than 10 stocks pass the filters Transaction costs: Size-tiered model, applied to every position


What is Sector Mean Reversion?

The idea is straightforward. At each quarterly rebalance, we rank all sectors by their equal-weighted 12-month trailing return. We buy every stock in the bottom 2 sectors. Next quarter, we re-rank and rotate.

Moskowitz and Grinblatt (1999) established the part this strategy leans on: much of the momentum anomaly is explained by industry-level momentum, which means sector membership, not stock selection, is where the signal lives. Their finding at a 12-month horizon was continuation, though, not reversal. This strategy runs against that result rather than following from it. The contrarian premise is a separate claim: sectors that underperform for a full year carry two things, suppressed valuations and depressed sentiment, and both tend to normalize over the following 12 months. Whether that outweighs the continuation effect is exactly what the backtest below measures.

The mechanics are different from stock-level mean reversion. You're not picking individual oversold names. You're tilting the entire portfolio toward the most out-of-favor corners of the market. With an average of 569 stocks per quarter across the two selected sectors, this is a broad bet on sector sentiment normalization, not a concentrated value play.

The sectors that show up most often in the bottom 2 tell the story:

Sector Quarters Selected (of 104)
Utilities 30
Energy 29
Real Estate 26
Basic Materials 22
Technology 21
Financial Services 19
Communication Services 18
Healthcare 15
Consumer Cyclical 12
Consumer Defensive 12
Industrials 4

Utilities and Energy dominate. These are capital-intensive, rate-sensitive sectors that cycle in and out of favor. Real Estate follows the same pattern. Industrials almost never qualifies, appearing in 4 quarters out of 104.

One thing to know about "Financial Services"

FMP files closed-end funds and ETFs under the Financial Services sector. On US large caps that sector holds 4,248 symbols, and 3,378 of them (79.5%) are funds or ETFs rather than operating companies. Financial Services is also 59% of the entire US large-cap universe by count, so when it lands in the bottom 2, most of what you buy is funds.

We left the screen as-is so the published numbers match what the rule actually does, but we measured the sensitivity. Dropping every fund and ETF cuts the universe from 7,199 symbols to 3,815 and the average holding from 569 stocks to 305. It also improves the result: 11.72% CAGR instead of 10.60%, and a Sharpe of 0.365 instead of 0.324. The funds were diluting the return, not creating it, so the headline conclusion survives the check and gets slightly stronger without them.


The Screen

The screen below runs live. It ranks sectors by their current 12-month equal-weighted return across NYSE, NASDAQ, and AMEX large caps. The bottom rows are what the backtest would buy today.

WITH prices AS (
    SELECT e.symbol, e.adjClose, CAST(e.date AS DATE) AS trade_date
    FROM stock_eod e
    JOIN profile p ON e.symbol = p.symbol
    WHERE p.sector IS NOT NULL AND p.sector != ''
      AND p.marketCap > 1000000000
      AND p.exchange IN ('NYSE', 'NASDAQ', 'AMEX')
      AND CAST(e.date AS DATE) >= CURRENT_DATE - INTERVAL '400' DAY
      AND e.adjClose IS NOT NULL AND e.adjClose > 0
),
recent AS (
    SELECT symbol, adjClose AS recent_price
    FROM prices
    QUALIFY ROW_NUMBER() OVER (PARTITION BY symbol ORDER BY trade_date DESC) = 1
),
year_ago AS (
    SELECT symbol, adjClose AS old_price
    FROM prices
    WHERE trade_date <= CURRENT_DATE - INTERVAL '252' DAY
    QUALIFY ROW_NUMBER() OVER (PARTITION BY symbol ORDER BY trade_date DESC) = 1
),
stock_returns AS (
    SELECT r.symbol, pr.sector, (r.recent_price / ya.old_price - 1) * 100 AS return_12m
    FROM recent r
    JOIN year_ago ya ON r.symbol = ya.symbol
    JOIN profile pr ON r.symbol = pr.symbol
    WHERE ya.old_price > 0 AND r.recent_price > 0
      AND (r.recent_price / ya.old_price - 1) BETWEEN -0.99 AND 5.0
)
SELECT pr.sector,
    ROUND(AVG(sr.return_12m), 2) AS avg_return_12m_pct,
    COUNT(DISTINCT sr.symbol) AS n_stocks,
    ROW_NUMBER() OVER (ORDER BY AVG(sr.return_12m) ASC) AS rank_worst
FROM stock_returns sr
JOIN profile pr ON sr.symbol = pr.symbol
GROUP BY pr.sector
HAVING COUNT(DISTINCT sr.symbol) >= 5
ORDER BY avg_return_12m_pct ASC

Run this screen on Ceta Research


What We Found

The strategy outperformed in bear markets and crashed harder in the worst downturns. That's the tradeoff in buying beaten-down sectors: you get the recoveries and you absorb the extended declines.

Growth of $10,000 invested in Sector Mean Reversion vs S&P 500 from 2000 to 2025. The strategy grew to $137,000, the S&P 500 to $74,000.
Growth of $10,000 invested in Sector Mean Reversion vs S&P 500 from 2000 to 2025. The strategy grew to $137,000, the S&P 500 to $74,000.

26 years. +2.58% annual alpha over the S&P 500.

Metric Strategy S&P 500
CAGR 10.60% 8.02%
Total Return 1272.80% 643.47%
Volatility 26.55% 16.60%
Max Drawdown -48.08% -43.86%
Sharpe Ratio 0.324 0.363
Sortino Ratio 0.545 0.539
Win Rate vs SPY (quarters) 53.85%
Up Capture 131.88%
Down Capture 114.58%
Beta 1.304
Alpha (Jensen) +0.75%
Avg Stocks per Period 569.1
Cash Periods 0 of 104

$10,000 compounds to $137,280 against $74,347 for SPY.

A few numbers worth holding together. The strategy beats the S&P 500 by 2.58% annually over 26 years, with a higher up capture (131.88%) and a higher down capture (114.58%). You get more of the upside and more of the downside. The Sharpe ratio (0.324 vs 0.363) is lower than the benchmark, because the excess return comes with excess volatility. This is a high-beta contrarian tilt, not a smooth ride.

The beta of 1.304 is the number that puts the rest in context. Once you adjust for how much market risk the portfolio carries, Jensen's alpha is +0.75% a year, not +2.58%. Most of the headline excess is compensation for taking more risk, not a free lunch.

The win rate of 53.85% means the strategy beat SPY in 56 of 104 quarters. On calendar years it's thinner still: 12 of 26. The average is carried by a handful of very large recovery years rather than by winning consistently.

Year-by-year returns

Sector Mean Reversion vs S&P 500 annual returns from 2000 to 2025. The strategy showed large outperformance during dot-com recovery and 2009, with notable underperformance in 2015 and 2020.
Sector Mean Reversion vs S&P 500 annual returns from 2000 to 2025. The strategy showed large outperformance during dot-com recovery and 2009, with notable underperformance in 2015 and 2020.

Year Strategy S&P 500 Excess
2000 +0.30% -10.50% +10.81%
2001 +26.02% -9.17% +35.18%
2002 -9.45% -19.92% +10.47%
2003 +57.02% +24.12% +32.90%
2004 +9.99% +10.24% -0.25%
2005 +8.63% +7.17% +1.45%
2006 +31.42% +13.65% +17.78%
2007 +2.41% +4.40% -2.00%
2008 -34.59% -34.31% -0.28%
2009 +68.68% +24.73% +43.95%
2010 +16.10% +14.31% +1.80%
2011 +1.72% +2.46% -0.74%
2012 +18.16% +17.09% +1.07%
2013 +22.98% +27.77% -4.80%
2014 +6.58% +14.50% -7.91%
2015 -29.35% -0.12% -29.23%
2016 +31.29% +14.45% +16.83%
2017 +24.28% +21.64% +2.64%
2018 -6.24% -5.15% -1.09%
2019 +29.67% +32.31% -2.65%
2020 -1.08% +15.64% -16.71%
2021 +25.61% +31.26% -5.65%
2022 -20.47% -18.99% -1.48%
2023 +26.43% +26.00% +0.42%
2024 +20.03% +25.28% -5.25%
2025 +12.01% +17.88% -5.86%

2000-2003: The strategy's clearest demonstration

When the dot-com bubble burst, the market rotated hard into the sectors that tech investors had ignored for years. Utilities and Energy were cheap on fundamentals and hated on momentum. The strategy loaded up on both.

2000: +0.30% vs SPY -10.50%. Roughly flat while the market fell 10 points. The market was selling tech. The strategy was buying utilities. 2001: +26.02% vs SPY -9.17%. The largest gap of the early period, as beaten-down defensives kept recovering while the index kept falling. 2002: -9.45% vs SPY -19.92%. Even in the final leg of the crash, the portfolio held up better. 2003: +57.02% vs SPY +24.12%. Post-dot-com recovery, beaten-down cyclicals that had been left for dead surged. The three-year cumulative gap over the S&P 500 was enormous.

This is the strategy working exactly as designed. Sectors that fell hardest during the bubble came back first when sentiment normalized.

2009: The best year

2009 produced +68.68% vs the S&P 500's +24.73%, a 44-point gap and the widest in the record. After the financial crisis, the strategy had rotated into Real Estate and Financial Services, the sectors most demolished by the crash. When those sectors recovered, the rebound was violent.

The pattern is the same as 2003: buy what was destroyed, wait for the recovery. The strategy doesn't predict the recovery. It systematically positions in the sectors most likely to mean-revert if one happens.

2015: The worst year

2015 was -29.35% against a near-flat SPY (-0.12%). The 29-point gap is the largest single-year underperformance in the 26-year record.

The culprit was Energy. Oil prices began their serious decline in mid-2014. By the start of 2015, Energy was one of the worst-performing sectors over the prior 12 months, exactly the trigger for the strategy to load up on it. Oil then kept falling throughout 2015. The sector that looked like it should revert kept declining. That's the core risk in mean reversion: you buy at the first sign of cheapness, but there may be more downside ahead.

2016 told the other side: +31.29% vs SPY +14.45%, driven partly by Energy's actual recovery once oil stabilized. You had to hold through the pain to get the gain.

2020: Tech-driven market, strategy misses it

2020 was -1.08% for the strategy while SPY returned +15.64%. The COVID crash was brief and violent, followed by a recovery driven almost entirely by tech and growth stocks. The sector mean reversion approach wasn't positioned for that. The bottom sectors in early 2020 included Energy (oil went negative in April) and sectors that didn't recover quickly. The strategy sat out the tech-driven bounce.

2019-2025: A long flat stretch

The recent record is the honest counterweight to 2003 and 2009. From 2019 through 2025 the strategy trailed SPY in six of seven years. None of the misses were catastrophic, the worst being -16.71% in 2020, but they were persistent. A contrarian sector tilt has no way to participate in a market where leadership stays concentrated in the sectors it is structurally avoiding.


Backtest Methodology

Parameter Choice
Universe NYSE + NASDAQ + AMEX, Market Cap > $1B USD
Signal Bottom 2 sectors by equal-weighted 12-month trailing return
Portfolio All qualifying stocks in selected sectors, equal weight
Rebalancing Quarterly (January, April, July, October)
Execution Next available close after the signal date
Cash rule Hold cash if < 5 sectors qualify or < 10 stocks pass filters
Transaction costs Size-tiered model
Benchmark S&P 500 Total Return (SPY)
Period 2000-2025 (26 years, 104 quarters)
Data Ceta Research (FMP financial data warehouse)

Limitations

Sector momentum can persist. The biggest risk here isn't model risk. It's the scenario where a sector underperforms for structural reasons rather than cyclical ones. Energy in 2015 and 2020 is the cleanest example. The strategy assumes underperformance is temporary. Sometimes it isn't.

High volatility, lower Sharpe. At 26.55% annualized volatility and a Sharpe of 0.324, this is a bumpier ride than the market. You earn the alpha, but you feel it in drawdowns. The -48.08% max drawdown exceeds the S&P 500's -43.86%.

Most of the excess is beta. Jensen's alpha is +0.75% a year against a headline excess of +2.58%, on a beta of 1.304. A leveraged S&P position would have captured much of the same gap without the sector work.

Large portfolio, diffuse bets. With 569 stocks on average, the strategy is closer to a sector tilt than a stock-picking approach. You're making a macro bet on two sectors normalizing. Individual stock selection doesn't matter much. That's a feature for some investors and a limitation for others.

Almost half the universe is funds. 3,378 of the 4,248 US large caps FMP tags as Financial Services are closed-end funds or ETFs. When that sector is selected, you're buying funds, not companies. Excluding them raises CAGR to 11.72% and Sharpe to 0.365, so this doesn't threaten the result, but it does change what the portfolio is.

Down capture > 100%. The strategy captured 114.58% of SPY's downside. In bad markets, it tends to fall harder. The positive alpha comes from the recoveries being even stronger (131.88% up capture), but the sequence of returns matters. A retiree drawing down a portfolio feels bad years more acutely than good ones.

Costs are modelled, not measured. The backtest applies a size-tiered cost to every position, but it doesn't model bid-ask spread or market impact. Rebalancing 569 positions quarterly carries friction beyond what the tier model charges, so treat the net numbers as an upper bound.

Survivorship bias. Exchange membership uses current profiles, not historical. Delisted companies (including failures) aren't tracked over time.


Takeaway

Sector mean reversion works on US stocks over 26 years. 10.60% CAGR, +2.58% annual excess, 1273% total return. The strategy earns its keep by systematically buying what the market has rejected at the sector level and waiting for sentiment to normalize.

The trade-off is clear. You get higher up capture (131.88%) and higher down capture (114.58%). The Sharpe ratio is lower than the benchmark. The max drawdown is worse. A year like 2015 (-29.35%) can erase multiple years of excess in a single period. And once you adjust for a beta of 1.304, the risk-adjusted alpha is +0.75%, not +2.58%.

The strategy suits investors who can tolerate a volatile ride and who believe that sector-level dislocations eventually correct. The 26-year record suggests they usually do. But "usually" isn't "always," the edge is concentrated in two recovery years, and the 2019-2025 stretch trailed the index in six years out of seven.


Part of a Series

This analysis is part of our Sector Mean Reversion global exchange comparison. We tested the same strategy across 13 exchanges: - Sector Mean Reversion on Korean Stocks (KSC) 14.28% CAGR, +8.74% vs KOSPI - Sector Mean Reversion on Taiwanese Stocks (TAI + TWO) 14.12% CAGR, +9.35% vs TAIEX - Sector Mean Reversion on Indian Stocks (NSE) 12.68% CAGR, +1.44% vs Sensex - Sector Mean Reversion on Swedish Stocks (STO) 10.79% CAGR, +7.40% vs OMX30 - Sector Mean Reversion: Global Exchange Comparison


References

  • Moskowitz, T. & Grinblatt, M. (1999). "Do Industries Explain Momentum?" Journal of Finance, 54(4), 1249-1290.

Run This Screen Yourself

Via web UI: Run the sector screen on Ceta Research. The query is pre-loaded. Hit "Run" to see current sector rankings.

Via Python:

import requests, time

API_KEY = "your_api_key"  # get one at cetaresearch.com
BASE = "https://tradingstudio.finance/api/v1"

query = """
WITH prices AS (
    SELECT e.symbol, e.adjClose, CAST(e.date AS DATE) AS trade_date
    FROM stock_eod e
    JOIN profile p ON e.symbol = p.symbol
    WHERE p.sector IS NOT NULL AND p.sector != ''
      AND p.marketCap > 1000000000
      AND p.exchange IN ('NYSE', 'NASDAQ', 'AMEX')
      AND CAST(e.date AS DATE) >= CURRENT_DATE - INTERVAL '400' DAY
      AND e.adjClose IS NOT NULL AND e.adjClose > 0
),
recent AS (
    SELECT symbol, adjClose AS recent_price
    FROM prices
    QUALIFY ROW_NUMBER() OVER (PARTITION BY symbol ORDER BY trade_date DESC) = 1
),
year_ago AS (
    SELECT symbol, adjClose AS old_price
    FROM prices
    WHERE trade_date <= CURRENT_DATE - INTERVAL '252' DAY
    QUALIFY ROW_NUMBER() OVER (PARTITION BY symbol ORDER BY trade_date DESC) = 1
),
stock_returns AS (
    SELECT r.symbol, pr.sector,
        (r.recent_price / ya.old_price - 1) * 100 AS return_12m
    FROM recent r
    JOIN year_ago ya ON r.symbol = ya.symbol
    JOIN profile pr ON r.symbol = pr.symbol
    WHERE ya.old_price > 0 AND r.recent_price > 0
      AND (r.recent_price / ya.old_price - 1) BETWEEN -0.99 AND 5.0
)
SELECT pr.sector,
    ROUND(AVG(sr.return_12m), 2) AS avg_return_12m_pct,
    COUNT(DISTINCT sr.symbol) AS n_stocks,
    ROW_NUMBER() OVER (ORDER BY AVG(sr.return_12m) ASC) AS rank_worst
FROM stock_returns sr
JOIN profile pr ON sr.symbol = pr.symbol
GROUP BY pr.sector
HAVING COUNT(DISTINCT sr.symbol) >= 5
ORDER BY avg_return_12m_pct ASC
"""

resp = requests.post(f"{BASE}/data-explorer/execute", headers={
    "X-API-Key": API_KEY, "Content-Type": "application/json"
}, json={
    "query": query,
    "options": {"format": "json", "limit": 100},
    "resources": {"memoryMb": 16384, "threads": 6}
})
task_id = resp.json()["taskId"]

while True:
    result = requests.get(f"{BASE}/tasks/data-query/{task_id}",
                          headers={"X-API-Key": API_KEY}).json()
    if result["status"] in ("completed", "failed"):
        break
    time.sleep(2)

print("Sector rankings (worst to best, 12-month return):")
for r in result["result"]["rows"]:
    flag = " <-- BUY" if r["rank_worst"] <= 2 else ""
    print(f"#{r['rank_worst']} {r['sector']:30s} {r['avg_return_12m_pct']:+.1f}%  ({r['n_stocks']} stocks){flag}")

Get your API key at cetaresearch.com. The full backtest code (Python + DuckDB) is on GitHub.


Data: Ceta Research, FMP financial data warehouse. Universe: NYSE + NASDAQ + AMEX. Quarterly rebalance, equal weight, 2000-2025.


Past performance does not guarantee future results. This is educational content, not investment advice.