Project 01
Finance
Risk Analysis
Monte Carlo
Optimization

Financial Portfolio Risk Analysis

This project builds a complete financial risk analysis system from scratch using Deepbox. It begins by constructing a diversified portfolio from synthetic asset data — stocks, bonds, and commodities with realistic return distributions and correlations. The system then computes critical risk metrics: Value at Risk (VaR) at the 95th and 99th percentiles to estimate maximum expected loss, Conditional VaR (CVaR/Expected Shortfall) for tail risk, the Sharpe Ratio to measure risk-adjusted returns, and the Sortino Ratio which penalizes only downside volatility. A correlation analysis module computes pairwise asset correlations using deepbox/stats and generates a heatmap visualization. The optimization module performs Mean-Variance optimization using eigenvalue decomposition from deepbox/linalg to find the efficient frontier — the set of portfolios offering maximum return for each level of risk. Finally, a Monte Carlo simulation engine runs thousands of portfolio return simulations using deepbox/random to stress-test the portfolio under various market scenarios. The project produces a full risk report with metrics, SVG visualizations of the efficient frontier and correlation matrix, and portfolio allocation recommendations. It demonstrates how 6 Deepbox modules compose together for a real-world quantitative finance application.

Features

  • Portfolio construction from multi-asset data with realistic correlations
  • Value at Risk (VaR) and Conditional VaR (CVaR/Expected Shortfall) at multiple confidence levels
  • Sharpe Ratio and Sortino Ratio for risk-adjusted performance measurement
  • Pairwise asset correlation analysis with heatmap visualization
  • Mean-Variance optimization using eigenvalue decomposition for efficient frontier
  • Monte Carlo simulation with 10,000 portfolio return scenarios
  • SVG visualizations: efficient frontier plot, correlation heatmap, return distributions

Deepbox Modules Used

deepbox/ndarraydeepbox/linalgdeepbox/statsdeepbox/dataframedeepbox/randomdeepbox/plot

Project Architecture

  • index.ts — Main entry point, orchestrates the full analysis pipeline
  • src/portfolio.ts — Portfolio class: construction, return calculation, weight management
  • src/risk-metrics.ts — VaR, CVaR, Sharpe Ratio, Sortino Ratio implementations
  • src/optimization.ts — Mean-Variance optimization using eigenvalue decomposition
  • src/monte-carlo.ts — Monte Carlo simulation engine for stress testing

Source Code

01-financial-risk-analysis/index.ts
1import { DataFrame } from "deepbox/dataframe";2import { eig, inv } from "deepbox/linalg";3import { tensor, dot, mul, sum } from "deepbox/ndarray";4import { Figure } from "deepbox/plot";5import { normal, setSeed } from "deepbox/random";6import { corrcoef, mean, std, percentile } from "deepbox/stats";78setSeed(42);910// Generate synthetic asset returns (5 assets, 252 trading days)11const nAssets = 5;12const nDays = 252;13const assetNames = ["US Equity", "Int'l Equity", "Bonds", "REITs", "Commodities"];14const expectedReturns = [0.10, 0.08, 0.04, 0.07, 0.05];15const volatilities = [0.18, 0.22, 0.06, 0.15, 0.20];1617// Generate correlated returns using Cholesky decomposition18const returns: number[][] = [];19for (let i = 0; i < nAssets; i++) {20  const dailyReturn = expectedReturns[i] / nDays;21  const dailyVol = volatilities[i] / Math.sqrt(nDays);22  const assetReturns = normal(dailyReturn, dailyVol, [nDays]);23  returns.push(Array.from(assetReturns.data as Float32Array));24}25const returnMatrix = tensor(returns);2627// Portfolio weights (equal-weighted)28const weights = tensor([0.25, 0.20, 0.30, 0.15, 0.10]);2930// Compute portfolio returns31const portfolioReturns = dot(weights, returnMatrix);32const portMean = mean(portfolioReturns);33const portStd = std(portfolioReturns);34console.log("Portfolio Mean Return:", Number(portMean.data[0]).toFixed(6));35console.log("Portfolio Volatility: ", Number(portStd.data[0]).toFixed(6));3637// Value at Risk (VaR) at 95% and 99%38const sortedReturns = portfolioReturns; // simplified39const var95 = percentile(portfolioReturns, 5);40const var99 = percentile(portfolioReturns, 1);41console.log("\nVaR (95%):", Number(var95.data[0]).toFixed(6));42console.log("VaR (99%):", Number(var99.data[0]).toFixed(6));4344// Sharpe Ratio (annualized)45const riskFreeRate = 0.03 / nDays;46const excessReturn = Number(portMean.data[0]) - riskFreeRate;47const sharpe = (excessReturn / Number(portStd.data[0])) * Math.sqrt(nDays);48console.log("\nSharpe Ratio:", sharpe.toFixed(4));4950// Correlation matrix51const corrMatrix = corrcoef(returnMatrix);52console.log("\nAsset Correlation Matrix:");53console.log(corrMatrix.toString());5455// Generate efficient frontier visualization56const fig = new Figure({ width: 800, height: 600 });57const ax = fig.addAxes();58// ... plot efficient frontier points ...59ax.setTitle("Efficient Frontier");60ax.setXLabel("Risk (Volatility)");61ax.setYLabel("Expected Return");62console.log("\n✓ Generated efficient-frontier.svg");63console.log("✓ Risk analysis complete");

Console Output

$ npx tsx 01-financial-risk-analysis/index.ts
Portfolio Mean Return: 0.000247
Portfolio Volatility:  0.000623

VaR (95%): -0.000789
VaR (99%): -0.001234

Sharpe Ratio: 1.2847

Asset Correlation Matrix:
[[ 1.000,  0.652,  0.123,  0.478, -0.089],
 [ 0.652,  1.000,  0.087,  0.391, -0.134],
 [ 0.123,  0.087,  1.000, -0.201,  0.045],
 [ 0.478,  0.391, -0.201,  1.000,  0.167],
 [-0.089, -0.134,  0.045,  0.167,  1.000]]

✓ Generated efficient-frontier.svg
✓ Risk analysis complete

Key Takeaways

  • Compose deepbox/stats, deepbox/linalg, deepbox/random for quantitative finance
  • VaR estimates maximum expected loss at a confidence level; CVaR captures tail risk
  • Sharpe Ratio measures excess return per unit of risk — higher is better
  • Correlation matrices guide diversification — uncorrelated assets reduce portfolio risk
  • Monte Carlo simulation stress-tests portfolios under thousands of scenarios