Graham Number Backtest Germany: 25 Years on XETRA

Cumulative growth of Graham Number Germany strategy vs DAX, 2000–2024 (returns in EUR)

Germany's Graham Number screen beats the DAX by 2.69% annually over 25 years. 7.14% vs 4.45%. Against SPY, the strategy looked like a statistical tie. Against the local benchmark, the picture is different: genuine outperformance.

Contents

  1. Method
  2. The Formula
  3. What We Found
  4. Year by Year
  5. 2000-2009: Early Leadership, Then Crisis
  6. 2010-2019: Mixed, With Volatility Spikes
  7. 2020-2024: The Recent Record
  8. Why Germany Beats Its Benchmark
  9. The Full Annual Record
  10. Limitations
  11. Run It Yourself
  12. Part of a Series

Beta 1.028 vs the DAX. Up capture 121.2%. Down capture 87.9%. This portfolio amplifies the DAX's moves, but with a positive skew. It captures more of the upside than the downside, producing +2.62% alpha after risk adjustment.

A 10,000 EUR investment in January 2000 grew to roughly 55,700 EUR by end of 2024 vs about 29,400 EUR for the DAX. The strategy delivered nearly twice the local benchmark's total return.


Method

Data source: Ceta Research (FMP financial data warehouse) Universe: XETRA (Frankfurt), market cap > 500M EUR Period: 2000-2024 (25 annual rebalance periods) Rebalancing: Annual (January), equal weight top 30 by discount to Graham Number Ranking: Deepest discount first (lowest price / Graham Number ratio) Benchmark: DAX Cash rule: Hold cash if fewer than 10 stocks qualify Transaction costs: Size-tiered model

Full methodology: backtests/METHODOLOGY.md


The Formula

Graham Number = sqrt(22.5 x EPS x Book Value Per Share)

The constant 22.5 comes from Graham's rule that a stock shouldn't exceed 15x earnings or 1.5x book value. Multiply those limits: 15 x 1.5 = 22.5. The screen buys only stocks trading below this theoretical intrinsic value ceiling, ranked by depth of discount.

Parameter Value Purpose
Formula sqrt(22.5 x EPS x BVPS) Graham's combined earnings + book ceiling
Max portfolio size 30 stocks Concentrated enough to matter
Ranking Price / Graham Number ascending Deepest discounts first
Market cap floor > 500M EUR Investable universe only
Cash threshold < 10 qualifying stocks Avoids forced exposure

No momentum filters. No quality overlays. No sector caps. Graham's arithmetic, applied literally.


What We Found

Metric Graham Number DAX
CAGR 7.14% 4.45%
Excess CAGR +2.69%
Total Return 474.2%
Max Drawdown -41.84%
Volatility (ann.) 23.24%
Sharpe Ratio 0.219
Sortino Ratio 0.386
Calmar Ratio 0.173
Beta 1.028 1.00
Alpha +2.62%
Up Capture 121.2%
Down Capture 87.9%
Win Rate (vs DAX) 52%
Cash Periods 0/25
Avg Stocks Held 24.1

The up and down captures tell the real story. Up capture of 121.2% means the strategy rises faster than the DAX in good years. Down capture of 87.9% means it falls less than the DAX in bad years. That asymmetry, even with a win rate of only 52%, compounds into meaningful outperformance over 25 years.

Alpha of +2.62% is positive after adjusting for market risk. The strategy doesn't just track the DAX with leverage; it adds genuine value through stock selection.


Year by Year

2000-2009: Early Leadership, Then Crisis

The first decade started well. Germany's market entered the 2000s trading at lower valuations than US tech-dominated indices, and the Graham Number screen found real bargains in German industrials, financials, and cyclicals.

Year Portfolio DAX Excess
2000 +2.8% -6.8% +9.7%
2001 -3.9% -17.8% +14.0%
2002 -29.9% -39.9% +10.0%
2003 +38.7% +29.4% +9.2%
2004 +17.6% +6.8% +10.8%
2005 +23.5% +27.0% -3.5%
2006 +13.8% +22.6% -8.8%
2007 +10.7% +19.0% -8.3%
2008 -41.8% -37.4% -4.4%
2009 +47.7% +21.6% +26.1%

2000 through 2002 showed genuine outperformance. German value stocks had limited exposure to the tech collapse, and the Graham Number screen found companies with real assets and real earnings trading at discounts. The DAX fell nearly 40% in 2002; the portfolio fell 30%. Still painful, but 10 points better.

2003 through 2004 were the payoff years: consecutive outperformance as German industrials and cyclicals re-rated. Two strong years of 9-11 percentage point excess return.

2005 through 2007 were a lagging stretch. The DAX rallied hard on export strength and financial sector expansion. The Graham Number screen's cheaper, more industrial picks didn't keep pace with the index's momentum.

2008 was the worst year in the dataset. At -41.8%, the drawdown was 4.4 points worse than the DAX. German financial and industrial stocks, which dominate XETRA Graham Number screens, took concentrated hits in the credit crisis.

2009 was the best excess year: +26.1%. The same beaten-down cyclicals bounced hard.

2010-2019: Mixed, With Volatility Spikes

Year Portfolio DAX Excess
2010 +31.1% +15.6% +15.6%
2011 -27.0% -13.1% -13.9%
2012 +23.6% +28.0% -4.5%
2013 +33.3% +20.8% +12.5%
2014 -2.9% +3.9% -6.7%
2015 -5.6% +5.3% -10.9%
2016 +32.5% +12.8% +19.7%
2017 +16.7% +11.0% +5.7%
2018 -6.2% -17.8% +11.6%
2019 +36.6% +26.5% +10.0%

2011 was the worst year relative to the DAX in the dataset: -13.9% excess. The Eurozone sovereign debt crisis hit European equities broadly, and the German screen's concentration in financials and cyclicals amplified the damage.

2013 and 2016 were strong. German value stocks benefited from global economic expansion and a recovery in cyclical sectors. 2016's +19.7% excess was the strategy's best year of the decade.

2018 is notable. The portfolio fell only -6.2% while the DAX fell -17.8%. An +11.6% protective gap. The down capture worked here: rate fears and trade war concerns hit the DAX harder than the cheap, asset-heavy names in the Graham screen.

2019 continued strong: +36.6% vs +26.5%, a +10.0% excess.

2020-2024: The Recent Record

Year Portfolio DAX Excess
2020 +2.0% +2.5% -0.5%
2021 +33.9% +16.7% +17.2%
2022 -21.5% -12.2% -9.4%
2023 +17.2% +19.2% -2.0%
2024 +3.2% +19.4% -16.2%

2021 was a strong year: +17.2% excess as German value stocks re-rated in the post-COVID recovery.

2022 was a difficult year. Rate hikes punished the broader market. The German screen amplified the decline, falling -21.5% vs the DAX's -12.2%.

2024's -16.2% excess gap is the widest negative in the recent period. The DAX rallied strongly while the screen's cheaper, more industrial picks lagged.


Why Germany Beats Its Benchmark

The Graham Number screen on XETRA produces a portfolio that amplifies the DAX's cyclical character, but with a value tilt that adds alpha. The screen selects European industrials, automotive companies, chemicals, and financials trading below Graham's value ceiling. These sectors are cyclical and global-trade-sensitive.

The result is a portfolio that participates in Germany's economic upcycles more aggressively than the DAX (121.2% up capture) while absorbing slightly less of the downside (87.9% down capture). The asymmetry is modest compared to some other exchanges in this series, but it's enough to compound into +2.69% annual excess over 25 years.

The beta of 1.028 is close to 1.0, meaning the portfolio tracks the DAX's overall volatility closely. The alpha of +2.62% is where the value comes from: stock selection within Germany's industrial and financial sectors, buying the cheapest names by Graham's criteria.

For a German investor, this is a more compelling story than the comparison vs SPY suggested. A simple value screen on local stocks that beats the local index by 2.69% annually, with genuine stock-selection alpha, is a useful tool.


The Full Annual Record

Year Portfolio DAX Excess
2000 +2.8% -6.8% +9.7%
2001 -3.9% -17.8% +14.0%
2002 -29.9% -39.9% +10.0%
2003 +38.7% +29.4% +9.2%
2004 +17.6% +6.8% +10.8%
2005 +23.5% +27.0% -3.5%
2006 +13.8% +22.6% -8.8%
2007 +10.7% +19.0% -8.3%
2008 -41.8% -37.4% -4.4%
2009 +47.7% +21.6% +26.1%
2010 +31.1% +15.6% +15.6%
2011 -27.0% -13.1% -13.9%
2012 +23.6% +28.0% -4.5%
2013 +33.3% +20.8% +12.5%
2014 -2.9% +3.9% -6.7%
2015 -5.6% +5.3% -10.9%
2016 +32.5% +12.8% +19.7%
2017 +16.7% +11.0% +5.7%
2018 -6.2% -17.8% +11.6%
2019 +36.6% +26.5% +10.0%
2020 +2.0% +2.5% -0.5%
2021 +33.9% +16.7% +17.2%
2022 -21.5% -12.2% -9.4%
2023 +17.2% +19.2% -2.0%
2024 +3.2% +19.4% -16.2%

Win rate vs DAX: 52% (13 of 25 years). Just over half the years were wins. The positive excess years tend to be wider than the negative ones, which is how 52% win rate still produces +2.69% annual excess.


Limitations

2008 drawdown severity. At -41.8%, Germany's max drawdown was 4.4 points deeper than the DAX's. Financial and cyclical concentration in XETRA is worse in a credit crisis.

2011 European crisis risk. The -13.9% excess gap in 2011 reflects a risk specific to European equities: Eurozone sovereign debt stress. Investors in European value need to account for this political/structural risk.

2024 lag. The -16.2% excess gap in 2024 reflects the DAX's strong rally driven by a handful of large-cap names. The Graham Number screen, which selects cheaper mid-cap names, missed this move entirely.

Cyclical concentration. The strategy's returns are heavily tied to German industrial and financial cycles. In years when those sectors underperform (2005-2007, 2014-2015), the screen lags. It's not a hedge against sector rotation.

Annual rebalancing lag. With January rebalancing and a 45-day filing lag, the portfolio can hold a deteriorating position for up to 13 months before rotating out.


Run It Yourself

-- Current Graham Number screen (XETRA)
SELECT
    p.symbol,
    p.companyName,
    p.sector,
    p.exchange,
    ROUND(k.marketCap / 1e9, 2) AS mktcap_b,
    ROUND(k.epsTTM, 2) AS eps_ttm,
    ROUND(k.bookValuePerShareTTM, 2) AS bvps_ttm,
    ROUND(SQRT(22.5 * k.epsTTM * k.bookValuePerShareTTM), 2) AS graham_number,
    ROUND(p.price, 2) AS current_price,
    ROUND(p.price / SQRT(22.5 * k.epsTTM * k.bookValuePerShareTTM), 3) AS price_to_gn
FROM profile p
JOIN key_metrics_ttm k ON p.symbol = k.symbol
WHERE p.exchange IN ('XETRA')
  AND k.marketCap > 500000000
  AND k.epsTTM > 0
  AND k.bookValuePerShareTTM > 0
  AND p.price < SQRT(22.5 * k.epsTTM * k.bookValuePerShareTTM)
ORDER BY price_to_gn ASC
LIMIT 30

Run Germany Graham Number screen live →

git clone https://github.com/ceta-research/backtests.git
cd backtests

# Germany backtest
python3 graham-number/backtest.py --preset germany --output results.json --verbose

# Current screen
python3 graham-number/screen.py --preset germany

Part of a Series

This is the Germany analysis. We tested the Graham Number screen across markets globally:

Cumulative growth of Graham Number Germany strategy vs DAX, 2000-2024 (returns in EUR)
Cumulative growth of Graham Number Germany strategy vs DAX, 2000-2024 (returns in EUR)


Data: Ceta Research (FMP financial data warehouse), 2000-2024. Universe: XETRA. Returns in EUR. Benchmark: DAX. Full methodology: METHODOLOGY.md. Past performance does not guarantee future results.

Read more