Pure-JS Nelder-Mead optimization, no SciPy/R dependencies.
import { fitGARCH11, fitEGARCH, fitGJR, garch11Forecast } from 'meridianalgo';
const result = fitGARCH11(returns);
// { params: { omega, alpha, beta, mu }, variances, logLikelihood, converged }
const fcst = garch11Forecast(lastVar, lastResid, result.params, 30);Models: GARCH(1,1), EGARCH (asymmetric, log-scale), GJR-GARCH (leverage indicator).
import {
parkinsonVolatility, garmanKlassVolatility,
rogersSatchellVolatility, yangZhangVolatility,
fitHARRV,
} from 'meridianalgo';
const bars = [{ open, high, low, close }, ...];
parkinsonVolatility(bars); // HL only — ~5x more efficient than CTC
garmanKlassVolatility(bars); // OHLC — ~7x more efficient
rogersSatchellVolatility(bars); // drift-independent
yangZhangVolatility(bars); // overnight + open-close + RS
// Heterogeneous Autoregressive RV
const har = fitHARRV(realizedVariances);
// { beta0, betaD, betaW, betaM, fitted, residuals }Adjusts Gaussian VaR for skew and kurtosis.
import { cornishFisherVaR } from 'meridianalgo';
const var95 = cornishFisherVaR(returns, 0.95); // positive number = lossHigher-moment-aware companions to the Gaussian/historical risk metrics.
import {
modifiedExpectedShortfall, adjustedSharpeRatio, tailRatio,
} from 'meridianalgo';
// Cornish-Fisher Expected Shortfall: mean loss in the tail beyond modified VaR
modifiedExpectedShortfall(returns, 0.95); // positive number = loss
// Pézier-White Adjusted Sharpe: penalises negative skew & excess kurtosis
adjustedSharpeRatio(returns, 0.02, 252); // rf annual, periods/year
// Tail ratio: right-tail magnitude / left-tail magnitude (>1 = upside-heavy)
tailRatio(returns, 0.05); // 95th vs 5th percentileimport {
drawdownSeries, painIndex, conditionalDrawdownAtRisk,
topNDrawdowns, gainToPainRatio,
} from 'meridianalgo';
drawdownSeries(equityCurve); // [0, ..., -0.12, ...]
painIndex(equityCurve); // average drawdown
conditionalDrawdownAtRisk(equity, 0.95);
const top5 = topNDrawdowns(equity, 5); // [{ startIdx, troughIdx, endIdx, depth, durationBars }]
gainToPainRatio(returns);Bailey & Lopez de Prado (2012).
import {
probabilisticSharpeRatio, minTrackRecordLength,
sharpeConfidenceInterval,
} from 'meridianalgo';
probabilisticSharpeRatio(returns, 0); // P(true SR > 0)
minTrackRecordLength(returns, 0, 0.05); // bars needed for 95% confidence
sharpeConfidenceInterval(returns, 0.95, 1000); // bootstrap CIimport { listStressScenarios, getStressScenario, applyStressScenario } from 'meridianalgo';
listStressScenarios();
// ['2008-crisis', 'covid-crash', 'dot-com', 'black-monday', 'taper-tantrum',
// 'asian-crisis', 'lehman-week']
const result = applyStressScenario(
{ equity: 1_000_000, rateDuration: 50_000, creditSpreadDuration: 20_000 },
'covid-crash'
);
// { pnl, breakdown: { equity, rates, credit, vol, fx } }Spinu cyclic coordinate descent.
import { equalRiskContribution, riskBudgetingWeights } from 'meridianalgo';
const erc = equalRiskContribution(covariance);
// { weights, riskContributions, portfolioVolatility, iterations, converged }
const custom = riskBudgetingWeights(covariance, [0.5, 0.3, 0.2]);