VaR answers one question: "What is the worst loss I should expect on a normal day?" Three methods dominate — parametric (variance-covariance), historical simulation, and Monte Carlo. Parametric VaR assumes normally distributed returns:
| Method | Assumption | Strength |
|---|---|---|
| Parametric | Normal returns | Fastest to compute |
| Historical | None (empirical) | Captures fat tails |
| Monte Carlo | Model-dependent | Flexible payoff profiles |
- Under the 1996 Basel Market Risk Amendment, market-risk capital was based on 99% 10-day VaR times a multiplier of at least 3. Basel III’s FRTB replaces it with 97.5% Expected Shortfall
- In 2008 many banks saw far more days with losses beyond VaR than their models allowed — normal assumptions and calm-period data understated the tails
- J.P. Morgan’s RiskMetrics (1994) popularised VaR, modelling returns as conditionally normal with EWMA volatility (λ = 0.94)
- Modern practice: run all three methods and report the worst case. If they disagree significantly, your risk model has a blind spot
pip install numpy pandas yfinance scipy
# ────────────────────────────────────────
import numpy as np, pandas as pd, yfinance as yf
from scipy.stats import norm
prices = yf.download('SPY', period='2y')['Close']
returns = prices.pct_change().dropna()
# Parametric VaR (95%, 1-day)
mu, sigma = returns.mean(), returns.std()
var_95 = -(mu + norm.ppf(0.05) * sigma)
print(f"Parametric VaR (95%): {var_95:.2%}")
# Historical VaR
var_hist = -np.percentile(returns, 5)
print(f"Historical VaR (95%): {var_hist:.2%}")
# Dollar VaR for $100K portfolio
portfolio = 100_000
print(f"1-day dollar VaR: ${portfolio * var_95:,.0f}")
Twenty daily returns on a 1,000,000 portfolio. Historical 95% VaR reads the 5% quantile straight off the data: 28,400. Parametric VaR assumes a normal distribution with the same mean and standard deviation: 23,512. The two worst days (−3.6% and −2.8%) drive the gap — the normal curve says such days are rarer than the data does.
- With 20 days the 5% quantile sits between the two worst observations; one more bad day moves it a lot. Historical VaR needs hundreds of days to be stable.
- VaR says nothing about how bad the bad days are beyond the cutoff, and it is not sub-additive: two portfolios’ VaR can add up to less than the VaR of the two combined (Artzner et al. 1999).
- A calm sample gives a small VaR just before volatility returns; the number is backward-looking.
r = pd.Series([0.4, -1.2, 0.8, 0.1, -0.6, 1.5, -2.8, 0.3, 0.9, -0.4,
0.2, -1.7, 0.6, 1.1, -0.9, 0.5, -3.6, 0.7, 0.0, -0.3]) / 100 # 20 daily returns, made up
value = 1_000_000
historical = -np.quantile(r, 0.05) * value # read the 5% quantile off the data
parametric = -(r.mean() - 1.645 * r.std()) * value # assume a normal distributionAssumes import numpy as np and import pandas as pd. Each snippet carries its own example numbers; the comments say which are made up or simulated.
- Value at Risk: The New Benchmark for Managing Financial Risk, P. Jorion, McGraw-Hill, 3rd ed. 2007
- J.P. Morgan/Reuters, RiskMetrics — Technical Document, 4th ed., 1996
- P. Artzner, F. Delbaen, J.-M. Eber & D. Heath, “Coherent Measures of Risk”, Mathematical Finance 9(3), 1999
Last reviewed October 2026 · How this site checks its content · Report a mistake
1. A portfolio’s 1-day 99% VaR is $1 million. What does that mean?
Show answer
C. VaR is a threshold, not a worst case. Expected shortfall measures what lies beyond it.
2. VaR is not subadditive. What does that mean in practice?
Show answer
A. This is one reason Artzner et al. (1999) did not count VaR among “coherent” risk measures.
3. What happens if you compute VaR assuming normal returns when real returns are fat-tailed?
Show answer
B. Fat tails put more probability on large moves than the normal curve does, especially at high confidence levels.