Price-to-Sales Below 1 in Sweden: 10.01% CAGR, +6.84% vs OMX Stockholm 30
A quality-filtered P/S value screen on Stockholm stocks returned 10.01% annually vs 3.17% for the OMX Stockholm 30 index, the strongest excess return vs a local benchmark of any developed market tested. Sharpe ratio 0.402, second best globally.
We ran a P/S value screen on the Stockholm Stock Exchange 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 10.01% annually vs 3.17% for the OMX Stockholm 30, with a Sharpe ratio of 0.402, the second best of any exchange we tested globally. The portfolio held cash during 2000-2002 when no qualifying stocks existed.
Contents
- Method
- What Is the P/S Screen?
- The Screen
- P/S Value Screen for STO (SQL)
- What We Found
- 25 years. Strongest local excess return of any developed market tested.
- The 2000-2002 cash period: accidental protection
- Year-by-year returns
- 2003-2004: the slow start after cash
- 2005-2006: two big years
- 2008: the drawdown problem
- 2015: outperforming a declining index
- 2019: the strongest single year
- Backtest Methodology
- Limitations
- Takeaway
- Part of a Series
- References
- Run This Screen Yourself
Data: FMP financial data warehouse, 2000–2025. Updated March 2026.
Method
Data source: Ceta Research (FMP financial data warehouse) Universe: STO (Stockholm Stock Exchange), market cap > SEK 2B Period: 2000-2025 (25 years, 100 quarterly periods) Rebalancing: Quarterly (January, April, July, October), equal weight, top 30 by lowest P/S Benchmark: OMX Stockholm 30 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 low-margin distributors and struggling industrials that are cheap for a reason. 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 | > SEK 2B |
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 STO (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 > 2000000000
AND p.exchange IN ('STO')
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. Strongest local excess return of any developed market tested.
| Metric | P/S Screen (STO) | OMX Stockholm 30 |
|---|---|---|
| CAGR | 10.01% | 3.17% |
| Excess Return | +6.84% | — |
| Sharpe Ratio | 0.402 | — |
| Max Drawdown | -54.93% | — |
| Win Rate | 64.08% | — |
| Avg Stocks per Period (when invested) | 26.0 | — |
| Cash Periods | 13 of 100 | — |
+6.84% annual excess vs the local OMX Stockholm 30 is the strongest of any developed market in this series. The Sharpe of 0.402 ranks second globally, behind only Japan's 0.409. The win rate of 64.08% is the best of any developed market we tested.
The strategy generated more return per unit of risk, not just more raw return. That's a meaningful distinction.
The tradeoff is the max drawdown: -54.93%. Sweden is a smaller, more concentrated market, and individual years can be brutal. The strategy isn't for investors who check their portfolio monthly.
The 13 cash periods are concentrated almost entirely in 2000-2002. Once the screen found qualifying stocks in 2003, it stayed invested.
The 2000-2002 cash period: accidental protection
Sweden's stock market in 2000 was dominated by Ericsson and a cluster of telecom-adjacent companies that had surged on the mobile internet boom. Many were trading at P/S ratios of 5x, 10x, or higher. The quality filters, gross margin above 20% and ROE above 10%, knocked out most of the tech names. What remained was a small pool that didn't hit the threshold of 10 qualifying stocks.
The result: the strategy held cash from 2000 to 2002 while the OMX Stockholm 30 lost 55% over three years. That cash position wasn't a clever tactical call. It was a mechanical consequence of Stockholm's tech-heavy composition at the time. But it worked.
Year-by-year returns

| Year | P/S Screen (STO) | OMX 30 | Excess |
|---|---|---|---|
| 2000 | 0.0% (cash) | -14.04% | +14.04% |
| 2001 | 0.0% (cash) | -20.09% | +20.09% |
| 2002 | 0.0% (cash) | -38.16% | +38.16% |
| 2003 | +7.98% | +25.19% | -17.21% |
| 2004 | -3.48% | +16.03% | -19.50% |
| 2005 | +40.01% | +28.84% | +11.17% |
| 2006 | +38.76% | +20.84% | +17.92% |
| 2007 | +0.74% | -9.08% | +9.83% |
| 2008 | -42.80% | -34.45% | -8.36% |
| 2009 | +54.09% | +38.89% | +15.21% |
| 2010 | +21.26% | +22.14% | -0.88% |
| 2011 | -19.01% | -15.08% | -3.93% |
| 2012 | +15.75% | +13.06% | +2.69% |
| 2013 | +30.48% | +17.20% | +13.27% |
| 2014 | +3.95% | +10.53% | -6.58% |
| 2015 | +17.61% | -4.74% | +22.35% |
| 2016 | +17.04% | +9.50% | +7.54% |
| 2017 | +17.89% | +3.47% | +14.42% |
| 2018 | -12.98% | -11.01% | -1.97% |
| 2019 | +42.59% | +28.65% | +13.94% |
| 2020 | +16.59% | +4.80% | +11.79% |
| 2021 | +32.80% | +28.95% | +3.86% |
| 2022 | -15.00% | -15.07% | +0.07% |
| 2023 | +19.64% | +15.38% | +4.27% |
| 2024 | +20.52% | +4.76% | +15.77% |
| 2025 | +10.11% | +7.96% | +2.15% |
2003-2004: the slow start after cash
The portfolio's first invested period, starting in 2003, wasn't strong. 2003 returned +7.98% while the OMX gained +25.19%. Then 2004 dropped -3.48% while the index rose +16.03%.
The gap in 2003 reflects a straightforward timing issue. The screen only found qualifying stocks partway through the year. 2004 is harder to explain. Swedish mid-cap industrials lagged the global recovery that year, which hit the concentrated small portfolio hard.
What followed redeemed it: 2005 at +40.01% and 2006 at +38.76%.
2005-2006: two big years
Back-to-back returns of +40.01% and +38.76% are the strategy's best consecutive run. Sweden's quality industrial mid-caps, defense and engineering companies, specialist manufacturers, had been left behind during the 2003-2004 recovery. When earnings growth caught up to valuations in 2005 and 2006, these stocks moved sharply.
The P/S screen had positioned the portfolio in exactly these companies: operationally solid, trading below 1x sales, with real ROE. That's the thesis working.
2008: the drawdown problem
2008 returned -42.80% vs the OMX's -34.45%. That gap contributed heavily to the -54.93% max drawdown. Sweden's smaller market means higher stock-level concentration. In a panic sell-off, concentrated portfolios in smaller markets suffer more.
The strategy has no mechanism to go defensive during systemic crises, other than the cash rule, which only triggers when qualifying stocks drop below 10. In 2008, there were still enough qualifying Swedish stocks to stay fully invested.
2015: outperforming a declining index
2015 was one of Sweden's best relative years: +17.61% when the OMX returned -4.74%. The index was dragged down by weakness in Swedish large-caps and commodity-related names. The P/S screen's quality filters had kept those out. The gross margin and operating margin requirements filtered exactly the right things that year.
2019: the strongest single year
2019 returned +42.59%, the highest in the backtest's invested periods. The backdrop was a strong global equity rally as trade war fears eased and rates stayed low. Small and mid-cap quality stocks caught a tailwind, and the Swedish screen was concentrated in exactly those names.
Backtest Methodology
| Parameter | Choice |
|---|---|
| Universe | STO, Market Cap > SEK 2B |
| 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 | OMX Stockholm 30 |
| Period | 2000-2025 (25 years, 100 quarterly periods, 13 in cash) |
| Data | Point-in-time (45-day lag on FY financial statements) |
Limitations
Severe drawdown. -54.93% max drawdown is the central risk. Sweden is a smaller, more concentrated market, and the portfolio's 26-stock average means individual stock blowups matter more. Investors need to model this explicitly.
High year-to-year volatility. Returns swing from +54.09% to -42.80%. The Sharpe ratio is strong because average returns are high enough to compensate, but in any given year the range of outcomes is wide.
Currency effects. Returns are in SEK. Non-Swedish investors carry an additional layer of SEK/currency risk not captured in these numbers.
Market concentration. The STO universe is smaller than NYSE or LSE. In some quarters, the screen holds fewer than 30 stocks with no sector diversification applied. Single-position and single-sector risk is real.
Early cash periods. 13 of 100 periods were in cash (all in 2000-2002). The CAGR of 10.01% is calculated over the full 25-year period including those years. An investor who entered in 2003 would have a different experience.
Survivorship bias. Exchange membership uses current profiles, not historical. Delistings aren't tracked.
Transaction costs not included. Quarterly rebalancing of ~26 stocks generates meaningful turnover. Cost drag at 0.2-0.5% per transaction one-way is approximately 0.4-1.0% annually.
Takeaway
The Sweden P/S screen delivers 10.01% CAGR, +6.84% annual excess vs the OMX Stockholm 30, and a Sharpe of 0.402 over 25 years. That's the strongest local excess return of any developed market in this series, and the second best Sharpe globally. The win rate of 64.08% is the best of any developed market we tested.
The early cash periods in 2000-2002 were accidental protection against the dot-com bust. When the portfolio started investing in 2003, it went through a rough 2004 before delivering back-to-back 40% years in 2005-2006. 2019's +42.59% and 2021's +32.80% show the strategy still had legs two decades in.
The cost is the drawdown: -54.93%. Sweden is a smaller, more concentrated market, and the portfolio reflects that. The Sharpe looks good in retrospect. Sitting through -42.80% in 2008 or -19.01% in 2011 is a different experience in real time.
For investors who can hold through those years, the 25-year math makes a 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.10% 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 Canadian Stocks (TSX) - 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 > 2000000000
AND p.exchange IN ('STO')
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.
Data: Ceta Research, FMP financial data warehouse. Universe: STO (Stockholm). Returns in SEK. Quarterly rebalance, equal weight, 2003-2025 invested.