@railpath/finance-toolkit
Version:
Production-ready finance library for portfolio construction, risk analytics, quantitative metrics, and ML-based regime detection
51 lines (50 loc) • 2.22 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.calculateVolatility = calculateVolatility;
const calculateEWMAVolatility_1 = require("./calculateEWMAVolatility");
const calculateGarmanKlassVolatility_1 = require("./calculateGarmanKlassVolatility");
const calculateParkinsonVolatility_1 = require("./calculateParkinsonVolatility");
const calculateStandardDeviation_1 = require("./calculateStandardDeviation");
/**
* Calculate volatility using various methods
*
* @param returns Array of log returns
* @param options Volatility calculation options
* @returns Volatility result with value and metadata
*/
function calculateVolatility(returns, options) {
if (returns.length < 2) {
throw new Error('At least 2 returns required for volatility calculation');
}
let value;
switch (options.method) {
case 'standard':
value = (0, calculateStandardDeviation_1.calculateStandardDeviation)(returns);
break;
case 'exponential':
value = (0, calculateEWMAVolatility_1.calculateEWMAVolatility)(returns, options.lambda ?? 0.94);
break;
case 'parkinson':
if (!options.highPrices || !options.lowPrices) {
throw new Error('High and low prices required for Parkinson method');
}
value = (0, calculateParkinsonVolatility_1.calculateParkinsonVolatility)(options.highPrices, options.lowPrices);
break;
case 'garman-klass':
if (!options.highPrices || !options.lowPrices || !options.openPrices || !options.closePrices) {
throw new Error('OHLC prices required for Garman-Klass method');
}
value = (0, calculateGarmanKlassVolatility_1.calculateGarmanKlassVolatility)(options.openPrices, options.highPrices, options.lowPrices, options.closePrices);
break;
default:
throw new Error(`Unknown volatility method: ${options.method}`);
}
const result = {
value,
method: options.method,
};
if (options.annualizationFactor) {
result.annualized = value * Math.sqrt(options.annualizationFactor);
}
return result;
}