3. 组合风险度量指标:定义与计算
组合风险度量是量化投资与风控的基石。本章聚焦五个核心指标:波动率、VaR、CVaR、最大回撤和跟踪误差。理解它们的定义、计算逻辑及适用场景,是后续进行人群切片与风险归因的前提。
3.1 指标概览与对比
五个指标从不同维度刻画组合风险:波动率衡量价格变动的离散程度;VaR与CVaR关注尾部损失;最大回撤反映极端下跌幅度;跟踪误差度量相对基准的偏离风险。
| 指标 | 核心含义 | 计算依赖 | 主要用途 |
|---|---|---|---|
| 波动率 (Volatility) | 收益率的标准差,衡量价格波动幅度 | 历史收益率序列 | 风险预算、资产配置 |
| VaR (Value at Risk) | 给定置信水平下,未来特定时期的最大可能损失 | 收益率分布假设或历史分位数 | 风险限额、资本计量 |
| CVaR (Conditional VaR) | 损失超过VaR时的平均损失,即尾部损失的期望 | 收益率分布尾部数据 | 尾部风险控制、压力测试 |
| 最大回撤 (Max Drawdown) | 从历史高点回落到低点的最大跌幅 | 净值曲线 | 评估极端下行风险、投资者体验 |
| 跟踪误差 (Tracking Error) | 组合收益率与基准收益率之差的标准差 | 组合与基准收益率序列 | 被动投资、指数增强、绩效归因 |
应用提示: 在人群切片复盘中,波动率与跟踪误差常用于衡量“稳定性”,而VaR/CVaR与最大回撤则聚焦“极端损失”。建议在分析不同客群时,同时使用这五类指标,形成立体风险画像。
3.2 波动率 (Volatility)
定义: 波动率通常指收益率的标准差,反映资产或组合价格围绕均值波动的离散程度。年化波动率是业界标准。
计算公式:
# 日收益率序列 r = [r1, r2, ..., rn]
# 日波动率 (样本标准差)
sigma_daily = sqrt( (1/(n-1)) * sum((ri - mean(r))^2) )
# 年化波动率 (假设252个交易日)
sigma_annual = sigma_daily * sqrt(252)
关键点:
- 波动率假设收益率服从正态分布,但实际金融数据常具有“尖峰厚尾”特征。
- 年化因子需根据数据频率调整:日频用√252,周频用√52,月频用√12。
- 在人群切片中,高波动率客群通常对应更高的换手率与交易成本。
3.3 VaR (Value at Risk)
定义: 在给定的置信水平(如95%、99%)和持有期(如1天、10天)下,组合可能遭受的最大预期损失。例如,95% VaR为-5%意味着有95%的把握,组合在下一个交易日损失不超过5%。
三种主流计算方法:
| 方法 | 原理 | 优点 | 缺点 |
|---|---|---|---|
| 参数法 (方差-协方差法) | 假设收益率服从正态分布,利用均值与标准差计算分位数 | 计算简单、速度快 | 对厚尾分布估计不足 |
| 历史模拟法 | 直接使用历史收益率序列的分位数作为VaR | 无需分布假设,保留真实尾部特征 | 依赖历史数据长度,对极端事件外推能力弱 |
| 蒙特卡洛模拟法 | 随机生成大量收益率路径,计算模拟分布的分位数 | 可处理非线性、复杂衍生品 | 计算量大,模型风险高 |
Python示例(历史模拟法):
import numpy as np
# 假设组合日收益率序列
returns = np.array([-0.02, 0.01, -0.015, 0.005, -0.03, 0.02, -0.01, 0.008, -0.025, 0.012])
confidence_level = 0.95
# 计算历史模拟VaR
var_historical = np.percentile(returns, (1 - confidence_level) * 100)
print(f"95% VaR (历史模拟): {var_historical:.4f}")
避坑指南: VaR不满足“次可加性”(Subadditivity),即组合的VaR可能大于各资产VaR之和,这违背了分散化降低风险的基本直觉。因此,在风险归因时,VaR不适合直接用于分解。此时应使用满足次可加性的CVaR。
3.4 CVaR (Conditional VaR)
定义: CVaR,又称期望损失(Expected Shortfall, ES),衡量损失超过VaR时的平均损失。它弥补了VaR无法度量尾部损失严重程度的缺陷。
计算公式:
# 给定收益率序列与置信水平
# 1. 计算VaR
var = np.percentile(returns, (1 - confidence_level) * 100)
# 2. 筛选所有小于VaR的损失(即尾部损失)
tail_losses = returns[returns <= var]
# 3. 计算尾部损失的均值
cvar = tail_losses.mean()
print(f"95% CVaR: {cvar:.4f}")
CVaR vs VaR 对比:
- VaR 回答“最坏情况下我能亏多少(在给定概率下)?”
- CVaR 回答“如果最坏情况发生,我平均会亏多少?”
- CVaR满足次可加性,适合用于组合风险分解与归因。
3.5 最大回撤 (Max Drawdown)
定义: 在选定周期内,组合净值从历史最高点回落到后续最低点的最大跌幅。它直观反映了投资者可能承受的最大浮亏。
计算步骤:
- 计算每日净值序列的累计最大值(Rolling High)。
- 计算每日回撤 = (当前净值 - 累计最大值) / 累计最大值。
- 最大回撤 = 所有回撤中的最小值(即最大跌幅)。
Python示例:
import numpy as np
# 假设净值序列
nav = np.array([1.00, 1.05, 1.02, 0.98, 1.03, 0.95, 0.92, 0.97, 1.01])
# 计算累计最大值
rolling_max = np.maximum.accumulate(nav)
# 计算回撤
drawdown = (nav - rolling_max) / rolling_max
# 最大回撤
max_drawdown = np.min(drawdown)
print(f"最大回撤: {max_drawdown:.4f} ({max_drawdown*100:.2f}%)")
人群切片应用: 在复盘不同客群时,最大回撤常与“持有期”结合分析。例如,某高换手客群虽然年化波动率不高,但最大回撤可能因集中持仓而显著放大。此时需进一步归因到行业或风格因子。
3.6 跟踪误差 (Tracking Error)
定义: 组合收益率与基准收益率之差(即超额收益)的标准差。它衡量组合相对于基准的偏离风险。
计算公式:
# 组合收益率序列 r_p,基准收益率序列 r_b
# 超额收益序列 e = r_p - r_b
# 跟踪误差 (年化)
tracking_error = np.std(e) * np.sqrt(252)
信息比率 (Information Ratio): 跟踪误差常与信息比率配合使用,衡量单位主动风险带来的超额收益。
# 信息比率 = 年化超额收益 / 年化跟踪误差
information_ratio = (np.mean(e) * 252) / tracking_error
跟踪误差的三种典型场景:
- 被动指数基金: 跟踪误差通常控制在0.5%以内,越低越好。
- 指数增强基金: 跟踪误差在1%-3%之间,追求适度偏离以获取超额收益。
- 主动管理基金: 跟踪误差可能超过5%,主动风险敞口较大。
3.7 风险度量指标关系图
下图展示了五个核心指标在风险度量体系中的位置与关联:波动率衡量整体离散度;VaR与CVaR聚焦左尾损失;最大回撤刻画极端下跌路径;跟踪误差度量相对风险。
3.8 指标选择与人群切片应用建议
在实际的人群切片复盘项目中,建议按以下逻辑组合使用上述指标:
| 分析目标 | 推荐指标组合 | 典型应用场景 |
|---|---|---|
| 整体风险水平评估 | 波动率 + 最大回撤 | 对比不同客群的持仓稳定性与极端下跌风险 |
| 尾部风险暴露 | VaR + CVaR | 识别高杠杆或集中持仓客群的潜在爆仓风险 |
| 主动管理能力评价 | 跟踪误差 + 信息比率 | 评估基金经理或策略团队的主动管理效率 |
| 风险预算与归因 | CVaR + 波动率 | 将组合风险分解到行业、风格或个股层面 |
实战要点: 在人群切片复盘中,不要孤立地看单一指标。例如,低波动率+高最大回撤的组合,往往暗示着“慢涨急跌”的风险结构,常见于流动性较差的资产或策略。此时应进一步结合持仓集中度与换手率进行归因。