Calmar Ratio: Formula, Max Drawdown, and Python Implementation

The Calmar Ratio, introduced by Terry Young in 1991 in the newsletter California Managed Accounts Reports (hence "Cal-Mar"), measures risk-adjusted return by dividing annualized geometric return by maximum drawdown. Where the Sharpe Ratio and Sortino Ratio penalize volatility, the Calmar uses the worst actual loss sequence in the strategy's history — the number traders and allocators feel directly in their accounts. CTA fund managers and trend-following allocators prefer Calmar because it answers a concrete question: how many years of annual return does it take to recover from the worst observed drawdown?

A Calmar of 1.0 means recovery takes one year of CAGR. A Calmar of 2.0 means recovery takes six months. A Calmar of 0.5 means two full years. The ratio translates directly into recovery-time language.

The Calmar Ratio Formula

The formula has two components: the annualized geometric return (CAGR) and the maximum drawdown expressed as a positive decimal:

Calmar Ratio = Annualized Geometric Return (CAGR) / Maximum Drawdown Example: CAGR 18% / MaxDD 12% = Calmar 1.50  ·  MaxDD as a decimal (0.12 for 12%)

A Calmar above 1.0 means the annual return exceeds the worst drawdown — the strategy claws back its worst loss within a year of CAGR. Below 1.0, recovery from the worst drawdown takes more than a full year of average gains.

Maximum Drawdown

Maximum drawdown (MaxDD) is the largest peak-to-trough decline in the equity curve, expressed as a decimal (e.g., 0.35 for a 35% decline). It is computed by scanning forward through the compounded equity curve, tracking the running peak, and recording the deepest trough relative to that peak:

MaxDD = max { (peak − trough) / peak } over all peak-then-trough pairs Computed on the compounded equity curve (starting at 1.0)  ·  Always ≥ 0, capped at 1.0 (100%)

The key implementation detail: drawdown is computed on the compounded equity curve starting at 1, not on the raw return series. This ensures the percentage decline is measured correctly from the actual capital peak. A return series of [+50%, −40%, +20%] has a max drawdown of 40% only from the intermediate peak — the equity curve [1.0, 1.5, 0.9, 1.08] correctly captures the 0.9/1.5 − 1 = −40% trough.

Annualized Return (CAGR)

The Calmar uses geometric annualized return — the compound annual growth rate (CAGR) — not the arithmetic mean. For n period returns with N periods per year:

CAGR = (Final Equity)N/n − 1 Final Equity = product of all (1 + ri) terms starting from 1  ·  N: 252 daily, 52 weekly, 12 monthly

The geometric formula correctly captures compounding losses. A strategy with +50% in year 1 and −50% in year 2 has an arithmetic mean of 0% per year but a CAGR of −13.4% — because 1.5 × 0.5 = 0.75, representing a 25% total loss over two years. Pairing CAGR with max drawdown ensures both components reflect real dollar outcomes, not statistical abstractions.

Interpretation Benchmarks

Calmar benchmarks are lower than their Sharpe equivalents because max drawdown is typically a much larger number than period standard deviation. A strategy with 20% max drawdown and 18% CAGR has Calmar 0.9 — solid risk-adjusted performance — but would show Sharpe roughly in the 1.0–1.5 range:

Annualized Calmar Verdict Notes
< 0 Losing CAGR is negative. Stop trading the setup.
0 – 0.5 Weak Equity-index passive range (~0.3–0.5). Recovery takes 2+ years of CAGR.
0.5 – 1.0 Marginal Covers costs with limited margin. Recovery takes 1–2 years of CAGR.
1.0 – 3.0 Good Target range for systematic strategies. Annual return exceeds worst drawdown.
> 3.0 Exceptional — scrutinize Often indicates look-ahead bias, short sample, or near-zero observed drawdown.

Recovery interpretation: Calmar directly encodes recovery time. Calmar 1.0 → one year of CAGR recovers the worst drawdown. Calmar 0.5 → two years. Calmar 2.0 → six months. For allocators who ask "how long until I'm whole?", Calmar is the most immediately intuitive of the three standard ratios.

Python Implementation

import math

def max_drawdown(equity_curve: list[float]) -> float:
    """Peak-to-trough percentage decline as a decimal (0.0 to 1.0)."""
    peak = float("-inf")
    max_dd = 0.0
    for val in equity_curve:
        if val > peak:
            peak = val
        if peak <= 0:
            continue
        dd = min((peak - val) / peak, 1.0)
        if dd > max_dd:
            max_dd = dd
    return max_dd


ANNUALIZATION = {
    "daily":   math.sqrt(252),
    "weekly":  math.sqrt(52),
    "monthly": math.sqrt(12),
    "annual":  1.0,
}

def calmar_ratio(returns: list[float], periodicity: str = "daily") -> float:
    """
    Annualized geometric return (CAGR) divided by maximum drawdown.

    Args:
        returns:      list of period returns as decimals (e.g., 0.01 for 1%)
        periodicity:  "daily" | "weekly" | "monthly" | "annual"

    Returns Calmar Ratio. Returns infinity when max drawdown is zero and
    return is positive; 0 when max drawdown is zero and return is non-positive.
    """
    n = len(returns)
    if n < 2:
        return 0.0

    factor = ANNUALIZATION.get(periodicity, ANNUALIZATION["daily"])
    periods_per_year = factor ** 2  # sqrt(252)**2 = 252, sqrt(52)**2 = 52, etc.

    # Equity curve starting at 1.0 (compounded from each period return)
    equity = [1.0]
    for r in returns:
        equity.append(equity[-1] * (1 + r))

    if any(v <= 0 for v in equity):
        return 0.0

    total_return = equity[-1] - 1
    dd = max_drawdown(equity)

    if dd == 0:
        return float("inf") if total_return > 0 else 0.0

    # CAGR: (1 + total_return)^(periods_per_year / n) - 1
    annualized_return = (1 + total_return) ** (periods_per_year / n) - 1
    return annualized_return / dd

Example: Evaluating Three Strategies Side by Side

# Compare Sharpe, Sortino, Calmar on a trend-following strategy
# annualized_sharpe / annualized_sortino: see the Sharpe & Sortino guides
daily_returns = [...]  # your return array as decimals

sharpe_val  = annualized_sharpe(daily_returns, periodicity="daily")
sortino_val = annualized_sortino(daily_returns, periodicity="daily")
calmar_val  = calmar_ratio(daily_returns, periodicity="daily")

print(f"Sharpe:  {sharpe_val:.3f}  (excess return / total vol)")
print(f"Sortino: {sortino_val:.3f}  (excess return / downside vol)")
print(f"Calmar:  {calmar_val:.3f}  (CAGR / max drawdown)")
print(f"Sortino/Sharpe: {sortino_val/sharpe_val:.2f}x  (expect ~1.41 for normal)")
# CTA trend-followers typically: Sharpe 0.5–1.0, Sortino 1.0–2.0, Calmar 0.5–1.5

When Calmar Diverges from Sharpe and Sortino

The three ratios tell different stories and diverge most on strategies with a single catastrophic historical drawdown, or on strategies with asymmetric return distributions:

Option-selling paradox: Covered-call and cash-secured-put strategies can show excellent Sharpe and Calmar during calm markets — premium harvesting produces steady gains with small observed drawdowns. Both ratios collapse when short gamma positions blow up in volatility events. Report max drawdown during high-volatility regimes (e.g., VIX above 30) alongside the full-history Calmar for a more complete picture.

Calmar vs. Other Risk Metrics

Metric What it penalizes When to prefer it
Sharpe Ratio Total volatility (up and down) Default choice; symmetric payoff strategies; comparing strategies with similar skew
Sortino Ratio Downside volatility only Trend-following, long volatility; strategies with known positive skew
Calmar Ratio Max drawdown (not volatility) CTA-style funds; drawdown-sensitive allocators; strategies where recovery time matters
Information Ratio Tracking error vs. benchmark Long-only equity strategies benchmarked against an index

Best practice is to report Sharpe, Sortino, Calmar, and max drawdown together. Sharpe captures average vol efficiency; Sortino reveals skew direction; Calmar anchors recovery time; max drawdown is the absolute pain threshold. AlgoDrill's calculator computes all three simultaneously from your return series.

Failure Modes: When Calmar Misleads

Calmar and Position Sizing

Like Sharpe and Sortino, Calmar does not directly determine position size — that is the Kelly Criterion's domain. But Calmar provides a critical sanity check: a strategy with Calmar below 0.5 has historical drawdowns that exceed annual gains, making Kelly sizing potentially reckless — even optimal Kelly sizing cannot overcome a denominator that erases more than a year of CAGR. The practical sequence: compute Calmar to evaluate whether the drawdown profile is survivable; use Sharpe to evaluate per-unit-of-volatility efficiency; apply Kelly to determine the optimal fraction.

A high Calmar with low Sharpe is typically a mean-reversion profile — steady but not efficient per unit of daily noise. A high Sharpe with low Calmar is a potential tail-risk situation — the strategy looks great on daily data but experienced (or is at risk of) a severe sustained drawdown. Both profiles should drive different Kelly fractions and different stop-loss rules.


Frequently Asked Questions

What is a good Calmar Ratio for algorithmic trading?
A Calmar Ratio above 1.0 is generally considered the baseline for a viable systematic strategy — it means your annualized return exceeds your worst historical drawdown. Above 3.0 is exceptional for a live strategy and warrants scrutiny for look-ahead bias, a short sample that omitted bear-market regimes, or overfitting. Passively managed equity indexes show long-run Calmar in the 0.3–0.5 range. CTA funds with verified multi-decade track records typically show Calmar in the 0.5–1.5 range. Values below 0.5 suggest either thin edge or excessive drawdown relative to return.
How is the Calmar Ratio different from the Sharpe Ratio?
The Sharpe Ratio divides excess return by standard deviation — it captures average volatility across all periods. The Calmar Ratio divides annualized return by maximum drawdown — it captures the worst single loss sequence in the strategy's entire history. Calmar is more intuitive for drawdown-sensitive allocators: it directly answers how many years of annualized return it would take to recover from the worst drawdown. A Calmar of 2.0 means the worst drawdown equals six months of CAGR; a Calmar of 0.5 means the worst drawdown equals two full years of CAGR.
What time window should I use for the Calmar Ratio?
The standard hedge-fund reporting convention is a 36-month (3-year) rolling window, which avoids penalizing a fund for a deep drawdown that occurred more than three years ago and has since been recovered. For systematic strategy evaluation, using the full backtest history is more conservative and appropriate — it captures every drawdown the strategy ever encountered, not just recent ones. Rolling Calmar (computed monthly on a trailing 36-month window) is useful for tracking how the ratio evolves across market regimes.
Why does the Calmar Ratio use geometric (CAGR) return instead of arithmetic return?
Geometric annualized return (CAGR) represents what a buy-and-hold investor actually earns over time. Arithmetic return overstates performance for volatile strategies: a strategy that returns +50% one year and -50% the next has an arithmetic mean of 0% but a geometric return of -13.4% (because 1.5 x 0.5 = 0.75). Since max drawdown captures actual peak-to-trough capital loss, pairing it with geometrically compounded return ensures both components reflect real dollar outcomes — you cannot use CAGR earnings to offset drawdown in arithmetic terms.
Can the Calmar Ratio be negative?
Yes. A negative Calmar means the strategy's annualized return (CAGR) is negative — it is losing money. Because max drawdown is always 0 or greater, a negative Calmar unambiguously indicates a losing strategy. Unlike the Sharpe Ratio (where negative-Sharpe comparisons become unreliable), two negative Calmar strategies can be compared meaningfully: -0.1 is better than -0.5 because the first loses less per unit of its historical worst drawdown.
What does a very high Calmar Ratio mean in backtesting?
A Calmar above 5.0 in a backtest almost always indicates a methodology artifact. The most common cause is a short sample period that omitted bear-market regimes — the strategy never experienced its worst possible drawdown, so max drawdown is artificially near zero. Other causes: look-ahead bias inflating the CAGR; survivorship bias; or extreme overfitting. Check that the backtest spans at least one full market cycle (bull and bear). A Calmar computed on 2020–2021 data alone will almost always be misleadingly high because the COVID crash recovery dominated returns while the drawdown reset.

Run the Calmar Ratio calculator on your own return series — paste comma-separated returns and get annualized Sharpe, Sortino, and Calmar instantly.

Open Calmar Calculator →   Drill Risk Metrics Flashcards →