Add compounded flag to qs.stats.calmar() for intraday / non-compounded return streams

Author: sohum-25Created Feb 17, 2026Updated Feb 17, 2026

Problem

qs.stats.calmar() currently computes Calmar as:

python
calmar = CAGR(compounded=True) / max_drawdown

This assumes the input series represents daily compounded returns. However, many users — especially intraday traders and systematic/prop-style workflows — use quantstats on:

intraday return series

per-trade PnL streams

arithmetic (non-compounded) returns

capital-constrained strategies

In these cases, geometric CAGR is not the correct numerator, and the resulting Calmar can become misleadingly high.

For non-compounded strategies, a more appropriate definition is:

python
qs.stats.cagr(series, compounded=False) / qs.stats.max_drawdown(series)

Without an option to switch the compounded behavior inside qs.stats.calmar(), users working with intraday or non-compounded return streams must manually compute this value, and may otherwise misinterpret performance.