Sector Mean Reversion on Canadian Stocks (TSX): 8.41% CAGR, +0.38% vs S&P 500

Sector mean reversion on TSX large caps from 2000 to 2025: 8.41% CAGR vs 8.02% S&P 500. The strategy barely edges SPY (+0.38% annually in CAD) but with extreme volatility. 2013 excess was -48.61%, 2015 was -28.37%, 2016 was +37.26%. Energy drives most of the variance.

Growth of CAD $10,000 in Sector Mean Reversion Canada (TSX) vs S&P 500 from 2000 to 2025

We tested sector mean reversion on TSX large caps from 2000 to 2025: at the start of each quarter, find the two worst-performing sectors by 12-month return and buy every qualifying stock in them. Quarterly rebalance, equal weight, 104 periods. The result was 8.41% annualized in CAD vs 8.02% for the S&P 500, a +0.38% annual edge over 26 years. The strategy was fully invested in 101 of 104 quarters. On paper, it works. In practice, the ride is brutal enough that most investors wouldn't hold it.

Contents

  1. Method
  2. What is Sector Mean Reversion?
  3. The Screen
  4. What We Found
  5. 26 years. +0.38% annual edge with extreme variance.
  6. Year-by-year returns
  7. 2001-2003: Tech crash, Canadian commodities rise
  8. 2005-2006: The commodity supercycle
  9. 2009: The biggest year
  10. 2013: The single worst excess year in the study
  11. 2015: Oil collapses
  12. 2016: The payoff
  13. 2019: Missing the growth rally
  14. Backtest Methodology
  15. Limitations
  16. Takeaway
  17. Part of a Series
  18. References
  19. Run This Screen Yourself

Method

Data source: Ceta Research (FMP financial data warehouse) Universe: TSX (Toronto Stock Exchange), market cap > CAD $500M Period: 2000-2025 (26 years, 104 quarterly periods) Rebalancing: Quarterly (January, April, July, October), equal weight all qualifying stocks in selected sectors Benchmark: S&P 500 Total Return (SPY), returns in CAD Cash rule: Hold cash if fewer than 5 stocks qualify across the bottom 2 sectors


What is Sector Mean Reversion?

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.

The academic basis is Moskowitz and Grinblatt (1999), who showed that much of the momentum anomaly is explained at the industry level. The corollary: when industry-level momentum turns sufficiently negative, mean reversion tends to follow. Sectors that underperform for a full year carry suppressed valuations and depressed sentiment. Both tend to normalize.

On Canadian markets, the dynamic has a structural wrinkle. Canada's TSX is heavily weighted toward Energy, Basic Materials, and Financials. This isn't a diversified multi-sector index the way the US market is. When commodity cycles turn, they dominate sector rankings for years at a time. That changes the character of the strategy compared to markets with broader sector representation.

The most-selected sectors across 101 invested quarters:

Sector Quarters Selected (of 101)
Energy 32 (32%)
Communication Services 30 (30%)
Basic Materials 26 (26%)
Utilities 23 (23%)
Technology 22 (22%)
Consumer Defensive 21 (21%)

Energy leads at 32% of all quarters. Communication Services and Basic Materials follow closely. These three sectors alone account for roughly half of all invested quarters. The TSX's commodity concentration doesn't just color the strategy — it defines it.


The Screen

The screen below runs live. It ranks TSX sectors by their current 12-month equal-weighted return across TSX 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 > 500000000
      AND p.exchange IN ('TSX')
      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

What We Found

The strategy produced a slim edge over 26 years, driven by big swings in both directions. The cumulative picture looks similar to SPY. The annual picture shows why most investors wouldn't run this.

Growth of CAD $10,000 in Sector Mean Reversion Canada (TSX) vs S&P 500 from 2000 to 2025
Growth of CAD $10,000 in Sector Mean Reversion Canada (TSX) vs S&P 500 from 2000 to 2025

26 years. +0.38% annual edge with extreme variance.

Metric Strategy S&P 500
CAGR 8.41% 8.02%
Volatility 25.93%
Max Drawdown -49.66% -45.53%
Sharpe Ratio 0.228 0.357
Sortino Ratio 0.367
Calmar Ratio 0.169
Win Rate vs SPY 49.04%
Up Capture 112.27%
Down Capture 99.77%
Avg Stocks per Period 71.0
Cash Periods 3 of 104

The 0.38% annual excess is real over the full period, but the Sharpe of 0.228 versus the S&P 500's 0.357 tells the real story. You're accepting more volatility, a worse Sharpe, and a larger max drawdown for less than half a percentage point of annual alpha. The win rate of 49.04% means the strategy trailed SPY in more than half of all quarters.

The down capture of 99.77% is nearly identical to SPY's. In bad markets, this portfolio falls almost exactly as hard as the benchmark. The up capture of 112.27% means the strategy captures more of the upside, but the asymmetry isn't strong enough to compensate for the event risk concentrated in specific years.

With 71 stocks per quarter on average, this is a sector tilt across a relatively small universe, not a diversified factor portfolio.

Year-by-year returns

Sector Mean Reversion vs S&P 500 annual returns, Canada (TSX), 2000-2025
Sector Mean Reversion vs S&P 500 annual returns, Canada (TSX), 2000-2025

Year Strategy S&P 500 Excess
2000 -2.96% -10.50% +7.54%
2001 +14.03% -9.17% +23.20%
2002 -16.89% -19.92% +3.03%
2003 +65.97% +24.12% +41.85%
2004 +12.69% +10.24% +2.45%
2005 +32.38% +7.17% +25.21%
2006 +32.83% +13.65% +19.18%
2007 -3.28% +4.40% -7.68%
2008 -37.90% -34.31% -3.59%
2009 +82.98% +24.73% +58.25%
2010 +27.70% +14.31% +13.39%
2011 +15.19% +2.46% +12.73%
2012 -3.68% +17.09% -20.77%
2013 -20.84% +27.77% -48.61%
2014 +12.26% +14.50% -2.24%
2015 -28.49% -0.12% -28.37%
2016 +51.71% +14.45% +37.26%
2017 +18.06% +21.64% -3.58%
2018 -5.61% -5.15% -0.46%
2019 +1.62% +32.31% -30.69%
2020 -3.89% +15.64% -19.53%
2021 +49.55% +31.26% +18.29%
2022 -17.02% -18.99% +1.97%
2023 +1.36% +26.00% -24.64%
2024 +14.05% +25.28% -11.23%
2025 +15.02% +17.88% -2.86%

2001-2003: Tech crash, Canadian commodities rise

The dot-com collapse hit Canada differently than the US. Canadian tech exposure was smaller, and the commodities that had been depressed through the late 1990s began to recover. The strategy loaded up on Energy and Basic Materials at a time when those sectors were genuinely cheap.

2001: +14.03% vs SPY -9.17%. The market was selling growth. The strategy was holding resource stocks. 2002: -16.89% vs SPY -19.92%. The portfolio held up better through the final leg of the decline. 2003: +65.97% vs SPY +24.12%. The commodity recovery accelerated hard. Beaten-down resource stocks surged as global demand picked back up. A 41-point excess return in a single year.

This is the strategy at its best: catching a sector rotation that the backward-looking momentum signal was correctly positioned for.

2005-2006: The commodity supercycle

By 2005-2006, the commodity supercycle was in full swing. China's infrastructure buildout was driving demand for everything Canada produces: oil, gas, copper, potash. The strategy's persistent tilt toward Energy and Basic Materials caught two consecutive years of strong outperformance.

2005: +32.38% vs SPY +7.17%, a 25-point gap. 2006: +32.83% vs SPY +13.65%, a 19-point gap.

Neither of these was a mean-reversion story in the traditional sense. The sectors the strategy was buying in 2004 had already started moving. The strategy rode the commodity boom as a structural feature of Canada's market, not just a sentiment normalization.

2009: The biggest year

2009 was +82.98% vs SPY's +24.73%, a 58-point gap. After the financial crisis, the strategy had loaded up on commodity and resource sectors that were destroyed in the crash. When commodity prices recovered alongside global growth expectations in 2009, the bounce was violent.

This is the same playbook as 2003: buy what was obliterated, wait for the recovery. On a resource-heavy exchange, the strategy's best years are almost always commodity recoveries.

2013: The single worst excess year in the study

2013 was -48.61% excess. The strategy returned -20.84% while SPY delivered +27.77%. That is the largest single-year gap in the entire global exchange comparison for this strategy.

The reason: the strategy was positioned in beaten-down commodity sectors during a year when markets globally were rewarding growth and momentum. The US was posting its strongest gains of the post-crisis recovery. Canadian resource stocks — already underperforming through 2012 — kept falling. The backward-looking signal kept buying them. The gap between what the strategy held and what the market was rewarding was as wide as it gets.

This single year erases roughly 10 years of alpha accumulation. A strategy with a 0.38% annual edge needs about 128 years to build back a 48-point single-year deficit on a risk-adjusted basis.

2015: Oil collapses

By early 2015, Energy had been the worst or near-worst performing sector for 12 months. The signal bought it. Oil kept falling. WTI went from roughly $55 at the start of 2015 toward $35 by year-end.

2015: -28.49% vs SPY -0.12%. The strategy fell nearly 28 points worse than a flat benchmark.

The commodity cycle created a structural trap. On the TSX, Energy underperforming for 12 months doesn't necessarily mean it's about to revert. It sometimes means the cycle is turning, and there's more downside ahead. The US strategy had the same 2015 problem, but Canada felt it harder because Energy is a bigger share of the investable universe.

2016: The payoff

2016 delivered +51.71% vs SPY +14.45%, a 37-point excess. Oil stabilized and recovered. Energy stocks — which the strategy had held through the pain of 2015 — surged. This is the mean reversion payoff that the strategy is built around.

But note the sequence: you had to absorb -28.37% excess in 2015 to earn +37.26% in 2016. Over the two years combined, the excess was just +8.89%. Depending on when you entered or exited, you may have caught the loss without the recovery.

2019: Missing the growth rally

2019 was +1.62% vs SPY +32.31%, a -30.69% excess. The US market had its strongest year in over a decade, driven by tech and consumer growth stocks. The strategy on the TSX was positioned in Energy and Communication Services — sectors that had underperformed through 2018. Neither caught the growth wave. Energy drifted. Telecom lagged. The strategy sat in CAD-denominated resource and telecom stocks while the benchmark exploded higher.

2020 continued the pattern: -3.89% vs SPY +15.64%. Two consecutive years of 20-point-plus underperformance wiped out years of prior gains.


Backtest Methodology

Parameter Choice
Universe TSX, Market Cap > CAD $500M
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)
Cash rule Hold cash if < 5 stocks qualify
Benchmark S&P 500 Total Return (SPY)
Period 2000-2025 (26 years, 104 quarters)
Data Ceta Research (FMP financial data warehouse)

Limitations

Energy concentration. Energy showing up in 32% of quarters isn't mean reversion at work — it's commodity cycle exposure. The TSX's structural weighting toward resource sectors means the strategy often functions as a commodity cyclical tilt rather than a diversified sector rotation play. In markets where commodity cycles are multi-year, the "reversion" signal can stay wrong for extended periods.

Currency. Returns are in CAD. The strategy's comparison to SPY includes CAD/USD currency effects. A Canadian investor holding this portfolio benefits from CAD appreciation and suffers from depreciation. The 0.38% annual edge is a CAD-denominated figure, not a direct capital comparison.

Extreme single-year risk. The -48.61% excess in 2013 is a tail event that no backtest methodology can fully capture in expectation. A strategy with this risk profile will periodically post years that destroy years of compounding. The overall positive excess is real but concentrated in a small number of boom periods.

Sharpe worse than benchmark. The strategy's Sharpe of 0.228 vs SPY's 0.357 means you're not being compensated for the extra volatility you're taking on. The 25.93% annualized vol with only 0.38% excess alpha is a poor trade on a risk-adjusted basis.

Small universe. With 71 stocks on average, the TSX portfolio is much smaller than US equivalents. That means individual sector performance has more impact on results. A single commodity price collapse (2015) can dominate an entire year's returns.

No transaction costs. The backtest doesn't include trading costs. Quarterly rebalancing across 71 stocks in a market with wider spreads than NYSE would meaningfully reduce net returns.

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


Takeaway

Sector mean reversion on the TSX produced 8.41% CAGR in CAD over 26 years, +0.38% annually above SPY. The strategy is technically positive over the full period. It's hard to recommend.

The Sharpe is 0.228 against the benchmark's 0.357. The max drawdown is -49.66%. In 2013, a single year produced -48.61% excess. In 2015, another year delivered -28.37%. The positive alpha is real but concentrated almost entirely in commodity recovery years: 2003, 2009, 2016, 2021. Outside those periods, the strategy often trails badly.

The core issue is structural. Canada's economy is resource-heavy, and resource sectors don't follow the same mean-reversion dynamics as diversified markets. Energy underperforming for 12 months on the TSX might be the first year of a 3-year commodity downturn. Buying beaten-down oil and gas stocks when the oil cycle hasn't bottomed is a different bet than buying beaten-down utilities after a rate scare.

For investors who can size positions appropriately and stomach multi-year stretches of underperformance, there's a case to run this. For most, the reward doesn't justify the risk.


Part of a Series

This analysis is part of our Sector Mean Reversion global exchange comparison. We tested the same strategy across multiple exchanges: - Sector Mean Reversion on US Stocks (NYSE + NASDAQ + AMEX) - Sector Mean Reversion on Indian Stocks (BSE + NSE) - Sector Mean Reversion on Korean Stocks (KSC) - Sector Mean Reversion on Taiwanese Stocks (TAI + TWO) - Sector Mean Reversion on Swedish Stocks (STO) - 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. Paste the SQL above, set your exchange filter to TSX, and 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 > 500000000
      AND p.exchange IN ('TSX')
      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("TSX 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: TSX, market cap > CAD $500M. Quarterly rebalance, equal weight, 2000-2025.