Financial Risk Management: VaR and Beyond
Module: Fintech AI | Difficulty: Advanced
Value at Risk (VaR)
Expected Shortfall (CVaR)
Cornish-Fisher Expansion
where = skewness, = excess kurtosis.
Backtesting
| Method | Unconditional Coverage | Independence | |--------|----------------------|--------------| | Kupiec | LR test | No | | Christoffersen | LR test | LR test | | Basel Traffic Light | Green/Amber/Red | No |
import numpy as np
from scipy import stats
class RiskMetrics:
def __init__(self, confidence=0.99):
self.confidence = confidence
def historical_var(self, returns):
return -np.percentile(returns, (1-self.confidence)*100)
def historical_es(self, returns):
var = self.historical_var(returns)
return -returns[returns <= -var].mean()
def parametric_var(self, returns, mu=None, sigma=None):
if mu is None: mu = returns.mean()
if sigma is None: sigma = returns.std()
z = stats.norm.ppf(1-self.confidence)
return -(mu + sigma * z)
def cornish_fisher_var(self, returns):
mu, sigma = returns.mean(), returns.std()
s = stats.skew(returns)
k = stats.kurtosis(returns)
z = stats.norm.ppf(1-self.confidence)
z_cf = z + (z**2 - 1)*s/6 + (z**3 - 3*z)*k/24
return -(mu + sigma * z_cf)
def kupiec_test(self, returns, var_estimate):
n = len(returns)
failures = np.sum(returns <= -var_estimate)
p_hat = failures / n
p = 1 - self.confidence
lr = -2 * (np.log((1-p)**(n-failures) * p**failures) -
np.log((1-p_hat)**(n-failures) * p_hat**failures))
return 1 - stats.chi2.cdf(lr, 1)
Research Insight: VaR has well-known flaws: it is not subadditive and ignores tail risk. Expected Shortfall (ES) is a coherent risk measure that addresses these issues. Basel III/IV is transitioning from VaR to ES for market risk capital requirements.