3、风险指标详解:最大回撤、波动率、下行波动率、VaR(在险价值)、CVaR(条件在险价值)
风险指标这东西,说白了就是量化策略的「体检报告」。你策略赚了多少固然重要,但怎么亏的、亏得有多惨,才是决定你能不能在这个市场活下去的关键。我个人习惯,看一个策略先不看收益,先扫一眼最大回撤和VaR——这两个要是不过关,收益再漂亮我也不敢实盘。
3.1 最大回撤(Max Drawdown)
最大回撤,是所有风险指标里最直观、最扎心的一个。它衡量的是:从历史高点跌到最低点,你最多亏了多少。
公式其实很简单:
Max Drawdown = max( (Peak - Trough) / Peak )
嗯,这里要注意:回撤不是从起点算的,是从每一个局部高点往下算。我见过不少新手把「从最高点到最低点的跌幅」当成最大回撤,其实不对——你得看每个波峰到波谷的跌幅,取最大值。
核心要点:
- 最大回撤是历史数据,不代表未来一定会发生,但它是策略风控的底线
- 回撤修复时间也很重要——跌了50%需要涨100%才能回来
- 我个人习惯,实盘策略的最大回撤控制在20%以内,超过这个数晚上睡不着
避坑指南:
我曾经见过一个策略,回测最大回撤只有8%,但实盘一个月就亏了15%。为什么?因为回测时用的是日线数据,忽略了盘中波动。后来我改成用1小时线甚至分钟线计算回撤,才真正看清了风险。
3.2 波动率(Volatility)
波动率,就是收益率的「震荡幅度」。你想想看,一个策略每天赚0.1%,另一个策略一天赚5%一天亏4%,虽然平均收益差不多,但后者你心脏受得了吗?
波动率通常用年化标准差来表示:
年化波动率 = 日收益率标准差 × √252
为什么用252?因为一年大概有252个交易日。这个数字是行业惯例,别问为什么不是365,问就是周末不开盘。
我自己的经验:
- 年化波动率 < 10%:低波动策略,适合大资金
- 年化波动率 10%-25%:中等波动,CTA策略常见
- 年化波动率 > 25%:高波动,小心脏慎入
注意:波动率只衡量「波动大小」,不区分上涨还是下跌。一个天天涨5%的策略,波动率也很高,但没人会嫌它风险大。所以,光看波动率是不够的——这就引出了下行波动率。
3.3 下行波动率(Downside Deviation)
下行波动率,说白了就是「只算亏钱时候的波动」。它把上涨的波动视为「好波动」,不纳入风险计算。这个指标比普通波动率更贴近真实风险感受。
计算方式:
下行波动率 = sqrt( (1/N) × Σ min(0, R_t - R_target)² )
其中R_target通常设为0,或者无风险利率。我个人习惯设成0,因为亏钱就是亏钱,别找借口。
举个例子:
| 日期 | 收益率 | 是否计入下行波动 |
|---|---|---|
| 第1天 | +2% | 否 |
| 第2天 | -1% | 是 |
| 第3天 | +3% | 否 |
| 第4天 | -2% | 是 |
你看,只有亏损的日子才参与计算。这样算出来的风险指标,更能反映你真正担心的东西——亏钱。
3.4 VaR(在险价值)
VaR,全称Value at Risk,翻译过来就是「在某个置信水平下,未来一段时间内可能的最大亏损」。比如95%置信水平的日VaR是2%,意思就是:有95%的概率,明天最多亏2%。
计算VaR有三种主流方法:
- 参数法(方差-协方差法):假设收益率服从正态分布,直接用均值和标准差算。简单,但正态分布假设在金融数据里基本不成立。
- 历史模拟法:直接用过去N天的收益率排序,取第5%分位数。不依赖分布假设,但历史会重演吗?不一定。
- 蒙特卡洛模拟法:随机生成大量路径,模拟未来可能的价格走势。计算量大,但最灵活。
代码示例(历史模拟法):
import numpy as np
def calculate_var(returns, confidence_level=0.95):
"""
计算历史模拟法VaR
"""
sorted_returns = np.sort(returns)
index = int((1 - confidence_level) * len(sorted_returns))
var = -sorted_returns[index]
return var
# 示例
daily_returns = np.random.normal(0.001, 0.02, 1000)
var_95 = calculate_var(daily_returns, 0.95)
print(f"95%置信水平日VaR: {var_95:.4f}")
我踩过的坑:
VaR有个致命缺陷——它只告诉你「最多亏多少」,但不告诉你「亏超过这个数的时候,平均会亏多少」。换句话说,VaR忽略了尾部风险。2008年金融危机时,很多银行的VaR模型显示风险可控,结果一夜之间就崩了。为什么?因为VaR没告诉你,那5%的极端情况里,亏损可能大到无法想象。
3.5 CVaR(条件在险价值)
CVaR,也叫Expected Shortfall(期望损失),就是专门来补VaR的窟窿的。它计算的是:当亏损超过VaR阈值时,这些亏损的平均值是多少。
公式:
CVaR = E[ Loss | Loss > VaR ]
说白了,VaR告诉你「最坏情况的下限」,CVaR告诉你「最坏情况的平均水平」。我个人更看重CVaR,因为它真正抓住了尾部风险。
代码示例:
def calculate_cvar(returns, confidence_level=0.95):
"""
计算历史模拟法CVaR
"""
sorted_returns = np.sort(returns)
index = int((1 - confidence_level) * len(sorted_returns))
tail_returns = sorted_returns[:index]
cvar = -np.mean(tail_returns)
return cvar
cvar_95 = calculate_cvar(daily_returns, 0.95)
print(f"95%置信水平日CVaR: {cvar_95:.4f}")
实战建议:
我一般同时看VaR和CVaR。如果两者差距很大,说明尾部风险很重,策略需要加保护。比如一个策略VaR是2%,CVaR是8%,那意味着一旦亏起来,平均要亏8%——这种策略我是不敢重仓的。
3.6 风险指标关系图
下面这张图,帮你理清这几个指标的关系:
从这张图可以看得很清楚:最大回撤和波动率是「粗粒度」的风险度量,VaR和CVaR是「细粒度」的。我个人建议,做策略评估时至少看三个:最大回撤(底线)、波动率(日常波动)、CVaR(尾部风险)。三者结合,基本能覆盖大部分风险场景。
最后提醒一句:所有风险指标都是基于历史数据的。市场会变,风格会变,相关性也会变。我见过太多人死磕回测指标,结果实盘一塌糊涂。记住:风险指标是工具,不是真理。用它们来约束自己,而不是欺骗自己。
公众号:蓝海资料掘金营,微信deep3321