@railpath/finance-toolkit
Version:
Production-ready finance library for portfolio construction, risk analytics, quantitative metrics, and ML-based regime detection
34 lines (33 loc) • 1.44 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.calculateCalmarRatio = calculateCalmarRatio;
const CalmarRatioOptionsSchema_1 = require("../schemas/CalmarRatioOptionsSchema");
const CalmarRatioResultSchema_1 = require("../schemas/CalmarRatioResultSchema");
const calculateMaxDrawdown_1 = require("./calculateMaxDrawdown");
/**
* Calculate Calmar Ratio
*
* Calmar = Annualized Return / Max Drawdown
*
* Measures return per unit of downside risk (drawdown).
* Higher is better; typically calculated over 36 months.
*
* @param options - Prices, returns, annualization factor
* @returns Calmar Ratio and components
*/
function calculateCalmarRatio(options) {
const { prices, returns, annualizationFactor } = CalmarRatioOptionsSchema_1.CalmarRatioOptionsSchema.parse(options);
// Mean return
const meanReturn = returns.reduce((sum, r) => sum + r, 0) / returns.length;
// Annualized return
const annualizedReturn = meanReturn * annualizationFactor;
// Max Drawdown
const { maxDrawdownPercent } = (0, calculateMaxDrawdown_1.calculateMaxDrawdown)({ prices });
// Calmar Ratio (use absolute value of drawdown)
const calmarRatio = maxDrawdownPercent !== 0 ? annualizedReturn / Math.abs(maxDrawdownPercent) : 0;
return CalmarRatioResultSchema_1.CalmarRatioResultSchema.parse({
calmarRatio,
annualizedReturn,
maxDrawdownPercent,
});
}