3. 风险度量指标:波动率、下行波动率、VaR、CVaR
风险度量,说白了就是回答一个问题:这笔交易到底可能亏多少?
我刚开始做量化那会儿,总觉得收益率高就是王道。直到有一次,一个策略回测年化30%,我兴冲冲上了实盘,结果三个月回撤了40%。嗯,从那以后,我再也不敢只看收益了。
今天咱们聊四个最常用的风险指标。它们就像体检报告里的几项关键数据,缺一不可。
核心观点: 波动率告诉你「抖不抖」,下行波动率告诉你「跌得狠不狠」,VaR告诉你「最坏情况亏多少」,CVaR告诉你「真倒霉了平均亏多少」。
3.1 波动率:最基础的「心跳」指标
波动率衡量的是收益率序列的离散程度。说白了,就是看你的净值曲线抖不抖。
计算公式:
# 日波动率
daily_vol = np.std(daily_returns)
# 年化波动率
annual_vol = daily_vol * np.sqrt(252)
我个人习惯用年化波动率来横向对比不同策略。比如策略A年化波动率15%,策略B是30%,那B的净值曲线看起来就像过山车。
避坑指南: 我曾经犯过一个低级错误——直接用日波动率乘以252。其实严格来说,应该用对数收益率计算。不过当收益率较小时,两者差异不大,实战中很多人直接用简单收益率。
3.2 下行波动率:只关心「坏」的波动
波动率有个问题:它把上涨和下跌都算作风险。但咱们做交易的,谁不喜欢上涨?
下行波动率只考虑收益率低于某个阈值(通常是0)的部分。这才是真正让人肉疼的波动。
计算逻辑:
# 只取负收益部分
negative_returns = returns[returns < 0]
# 下行波动率
downside_vol = np.std(negative_returns) * np.sqrt(252)
你想想看,一个策略如果上涨时波动大、下跌时波动小,那它的下行波动率就会远低于总波动率。这种策略,我个人比较喜欢。
注意: 下行波动率的计算有个细节——阈值可以自定义。比如你想更严格一点,可以设阈值为无风险利率。我在做债券策略时就这么干过,因为债券的基准收益本来就低。
3.3 VaR:在险价值
VaR回答的是:在95%(或99%)的置信水平下,未来N天最大可能亏损是多少?
举个例子:95% VaR = -2%,意思是有95%的把握,明天最多亏2%。
三种计算方法:
| 方法 | 原理 | 适用场景 |
|---|---|---|
| 参数法 | 假设收益率服从正态分布 | 快速估算,数据量小 |
| 历史模拟法 | 直接用历史收益率的分位数 | 数据充足,分布未知 |
| 蒙特卡洛法 | 随机模拟大量路径 | 复杂策略,需要压力测试 |
# 历史模拟法计算95% VaR
var_95 = np.percentile(returns, 5)
print(f"95% VaR: {var_95:.2%}")
实战经验: 我建议新手先用历史模拟法。参数法假设正态分布,但金融数据往往有厚尾特征(极端值比正态分布多)。历史模拟法虽然简单,但胜在真实。
3.4 CVaR:条件在险价值
VaR有个致命缺陷:它只告诉你「最坏情况」的边界,但没告诉你一旦突破这个边界,到底会亏多少。
CVaR弥补了这个缺陷。它计算的是:在VaR之外的尾部区域,亏损的平均值。
计算公式:
# 计算CVaR
var_threshold = np.percentile(returns, 5)
tail_returns = returns[returns <= var_threshold]
cvar = tail_returns.mean()
print(f"95% CVaR: {cvar:.2%}")
举个例子:95% VaR是-2%,但CVaR可能是-3.5%。这意味着,如果真的倒霉到那5%的情况里,平均要亏3.5%。
我的习惯: 做风控时,我同时看VaR和CVaR。VaR用来设止损线,CVaR用来评估策略的尾部风险。如果CVaR比VaR大很多,说明这个策略一旦亏起来,会亏得很惨。
3.5 四个指标的关系
咱们用一张图来理清它们的关系:
3.6 实战中的组合使用
这四个指标,单独看哪个都有局限。我一般这样用:
- 波动率:用来做仓位管理。波动率高的策略,仓位要轻。
- 下行波动率:用来筛选策略。下行波动率/波动率比值越小越好。
- VaR:用来设止损线。比如95% VaR是-2%,那止损可以设在-3%。
- CVaR:用来做压力测试。如果CVaR超过你能承受的亏损,这个策略就别上了。
重要提醒: 这些指标都是基于历史数据算出来的。历史会重演,但不会简单重复。我见过太多人把VaR当成了「绝对不会亏超过这个数」的保证——千万别这么想。
好了,风险度量这块就聊到这儿。记住一句话:不懂风险,就别谈收益。
公众号:蓝海资料掘金营,微信deep3321