Graham Number Across 13 Global Markets: 10 of 13 Beat Their Local Benchmark

Graham Number CAGR comparison across 13 global stock exchanges, 2000–2024

We ran the Graham Number screen on 13 exchanges over 25 years. Same formula. Same rules. Each exchange measured against its own local stock index. The results are stronger than the old SPY-only comparison suggested.

Contents

  1. Method
  2. Full Results Table
  3. The Winners: 10 Markets That Beat Their Local Index
  4. Japan: Best Risk-Adjusted, +8.64% Above the Nikkei
  5. Sweden: +8.65% Above OMX Stockholm, 80% Win Rate
  6. Canada: Best Drawdown Protection, +5.64% Above TSX
  7. Switzerland: +5.04% Above SMI, Best Sharpe Among European Exchanges
  8. Brazil: +9.93% Above Bovespa, With Inflation Context
  9. The Middle: Modest Alpha
  10. The Underperformers: 3 Markets That Trail Their Own Index
  11. US: The One Market Where Graham Lags
  12. India: The Strategy Can't Keep Up With a Fast Market
  13. Hong Kong: China Risk Overwhelms the Signal
  14. The Pattern: Local Benchmarks Reveal Broader Alpha
  15. Excluded Exchanges
  16. Run It Yourself
  17. Part of a Series

10 of 13 exchanges beat their local benchmark. Sweden and Japan lead with +8.6% annual excess. Brazil, Canada, and Switzerland all show +5% or more. Only India, Hong Kong, and the US underperformed their home market.

That's the summary. The data underneath it explains why.


Method

Data source: Ceta Research (FMP financial data warehouse) Strategy: Top 30 stocks per exchange trading below their Graham Number, ranked by deepest discount. Equal weight. Annual rebalancing, January. 45-day filing lag on annual financials. Graham Number: sqrt(22.5 × EPS × BVPS). Requires EPS > 0, BVPS > 0. Benchmark: Local stock index per exchange (Nikkei 225 for Japan, Sensex for India, DAX for Germany, etc.). SPY for US. Period: 2000–2024 (25 annual rebalance periods) Transaction costs: Size-tiered model, exchange-specific market cap thresholds

Full methodology: backtests/METHODOLOGY.md


Full Results Table

Each exchange is benchmarked against its local stock index to measure genuine alpha in the same currency.

Exchange CAGR Local Benchmark Excess vs Local Sharpe MaxDD Cash
Brazil (B3) 18.37% Bovespa 8.44% +9.93% 0.236 -34.6% 2/25
Sweden (STO) 11.61% OMX Stockholm 2.95% +8.65% 0.381 -42.6% 2/25
Japan (JPX) 11.59% Nikkei 225 2.95% +8.64% 0.484 -38.9% 0/25
Canada (TSX) 10.07% TSX Composite 4.44% +5.64% 0.318 -29.4% 0/25
Switzerland (SIX) 6.94% SMI 1.90% +5.04% 0.350 -30.2% 2/25
Taiwan (TAI+TWO) 8.89% TAIEX 3.91% +4.98% 0.284 -40.9% 6/25
UK (LSE) 4.79% FTSE 100 0.86% +3.93% 0.044 -59.7% 5/25
Germany (XETRA) 7.14% DAX 4.45% +2.69% 0.219 -41.8% 0/25
Korea (KSC) 5.68% KOSPI 3.32% +2.36% 0.120 -45.5% 6/25
Australia (ASX) 4.55% ASX 200 4.00% +0.55% 0.060 -40.8% 0/25
US (NYSE+NASDAQ+AMEX) 6.34% S&P 500 7.64% -1.31% 0.204 -44.4% 0/25
HKSE -2.06% Hang Seng 0.49% -2.55% -0.152 -83.0% 1/25
India (BSE+NSE) 6.98% Sensex 11.40% -4.42% 0.012 -60.1% 5/25

The Winners: 10 Markets That Beat Their Local Index

Japan: Best Risk-Adjusted, +8.64% Above the Nikkei

11.59% CAGR vs Nikkei 225 at 2.95%. +8.64% annual excess. Sharpe 0.484.

Measured against its local benchmark, Japan's Graham Number screen generated 8.64% annual alpha over 25 years. The portfolio won in 19 of 25 years (76% win rate vs Nikkei). Down capture vs Nikkei is 12.1%, meaning when the Nikkei fell, this portfolio fell only about an eighth as much.

2022 was the sharpest demonstration: +24.2% when the Nikkei fell -12.2%. A +36.4% excess in a single year. Japan's near-zero interest rate environment insulated deep-value stocks from the rate shock that hurt growth names globally.

Why does Japan work? The Tokyo Stock Exchange has historically had a large pool of profitable, asset-heavy companies trading below book value due to cross-shareholding structures, conservative dividend policies, and deflationary culture. The Graham Number requires exactly those characteristics: positive EPS, positive BVPS, and a price below the intrinsic ceiling. Japan has a deep supply of qualifying stocks. Since 2021, the TSE has actively pushed companies below 1x book to improve capital allocation, providing a structural revaluation catalyst.

Sweden: +8.65% Above OMX Stockholm, 80% Win Rate

11.61% CAGR vs OMX Stockholm 30 at 2.95%. +8.65% annual excess. Won in 20 of 25 years, the highest win rate in the study.

Swedish industrials and materials companies sit in manufacturing-heavy sectors with tangible book values and regular earnings. The Graham Number finds a natural fit there. The OMX Stockholm 30 returned just 2.95% annually over this period, and the strategy beat it in 80% of years. Down capture vs OMX is 43.8%.

The recent weakness (2023: -19.6% excess, 2024: -3.3% excess) reflects the global momentum shift toward growth and AI names, not a failure of the local strategy.

Canada: Best Drawdown Protection, +5.64% Above TSX

10.07% CAGR vs TSX Composite at 4.44%. +5.64% annual excess. MaxDD -29.38%.

Canada's drawdown profile stands alone. The maximum drawdown of -29.38% is the lowest of any exchange in the study. Down capture vs the TSX Composite is 55.1%, meaning the portfolio absorbed about half of the TSX's declines.

Canadian markets are dominated by financials, energy, and materials. These sectors carry substantial book value and regular earnings. Graham Number screens load up on exactly these sectors. When commodity or credit cycles turn, the cheapest names by Graham's formula tend to be the ones with the most room to recover.

Switzerland: +5.04% Above SMI, Best Sharpe Among European Exchanges

6.94% CAGR vs SMI at 1.90%. +5.04% annual excess. Sharpe 0.350. MaxDD -30.2%.

Switzerland looked like a modest underperformer when benchmarked against SPY (-0.75% excess). Against its own market, the story flips completely. The SMI returned just 1.9% annually over 25 years. The Graham Number screen delivered +5.04% above that with lower drawdown and a Sharpe higher than the local index.

Brazil: +9.93% Above Bovespa, With Inflation Context

18.37% CAGR vs Bovespa at 8.44%. +9.93% annual excess. But returns are in BRL.

Brazil's nominal headline is the highest in the study. It needs context. All returns are denominated in Brazilian reals. Brazil's average annual inflation has run 6-8% over this period. The Selic rate averaged 12-15%. Against the Bovespa (which already includes inflation dynamics), the strategy still delivered nearly 10% annual excess. The signal is real, even after accounting for the local market environment.


The Middle: Modest Alpha

Germany (+2.69% vs DAX), Korea (+2.36% vs KOSPI), and Australia (+0.55% vs ASX 200) all beat their local benchmarks, but the margins are slim. Germany's high beta (1.028 vs DAX) means the excess comes with amplified risk. Australia's 0.55% excess is barely distinguishable from noise over 25 years.

The UK (+3.93% vs FTSE) is a surprising result. Against SPY, the UK was the worst performer in the old study at -2.85%. Against the FTSE 100 (which returned just 0.86% annually), the strategy actually delivered meaningful alpha, though with a painful -59.7% max drawdown.

The Underperformers: 3 Markets That Trail Their Own Index

US: The One Market Where Graham Lags

6.34% CAGR vs SPY at 7.64%. -1.31% annual shortfall. Sharpe 0.204.

The US is the only developed market in the study where the Graham Number screen underperforms its own benchmark. The strategy worked from 2000-2012, winning in 9 of 13 years. Then the US equity market entered a technology-driven regime that the Graham Number structurally can't participate in.

Amazon, Apple, Microsoft, Google, Meta trade at multiples of book value. The Graham Number screen doesn't hold them. As technology's share of the S&P 500 grew from roughly 16% to over 30%, any book-value-based screen faced an increasing benchmark headwind.

The down capture of 72.1% is real protection. 2000-2002 and 2022 proved it. But the up capture of 86.9% means that in technology-led bull markets, the gap compounds against you.

India: The Strategy Can't Keep Up With a Fast Market

6.98% CAGR vs Sensex at 11.40%. -4.42% annual shortfall. Sharpe 0.012.

India is the clearest underperformer in the study when measured against local benchmarks. The Sensex returned 11.4% annually, driven by technology, pharmaceuticals, and consumer companies that rarely appear in Graham Number screens. The 5/25 cash periods (no qualifying stocks in the early years) further dragged cumulative returns.

India's near-zero Sharpe (0.012) reflects the math: 6.98% return minus a 6.5% risk-free rate leaves almost nothing per unit of risk. The -60.1% max drawdown adds insult.

Hong Kong: China Risk Overwhelms the Signal

-2.06% CAGR vs Hang Seng at 0.49%. -2.55% annual shortfall.

Hong Kong's results over 2020-2023 were dominated by China's real estate crisis and the broad repricing of China-linked equities. MaxDD hit -83%. The strategy found genuinely cheap stocks, but "cheap" kept getting cheaper as regulatory and macro risks crystallized.


The Pattern: Local Benchmarks Reveal Broader Alpha

The old SPY-only comparison painted a misleading picture. Many exchanges appeared to underperform simply because SPY was a strong benchmark over this period. When each exchange is measured against its own local index, 10 of 13 show positive excess returns.

Graham's formula rewards two things: earnings and tangible assets. Markets where listed companies carry substantial book values and stable earnings generate large pools of qualifying stocks at genuine discounts. Japan, Canada, Sweden, and Switzerland are manufacturing, resource, and financial economies. The Graham Number finds real opportunities there, and the local indices (Nikkei, TSX, OMX, SMI) had modest returns that made the strategy's alpha stand out.

The three failures share a common thread. The US market is dominated by intangible-value companies that the formula structurally excludes. India's high-growth market (Sensex at 11.4% CAGR) sets a hurdle the conservative Graham screen can't clear. Hong Kong's China exposure created macro risk that overwhelmed any value signal.

The revaluation catalyst matters. Japan's corporate governance reform since 2021 created systematic pressure on below-book companies to improve. That's exactly the type of catalyst that converts a "cheap" stock into a "re-rated" stock. Korea's discount and India's risk premium lack equivalent catalysts, which is why the screen works in Japan but struggles in those markets.


Excluded Exchanges

Three exchanges were tested but excluded from the main comparison table.

France (PAR). FMP's fundamental data for French-listed stocks has insufficient FY-period coverage. The screen couldn't find enough qualifying names to run meaningful backtests across the full 25-year period. This is a data pipeline limitation, not a conclusion about France as a market.

South Africa (JNB). FMP stores EPS and BVPS for South African stocks in a unit that doesn't match price convention. The resulting Graham Numbers are roughly 100x smaller than actual stock prices. A data normalization issue, not a strategy result.

Singapore (SGX). The exchange code mapping returned zero symbols in the current data. Too sparse to draw conclusions.


Run It Yourself

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

# Single exchange
python3 graham-number/backtest.py --preset japan --output results.json --verbose

# Global comparison
python3 graham-number/backtest.py --global --output results/exchange_comparison.json

# Live screen (any exchange)
python3 graham-number/screen.py --preset canada
-- Graham Number screen, parameterized by exchange
WITH graham AS (
    SELECT
        k.symbol,
        k.epsttm AS eps,
        k.bookValuePerShareTTM AS bvps,
        SQRT(22.5 * k.epsttm * k.bookValuePerShareTTM) AS graham_number,
        p.price AS current_price,
        p.mktCap,
        p.companyName,
        p.exchange,
        p.sector
    FROM key_metrics_ttm k
    JOIN profile p ON k.symbol = p.symbol
    WHERE k.epsttm > 0
      AND k.bookValuePerShareTTM > 0
      AND p.exchange IN ('JPX')  -- swap for TSX, STO, NYSE, NASDAQ, AMEX, etc.
)
SELECT
    symbol,
    companyName,
    exchange,
    sector,
    ROUND(eps, 2) AS eps,
    ROUND(bvps, 2) AS bvps,
    ROUND(graham_number, 2) AS graham_number,
    ROUND(current_price, 2) AS price,
    ROUND((1 - current_price / graham_number) * 100, 1) AS discount_pct
FROM graham
WHERE current_price < graham_number
ORDER BY discount_pct DESC
LIMIT 30

Run global Graham Number screen live →


Part of a Series


Data: Ceta Research (FMP financial data warehouse), 2000-2024. All returns in local currency. Each exchange benchmarked against its local stock index. Local risk-free rates applied per exchange. Full methodology: METHODOLOGY.md. Past performance does not guarantee future results.