2. VaR计算实战:使用Python计算单资产VaR(正态分布假设)
2.1 正态分布假设下的VaR公式
在金融风控中,若假设资产收益率服从正态分布,VaR的计算可简化为一个解析表达式。这是最基础的参数法VaR,也是后续流式归因的起点。
| 参数 | 符号 | 说明 |
|---|---|---|
| 置信水平 | α | 通常取 95% 或 99% |
| 分位数 | zα | 标准正态分布下对应置信水平的分位数(95% → 1.645,99% → 2.326) |
| 持有期 | T | 以天为单位,通常 T=1 |
| 日收益率均值 | μ | 样本期内日收益率算术平均 |
| 日收益率标准差 | σ | 样本期内日收益率样本标准差 |
| 当前资产市值 | V | 持仓名义本金或市值 |
单资产VaR计算公式(正态分布假设):
VaR(α, T) = V × (μ × T + z_α × σ × √T)
当 T=1 且 μ 近似为 0 时,简化为:
VaR(α) = V × z_α × σ
实务提示: 日频数据下 μ 通常远小于 σ,许多量化团队直接取 μ=0 计算相对VaR,避免均值估计误差对尾部风险的干扰。
2.2 Python代码实现:从数据到VaR
以下代码演示了完整的单资产VaR计算流程:获取价格序列 → 计算日收益率 → 估计参数 → 输出VaR值。
import numpy as np
import pandas as pd
import yfinance as yf
# 1. 获取数据
ticker = "AAPL"
data = yf.download(ticker, start="2023-01-01", end="2024-12-31")
prices = data["Adj Close"]
# 2. 计算日对数收益率
log_returns = np.log(prices / prices.shift(1)).dropna()
# 3. 估计参数
mu = log_returns.mean() # 日收益率均值
sigma = log_returns.std() # 日收益率标准差
current_price = prices.iloc[-1]
# 4. 设置VaR参数
confidence_level = 0.95
z_score = np.percentile(np.random.standard_normal(100000), confidence_level * 100)
# 或直接使用:z_score = 1.645
# 5. 计算VaR(持有期1天,假设μ=0)
VaR_1d_95 = current_price * z_score * sigma
# 6. 输出结果
print(f"=== {ticker} 单资产VaR(正态分布假设)===")
print(f"当前价格: {current_price:.2f}")
print(f"日收益率标准差: {sigma*100:.4f}%")
print(f"95%置信水平1天VaR: {VaR_1d_95:.2f} 美元")
print(f"VaR占市值比例: {VaR_1d_95/current_price*100:.2f}%")
代码要点:
- 使用对数收益率而非简单收益率,保证收益率分布更接近正态假设。
- z_score 可通过查表或蒙特卡洛模拟生成标准正态分位数获得。
- 实际生产中建议使用滑动窗口(如252天)滚动计算VaR,而非固定样本。
2.3 结果解读与校验
假设上述代码输出结果为:
=== AAPL 单资产VaR(正态分布假设)===
当前价格: 192.53
日收益率标准差: 1.2345%
95%置信水平1天VaR: 3.91 美元
VaR占市值比例: 2.03%
解读要点:
- 绝对VaR(3.91美元): 在95%置信水平下,持有1天该资产的最大预期损失不超过3.91美元。
- 相对VaR(2.03%): 相对于当前市值的损失比例,便于跨资产比较。
- 正态假设的局限性: 实际金融收益率常呈现尖峰厚尾特征,正态分布会低估极端损失。
| 校验维度 | 方法 | 预期结果 |
|---|---|---|
| 回测检验 | 统计历史数据中实际损失超过VaR的天数占比 | 应接近 5%(95%置信水平) |
| 正态性检验 | Jarque-Bera 检验或 Q-Q 图 | 若p值<0.05,拒绝正态假设 |
| 敏感性分析 | 改变置信水平(95%→99%)观察VaR变化 | VaR应显著增大(约1.4倍) |
风险提示: 正态分布VaR在极端行情(如2020年3月、2022年加息周期)下会严重低估尾部风险。建议同时计算历史模拟法VaR或Cornish-Fisher扩展VaR作为对照。
2.4 实战避坑指南
- 收益率选择: 优先使用对数收益率,其分布更接近正态,且具有时间可加性。
- 样本窗口长度: 过短(<60天)导致σ估计不稳定;过长(>5年)可能包含已失效的市场结构。建议252天(约1年交易日)。
- 均值处理: 日频μ通常不显著,建议直接设μ=0计算相对VaR,避免引入估计误差。
- 分位数精度: 使用scipy.stats.norm.ppf(0.95) 而非查表,保证精度与可复现性。
- 单位一致性: 确保VaR的时间单位与σ的时间单位匹配(日VaR对应日σ)。