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,避免均值估计误差对尾部风险的干扰。
正态分布假设下的VaR示意图(95%置信水平) VaR 阈值 μ(均值) 损失 关键解读 • 左尾面积 = 5% • VaR = 均值 - 1.645σ • 表示95%概率下最大损失

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作为对照。
单资产VaR计算流程(正态分布假设) ① 获取价格序列 ② 计算日收益率 ③ 估计 μ, σ ④ 计算VaR 输出:VaR值 + 占比 用于风控限额与归因分析 流式决策扩展点 • 步骤③④可改为滑动窗口增量更新,实现逐Tick VaR重算 • 步骤④可拆解为各风险因子贡献,实现VaR归因

2.4 实战避坑指南

  • 收益率选择: 优先使用对数收益率,其分布更接近正态,且具有时间可加性。
  • 样本窗口长度: 过短(<60天)导致σ估计不稳定;过长(>5年)可能包含已失效的市场结构。建议252天(约1年交易日)。
  • 均值处理: 日频μ通常不显著,建议直接设μ=0计算相对VaR,避免引入估计误差。
  • 分位数精度: 使用scipy.stats.norm.ppf(0.95) 而非查表,保证精度与可复现性。
  • 单位一致性: 确保VaR的时间单位与σ的时间单位匹配(日VaR对应日σ)。