2. VaR 计算方法概述
在金融风险管理中,VaR(Value at Risk,风险价值)是衡量在特定置信水平和持有期内,资产组合可能遭受的最大预期损失。计算 VaR 的核心在于对资产收益率分布进行建模。根据对分布假设和处理方式的不同,主流方法分为三类:参数法、历史模拟法和蒙特卡洛模拟法。本章将系统阐述这三种方法的原理、计算步骤、适用场景及核心差异。
2.1 参数法(方差-协方差法)
参数法假设资产收益率服从某种已知的概率分布(通常为正态分布),通过估计分布的参数(均值、方差、协方差)来直接计算 VaR。其核心在于“参数化”风险因子。
2.1.1 核心假设与公式
- 正态分布假设:资产收益率 \( R \sim N(\mu, \sigma^2) \)。
- 线性映射:组合价值变化与风险因子变化呈线性关系。
- VaR 计算公式:\( VaR = - ( \mu \cdot \Delta t + z_{\alpha} \cdot \sigma \cdot \sqrt{\Delta t} ) \cdot P \),其中 \( z_{\alpha} \) 为标准正态分布下置信水平 \( \alpha \) 对应的分位数(如 95% 对应 1.645,99% 对应 2.326),\( P \) 为组合当前价值。
2.1.2 计算步骤
- 识别风险因子:确定影响组合价值的市场变量(如利率、汇率、股价)。
- 估计参数:计算各风险因子的历史收益率均值 \( \mu \) 和方差-协方差矩阵 \( \Sigma \)。
- 计算组合波动率:\( \sigma_p = \sqrt{ \mathbf{w}^T \Sigma \mathbf{w} } \),其中 \( \mathbf{w} \) 为权重向量。
- 代入公式:根据持有期和置信水平计算 VaR。
优点:计算速度快,仅需一阶矩和二阶矩;易于解析求解。
缺点:对“厚尾”分布失效;无法处理非线性风险(如期权)。
缺点:对“厚尾”分布失效;无法处理非线性风险(如期权)。
2.2 历史模拟法
历史模拟法是一种非参数方法,它不假设任何特定的分布形式,而是直接使用历史收益率数据来模拟未来可能的变化。其核心思想是“历史会重演”。
2.2.1 核心原理
- 直接使用历史数据:将过去 N 个交易日的实际收益率序列作为未来可能的情景。
- 排序分位数:将历史损益值按从小到大排序,取第 \( (1-\alpha) \times N \) 个分位数作为 VaR 估计值。
- 无需分布假设:完全依赖经验分布,能自然捕捉厚尾、自相关等真实市场特征。
2.2.2 计算步骤
- 收集历史数据:获取风险因子过去 N 天的日收益率序列。
- 计算情景损益:将当前头寸映射到每个历史收益率情景,得到 N 个模拟损益值。
- 排序:将 N 个损益值从小到大排序。
- 取分位数:例如 95% 置信水平下,取排序后第 \( 0.05 \times N \) 个位置的损益值(负值)作为 VaR。
实践要点:历史模拟法对数据窗口长度敏感。窗口过短(如 250 天)可能导致 VaR 估计不稳定;窗口过长(如 1000 天)可能包含过时的市场结构信息。通常建议使用 500~750 个交易日。
2.3 蒙特卡洛模拟法
蒙特卡洛模拟法是一种随机模拟方法,它通过假设风险因子的随机过程(如几何布朗运动),生成大量可能的未来路径,从而构建损益分布。它是最灵活但计算成本最高的方法。
2.3.1 核心原理
- 随机过程假设:通常假设资产价格服从几何布朗运动:\( dS = \mu S dt + \sigma S dW \),其中 \( dW \) 为维纳过程。
- 大量模拟:生成数千至数万条随机路径,每条路径对应一个未来损益情景。
- 分布构建:将所有情景的损益值汇总,形成经验分布,再取分位数得到 VaR。
2.3.2 计算步骤
- 设定随机模型:选择风险因子的随机过程并估计参数(\( \mu, \sigma \))。
- 生成随机序列:使用伪随机数生成器(如 Mersenne Twister)模拟 \( dW \),并递推计算未来价格路径。
- 计算路径损益:对每条路径,计算期末组合价值与当前价值的差值。
- 汇总与排序:将所有路径的损益值排序,取对应置信水平的分位数。
注意事项:蒙特卡洛模拟的精度取决于模拟次数。通常至少需要 10,000 次模拟才能获得稳定估计。此外,随机数质量(低差异序列 vs 伪随机数)会直接影响结果可靠性。
2.4 三种方法对比
| 对比维度 | 参数法 | 历史模拟法 | 蒙特卡洛模拟法 |
|---|---|---|---|
| 分布假设 | 正态分布(或 t 分布) | 无(经验分布) | 随机过程(如 GBM) |
| 计算速度 | 极快 | 快 | 慢(需大量模拟) |
| 厚尾处理 | 差(正态假设下低估尾部风险) | 好(自然捕捉历史厚尾) | 较好(可通过跳跃扩散模型改进) |
| 非线性风险 | 不支持(线性近似) | 支持(全值重估) | 支持(全值重估) |
| 数据需求 | 均值、方差、协方差 | 历史收益率序列 | 随机过程参数 |
| 典型应用 | 线性组合、快速风控 | 监管资本计算(巴塞尔协议) | 复杂衍生品、压力测试 |
2.5 方法选择流程图
下图展示了在实际风控场景中,如何根据组合特征和计算资源选择最合适的 VaR 计算方法。
2.6 三种方法的数学表达对比
以下代码片段展示了三种方法在 Python 中的核心计算逻辑,便于理解其数学本质。
import numpy as np
from scipy.stats import norm
# 示例数据:假设组合当前价值 P=1e6,日收益率均值 mu=0.0005,日波动率 sigma=0.02
P = 1e6
mu = 0.0005
sigma = 0.02
confidence = 0.95
z = norm.ppf(1 - confidence) # 95% 置信水平下 z = -1.645
# 1. 参数法 VaR
VaR_param = - (mu + z * sigma) * P
print(f"参数法 VaR (95%): {VaR_param:.2f}")
# 2. 历史模拟法(假设有 500 个历史日收益率数据)
np.random.seed(42)
historical_returns = np.random.normal(mu, sigma, 500) # 模拟历史数据
historical_PnL = historical_returns * P
historical_PnL_sorted = np.sort(historical_PnL)
index = int((1 - confidence) * len(historical_PnL_sorted))
VaR_hist = -historical_PnL_sorted[index]
print(f"历史模拟法 VaR (95%): {VaR_hist:.2f}")
# 3. 蒙特卡洛模拟法(模拟 10000 条路径)
n_simulations = 10000
dt = 1 # 1 天持有期
random_shocks = np.random.normal(0, sigma * np.sqrt(dt), n_simulations)
simulated_returns = mu * dt + random_shocks
simulated_PnL = simulated_returns * P
simulated_PnL_sorted = np.sort(simulated_PnL)
VaR_mc = -simulated_PnL_sorted[int((1 - confidence) * n_simulations)]
print(f"蒙特卡洛模拟法 VaR (95%): {VaR_mc:.2f}")
关键理解:参数法本质是解析解,历史模拟法是经验分位数,蒙特卡洛法是数值模拟分位数。三者的核心差异在于“如何生成损益分布”——参数法用公式生成,历史模拟法用历史数据生成,蒙特卡洛法用随机过程生成。