Graham Number in Brazil: 18.37% Nominal CAGR, But Read the Fine Print

Cumulative growth of Graham Number Brazil strategy vs Bovespa, 2000–2024 (returns in BRL)

The Graham Number strategy returned 18.37% annually on Brazil's B3 exchange from 2000 to 2024. In BRL. That distinction matters.

Contents

  1. Method
  2. What We Found
  3. Year by Year
  4. The Early Years: Cash During the Data Gap
  5. The Commodity Decade: When Brazil Ran Hot
  6. The Crisis: Where the Strategy Proved Its Worth
  7. Political and Macro Turbulence: The 2010s
  8. The Modern Era
  9. Reading Brazil's Numbers Honestly
  10. The Selic Rate Context
  11. The Excess Over Bovespa Is Real
  12. The Sharpe Is Moderate, Not Exceptional
  13. Currency Risk for USD-Based Investors
  14. Run It Yourself
  15. Part of a Series

Brazil's central bank benchmark rate (the Selic) averaged 12–15% annually over this period. Consumer price inflation ran 6–8% per year. A nominal 18.37% CAGR in BRL translates to roughly 8–12% in real terms depending on which inflation measure you use. That's still genuine outperformance. It's not the story a headline number suggests.

This is an honest account of what the strategy actually did across 25 years of Brazilian market cycles.


Method

Parameter Detail
Exchange B3 (São Paulo, SAO exchange code)
Period 2000–2024 (25 annual rebalance periods)
Universe All B3 stocks with qualifying fundamentals
Signal P/E < 15 and P/B < 1.5 (equivalent to price below Graham Number)
Quality filters ROE > 10%, D/E < 1.0
Ranking Deepest discount to Graham Number first
Portfolio size Top 30 stocks, equal weight
Rebalancing Annual (January), 45-day filing lag
Cash rule Hold cash if fewer than 10 stocks qualify
Benchmark Bovespa
Transaction costs Size-tiered model (0.1%–0.5%)
Currency All returns in BRL (Brazilian Real)

Historical financial data with 45-day lag to prevent look-ahead bias. Full methodology: backtests/METHODOLOGY.md


What We Found

Metric Graham Brazil Bovespa
CAGR 18.37% 8.44%
Total Return 6,735.75%
Max Drawdown -34.61%
Volatility (ann.) 32.63%
Sharpe Ratio 0.236
Sortino Ratio 0.629
Calmar Ratio 0.531
Excess CAGR +9.93%
Avg Stocks 19.8
Cash Periods 2/25 (2000–2001)

The number that stands out isn't the CAGR. It's the excess over the Bovespa: +9.93% annually. In a market where the index itself returned 8.44%, nearly doubling the benchmark's return through a simple value screen is significant. The strategy built a 6,735% total return over 25 years.

The Sharpe ratio of 0.236 is moderate. Brazilian equity markets carry high nominal volatility (32.63%) partly because inflation is embedded in asset prices. The risk-adjusted returns are real but not exceptional by Sharpe standards. The strategy earns its keep through asymmetry, not smooth compounding.


Year by Year

The Early Years: Cash During the Data Gap

Year Graham Brazil (BRL) Bovespa Excess
2000 0.00% (cash)
2001 0.00% (cash)
2002 +9.49%

The strategy held cash in 2000 and 2001 because fewer than 10 stocks qualified. This is both a feature and a limitation: the screen kept capital out of a thin, early-data market, but those cash years contribute zero to the return stack.

The Commodity Decade: When Brazil Ran Hot

2003 through 2007 was Brazil's commodity supercycle. Iron ore, soybeans, oil. B3 ran hard. The Graham Number screen caught the industrial and commodity companies that looked cheapest on fundamentals as prices ripped. The +76.91% in 2003 (in BRL) was not just Graham Number alpha. It was value investing meeting a commodity boom.

The Crisis: Where the Strategy Proved Its Worth

Year Graham Brazil (BRL) Bovespa Excess
2008 -17.11%
2009 +75.4% +74.5% +0.9%

2008 is the clearest demonstration of the value floor. The Graham Brazil strategy fell only 17.11%. The portfolio held undervalued, asset-heavy stocks that were less exposed to the financial sector leverage that drove the global crisis. Then in 2009, the recovery was strong: +75.4%, roughly matching the Bovespa's +74.5%.

Political and Macro Turbulence: The 2010s

Year Graham Brazil (BRL) Bovespa Excess
2011 +13.70%
2013 -10.09%
2015 -26.11%
2016 +94.1% +45.7% +48.4%
2017 +41.40%
2018 +17.57%
2019 +67.6% +28.6% +39.0%

2013 and 2015 were brutal. Brazil's political instability (the Dilma Rousseff government, the Lava Jato corruption investigation) combined with a commodity price collapse and recession. The strategy fell -26.11% in 2015. In BRL. While the Bovespa was also down.

Then 2016 delivered +94.1% vs the Bovespa's +45.7%, a +48.4% excess. The Temer government stabilized the macro environment and commodity prices recovered. This extreme sequence tells you something important about Brazil: the macro regime swings are large, and the Graham Number screen amplifies them on the upside. 2019 showed the same pattern: +67.6% vs +28.6% for the Bovespa.

The Modern Era

Year Graham Brazil (BRL) Bovespa Excess
2020 +28.28%
2022 -6.94%
2023 +34.09%
2024 -17.09%

2024 was a difficult year. The strategy fell -17.09% in BRL. The BRL also depreciated against the USD significantly in 2024, which would compound losses for USD-based investors.


Reading Brazil's Numbers Honestly

The Selic Rate Context

The Selic rate, Brazil's central bank benchmark, averaged 12–15% over this period and has rarely fallen below 8%. When you earn 18.37% CAGR in a currency where the risk-free rate is 12%, the excess return is roughly 6%. That's real. It's not nothing. But it's not the same as 18.37% excess in a 2% rate environment.

This matters for anyone benchmarking against Brazilian alternatives. A Brazilian investor holding Tesouro Direto (government bonds) would have earned roughly 12–14% annually with zero equity risk. The Graham Number strategy added a premium over that, but the premium required tolerating 32.63% annual volatility and a -34.61% max drawdown.

Against the Bovespa itself, the excess is cleaner: +9.93% per year. The index returned 8.44% annually, and the Graham Number screen nearly doubled that. This is genuine stock-selection alpha in local-currency terms.

The Excess Over Bovespa Is Real

+9.93% excess CAGR over the local benchmark is genuine. The strategy nearly doubled the Bovespa's 8.44% annual return. The Graham Number selects stocks trading below a fundamental fair value threshold. In a market as volatile as Brazil, that discipline compounds.

The 2016 result confirms this: +94.1% vs +45.7% for the Bovespa. The 2019 result confirms it again: +67.6% vs +28.6%.

The Sharpe Is Moderate, Not Exceptional

A Sharpe of 0.236 means the strategy earned about 0.24 units of excess return per unit of volatility. That's below what most US strategies in this dataset achieve. The reason is simple: 32.63% annual volatility is high. Brazil's nominal volatility is structurally elevated because exchange rates, commodity cycles, and political risk all amplify price swings. The strategy produces strong returns partly by accepting that volatility.

If you're comparing Sharpe ratios across markets, note that a Sharpe of 0.236 in Brazil is not directly comparable to 0.382 in the US. The denominators are different in kind.

Currency Risk for USD-Based Investors

All returns here are in BRL. The Brazilian Real has depreciated substantially against the USD over the 25-year period. In 2000, the BRL/USD rate was roughly 1.8. By 2024, it was above 5.5. A strategy returning 6,735% in BRL delivered substantially less in USD terms.

USD-based investors allocating to Brazil absorb that currency risk on top of the equity risk. The strategy's strong local-currency excess may be partially or fully offset by BRL depreciation. 2024 is a concrete example: -17.09% in BRL, plus BRL depreciation, produced a painful USD return.


Run It Yourself

-- Graham Number screen for Brazil (B3 / SAO exchange)
-- Point-in-time: use FY data with 45-day filing lag
-- Rank by deepest discount to Graham Number (lowest P/E first)
SELECT
    r.symbol,
    ROUND(r.priceToEarningsRatio, 2) AS pe,
    ROUND(r.priceToBookRatio, 2) AS pb,
    ROUND(m.returnOnEquity * 100, 1) AS roe_pct,
    ROUND(r.debtToEquityRatio, 2) AS de,
    ROUND(m.marketCap / 1e9, 1) AS mktcap_bn
FROM financial_ratios r
JOIN key_metrics m ON r.symbol = m.symbol
JOIN profile p ON r.symbol = p.symbol
WHERE p.exchange IN ('SAO')          -- B3 / São Paulo
  AND r.period = 'FY'
  AND r.priceToEarningsRatio > 0
  AND r.priceToEarningsRatio < 15   -- Graham P/E threshold
  AND r.priceToBookRatio > 0
  AND r.priceToBookRatio < 1.5      -- Graham P/B threshold
  AND m.returnOnEquity > 0.10       -- ROE > 10%
  AND r.debtToEquityRatio < 1.0     -- D/E < 1.0
ORDER BY r.priceToEarningsRatio ASC
LIMIT 30;

Run Brazil Graham Number screen live →

To run the full backtest:

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

# Brazil backtest
python3 graham-number/backtest.py --preset brazil --output results.json --verbose

Part of a Series

This is the Brazil analysis. We tested the same Graham Number strategy across multiple global markets:


Data: Ceta Research (FMP financial data warehouse), 2000–2024. Exchange: B3 (SAO). All returns in BRL (Brazilian Real). Benchmark: Bovespa. Selic rate context: Brazil's central bank benchmark averaged 12–15% annually over this period. Nominal returns should be interpreted relative to local inflation (avg 6–8%) and local risk-free rates. Full methodology: METHODOLOGY.md. Past performance does not guarantee future results. This is educational content, not investment advice.

Read more