Sector Mean Reversion on Canada (TSX): 8.41% CAGR, +0.38% vs S&P 500
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
- Method
- What is Sector Mean Reversion?
- The Screen
- What We Found
- 26 years. +0.38% annual edge with extreme variance.
- Year-by-year returns
- 2001-2003: Tech crash, Canadian commodities rise
- 2005-2006: The commodity supercycle
- 2009: The biggest year
- 2013: The single worst excess year in the study
- 2015: Oil collapses
- 2016: The payoff
- 2019: Missing the growth rally
- Backtest Methodology
- Limitations
- Takeaway
- Part of a Series
- References
- 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.

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

| 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.