halo 的技术博客

返回

为什么需要风险度量?#

在量化投资中,收益只是硬币的一面,风险才是另一面。一个策略即使有再高的预期收益,如果风险失控,也可能在一夜之间灰飞烟灭。

2008年金融危机中,无数”稳健”的量化基金爆仓,根本原因就是低估了极端风险。传统的波动率指标无法捕捉”黑天鹅”事件,而**VaR(风险价值)和CVaR(条件风险价值)**正是为了解决这个问题而生。

VaR:风险价值的直观理解#

什么是VaR?#

**VaR(Value at Risk,风险价值)**回答的是一个简单的问题:

“在正常的市场条件下,我在95%或99%的置信水平下,未来一天/一周/一月最多会亏多少钱?”

举个例子

  • 你的投资组合VaR(95%, 1天) = 10万元
  • 含义:在95%的情况下,明天你的损失不会超过10万元
  • 换句话说:有5%的概率,明天的损失会超过10万元

VaR的三种计算方法#

1. 历史模拟法(Historical Simulation)#

核心思想:用过去的实际收益率分布来预测未来风险。

计算步骤

  1. 收集过去1000个交易日的收益率数据
  2. 将这些收益率从低到高排序
  3. 找到第5百分位数(95%置信水平)或第1百分位数(99%置信水平)

Python实现

优点

  • 简单直观,不需要假设收益率分布
  • 能捕捉非正态分布的特征(如肥尾)

缺点

  • 假设”未来会重复过去”,对结构性变化不敏感
  • 需要大量历史数据(至少3-5年)

2. 参数法(Parametric / Delta-Normal)#

核心思想:假设收益率服从某个人知分布(通常是正态分布),用均值和方差来计算VaR。

计算公式(正态分布假设):

VaR(α%, t天) = -μ_t + z_α * σ_t
plaintext

其中:

  • μ_t = t天的预期收益率
  • σ_t = t天的波动率
  • z_α = 标准正态分布的α%分位数(如95%对应1.645,99%对应2.33)

Python实现

优点

  • 计算速度快
  • 可以轻松调整持有期(√t法则)

缺点

  • 致命缺陷:假设正态分布,低估肥尾风险
  • 对均值和方差的估计误差敏感

3. 蒙特卡洛模拟法(Monte Carlo Simulation)#

核心思想:用随机模拟生成成千上万种可能的市场情景,再计算分位数。

计算步骤

  1. 假设收益率服从某个随机过程(如几何布朗运动、GARCH等)
  2. 用历史数据估计模型参数
  3. 模拟10,000次未来的收益率路径
  4. 计算模拟收益率的分位数

Python实现(几何布朗运动):

优点

  • 可以模拟各种复杂的收益分布和依赖结构
  • 能处理非线性资产(如期权)

缺点

  • 计算成本高
  • 结果依赖于模型假设(垃圾进,垃圾出)

VaR的致命缺陷:不捕捉尾部风险#

尽管VaR被广泛使用,但它有一个致命缺陷

VaR只告诉你”最坏情况下会亏多少”,但不告诉你”如果超过VaR会亏多少”

举个例子:

  • 组合A:99%概率亏1万,1%概率亏2万 → VaR(99%) = 1万
  • 组合B:99%概率亏1万,1%概率亏100万 → VaR(99%) = 1万

两个组合的VaR一样,但风险完全不同!

这就是为什么2008年金融危机中,许多银行的VaR模型”正常”,但却遭遇了远超VaR的损失。

CVaR:捕捉极端风险#

什么是CVaR?#

CVaR(Conditional Value at Risk,条件风险价值),也称为期望损失(Expected Shortfall),回答的是:

“当损失超过VaR时,平均会亏多少钱?”

数学定义

CVaR_α = E[L | L > VaR_α]
plaintext

其中L是损失,VaR_α是α%置信水平的VaR。

直观理解

  • VaR是”门槛”:95%的情况下,损失不会超过这个门槛
  • CVaR是”平均超量损失”:当损失超过门槛时,平均会亏多少

CVaR的计算#

历史模拟法计算CVaR#

为什么CVaR比VaR更好?#

  1. 捕捉尾部风险:CVaR考虑了超过VaR的极端损失
  2. 次可加性(Subadditivity):满足风险度量的数学性质,更符合分散化降低风险的直觉
  3. 监管认可:巴塞尔协议III已经开始推荐CVaR

对比示例

# 比较两个组合的风险
portfolio_a = np.random.normal(-0.0005, 0.01, 1000)  # 稳健组合
portfolio_b = np.random.normal(-0.0005, 0.01, 980).tolist() + \
              np.random.normal(-0.05, 0.05, 20).tolist()  # 有极端损失

print("组合A:")
print(f"  VaR(95%) = {historical_var(portfolio_a, 0.95):.4f}")
print(f"  CVaR(95%) = {historical_cvar(portfolio_a, 0.95):.4f}")

print("\n组合B:")
print(f"  VaR(95%) = {historical_var(portfolio_b, 0.95):.4f}")
print(f"  CVaR(95%) = {historical_cvar(portfolio_b, 0.95):.4f}")
python

输出会显示:组合B的CVaR显著高于A,但VaR可能相近

实战:用VaR/CVaR管理投资组合风险#

1. 仓位管理:基于VaR的仓位计算#

核心思想:不是用固定比例仓位,而是用”风险预算”来分配仓位。

计算方法

2. 组合VaR:分散化的力量#

关键问题:组合VaR ≠ 各资产VaR之和

3. 回测VaR模型:失败率检验#

核心思想:一个好的VaR模型,其”突破次数”(实际损失超过VaR的天数)应该接近理论值。

Kupiec检验(失败率检验)

进阶:VaR/CVaR的局限与改进#

1. 肥尾修正:t分布VaR#

2. 时变波动率:GARCH-VaR#

3. 极值理论(EVT):捕捉极端肥尾#

实盘应用:风险管理框架#

1. 多层次风险限额#

2. 动态止损:基于CVaR的止损线#

3. 压力测试:极端情景下的VaR#

总结:VaR/CVaR最佳实践#

1. 选择哪种VaR?#

方法适用场景优点缺点
历史模拟法常规风险管理简单,捕捉肥尾对结构性变化不敏感
参数法快速估算计算快,可调整持有期低估肥尾
蒙特卡洛法复杂资产/非线性灵活,可模拟各种分布计算成本高
CVaR极端风险管理捕捉尾部,数学性质好计算复杂

推荐组合

  • 日常监控:历史模拟法VaR(95%)
  • 极端风险:CVaR(99%)
  • 压力测试:蒙特卡洛模拟

2. VaR/CVaR使用注意事项#

  1. 不要单独依赖VaR/CVaR:结合其他指标(最大回撤、夏普比率、胜率)
  2. 定期回测:检验VaR模型的准确性(突破率是否接近理论值)
  3. 考虑流动性:VaR假设可以按市价平仓,但实盘中可能有流动性风险
  4. 多时间维度:同时监控日VaR、周VaR、月VaR

3. 风险管理的铁律#

“VaR告诉你最坏情况下会亏多少,但记住:最坏情况往往会比你认为的更坏。”

因此:

  • VaR/CVaR是必要但不充分的风险管理工具
  • 永远留安全垫(如用1.5倍CVaR作为止损线)
  • 分散化是唯一”免费午餐”
  • 生存比收益更重要

下期预告:《风险平价策略中国实证:跨越美股的本土化改造》—— 风险平价策略在中国市场表现如何?需要做哪些改良?我们将用A股数据实证分析。

相关资源

希望这篇文章能帮你建立量化的风险标尺。记住:不懂风险的收益只是赌博,而懂得风险的收益才是投资。

VaR与CVaR风险度量:量化投资的风险标尺
https://blog.halo26812.eu.org/blog/2026-06-14-var-cvar-risk-model
Author halo
Published at 2026年6月14日
版权声明 CC BY-NC-SA 4.0
Comment seems to stuck. Try to refresh?✨