UNPKG

@railpath/finance-toolkit

Version:

Production-ready finance library for portfolio construction, risk analytics, quantitative metrics, and ML-based regime detection

62 lines (61 loc) 2.26 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.calculateBeta = calculateBeta; const BetaOptionsSchema_1 = require("../schemas/BetaOptionsSchema"); const BetaResultSchema_1 = require("../schemas/BetaResultSchema"); /** * Calculate Beta (β) * * β = Cov(asset, benchmark) / Var(benchmark) * * Measures systematic risk relative to market/benchmark. * β = 1: moves with market * β > 1: more volatile than market * β < 1: less volatile than market * * @param options - Asset returns and benchmark returns * @returns Beta, covariance, variance, correlation */ function calculateBeta(options) { const { assetReturns, benchmarkReturns } = BetaOptionsSchema_1.BetaOptionsSchema.parse(options); if (assetReturns.length !== benchmarkReturns.length) { throw new Error('Asset and benchmark returns must have same length'); } const n = assetReturns.length; // Mean returns const assetMean = assetReturns.reduce((sum, r) => sum + r, 0) / n; const benchmarkMean = benchmarkReturns.reduce((sum, r) => sum + r, 0) / n; // Covariance let covariance = 0; for (let i = 0; i < n; i++) { covariance += (assetReturns[i] - assetMean) * (benchmarkReturns[i] - benchmarkMean); } covariance /= n - 1; // Sample covariance // Benchmark variance let benchmarkVariance = 0; for (let i = 0; i < n; i++) { benchmarkVariance += Math.pow(benchmarkReturns[i] - benchmarkMean, 2); } benchmarkVariance /= n - 1; // Sample variance // Beta const beta = benchmarkVariance !== 0 ? covariance / benchmarkVariance : 0; // Asset standard deviation (for correlation) let assetVariance = 0; for (let i = 0; i < n; i++) { assetVariance += Math.pow(assetReturns[i] - assetMean, 2); } assetVariance /= n - 1; const assetStdDev = Math.sqrt(assetVariance); const benchmarkStdDev = Math.sqrt(benchmarkVariance); // Correlation const correlation = assetStdDev !== 0 && benchmarkStdDev !== 0 ? covariance / (assetStdDev * benchmarkStdDev) : 0; return BetaResultSchema_1.BetaResultSchema.parse({ beta, covariance, benchmarkVariance, correlation, }); }