第三章 参数法VaR:正态分布下的风险量化

参数法VaR,也叫方差-协方差法。说实话,这是我最先学会的VaR计算方法。为什么?因为它简单、优雅,而且有漂亮的数学推导。但我要提醒你——简单的东西往往藏着陷阱。

我在2015年做固收产品风控时,就吃过参数法的亏。当时市场平稳,模型跑得漂亮。结果2016年债市波动一来,VaR值直接被打脸。嗯,这个教训让我明白:参数法好用,但前提你得懂它的假设。

3.1 正态分布假设:为什么是它?

参数法的核心假设就一句话:资产收益率服从正态分布

你可能会问:为什么偏偏是正态分布?

原因有三:

  • 数学上方便:正态分布只需要两个参数——均值和标准差。计算简单,推导清晰
  • 可加性好:多个正态分布变量的线性组合,仍然是正态分布。这对组合VaR计算太重要了
  • 历史惯性:Markowitz的均值-方差框架就是基于正态假设。金融学界用了快70年

核心公式

VaR = - (μ × Δt + zα × σ × √Δt) × P

其中:

  • μ:日收益率均值
  • σ:日收益率标准差
  • zα:置信水平对应的分位数(95%→1.645,99%→2.326)
  • Δt:持有期(天)
  • P:资产当前价值

但我要泼盆冷水——真实世界的收益率,几乎从来不是正态分布。我见过太多人拿着正态分布硬套,结果VaR值偏小,风险被低估。说白了,正态分布假设是「理想情况」,现实是「肥尾」的。

3.2 均值-方差框架:Markowitz的遗产

这个框架是Harry Markowitz在1952年提出的。老爷子凭这个拿了诺贝尔奖。核心思想就一句话:用均值衡量收益,用方差衡量风险

在VaR计算中,我们这样用:

  1. 估计均值:历史收益率的平均值。我个人习惯用过去250个交易日(约1年)的数据
  2. 估计方差/标准差:衡量收益率的波动程度
  3. 计算协方差矩阵:如果做组合VaR,需要知道资产之间的相关性

我的经验:均值估计其实很敏感。市场平稳时,均值接近0。但遇到趋势行情,均值会偏移。我建议:如果持有期短(比如1天),直接把均值设为0。这样算出来的VaR更保守,也更安全。

为什么?因为短期来看,均值的影响远小于标准差。你想想看,一天的收益率均值可能只有0.05%,但标准差可能是1.5%。差了两个数量级。所以忽略均值,反而更稳健。

3.3 参数估计:数据怎么来?

参数估计是参数法VaR的「地基」。地基不稳,楼再漂亮也得塌。

我常用的方法有两种:

方法 优点 缺点 我的建议
简单移动平均(SMA) 计算简单,容易理解 所有数据权重相同,对近期变化不敏感 适合波动率稳定的资产
指数加权移动平均(EWMA) 近期数据权重更大,反应更快 需要选择衰减因子λ 我偏好λ=0.94(RiskMetrics标准)

举个例子。假设某股票过去5天的日收益率:0.5%, -1.2%, 0.8%, -0.3%, 1.1%。

用SMA算标准差:

import numpy as np

returns = np.array([0.005, -0.012, 0.008, -0.003, 0.011])
mean = np.mean(returns)  # 0.0018
std = np.std(returns, ddof=1)  # 0.0093
print(f"标准差: {std:.4f}")

用EWMA算:

def ewma_std(returns, lam=0.94):
    n = len(returns)
    weights = np.array([lam**(n-1-i) for i in range(n)])
    weights = weights / np.sum(weights)
    mean = np.sum(weights * returns)
    var = np.sum(weights * (returns - mean)**2)
    return np.sqrt(var)

std_ewma = ewma_std(returns)
print(f"EWMA标准差: {std_ewma:.4f}")

避坑指南:我曾经用SMA算一个高波动股票的VaR,结果连续几天VaR值都偏小。后来发现是SMA对近期暴跌反应太慢。从那以后,对于高波动资产,我坚持用EWMA。

3.4 计算步骤:手把手教你算

好了,理论讲完,咱们动手。计算参数法VaR,分四步走:

步骤1:收集数据

获取资产的历史价格。我一般取250个交易日的数据。

步骤2:计算收益率

用对数收益率:rt = ln(Pt / Pt-1)

步骤3:估计参数

计算均值和标准差。这里我推荐用EWMA。

步骤4:计算VaR

代入公式:VaR = - (μ + zα × σ) × P

完整代码示例:

import numpy as np
import pandas as pd

def parametric_var(prices, confidence=0.95, lam=0.94):
    # 计算对数收益率
    log_returns = np.log(prices[1:] / prices[:-1])
    
    # EWMA估计
    n = len(log_returns)
    weights = np.array([lam**(n-1-i) for i in range(n)])
    weights = weights / np.sum(weights)
    
    mean = np.sum(weights * log_returns)
    var = np.sum(weights * (log_returns - mean)**2)
    std = np.sqrt(var)
    
    # 分位数
    z = 1.645 if confidence == 0.95 else 2.326
    
    # 当前价格
    current_price = prices[-1]
    
    # VaR计算
    var_value = -(mean + z * std) * current_price
    
    return var_value

# 示例
prices = np.array([100, 101, 99, 102, 98, 100, 103, 97, 101, 99])
var_95 = parametric_var(prices, confidence=0.95)
print(f"95%置信水平下的VaR: {var_95:.2f}")

3.5 知识体系总览

下面这张图,是我梳理的参数法VaR的核心逻辑。你一看就明白:

参数法VaR知识体系 核心假设:正态分布 均值-方差框架 参数估计:SMA / EWMA 协方差矩阵(组合VaR) 单资产VaR计算 组合VaR计算 VaR值输出 VaR值输出

3.6 实战中的坑与对策

做了这么多年风控,我总结参数法VaR的三个大坑:

坑1:肥尾风险

正态分布假设下,极端事件概率被低估。比如2008年金融危机,VaR模型几乎全部失效。

对策:用压力测试补充。我一般会算99.9%分位数的VaR,虽然极端,但心里有底。

坑2:参数不稳定

均值和标准差会随时间变化。用历史数据估计未来,本身就是一种赌博。

对策:滚动窗口估计。我习惯用250天窗口,每天更新参数。

坑3:相关性突变

组合VaR依赖资产间的相关性。但危机时,所有资产的相关性都会上升——这就是「相关性崩溃」。

对策:用压力场景下的相关性矩阵。我曾在2018年做过测试,正常时期相关性0.3的资产,危机时能飙到0.8。

最后说一句:参数法VaR是个好工具,但别迷信它。我见过太多人把VaR当成了「风险上限」,结果亏得底朝天。记住,VaR只是告诉你「大概率不会亏超过这个数」,但那个「小概率」一旦发生,可能就是灭顶之灾。

我的原则:参数法VaR + 压力测试 + 情景分析,三者缺一不可。单腿走路,迟早摔跤。

专注资料整理