Maximum drawdown & Calmar ratio
Query
WITH
'2024-01-01' AS start_date,
'2024-12-31' AS end_date,
365 AS sessions_per_year,
candles AS (
SELECT toDate(start) AS day, market, toFloat64(close) AS close
FROM api.ohlcv(candle_duration_in_minutes = 1440)
WHERE exchange = 'binance'
AND market IN ('BTC-USDT', 'ETH-USDT', 'SOL-USDT', 'ADA-USDT', 'DOGE-USDT')
AND start BETWEEN start_date AND end_date
),
market_returns AS (
SELECT day, market,
close / lagInFrame(toNullable(close), 1) OVER (PARTITION BY market ORDER BY day) - 1 AS ret
FROM candles
),
all_returns AS (
SELECT day, market, ret FROM market_returns WHERE ret IS NOT NULL
UNION ALL
SELECT day, 'PORTFOLIO' AS market, avg(ret) AS portfolio_ret
FROM market_returns WHERE ret IS NOT NULL GROUP BY day
),
cumulative AS (
SELECT market, day, ret, exp(sum(log(1 + ret)) OVER w) AS cum_return
FROM all_returns
WINDOW w AS (PARTITION BY market ORDER BY day
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
),
drawdowns AS (
SELECT market, ret, cum_return / max(cum_return) OVER w - 1 AS drawdown
FROM cumulative
WINDOW w AS (PARTITION BY market ORDER BY day
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
)
SELECT market,
min(drawdown) AS max_drawdown,
avg(ret) * sessions_per_year / abs(min(drawdown)) AS calmar
FROM drawdowns
GROUP BY market
ORDER BY marketOutput (2024)
day
cum_return
drawdown
market
max_drawdown
calmar
basket size × period
execution time
Last updated