52-Week Low Quality: 24-Year Canada Backtest (TSX)
The TSX isn't the S&P 500. Energy companies, banks, and miners dominate Canada's index. They trade cyclically. When commodity prices fall, quality resource stocks hit 52-week lows. When the cycle turns, they recover. This backtest ran from 2002 to 2025 to see whether a quality-filtered 52-week low screen could exploit that pattern.
Contents
Result: 6.10% CAGR, max drawdown of -36.29%, and a 2002 return of +9.84% while the TSX fell 13.65%. The crash protection works. The long-run CAGR roughly matches the TSX Composite's 5.95%.
Data: FMP financial data warehouse, 2000–2025. Updated March 2026.
Method
Data source: Ceta Research (FMP financial data warehouse) Universe: TSX, market cap > C$100M Period: 2002–2025 (95 quarters) Rebalancing: Quarterly (January, April, July, October), equal weight Max stocks: 30, minimum 5 to deploy capital Benchmark: TSX Composite (^GSPTSE) Cash rule: Hold cash if fewer than 5 stocks qualify Transaction costs: 0.1% per trade (one-way) Filing lag: 45-day lag on all fundamental data
Full methodology: backtests/METHODOLOGY.md
What We Found
| Metric | Portfolio | TSX Composite |
|---|---|---|
| CAGR | 6.10% | 5.95% |
| Total Return | 308.46% | — |
| Max Drawdown | -36.29% | — |
| Volatility (ann.) | 16.5% | — |
| Sharpe Ratio | 0.227 | — |
| Sortino Ratio | 0.360 | — |
| Calmar Ratio | 0.170 | — |
| Beta | 0.825 | 1.00 |
| Alpha | +0.76% | — |
| Up Capture | 70.36% | — |
| Down Capture | 78.27% | — |
| Win Rate (vs bench) | 43.16% | — |
| Cash Periods | 8/95 | — |
| Avg Stocks (when invested) | 20.0 | — |
The strategy matches the TSX Composite almost exactly: 6.10% vs 5.95% CAGR. The alpha of +0.76% is small but positive. This isn't a market-beating strategy on the TSX, but it keeps pace with the local benchmark while running a more defensive portfolio.
The max drawdown of -36.29% is the real story. During the worst drawdown periods, this portfolio held up better than the broad TSX. The down-capture of 78.27% tells the same story differently: in periods when the TSX fell, this portfolio fell about 78% as much.
$10k grew to roughly $40,845 over 24 years. That's in line with what the TSX Composite delivered over the same period.

$10k invested in January 2002. Canada portfolio (blue) tracks the TSX Composite closely over the full period.
Year-by-Year
| Year | Portfolio | TSX Composite | Excess |
|---|---|---|---|
| 2002 | +9.84% | -13.65% | +23.49% |
| 2003 | +28.40% | +25.69% | +2.71% |
| 2004 | +15.44% | +13.72% | +1.72% |
| 2005 | +14.91% | +23.39% | -8.48% |
| 2006 | +23.46% | +16.22% | +7.24% |
| 2007 | +12.43% | +8.63% | +3.80% |
| 2008 | -26.80% | -33.87% | +7.07% |
| 2009 | +25.79% | +32.42% | -6.63% |
| 2010 | +36.49% | +14.37% | +22.12% |
| 2011 | +9.42% | -11.19% | +20.61% |
| 2012 | +8.75% | +6.16% | +2.59% |
| 2013 | +4.15% | +10.85% | -6.70% |
| 2014 | +4.83% | +9.54% | -4.71% |
| 2015 | -12.71% | -11.28% | -1.43% |
| 2016 | +20.15% | +19.42% | +0.73% |
| 2017 | +9.14% | +7.52% | +1.62% |
| 2018 | -9.62% | -11.89% | +2.27% |
| 2019 | +6.44% | +20.01% | -13.57% |
| 2020 | -3.14% | +4.48% | -7.62% |
| 2021 | +21.41% | +22.78% | -1.37% |
| 2022 | -1.42% | -8.94% | +7.52% |
| 2023 | +14.50% | +8.25% | +6.25% |
| 2024 | +9.49% | +18.29% | -8.80% |
| 2025 | +5.78% | +21.07% | -15.29% |
The 2002 to 2011 decade is where this strategy earns its keep. The TSX's resource-heavy composition provided natural protection during the dot-com bust, and the strategy outperformed the TSX Composite in eight of the first ten years. Energy and mining stocks at 52-week lows with strong balance sheets recovered when commodity prices normalized.
The 2013 to 2015 stretch is the soft patch. Three consecutive years of underperformance vs the TSX: -6.70%, -4.71%, -1.43%. The gaps are modest compared to what SPY benchmarking showed, but they add up.
2019 and 2025 are the weakest years. The strategy lagged the TSX by 13.57% and 15.29% respectively, both in years when the broader Canadian market rallied strongly. The quality filter doesn't help when the rally is led by sectors the screen doesn't hold.

Year-by-year comparison. The strategy trades excess returns back and forth with the TSX Composite, with no persistent directional gap.
Why the TSX Behaves This Way
The TSX has a structurally different sector composition from the S&P 500. As of 2025, roughly 35% of the TSX is financials, 20% is energy, and 15% is materials. Technology is under 10%. Compare that to the S&P 500 where technology and tech-adjacent companies represent over 30% of index weight.
This composition has two effects on a 52-week low quality screen.
First, the signal fires more reliably. Energy and mining companies trade on commodity cycles. When oil falls from $80 to $50, quality producers hit 52-week lows. Those lows are a function of commodity price, not business quality. When oil recovers, the stocks recover. A Piotroski filter is very good at identifying which energy companies have the financial strength to wait out the cycle.
Second, within Canada, the strategy is selecting from the same sectors that dominate the TSX. Banks, pipelines, miners. When these sectors do well, the strategy does well. When they don't, the strategy doesn't. That's why the CAGR tracks the TSX Composite so closely: the portfolio is drawn from the same sector pool as the benchmark.
The down-capture of 78.27% means that in periods when the TSX fell, this portfolio fell about 78% as much. That's meaningful but not dramatic protection. The max drawdown of -36.29% is the cleanest summary of the defensive characteristic.
The alpha of +0.76% is small but positive. The strategy isn't beating the TSX by a wide margin. It's matching it with slightly better drawdown characteristics. For a mechanical quality screen, that's a reasonable outcome.
Run It Yourself
WITH
inc AS (
SELECT symbol, netIncome, grossProfit, revenue,
ROW_NUMBER() OVER (PARTITION BY symbol ORDER BY dateEpoch DESC) AS rn
FROM income_statement WHERE period = 'FY' AND netIncome IS NOT NULL
),
bal AS (
SELECT symbol, totalAssets, totalCurrentAssets, totalCurrentLiabilities,
longTermDebt, totalStockholdersEquity,
ROW_NUMBER() OVER (PARTITION BY symbol ORDER BY dateEpoch DESC) AS rn
FROM balance_sheet WHERE period = 'FY' AND totalAssets > 0
),
cf AS (
SELECT symbol, operatingCashFlow,
ROW_NUMBER() OVER (PARTITION BY symbol ORDER BY dateEpoch DESC) AS rn
FROM cash_flow_statement WHERE period = 'FY' AND operatingCashFlow IS NOT NULL
),
piotroski AS (
SELECT ic.symbol,
CASE WHEN ic.netIncome > 0 THEN 1 ELSE 0 END
+ CASE WHEN cfc.operatingCashFlow > 0 THEN 1 ELSE 0 END
+ CASE WHEN (ic.netIncome/bc.totalAssets) > (ip.netIncome/bp.totalAssets) THEN 1 ELSE 0 END
+ CASE WHEN cfc.operatingCashFlow/bc.totalAssets > ic.netIncome/bc.totalAssets THEN 1 ELSE 0 END
+ CASE WHEN (COALESCE(bc.longTermDebt,0)/bc.totalAssets) < (COALESCE(bp.longTermDebt,0)/bp.totalAssets) THEN 1 ELSE 0 END
+ CASE WHEN (bc.totalCurrentAssets/bc.totalCurrentLiabilities) > (bp.totalCurrentAssets/bp.totalCurrentLiabilities) THEN 1 ELSE 0 END
+ CASE WHEN bc.totalStockholdersEquity >= bp.totalStockholdersEquity THEN 1 ELSE 0 END
+ CASE WHEN (ic.revenue/bc.totalAssets) > (ip.revenue/bp.totalAssets) THEN 1 ELSE 0 END
+ CASE WHEN (ic.grossProfit/ic.revenue) > (ip.grossProfit/ip.revenue) THEN 1 ELSE 0 END
AS f_score
FROM (SELECT * FROM inc WHERE rn=1) ic
JOIN (SELECT * FROM inc WHERE rn=2) ip ON ic.symbol = ip.symbol
JOIN (SELECT * FROM bal WHERE rn=1) bc ON ic.symbol = bc.symbol
JOIN (SELECT * FROM bal WHERE rn=2) bp ON ic.symbol = bp.symbol
JOIN (SELECT * FROM cf WHERE rn=1) cfc ON ic.symbol = cfc.symbol
),
prices_52w AS (
SELECT symbol,
LAST_VALUE(adjClose) OVER (PARTITION BY symbol ORDER BY dateEpoch ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS current_price,
MIN(adjClose) OVER (PARTITION BY symbol) AS low_52w
FROM stock_eod
WHERE date >= CURRENT_DATE - INTERVAL '365 days' AND adjClose > 0
)
SELECT pio.symbol, p.companyName, p.sector,
pio.f_score,
ROUND(ps.current_price, 2) AS current_price,
ROUND(ps.low_52w, 2) AS low_52w,
ROUND((ps.current_price - ps.low_52w)/ps.low_52w * 100, 1) AS pct_above_low,
ROUND(k.marketCap/1e9, 2) AS mktcap_b
FROM piotroski pio
JOIN profile p ON pio.symbol = p.symbol
JOIN (SELECT symbol, MAX(current_price) AS current_price, MIN(low_52w) AS low_52w FROM prices_52w GROUP BY symbol) ps ON pio.symbol = ps.symbol
JOIN key_metrics_ttm k ON pio.symbol = k.symbol
WHERE p.exchange = 'TSX'
AND k.marketCap > 100000000
AND pio.f_score >= 7
AND (ps.current_price - ps.low_52w)/ps.low_52w <= 0.15
AND ps.current_price >= 1.0
ORDER BY (ps.current_price - ps.low_52w)/ps.low_52w ASC
LIMIT 30
Run this screen on Ceta Research →
Limitations
Currency. Returns and benchmark are both in CAD, so currency effects don't distort the comparison. International investors would need to account for CAD/USD fluctuations separately.
Energy concentration risk. The TSX's heavy energy weighting means this screen regularly concentrates in oil and gas companies when commodity prices correct. In 2015, that created correlated losses when oil fell from $60 to $30. Quality companies can still fall 40% if the commodity they depend on collapses.
The 2013-2014-2015 gap. Three consecutive years of underperformance vs the TSX totaling roughly -13 percentage points of cumulative excess return. Not catastrophic, but enough to test conviction.
Win rate of 43.16%. Fewer than half of the 95 quarters beat the TSX Composite. The strategy wins when it wins big (2002, 2010, 2011, 2022) but loses modestly in many of the remaining quarters. The skew is positive but the frequency of beating the benchmark is low.
Annual statement lag. With quarterly rebalancing and a 45-day filing lag, the Piotroski score reflects annual statements. A company whose energy revenues collapse mid-year won't trigger a portfolio exit until the next rebalance after the annual filing. The 2015 oil crash demonstrated this timing gap clearly.
Data: Ceta Research (FMP financial data warehouse), 2002–2025. Full methodology: backtests/METHODOLOGY.md. Backtest code: backtests/52-week-low/. Past performance does not guarantee future results. Educational content only, not investment advice.