Definition
CAGR = (ending_capital / starting_capital)^(1 / years) - 1
Example: 100 -> 200 in 3 years ⇒ CAGR = 2^(1/3) - 1 ≈ 26% p.a.
CAGR is geometric, not arithmetic. That is the decisive difference: the arithmetic mean of yearly returns overstates actual growth, because losses weigh more heavily in percentage terms (variance drag / volatility drag).
Why the difference matters
+50% followed by −50% is 0% in the arithmetic mean, but in reality: 1.5 × 0.5 = 0.75 ⇒ −25%. CAGR captures exactly this reality. The more volatile a strategy, the larger the gap between the arithmetic mean and CAGR:
CAGR ≈ arithmetic mean - (variance / 2)
Interpretation
CAGR alone says nothing about the path: two strategies with identical CAGR may have had −10% or −70% intermediate drawdown. So ALWAYS read it together with a risk measure (Sharpe, Calmar, max DD). A high CAGR from a short bull window is almost meaningless — it says more about the period than about the strategy.
How Botty uses it
The scout scripts (ptj_regime_test.py, rayner_breakout_scout.py) report CAGR as a headline metric alongside Sharpe, max DD, and Calmar. Cross-asset gates compare a strategy's CAGR on BTC/ETH/SOL against buy & hold — a higher CAGR than B&H is necessary but, because of the path blind spot, never sufficient.
Limits
- Blind to drawdown and ordering. Only tells start vs. end.
- Start/end-point sensitive. A bull peak at the end inflates the value.
- Needs history. Under ~1 year the annualization is extrapolation, not a measurement.