核心思想

风险价值 (Value at Risk, VaR) 衡量在给定置信水平和持有期下,投资组合可能遭受的最大损失。

条件风险价值 (Conditional VaR, CVaR / Expected Shortfall) 是当损失超过 VaR 阈值时的条件期望损失,更能反映尾部风险。

VaRα=inf{x:P(Lx)α}\text{VaR}_\alpha = -\inf\{x : P(L \le x) \ge \alpha\}

CVaRα=E[LL>VaRα]\text{CVaR}_\alpha = E[L \mid L > \text{VaR}_\alpha]

其中 LL 为组合损失,α\alpha 为置信水平(通常为 95% 或 99%)。

计算方法详解

1. 参数法 (Parametric VaR)

假设收益服从正态分布或学生 t 分布:

VaRα=μzασT\text{VaR}_\alpha = \mu - z_\alpha \cdot \sigma \cdot \sqrt{T}

其中 zα=Φ1(α)z_\alpha = \Phi^{-1}(\alpha) 为标准正态分位数。对于 t 分布,用 tν1(α)t_{\nu}^{-1}(\alpha) 代替。

优点: 简洁快速,可解析求解 缺点: 正态假设严重低估尾部风险;t 分布的自由度选择有主观性

2. 历史模拟法 (Historical Simulation)

直接对历史收益排序,取第 (1α)(1-\alpha) 百分位:

import numpy as np
from scipy import stats

def historical_var(returns, confidence=0.95):
    """历史模拟 VaR"""
    return -np.percentile(returns, (1 - confidence) * 100)

def historical_cvar(returns, confidence=0.95):
    """历史模拟 CVaR (Expected Shortfall)"""
    var = historical_var(returns, confidence)
    tail_losses = returns[returns <= -var]
    if len(tail_losses) == 0:
        return var
    return -tail_losses.mean()

# 加权历史模拟:给近期数据更高权重
def weighted_historical_var(returns, half_life=30, confidence=0.95):
    """EWMA 加权历史 VaR"""
    n = len(returns)
    weights = np.exp(-np.log(2) * np.arange(n) / half_life)
    weights = weights / weights.sum()
    
    sorted_idx = np.argsort(returns)
    cumulative_weights = np.cumsum(weights[sorted_idx])
    
    var_index = np.searchsorted(cumulative_weights, 1 - confidence)
    return -returns[sorted_idx[var_index]]

优点: 无需分布假设,保留历史尾部特征 缺点: 依赖样本长度;极端事件可能在历史中不存在

3. Monte Carlo 模拟

从假设的联合分布中大量抽样:

def monte_carlo_var_cov(S0, mu, cov_matrix, T, N=100000, confidence=0.95):
    """多资产 Monte Carlo VaR(使用协方差矩阵)"""
    np.random.seed(42)
    
    # Cholesky 分解生成相关随机变量
    L = np.linalg.cholesky(cov_matrix)
    z = np.random.randn(N, len(S0))
    
    # 生成相关收益率
    corr_returns = z @ L.T
    
    # 对数正态价格模拟
    drift = (mu - 0.5 * np.diag(cov_matrix)) * T
    vol = np.sqrt(np.diag(cov_matrix) * T)
    
    log_returns = drift + vol * corr_returns
    terminal_prices = S0 * np.exp(log_returns)
    
    # 组合损失
    weights = np.ones(len(S0)) / len(S0)
    portfolio_returns = np.mean((terminal_prices - S0) / S0, axis=1)
    
    var = -np.percentile(portfolio_returns, (1-confidence)*100)
    
    # CVaR: 超过 VaR 的平均损失
    tail = portfolio_returns[portfolio_returns <= -var]
    cvar = -tail.mean() if len(tail) > 0 else var
    
    return {'VaR': var, 'CVaR': cvar}

# 使用 GARCH 生成条件模拟
def garch_simulated_var(r, delta=1, N_sim=10000):
    """GARCH(1,1) 模拟 VaR"""
    from arch import arch_model
    
    # 拟合 GARCH(1,1)
    model = arch_model(r, vol='Garch', p=1, q=1)
    result = model.fit(disp='off')
    
    # 模拟未来路径
    sim = result.simulate(N_sim, delta=delta)
    var_simulations = -sim.returns.values
    
    return {
        'VaR_95': np.percentile(var_simulations, 5),
        'VaR_99': np.percentile(var_simulations, 1),
        'CVaR_95': var_simulations[var_simulations <= np.percentile(var_simulations, 5)].mean(),
    }

优点: 可处理复杂组合、非线性衍生品和非正态分布 缺点: 计算成本高;模型假设的敏感性(“garbage in, garbage out”)

风险度量的数学性质

一致性风险度量 (Coherent Risk Measures)

Artzner et al. (1999) 提出风险度量应满足四个性质:

  1. 单调性:若 X1X2X_1 \le X_2 几乎必然,则 ρ(X1)ρ(X2)\rho(X_1) \ge \rho(X_2)
  2. 次可加性ρ(X1+X2)ρ(X1)+ρ(X2)\rho(X_1 + X_2) \le \rho(X_1) + \rho(X_2)(分散化有效)
  3. 正齐次性ρ(λX)=λρ(X)\rho(\lambda X) = \lambda \rho(X) for λ>0\lambda > 0
  4. 平移不变性ρ(X+c)=ρ(X)c\rho(X + c) = \rho(X) - c

关键结论: VaR 不满足次可加性(不能保证分散化有益),而 CVaR / Expected Shortfall 满足所有四个性质,是一致风险度量。

CVaR 的优化表达式

Rockafellar & Uryasev (2002) 证明了 CVaR 可以通过凸优化求解:

CVaRα(L)=minz{z+11αE[(Lz)+]}\text{CVaR}_\alpha(L) = \min_{z} \left\{ z + \frac{1}{1-\alpha} E[(L - z)_+] \right\}

其中 zz 即为 VaRα\text{VaR}_\alpha。这个表达式使得 CVaR 优化可以转化为线性规划问题,非常适合大规模投资组合优化。

数据需求

类型说明最低频率
收益序列日频/分钟级历史收益率日频(200+ 条)
协方差矩阵多资产需要相关性结构日频
持仓权重各标的在组合中的占比实时更新
波动率模型GARCH 参数(如使用)日频

风险与局限

⚠️ VaR 的三大缺陷

  1. 不满足次可加性:可能鼓励集中而非分散,与风险管理的核心目标矛盾
  2. 尾部盲区:只给出边界值,对超过边界的损失”视而不见”
  3. 非单调性:不同置信水平之间 VaR 值不保证单调(在真实市场中)

⚠️ CVaR 的局限

  1. 估计不稳定:尾部数据的稀少性导致 CVaR 对样本长度非常敏感
  2. 历史依赖:如果历史上未发生极端事件,CVaR 会严重低估真实尾部风险
  3. 分布假设敏感:GARCH、Copula 等模型的误设会直接影响 CVaR 估计

⚠️ 实操风险

参考文献

  1. Jorion, P., 2006. Value at Risk: The New Benchmark for Managing Financial Risk. McGraw-Hill.
  2. Artzner, P., Delbaen, F., Eber, J.-M. & Heath, D., 1999. “Coherent Measures of Risk.” Mathematical Finance, 9(3), 203-238.
  3. Acerbi, C. & Tasche, D., 2002. “On the Coherence of Expected Shortfall.” Journal of Banking & Finance, 26(7).
  4. Rockafellar, R.T. & Uryasev, S., 2002. “Conditional Value-at-Risk for General Loss Distributions.” Journal of Banking & Finance, 26(7).
  5. McNeil, A.J., Frey, R. & Embrechts, P., 2015. Quantitative Risk Management: Concepts, Techniques and Tools. Princeton University Press.

相关资源

变体与演进

版本描述适用场景
Historical VaR纯历史模拟,无参数假设数据充足的成熟市场
EWMA VaRRiskMetrics 指数加权快速响应波动率变化
GARCH-VaRGARCH 模型预测下日 σ,再算 VaR波动率聚类显著的市场
Monte Carlo CVaR模拟全分布精确估计尾部期望复杂组合/衍生品
EWMA GARCH-VaRRiskMetrics + GARCH 混合估计高精度需求
Regime-aware CVaR按 Bull/Bear/Range 分别估计,切换模型跨周期稳健风控