第2章:VaR的数学原理:概率论基础、分位数概念、置信区间与持有期的选择
聊到VaR,很多人第一反应是「算个数字嘛」。但说实话,如果不懂背后的数学原理,你算出来的VaR可能就是个摆设。我在刚入行时也犯过这个错——拿着Excel一拉,95%分位数出来了,结果风控委员会一问「你这个置信区间为什么选95%而不是99%?」我当场就卡壳了。
所以这一章,咱们把VaR的数学底裤扒干净。你想想看,VaR本质上问的是:「在给定的概率下,我最多亏多少钱?」 就这么简单。但要把这句话翻译成数学语言,就需要三个核心概念:概率论、分位数、置信区间与持有期。
核心公式: VaR = -F-1(1-α) × σ × √T
其中 F-1 是分位数函数,α 是置信水平,σ 是波动率,T 是持有期。
2.1 概率论基础:VaR的底层语言
概率论说白了就是描述「不确定性」的数学工具。VaR的核心假设是:你的资产收益率服从某个概率分布。最常见的假设是正态分布——虽然现实中金融数据往往有厚尾,但正态分布是入门的最佳选择。
我记得有一次做压力测试,团队里有人直接用正态分布算VaR,结果回测时发现实际亏损超过VaR的次数比理论值多了两倍。为什么?因为市场暴跌时,尾部风险远大于正态分布的预测。这就是概率分布选择的重要性。
几个关键概念你得刻在脑子里:
- 概率密度函数(PDF):描述收益率在每个取值上的可能性。正态分布的PDF像个钟形曲线。
- 累积分布函数(CDF):描述收益率小于等于某个值的概率。VaR就是从这个函数反推出来的。
- 期望与方差:期望是平均收益,方差是波动程度。VaR直接跟方差挂钩。
我的经验: 别一上来就用复杂分布。先用正态分布跑通流程,再逐步替换成t分布或经验分布。这样调试时心里有底。
2.2 分位数概念:VaR的「切蛋糕」逻辑
分位数,说白了就是「把数据切成几块,看某一块的边界在哪」。比如95%分位数,意思是「有95%的数据小于这个值,5%的数据大于这个值」。VaR取的就是这个边界值——只不过我们关心的是亏损端,所以通常取左侧分位数。
举个例子:假设你持有某股票,日收益率的历史数据如下:
import numpy as np
# 模拟1000个日收益率(正态分布)
np.random.seed(42)
returns = np.random.normal(0.001, 0.02, 1000)
# 计算95%分位数(左侧)
var_95 = np.percentile(returns, 5) # 注意:5%分位数对应95%置信水平
print(f"95% VaR(日):{var_95:.4f}")
# 输出:95% VaR(日):-0.0312
# 解读:有95%的概率,日亏损不超过3.12%
为什么会用5%分位数而不是95%?因为VaR关注的是「最差的5%情况」的边界。你想想看,如果我说「95%置信水平下VaR为-3.12%」,意思就是「100天里,最多有5天亏损超过3.12%」。
注意: 分位数计算对数据量敏感。样本太少时,分位数估计会很不稳定。我建议至少用250个交易日(约1年)的数据。
2.3 置信区间与持有期的选择
这两个参数是VaR建模中最「艺术」的部分。为什么?因为它们没有标准答案,完全取决于你的业务场景。
置信区间:95% vs 99%
置信区间决定了你「容忍」多大的尾部风险。95%意味着你接受5%的例外情况,99%则只接受1%。听起来99%更安全,对吧?但代价是VaR值会更大——因为你要覆盖更极端的亏损。
| 置信水平 | 分位数位置 | VaR值(示例) | 例外频率(250天) |
|---|---|---|---|
| 95% | 5% | -3.12% | 约12.5天 |
| 99% | 1% | -4.65% | 约2.5天 |
| 99.5% | 0.5% | -5.15% | 约1.25天 |
我在项目中遇到过一件事:某基金公司用99% VaR做风控,结果一年内发生了3次例外——理论上应该只有2.5次。虽然偏差不大,但董事会不干了,觉得模型有问题。后来我们改成了95% VaR做日常监控,99% VaR做压力测试,两边都满意。
持有期:1天 vs 10天 vs 1个月
持有期越长,VaR越大——因为时间给了市场更多「折腾」的空间。巴塞尔协议要求银行用10天持有期计算市场风险VaR,但实际操作中,很多机构先用1天VaR再乘以√10来近似。
为什么是√T?因为假设收益率独立同分布,方差随时间线性累加,标准差就是√T倍。但注意:这个假设在现实中经常不成立——市场有自相关性,有波动率聚集效应。
# 不同持有期的VaR对比
def var_holding_period(vol_daily, holding_days, confidence=0.95):
from scipy.stats import norm
z = norm.ppf(1 - confidence) # 分位数
var = -z * vol_daily * np.sqrt(holding_days)
return var
vol = 0.02 # 日波动率2%
for days in [1, 5, 10, 20]:
v = var_holding_period(vol, days, 0.95)
print(f"{days}天持有期 VaR(95%): {v:.4f}")
# 输出:
# 1天持有期 VaR(95%): -0.0329
# 5天持有期 VaR(95%): -0.0736
# 10天持有期 VaR(95%): -0.1041
# 20天持有期 VaR(95%): -0.1472
避坑指南: 我曾经直接用√T把1天VaR换算成10天VaR,结果回测时发现实际风险被低估了15%。为什么?因为市场在10天内可能发生趋势性变化,而独立同分布假设忽略了这一点。所以,如果条件允许,直接用10天的收益率数据计算,别偷懒。
2.4 知识体系总览
下面这张图把本章的核心逻辑串起来了。你可以看到,VaR的数学原理其实就三条线:概率分布决定形状,分位数决定切割点,置信区间和持有期决定参数选择。
2.5 实战中的选择逻辑
说了这么多理论,最后给点实在的。你在实际项目中怎么选这些参数?
- 监管要求优先:巴塞尔协议、银保监会的规定是硬约束。银行做市场风险VaR,必须用99%置信水平、10天持有期。
- 业务场景决定:交易部门看日VaR,投资组合看周VaR或月VaR。别拿日VaR去管长期持仓,那会低估风险。
- 数据质量兜底:如果数据只有1年,别硬算99.9% VaR——样本太少,分位数估计方差太大。我一般要求至少3年数据才敢用99%置信水平。
一句话总结: VaR的数学原理不复杂,复杂的是参数选择背后的业务判断。概率论给你工具,分位数给你方法,置信区间和持有期给你场景——三者缺一不可。