4. 历史模拟法VaR:经验分布构建、排序与分位数提取、优缺点分析
历史模拟法(Historical Simulation, HS)是计算VaR最直观的非参数方法。它不假设资产收益服从任何特定分布(如正态分布),而是直接使用历史收益数据来模拟未来的可能损益分布。其核心思想是:历史会重演,过去一段时间的收益变化模式,可以作为预测未来风险的基础。
4.1 经验分布构建
构建经验分布是历史模拟法的第一步。我们需要收集资产或组合在历史观测期内的每日收益率序列。
核心步骤: 将历史收益率按时间顺序排列,每个历史收益率都被视为未来可能发生的一个“情景”。这些情景共同构成了未来的经验分布。
假设我们有一个包含 N 个历史收益率的样本:r1, r2, ..., rN。对于当前投资组合价值 V0,每个历史情景对应的模拟损益为:
ΔV_i = V_0 × r_i (对于 i = 1, 2, ..., N)
这 N 个模拟损益值 ΔV1, ΔV2, ..., ΔVN 就构成了未来损益的经验分布。这个分布没有预设的数学形式,完全由历史数据驱动。
4.2 排序与分位数提取
得到经验分布后,我们需要从中提取特定置信水平下的VaR值。这通过排序和分位数提取完成。
- 排序: 将 N 个模拟损益值 ΔVi 从小到大(即从最坏到最好)进行排序,得到排序后的序列:ΔV(1) ≤ ΔV(2) ≤ ... ≤ ΔV(N)。
- 确定分位数位置: 对于置信水平 c(例如 95% 或 99%),VaR对应的是左侧尾部的第 (1-c) 分位数。分位数位置 k 的计算公式为:
其中 floor 表示向下取整,ceil 表示向上取整。不同的取整方法会导致VaR值略有差异。k = floor((1 - c) × N) 或 k = ceil((1 - c) × N) - 提取VaR: 排序后序列中第 k 个最小的损益值即为VaR:
通常VaR以正数表示损失,因此取负号。例如,如果排序后第50个最小的损益是 -100万元,那么95%的VaR就是100万元。VaR(c) = -ΔV_(k)
示例: 假设有 N=1000 个历史损益数据,置信水平 c=99%。则 (1-c)×N = 0.01×1000 = 10。VaR(99%) 就是排序后第10个最差的损益值的绝对值。
下表总结了不同置信水平下,分位数位置的确定方法:
| 置信水平 (c) | 尾部概率 (1-c) | 样本量 (N) | 分位数位置 (k) | VaR提取 |
|---|---|---|---|---|
| 95% | 5% | 500 | 25 (0.05×500) | -ΔV(25) |
| 99% | 1% | 1000 | 10 (0.01×1000) | -ΔV(10) |
| 99.5% | 0.5% | 2000 | 10 (0.005×2000) | -ΔV(10) |
4.3 历史模拟法VaR流程图
下图展示了历史模拟法计算VaR的完整流程:
4.4 优缺点分析
历史模拟法因其简单直观而广受欢迎,但也存在明显的局限性。下表对其优缺点进行了系统对比:
| 维度 | 优点 | 缺点 |
|---|---|---|
| 模型假设 | 无需假设收益分布形态,完全由数据驱动,能捕捉厚尾、偏斜等真实特征 | 隐含假设“历史会重演”,无法预测结构性变化或从未发生过的极端事件 |
| 计算实现 | 计算简单,易于理解和实现,无需复杂的参数估计 | 需要大量历史数据(通常至少250-500个观测值),数据存储和排序计算成本较高 |
| 尾部风险 | 能够自然反映历史中的极端损失,无需额外处理尾部 | 尾部估计完全依赖于历史样本中是否包含极端事件;若历史期未发生“黑天鹅”,VaR会严重低估风险 |
| 时效性 | 对市场波动变化有一定适应性(通过滚动窗口更新数据) | 对近期市场变化反应迟钝,等权重处理所有历史数据,旧数据可能稀释近期波动信息 |
| 分位数稳定性 | 分位数提取方法直接,结果可重复 | VaR估计值对样本区间选择敏感,不同起始点可能导致结果差异较大;分位数位置取整方式也会影响结果 |
4.5 历史模拟法的关键局限与改进方向
历史模拟法的主要局限在于其对历史数据的“等权重”处理和尾部数据稀疏性问题。下图展示了这些局限以及常见的改进思路:
实践警示: 在使用历史模拟法时,务必检查历史数据是否覆盖了完整的市场周期(包括牛市、熊市和危机时期)。如果历史窗口恰好处于低波动期,VaR会系统性低估真实风险。建议至少使用3-5年的日度数据,并定期回测验证VaR模型的准确性。
4.6 代码实现示例
以下Python代码展示了如何使用历史模拟法计算单个资产的VaR:
import numpy as np
import pandas as pd
def historical_var(returns, confidence_level=0.95):
"""
使用历史模拟法计算VaR
参数:
returns: 历史收益率序列 (numpy array 或 pandas Series)
confidence_level: 置信水平,默认95%
返回:
VaR值 (正数表示损失)
"""
# 假设当前投资组合价值为1,计算模拟损益
simulated_pnl = returns
# 对损益从小到大排序
sorted_pnl = np.sort(simulated_pnl)
# 确定分位数位置
n = len(sorted_pnl)
index = int(np.ceil((1 - confidence_level) * n)) - 1
index = max(0, index) # 确保索引非负
# 提取VaR
var = -sorted_pnl[index]
return var
# 示例:使用1000个模拟收益率数据
np.random.seed(42)
# 生成具有厚尾特征的t分布收益率
returns = np.random.standard_t(df=3, size=1000) * 0.01
var_95 = historical_var(returns, 0.95)
var_99 = historical_var(returns, 0.99)
print(f"95% VaR (历史模拟法): {var_95:.4f}")
print(f"99% VaR (历史模拟法): {var_99:.4f}")
历史模拟法作为VaR计算的基准方法,其非参数特性使其在金融风控实践中具有不可替代的地位。理解其构建逻辑、分位数提取机制以及内在局限,是进一步学习加权历史模拟法、蒙特卡洛模拟等高级方法的基础。