Price-to-Sales Below 1 in Canada: 9.54% CAGR, Zero Cash Periods Over
We ran a P/S value screen on the TSX from 2000 to 2025. The strategy requires P/S below 1.0, gross margin above 20%, operating margin above 5%, and ROE above 10%. It returned 9.54% annually vs 8.01% for the S&P 500, with zero cash periods across 25 years and an average of 26.2 stocks per quarter.
Contents
- Method
- What Is the P/S Screen?
- The Screen
- P/S Value Screen for TSX (SQL)
- What We Found
- 25 years. 1.5% annual alpha. Never ran out of stocks.
- Year-by-year returns
- 2000-2005: the strategy's defining run
- 2015: the oil crash hits hard
- 2016: the recovery year
- 2022-2025: closing strong
- Backtest Methodology
- Limitations
- Takeaway
- Part of a Series
- References
- Run This Screen Yourself
Method
- Data source: Ceta Research (FMP financial data warehouse)
- Universe: TSX, market cap > CAD 500M
- Period: 2000-2025 (25 years, 100 quarterly periods)
- Rebalancing: Quarterly (January, April, July, October), equal weight, top 30 by lowest P/S
- Benchmark: S&P 500 Total Return (SPY)
- Cash rule: Hold cash if fewer than 10 stocks qualify
Financial data sourced from financial_ratios (FY) for P/S ratio and margins, key_metrics (FY) for ROE and market cap. 45-day lag on all financial statements to prevent look-ahead bias.
What Is the P/S Screen?
Price-to-sales divides a company's market cap by its annual revenue. A ratio below 1.0 means you're paying less than $1 for every $1 of sales the business generates. Kenneth Fisher popularized P/S as a valuation metric in Super Stocks (1984), arguing it was a cleaner signal than P/E because revenue is harder to manipulate than earnings.
The screen doesn't stop at P/S < 1.0. Without quality filters, that criterion fills the portfolio with commodity traders, fuel distributors, and pipeline companies that run thin margins by design. The quality gates change what qualifies.
Valuation:
| Criterion | Metric | Threshold |
|---|---|---|
| Cheap on sales | Price-to-Sales (FY) | < 1.0 |
Quality Filters:
| Criterion | Metric | Threshold |
|---|---|---|
| Margin quality | Gross Margin | > 20% |
| Operational efficiency | Operating Margin | > 5% |
| Capital returns | Return on Equity | > 10% |
Size:
| Criterion | Metric | Threshold |
|---|---|---|
| Institutional grade | Market Cap | > CAD 500M |
Stocks must pass all four to enter. The top 30 by lowest P/S ratio are selected each quarter, equal weighted.
The Screen
P/S Value Screen for TSX (SQL)
SELECT
f.symbol,
p.companyName,
p.exchange,
p.sector,
ROUND(f.priceToSalesRatioTTM, 3) AS ps_ratio,
ROUND(f.grossProfitMarginTTM * 100, 1) AS gross_margin_pct,
ROUND(f.operatingProfitMarginTTM * 100, 1) AS op_margin_pct,
ROUND(k.returnOnEquityTTM * 100, 1) AS roe_pct,
ROUND(k.marketCap / 1e9, 2) AS mktcap_b
FROM financial_ratios_ttm f
JOIN key_metrics_ttm k ON f.symbol = k.symbol
JOIN profile p ON f.symbol = p.symbol
WHERE f.priceToSalesRatioTTM > 0
AND f.priceToSalesRatioTTM < 1
AND f.grossProfitMarginTTM > 0.20
AND f.operatingProfitMarginTTM > 0.05
AND k.returnOnEquityTTM > 0.10
AND k.marketCap > 500000000
AND p.exchange IN ('TSX')
QUALIFY ROW_NUMBER() OVER (PARTITION BY f.symbol ORDER BY f.priceToSalesRatioTTM ASC) = 1
ORDER BY f.priceToSalesRatioTTM ASC
LIMIT 30
Run this query on Ceta Research
What We Found

25 years. 1.5% annual alpha. Never ran out of stocks.
| Metric | P/S Screen (TSX) | S&P 500 |
|---|---|---|
| CAGR | 9.54% | 8.01% |
| Sharpe Ratio | 0.351 | 0.354 |
| Max Drawdown | -47.11% | -45.53% |
| Avg Stocks per Period | 26.2 | - |
| Cash Periods | 0 of 100 | - |
The return is solid: 9.54% annually over 25 years, $10,000 growing to roughly $97,000 in CAD terms. The zero cash periods stand out. The TSX consistently produced enough qualifying stocks through every market condition, including the 2008 credit crisis and the 2015 commodity collapse.
The Sharpe ratio of 0.351 sits just below SPY's 0.354, which is essentially a tie. The max drawdown of -47.11% is slightly worse than SPY's -45.53%, so this isn't a strategy that improves your risk profile. The alpha is in the raw return, not in better risk-adjusted efficiency.
Year-by-year returns

| Year | P/S Screen (TSX) | S&P 500 | Excess |
|---|---|---|---|
| 2000 | +42.40% | -10.50% | +52.90% |
| 2001 | +3.94% | -9.17% | +13.11% |
| 2002 | +19.72% | -19.92% | +39.64% |
| 2003 | +29.10% | +24.12% | +4.98% |
| 2004 | +15.98% | +10.24% | +5.74% |
| 2005 | +20.86% | +7.17% | +13.69% |
| 2006 | -0.09% | +13.65% | -13.74% |
| 2007 | +0.61% | +4.40% | -3.79% |
| 2008 | -37.01% | -34.31% | -2.70% |
| 2009 | +60.27% | +24.73% | +35.54% |
| 2010 | +29.56% | +14.31% | +15.25% |
| 2011 | -8.36% | +2.46% | -10.82% |
| 2012 | +11.10% | +17.09% | -5.99% |
| 2013 | +11.21% | +27.77% | -16.56% |
| 2014 | -2.72% | +14.50% | -17.22% |
| 2015 | -25.51% | -0.12% | -25.39% |
| 2016 | +45.37% | +14.45% | +30.92% |
| 2017 | +1.83% | +21.64% | -19.81% |
| 2018 | -9.53% | -5.15% | -4.38% |
| 2019 | +17.87% | +32.31% | -14.44% |
| 2020 | +3.79% | +15.64% | -11.85% |
| 2021 | +25.41% | +31.26% | -5.85% |
| 2022 | -9.39% | -18.99% | +9.60% |
| 2023 | +0.62% | +26.00% | -25.38% |
| 2024 | +21.27% | +25.28% | -4.01% |
| 2025 | +32.99% | +15.34% | +17.65% |
2000-2005: the strategy's defining run
| Period | P/S Screen (TSX) | S&P 500 | Excess |
|---|---|---|---|
| 2000-2002 | +72.6% | -34.6% | +107.2% |
| 2003-2005 | +78.7% | +46.3% | +32.4% |
While the US market was deep in the dot-com bust, the TSX screen posted three straight positive years: +42.4%, +3.9%, +19.7%. The reason is structural. Canadian large caps were never dominated by tech the way the US market was. The TSX in 2000 was financials, energy, and materials. Those sectors didn't trade at 50x sales. They traded at reasonable multiples, many of them below 1x, and they kept earning money while US tech imploded.
When the dot-com recovery came in 2003-2005, the TSX screen participated fully: +29.1%, +16.0%, +20.9%.
2015: the oil crash hits hard
The worst single year in the backtest was 2015: -25.51%, 25 percentage points worse than the S&P 500's flat -0.12%. The oil price collapse explains most of it.
The P/S screen with gross margin > 20% and operating margin > 5% is designed to exclude pure commodity producers. But the TSX's energy and materials sectors include companies, pipeline operators, energy services firms, gold royalty companies, that can pass those margin filters in normal conditions. When oil fell from $100 to $35, those stocks didn't care much about margin filters. They sold off.
This is the cyclical risk embedded in the TSX. The quality filters help but don't immunize the portfolio from commodity cycles.
2016: the recovery year
After 2015's -25.51%, the portfolio bounced +45.37% in 2016. Oil recovered from its lows, and the beaten-down energy and materials names that dragged the portfolio down snapped back hard. The recovery was bigger than the drawdown in percentage terms, which is what kept the long-run CAGR positive.
This is the pattern with cyclical strategies: if you stayed in through 2015, the 2016 recovery more than compensated.
2022-2025: closing strong
| Year | P/S Screen (TSX) | S&P 500 | Excess |
|---|---|---|---|
| 2022 | -9.39% | -18.99% | +9.60% |
| 2025 | +32.99% | +15.34% | +17.65% |
The rate-rising environment of 2022 favored value. The portfolio fell only -9.39% while SPY dropped -19%. The 2025 finish at +32.99% was the second-strongest year in the entire 25-year run, behind only 2009's +60.27%.
Backtest Methodology
| Parameter | Choice |
|---|---|
| Universe | TSX, Market Cap > CAD 500M |
| Signal | P/S < 1.0, Gross Margin > 20%, Op. Margin > 5%, ROE > 10% |
| Portfolio | Top 30 by lowest P/S, equal weight |
| Rebalancing | Quarterly (January, April, July, October) |
| Cash rule | Hold cash if < 10 qualify |
| Benchmark | S&P 500 Total Return (SPY) |
| Period | 2000-2025 (25 years, 100 quarterly periods) |
| Data | Point-in-time (45-day lag on FY financial statements) |
Limitations
Commodity-driven cyclicality. The TSX is heavily weighted toward energy, materials, and financials. The quality filters reduce but don't eliminate exposure to commodity cycles. 2015 is the evidence.
Sharpe ratio doesn't improve on SPY. 0.351 vs 0.354 is a wash. The alpha comes entirely from return, not from better risk-adjusted performance. Investors focused on Sharpe won't find a compelling case here.
Currency effects. Returns are in CAD. US-based investors face an additional layer of CAD/USD currency risk that isn't captured in the backtest.
Sector concentration. Without a sector cap, some quarters skew heavily toward energy services or financials. Single-sector risk exists, especially given the TSX's natural resource bias.
Survivorship bias. Exchange membership uses current profiles, not historical. Delistings and historical composition aren't tracked.
Transaction costs not included. Quarterly rebalancing of 30 stocks generates turnover. Cost drag at 0.2-0.5% per transaction one-way is approximately 0.4-1.0% annually.
Takeaway
The TSX P/S screen delivers 9.54% CAGR over 25 years, 1.5% above the S&P 500. The zero cash periods show the Canadian market is consistently deep enough to fill the screen. The 2000-2005 run demonstrates the strategy's real strength: holding profitable Canadian companies when US tech was cratering.
The cyclical risk is real. The TSX leans into energy and materials in ways US screens don't, and 2015 was painful. But the 2016 recovery was bigger. Over 25 years the math holds.
The Sharpe ratio lands just below SPY's, so this isn't a risk-reduction strategy. It's a return-enhancement strategy that asks you to tolerate more volatility, specifically the commodity cycles that define the TSX. For an investor who understands that, the 25-year track record is a reasonable case.
Part of a Series
This analysis is part of our global P/S value screen comparison. We tested the same screen across multiple exchanges worldwide: - P/S Value Screen on US Stocks (NYSE + NASDAQ + AMEX) - 11.14% CAGR, strongest raw return - P/S Value Screen on Indian Stocks (BSE + NSE) - P/S Value Screen on German Stocks (XETRA) - P/S Value Screen on Swedish Stocks (STO) - P/S Value Screen on South African Stocks (JNB) - P/S Value Screen on Japanese Stocks (JPX) - P/S Value Screen: Global Exchange Comparison
References
- Fisher, K. (1984). Super Stocks. Dow Jones-Irwin.
- Barbee, W., Mukherji, S. & Raines, G. (1996). "Do Sales-Price and Debt-Equity Explain Stock Returns Better than Book-Market and Firm Size?" Financial Analysts Journal, 52(2), 56-60.
- Gray, W. & Vogel, J. (2012). "Analyzing Valuation Measures: A Performance Horse-Race over the Past 40 Years." Journal of Portfolio Management, 39(1), 112-121.
- Novy-Marx, R. (2013). "The Other Side of Value: The Gross Profitability Premium." Journal of Financial Economics, 108(1), 1-28.
Run This Screen Yourself
Via web UI: Run the P/S value screen on Ceta Research. The query is pre-loaded. Hit "Run" and see what qualifies today.
Via Python:
import requests, time
API_KEY = "your_api_key" # get one at cetaresearch.com
BASE = "https://tradingstudio.finance/api/v1"
resp = requests.post(f"{BASE}/data-explorer/execute", headers={
"X-API-Key": API_KEY, "Content-Type": "application/json"
}, json={
"query": """
SELECT f.symbol, p.companyName, p.sector,
ROUND(f.priceToSalesRatioTTM, 3) AS ps_ratio,
ROUND(f.grossProfitMarginTTM * 100, 1) AS gross_margin_pct,
ROUND(f.operatingProfitMarginTTM * 100, 1) AS op_margin_pct,
ROUND(k.returnOnEquityTTM * 100, 1) AS roe_pct,
ROUND(k.marketCap / 1e9, 2) AS mktcap_b
FROM financial_ratios_ttm f
JOIN key_metrics_ttm k ON f.symbol = k.symbol
JOIN profile p ON f.symbol = p.symbol
WHERE f.priceToSalesRatioTTM > 0
AND f.priceToSalesRatioTTM < 1
AND f.grossProfitMarginTTM > 0.20
AND f.operatingProfitMarginTTM > 0.05
AND k.returnOnEquityTTM > 0.10
AND k.marketCap > 500000000
AND p.exchange IN ('TSX')
QUALIFY ROW_NUMBER() OVER (PARTITION BY f.symbol ORDER BY f.priceToSalesRatioTTM ASC) = 1
ORDER BY f.priceToSalesRatioTTM ASC
LIMIT 30
""",
"options": {"format": "json", "limit": 100}
})
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)
for r in result["result"]["rows"][:10]:
print(f"{r['symbol']:8s} P/S={r['ps_ratio']:.3f} GM={r['gross_margin_pct']:.1f}% ROE={r['roe_pct']:.1f}%")
Get your API key at cetaresearch.com. The full backtest code (Python + DuckDB) is on GitHub.
Part of a Series: Global | US | Sweden | Southafrica Stocks | Japan | India | Germany
Data: Ceta Research, FMP financial data warehouse. Universe: TSX. Returns in CAD. Quarterly rebalance, equal weight, 2000-2025.