Price-to-Sales Below 1 in Germany: 9.70% CAGR, +4.58% vs DAX Over 25 Years

Growth of €10,000 invested in P/S value screen XETRA Germany vs DAX from 2000 to 2025. Germany strategy grew to approximately €98,000 (EUR), DAX to €26,000.

We screened XETRA-listed stocks for low price-to-sales ratios with qualifying margins and profitability, then backtested the resulting portfolio from 2000 to 2025. The strategy returned 9.70% annually vs 5.12% for the DAX, over 25 years and 100 quarterly periods. The Sharpe ratio is 0.368. The portfolio was never in cash.

Contents

  1. Method
  2. The Screen
  3. XETRA P/S Screen (SQL)
  4. What We Found
  5. 25 years. Strong alpha vs the local DAX.
  6. Year-by-year returns
  7. 2007: the standout year
  8. 2008: the flip side
  9. 2020: COVID hit European industrials differently
  10. 2024: flat amid structural weakness
  11. Where Germany's P/S screen works best
  12. Why Germany's Mittelstand fits this screen
  13. Backtest Methodology
  14. Limitations
  15. Takeaway
  16. Part of a Series
  17. References
  18. Run This Screen Yourself

Data: FMP financial data warehouse, 2000–2025. Updated March 2026.


Method

Data source: Ceta Research (FMP financial data warehouse) Universe: XETRA, market cap > €300M EUR Period: 2000-2025 (25 years, 100 quarterly periods) Rebalancing: Quarterly (January, April, July, October), equal weight, top 30 by lowest P/S Benchmark: DAX (German large-cap index) Cash rule: Hold cash if fewer than 10 stocks qualify

Popularized by Kenneth Fisher in Super Stocks (1984). The P/S ratio avoids the noise in earnings-based metrics and works particularly well for companies with temporarily depressed margins. 45-day lag on financial data to prevent look-ahead bias.


The Screen

Signal filters:

Criterion Metric Threshold
Cheap relative to revenue Price-to-Sales < 1.0
Business quality Gross Margin > 20%
Operational efficiency Operating Margin > 5%
Capital returns ROE > 10%

Size filter: Market cap > €300M EUR

Selection: Top 30 by lowest P/S among qualifying stocks.

XETRA P/S Screen (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 > 300000000
  AND p.exchange IN ('XETRA')
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

Growth of €10,000 invested in P/S value screen XETRA Germany vs DAX from 2000 to 2025. Germany strategy grew to approximately €98,000 (EUR), DAX to €26,000.
Growth of €10,000 invested in P/S value screen XETRA Germany vs DAX from 2000 to 2025. Germany strategy grew to approximately €98,000 (EUR), DAX to €26,000.

25 years. Strong alpha vs the local DAX.

Metric P/S Screen (XETRA) DAX
CAGR 9.70% 5.12%
Excess Return +4.58%
Max Drawdown -51.85%
Sharpe Ratio 0.368
Avg Stocks per Period 20.8
Cash Periods 0 of 100

The strategy turned €10,000 into approximately €98,000. Zero cash periods across 100 quarters: German mid-cap companies consistently had enough stocks trading below 1x revenue to stay fully invested the entire time.

The Sharpe of 0.368 is strong. Japan (0.409) and Sweden (0.402) come in higher, but Germany ranks #3 globally on risk-adjusted terms. Germany combines a deep Mittelstand manufacturing base, consistent profitability, and modest market valuations relative to earnings and sales.

Year-by-year returns

XETRA P/S screen vs DAX annual returns 2000 to 2025. Strong outperformance in 2001, 2007, 2014, and 2021. Underperformance in 2008, 2020, and 2024.
XETRA P/S screen vs DAX annual returns 2000 to 2025. Strong outperformance in 2001, 2007, 2014, and 2021. Underperformance in 2008, 2020, and 2024.

Year XETRA P/S DAX Excess
2000 +6.75% -6.83% +13.58%
2001 +5.74% -17.84% +23.58%
2002 -22.00% -39.92% +17.92%
2003 +21.07% +29.42% -8.35%
2004 +20.59% +6.79% +13.80%
2005 +20.89% +26.99% -6.10%
2006 +30.36% +22.59% +7.77%
2007 +43.62% +18.98% +24.64%
2008 -45.88% -37.44% -8.44%
2009 +40.97% +21.62% +19.34%
2010 +24.64% +15.57% +9.08%
2011 -16.59% -13.08% -3.51%
2012 +18.76% +28.03% -9.28%
2013 +20.48% +20.84% -0.36%
2014 +31.19% +3.88% +27.32%
2015 +6.98% +5.31% +1.67%
2016 +26.67% +12.79% +13.88%
2017 +13.16% +10.98% +2.18%
2018 -6.74% -17.80% +11.06%
2019 +23.19% +26.52% -3.33%
2020 -12.48% +2.55% -15.02%
2021 +31.80% +16.71% +15.09%
2022 -7.34% -12.18% +4.84%
2023 +12.31% +19.19% -6.88%
2024 +1.72% +19.41% -17.69%
2025 +16.37% +21.96% -5.59%

2007: the standout year

The portfolio gained +43.62% in 2007 while the DAX returned +18.98%. Germany's export machine was running at full capacity. Chinese industrialization drove demand for German capital equipment, machine tools, and automotive components. Companies that were trading below 1x revenue in 2006 re-rated sharply as their revenue base expanded. The P/S screen loaded up on exactly those names.

2008: the flip side

The same industrial exposure that drove 2007's gains produced a -45.88% drawdown in 2008. This is the honest tradeoff. XETRA industrials and exporters are cyclical. When global demand collapses, so do their revenues, and low P/S stocks get hit harder than defensive names. The max drawdown of -51.85% is real.

If you're investing in this strategy, the 2008 experience is what you're signing up to survive through.

2020: COVID hit European industrials differently

The portfolio returned -12.48% in 2020 while the DAX gained +2.55%. German industrials took the full hit of lockdowns and supply chain disruption with no equivalent tech sector to cushion the fall. The DAX's recovery was driven by a handful of large-cap names; the mid-cap P/S screen didn't share in it.

2024: flat amid structural weakness

The portfolio returned +1.72% in 2024 while the DAX gained +19.41%. XETRA was weak across the board that year. The auto sector (BMW, Mercedes-Benz, Volkswagen) suffered margin compression from Chinese EV competition and weak domestic demand. Energy-intensive manufacturers were still working through post-2022 cost structures. Stocks that looked cheap on P/S kept getting cheaper.

Where Germany's P/S screen works best

The screen performs best during global growth cycles where German exports are in demand (2003-2007, 2009-2010, 2014-2016). It struggles when the DAX is being pulled up by a few large-cap names while mid-cap industrials lag (2023-2024).

Period XETRA P/S DAX Excess
Growth cycle (2003-07) +230% cumulative +156% cumulative +74%
Post-crisis recovery (2009-10) +76% cumulative +41% cumulative +35%
Recent drag (2019-24) +50% cumulative +89% cumulative -39%

Why Germany's Mittelstand fits this screen

German mid-cap companies (the Mittelstand) are often family-controlled, export-oriented manufacturers. They run lean balance sheets, maintain consistent margins, and rarely trade at high revenue multiples because they're not growth stories. They're durable businesses generating consistent cash flow.

That's exactly what a P/S < 1 screen with margin requirements is designed to find. The screen isn't just coincidentally working in Germany. Germany's market structure is naturally suited to it.


Backtest Methodology

Parameter Choice
Universe XETRA, Market Cap > €300M EUR
Signal P/S < 1.0, Gross Margin > 20%, Operating 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 DAX
Period 2000-2025 (25 years, 100 periods)
Data Point-in-time (45-day lag for financial statements)

Limitations

Drawdown risk. The -51.85% max drawdown is substantial. Industrial cyclicality is real. Any investor in this strategy needs to be prepared for a 2008-type event.

Currency exposure. Returns are in EUR. A US investor holding XETRA stocks takes on EUR/USD currency risk. EUR depreciation reduces USD-denominated returns; appreciation adds to them.

Concentration in industrials and materials. The P/S filter naturally pulls toward capital-intensive manufacturers. Sector concentration is a persistent feature, not an accident.

2024 structural headwinds. The auto sector's de-rating and ongoing energy cost pressures create genuine fundamental risks that a backward-looking screen won't flag. These aren't cyclical dips. Some may be structural.

Survivorship bias. Exchange membership uses current profiles, not historical. Delistings and restructurings aren't tracked.

Transaction costs not included. With quarterly rebalancing and roughly 21 stocks, cost drag is approximately 0.3-0.5% annually at standard institutional rates.


Takeaway

The XETRA P/S screen returned 9.70% CAGR over 25 years, 4.58% annual alpha over the DAX, and a Sharpe of 0.368 with zero cash periods. It ranks #3 globally on risk-adjusted terms behind Japan (0.409) and Sweden (0.402).

The reason isn't mysterious. Germany has a deep base of mid-cap industrial companies with genuine profitability, consistent margins, and modest market valuations. The P/S screen finds them systematically. The 45-day lag keeps the data clean. Quarterly rebalancing keeps the portfolio current.

The tradeoff is drawdown. The worst year was 2008 at -45.88%. The max drawdown hit -51.85%. If you hold XETRA industrials through a global demand collapse, they'll fall hard. That's the deal. The 25-year track record says the long-run math works in your favor, but you have to actually stay in through those years.

Returns are in EUR. For international investors, the EUR/USD component adds another layer of risk and return to factor in.


Part of a Series

This analysis is part of our P/S value screen global exchange comparison. We tested the same four-factor screen across 14 exchanges worldwide: - P/S Value Screen on US Stocks - P/S Value Screen on Indian Stocks - P/S Value Screen on Canadian Stocks - P/S Value Screen on Swedish Stocks - P/S Value Screen on South African Stocks - P/S Value Screen on Japanese Stocks - P/S Value Screen: 13-Exchange Global 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 screen on Ceta Research. The query is pre-loaded. Hit "Run" and see what passes 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,
            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 > 300000000
          AND p.exchange IN ('XETRA')
        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": 30}
})
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"]:
    print(f"{r['symbol']:10s} 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: XETRA. Returns in EUR. Quarterly rebalance, equal weight, 2000-2025.