Skip to content

Add Adjusted Sharpe Ratio and Adjusted CAGR to portfolio statistics #9813

Description

@AlexCatarino

Expected Behavior

PortfolioStatistics exposes two additional risk-adjusted return statistics in the backtest/live report:

  • Adjusted Sharpe Ratio (ASR) — the Sharpe Ratio penalised for non-normality of the return distribution, per Pezier & White (2006):

    ASR = SR * (1 + (S / 6) * SR - ((K - 3) / 24) * SR^2)

    where S is the skewness and K the kurtosis of the return series. Negative skew and fat tails reduce the ratio, which is the point of the metric for mean-reversion and short-volatility strategies whose plain Sharpe flatters them.

  • Adjusted CAGR — a risk/quality-adjusted compounding annual return, alongside the existing raw CompoundingAnnualReturn. The exact definition is worth pinning down before implementation: candidates are CAGR scaled by a drawdown or volatility penalty, or CAGR restated on the skew/kurtosis-adjusted return distribution.

Actual Behavior

Neither exists. Common/Statistics/PortfolioStatistics.cs currently exposes SharpeRatio, ProbabilisticSharpeRatio, SortinoRatio, CompoundingAnnualReturn, InformationRatio, TreynorRatio, ValueAtRisk95/99, and friends — nothing skew/kurtosis-adjusted, and no adjusted variant of CAGR.

Potential Solution

The inputs for ASR are already computed in the codebase: Statistics.ProbabilisticSharpeRatio (Common/Statistics/Statistics.cs) calls listPerformance.Skewness() and listPerformance.Kurtosis() from MathNet, so ASR is a small addition on top of the existing ObservedSharpeRatio / annualised Sharpe plumbing rather than new machinery.

Points to settle:

  • Whether ASR is built from the annualised SharpeRatio or the non-annualised ObservedSharpeRatio.
  • Whether the kurtosis term is excess or raw. The existing PSR code uses (kurtosis - 1) against MathNet's Kurtosis(), which is worth confirming against the convention chosen for ASR so the two statistics agree on the same input.
  • A concrete definition for "Adjusted CAGR", since the term is not standardised.

Reproducing the Problem

N/A — feature request.

System Information

N/A

Related

Requested by a long-time user who has been maintaining their own implementation (Intercom conversation 215476003778646).

Checklist

  • I have completely filled out this template
  • I have confirmed that this issue exists on the current master branch
  • I have confirmed that this is not a duplicate issue by searching issues

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions