UNPKG

@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
"use strict"; 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; }