@railpath/finance-toolkit
A comprehensive TypeScript library for portfolio management and risk analytics.
@railpath/finance-toolkit provides a complete collection of financial metrics with focus on modularity, type-safety, and performance.
Part of the RailPath open source ecosystem – building financial infrastructure that belongs to everyone.
Features
Portfolio Performance Metrics
- Time-Weighted Return (TWR) – Performance independent of cash flows
- Money-Weighted Return (MWR) – IRR-based performance with cash flow consideration
- Portfolio Metrics – Comprehensive portfolio analysis (CAGR, Sharpe, Sortino, VaR, ES)
- Performance Attribution – Factor-based performance analysis
- Portfolio Optimization – Mean-variance optimization
- Portfolio Rebalancing – Rebalancing strategies and trade calculations
- Equal Weight Portfolio – Equal weight allocation strategies
- Returns Calculation – Various return calculation methods
- Risk Metrics – Portfolio-level risk analysis
- Information Ratio – Active return vs. tracking error
- Tracking Error – Deviation from benchmark
Risk Metrics
- Value at Risk (VaR) – Historical, Parametric, Monte Carlo methods
- Expected Shortfall (CVaR) – Conditional Value at Risk
- Maximum Drawdown – Largest loss from peak to trough
- Alpha & Beta – CAPM-based performance metrics
- Sharpe Ratio – Risk-adjusted returns
- Sortino Ratio – Downside risk-adjusted returns
- Calmar Ratio – Return vs. maximum drawdown
- Standard Deviation – Classical volatility measure
- Semideviation – Downside volatility measure
- Skewness & Kurtosis – Distribution shape analysis
- VaR 95% & 99% – Pre-configured confidence levels
Technical Indicators
- SMA (Simple Moving Average) – Trend-following indicator
- EMA (Exponential Moving Average) – Weighted trend indicator
- MACD (Moving Average Convergence Divergence) – Trend momentum indicator
- RSI (Relative Strength Index) – Momentum oscillator (0-100)
- Stochastic Oscillator – Momentum indicator (%K, %D)
- Williams %R – Momentum oscillator (-100 to 0)
- Bollinger Bands – Volatility-based price channels
- ATR (Average True Range) – Volatility measurement
Volatility Calculations
- Standard Deviation – Classical volatility
- EWMA Volatility – Exponentially Weighted Moving Average
- Parkinson Volatility – High-Low range based
- Garman-Klass Volatility – OHLC-based volatility
Portfolio Analysis
- Correlation Matrix – Asset correlations
- Covariance Matrix – Asset covariances
- Portfolio Volatility – Total portfolio risk
- Portfolio Optimization – Mean-variance optimization
- Portfolio Rebalancing – Rebalancing strategies
- Equal Weight Allocation – Equal weight strategies
- Performance Attribution – Factor-based analysis
Language Support
Written in TypeScript, works seamlessly in JavaScript projects.
Type definitions included for IDE autocomplete.
Installation
npm install @railpath/finance-toolkit
Quick Start
Portfolio Performance
import {
calculateTimeWeightedReturn,
calculateMoneyWeightedReturn
} from '@railpath/finance-toolkit';
const twr = calculateTimeWeightedReturn({
portfolioValues: [1000, 1100, 1200, 1150],
cashFlows: [0, 100, 0, -50],
annualizationFactor: 252
});
const mwr = calculateMoneyWeightedReturn({
cashFlows: [1000, 100, -50],
dates: [new Date('2023-01-01'), new Date('2023-06-01'), new Date('2023-12-01')],
finalValue: 1150,
initialValue: 0
});
Risk Analysis
import {
calculateVaR,
calculateSharpeRatio,
calculateMaxDrawdown
} from '@railpath/finance-toolkit';
const var95 = calculateVaR({
returns: [0.01, 0.02, -0.01, 0.03, -0.02],
confidenceLevel: 0.95,
method: 'historical'
});
const sharpe = calculateSharpeRatio({
returns: [0.01, 0.02, -0.01, 0.03],
riskFreeRate: 0.02,
annualizationFactor: 252
});
const maxDD = calculateMaxDrawdown({
portfolioValues: [1000, 1100, 1050, 1200, 1150]
});
Portfolio Analysis
import {
calculateCorrelationMatrix,
calculatePortfolioVolatility
} from '@railpath/finance-toolkit';
const correlation = calculateCorrelationMatrix({
assetReturns: [
[0.01, 0.02, -0.01],
[0.015, 0.025, -0.005]
]
});
const portfolioVol = calculatePortfolioVolatility({
weights: [0.6, 0.4],
covarianceMatrix: [[0.04, 0.02], [0.02, 0.09]]
});
Technical Indicators
import {
calculateSMA,
calculateEMA,
calculateMACD,
calculateRSI,
calculateStochastic,
calculateWilliamsR,
calculateBollingerBands,
calculateATR
} from '@railpath/finance-toolkit';
const sma = calculateSMA({
prices: [100, 102, 101, 103, 105, 104, 106],
period: 5
});
const ema = calculateEMA({
prices: [100, 102, 101, 103, 105, 104, 106],
period: 5
});
const macd = calculateMACD({
prices: [100, 102, 101, 103, 105, 104, 106, 107, 108, 109, 110, 111, 112, 113, 114],
fastPeriod: 12,
slowPeriod: 26,
signalPeriod: 9
});
const rsi = calculateRSI({
prices: [100, 102, 101, 103, 105, 104, 106],
period: 14
});
const stochastic = calculateStochastic({
high: [102, 103, 101, 104, 105, 106, 107],
low: [98, 99, 97, 100, 101, 102, 103],
close: [100, 102, 100, 103, 104, 105, 106],
kPeriod: 14,
dPeriod: 3
});
const williamsR = calculateWilliamsR({
high: [102, 103, 101, 104, 105, 106, 107],
low: [98, 99, 97, 100, 101, 102, 103],
close: [100, 102, 100, 103, 104, 105, 106],
period: 14
});
const bollinger = calculateBollingerBands({
prices: [100, 102, 101, 103, 105, 104, 106],
period: 20,
stdDevMultiplier: 2
});
const atr = calculateATR({
high: [101, 103, 102, 104, 106, 105, 107],
low: [99, 101, 100, 102, 104, 103, 105],
close: [100, 102, 101, 103, 105, 104, 106],
period: 14
});
Use Cases
Portfolio Manager
- Performance attribution and benchmarking
- Risk-adjusted return optimization
- Cash flow impact analysis
Risk Manager
- VaR and Expected Shortfall monitoring
- Stress testing and scenario analysis
- Portfolio concentration risk
Quantitative Analyst
- Factor model development
- Volatility forecasting
- Correlation structure analysis
Financial Advisor
- Client portfolio performance
- Risk assessment and reporting
- Asset allocation optimization
Technical Analyst
- Trend analysis with SMA, EMA, and MACD
- Momentum indicators (RSI, Stochastic, Williams %R) for market timing
- Volatility-based trading signals with Bollinger Bands and ATR
TypeScript Support
All functions are fully typed with Zod validation and modular schema architecture:
import type {
TimeWeightedReturnOptions,
TimeWeightedReturnResult,
SMAOptions,
SMAResult,
RSIOptions,
RSIResult
} from '@railpath/finance-toolkit';
const options: TimeWeightedReturnOptions = {
portfolioValues: [1000, 1100, 1200],
cashFlows: [0, 100, 0],
annualizationFactor: 252
};
const result: TimeWeightedReturnResult = calculateTimeWeightedReturn(options);
console.log(result.twr);
console.log(result.annualizedTWR);
console.log(result.periodReturns);
const smaOptions: SMAOptions = {
prices: [100, 102, 101, 103, 105],
period: 3
};
const smaResult: SMAResult = calculateSMA(smaOptions);
console.log(smaResult.sma);
console.log(smaResult.count);
console.log(smaResult.indices);
const macdOptions: MACDOptions = {
prices: [100, 102, 101, 103, 105, 104, 106],
fastPeriod: 12,
slowPeriod: 26,
signalPeriod: 9
};
const macdResult: MACDResult = calculateMACD(macdOptions);
console.log(macdResult.macdLine);
console.log(macdResult.signalLine);
console.log(macdResult.histogram);
Schema Architecture
The library uses a modular schema architecture with separate files for Options and Results:
src/schemas/
├── indicators/
│ ├── SMAOptionsSchema.ts # Input validation
│ ├── SMAResultSchema.ts # Output structure
│ ├── RSIOptionsSchema.ts # Input validation
│ └── RSIResultSchema.ts # Output structure
└── ...
This provides:
- Granular imports - Import only what you need
- Better tree-shaking - Smaller bundle sizes
- Clear separation - Input vs. output validation
- Easy maintenance - Modify schemas without touching implementation
API Reference
Portfolio Performance
calculateTimeWeightedReturn | TWR Performance | Portfolio Values, Cash Flows | TWR, Annualized TWR, Period Returns |
calculateMoneyWeightedReturn | MWR Performance (IRR) | Cash Flows, Dates, Final Value | MWR, Annualized MWR, NPV, Iterations |
calculatePortfolioMetrics | Comprehensive Analysis | Portfolio Values, Risk-Free Rate | CAGR, Sharpe, Sortino, VaR, ES, Volatility |
calculatePerformanceAttribution | Factor Analysis | Returns, Factor Returns | Factor Contributions, Active Return |
calculatePortfolioOptimization | Mean-Variance Optimization | Expected Returns, Covariance Matrix | Optimal Weights, Risk-Return |
calculatePortfolioRebalancing | Rebalancing Strategies | Current Weights, Target Weights | New Weights, Trade Amounts |
calculateEqualWeightPortfolio | Equal Weight Allocation | Asset Count | Equal Weights, Portfolio Metrics |
calculateReturns | Return Calculations | Prices, Dates | Various Return Types |
calculateRiskMetrics | Portfolio Risk Analysis | Returns, Risk-Free Rate | Risk Metrics, VaR, ES |
calculateInformationRatio | Active Return Analysis | Portfolio Returns, Benchmark Returns | Information Ratio, Active Return |
calculateTrackingError | Benchmark Deviation | Portfolio Returns, Benchmark Returns | Tracking Error, Active Risk |
Risk Metrics
calculateVaR | Value at Risk | Historical, Parametric, Monte Carlo |
calculateVaR95 | VaR 95% Confidence | Historical, Parametric, Monte Carlo |
calculateVaR99 | VaR 99% Confidence | Historical, Parametric, Monte Carlo |
calculateExpectedShortfall | Conditional VaR | Historical, Parametric |
calculateHistoricalVaR | Historical VaR | Historical Method |
calculateParametricVaR | Parametric VaR | Normal Distribution |
calculateMonteCarloVaR | Monte Carlo VaR | Simulation Method |
calculateHistoricalExpectedShortfall | Historical ES | Historical Method |
calculateParametricExpectedShortfall | Parametric ES | Normal Distribution |
calculateSharpeRatio | Risk-Adjusted Returns | Standard, Annualized |
calculateSortinoRatio | Downside Risk-Adjusted | Standard, Annualized |
calculateSemideviation | Downside Volatility | Zero/Mean Threshold |
calculateCalmarRatio | Return vs. Drawdown | Calmar Ratio |
calculateSkewness | Distribution Asymmetry | Third Moment |
calculateKurtosis | Distribution Tailedness | Fourth Moment (Excess) |
calculateAlpha | CAPM Alpha | Asset vs. Benchmark |
calculateBeta | CAPM Beta | Asset vs. Benchmark |
calculateMaxDrawdown | Maximum Loss | Peak-to-Trough Analysis |
calculateStandardDeviation | Standard Deviation | Classical Measure |
Volatility
calculateVolatility | Standard Deviation | Returns Array |
calculateEWMAVolatility | Exponentially Weighted | Returns, Lambda |
calculateParkinsonVolatility | High-Low Range | High, Low Prices |
calculateGarmanKlassVolatility | OHLC-based | Open, High, Low, Close |
calculateStandardDeviation | Classical Measure | Returns Array |
Portfolio Analysis
calculateCorrelationMatrix | Asset Correlations | Asset Returns Matrix |
calculateCovarianceMatrix | Asset Covariances | Asset Returns Matrix |
calculatePortfolioVolatility | Portfolio Risk | Weights, Covariance Matrix |
Technical Indicators
calculateSMA | Simple Moving Average | Prices Array, Period | SMA Values, Indices |
calculateEMA | Exponential Moving Average | Prices Array, Period | EMA Values, Smoothing Factor |
calculateMACD | Moving Average Convergence Divergence | Prices Array, Fast/Slow/Signal Periods | MACD Line, Signal Line, Histogram |
calculateRSI | Relative Strength Index | Prices Array, Period | RSI Values (0-100), Gains/Losses |
calculateStochastic | Stochastic Oscillator | High/Low/Close Arrays, K/D Periods | %K, %D, Highest High, Lowest Low |
calculateWilliamsR | Williams %R | High/Low/Close Arrays, Period | Williams %R Values (-100 to 0) |
calculateBollingerBands | Bollinger Bands | Prices Array, Period, StdDev Multiplier | Upper/Middle/Lower Bands, %B |
calculateATR | Average True Range | High/Low/Close Arrays, Period | ATR Values, True Range |
Testing
npm test
npm run test:watch
npm run test:coverage
npm run test:integration
npm run test:integration:watch
npm run test:performance
npm run test:performance:watch
Test Coverage: 1160 Tests across 53 test files
Battle Testing
This library uses a comprehensive battle testing approach to ensure accuracy by comparing TypeScript implementations against Python equivalents using battle-tested libraries (numpy, scipy, pandas).
Performance Testing
Comprehensive performance benchmarks test functions across different dataset sizes to ensure optimal performance and detect regressions. Performance tests measure execution time, memory usage, and throughput for various dataset sizes to identify bottlenecks and ensure scalability. See testing/README.md for details on the performance testing framework.
Build
npm run build
npm run dev
Output: TypeScript declarations and optimized JavaScript modules
Contributing
- Fork the repository
- Create a feature branch
- Implement tests for new functions
- Ensure all tests pass
- Create a pull request
License
MIT License - see LICENSE for details.