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有三种主流方法:

  1. 参数法(方差-协方差法):假设收益率服从正态分布,直接用均值和标准差算。简单,但正态分布假设在金融数据里基本不成立。
  2. 历史模拟法:直接用过去N天的收益率排序,取第5%分位数。不依赖分布假设,但历史会重演吗?不一定。
  3. 蒙特卡洛模拟法:随机生成大量路径,模拟未来可能的价格走势。计算量大,但最灵活。

代码示例(历史模拟法):

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(条件在险价值) 尾部亏损的平均值 关注极端亏损 细化 量化尾部风险 补充 从左到右:风险度量越来越精细,越来越关注尾部风险 实际应用中,建议同时监控多个指标,不要只看一个

从这张图可以看得很清楚:最大回撤和波动率是「粗粒度」的风险度量,VaR和CVaR是「细粒度」的。我个人建议,做策略评估时至少看三个:最大回撤(底线)、波动率(日常波动)、CVaR(尾部风险)。三者结合,基本能覆盖大部分风险场景。

最后提醒一句:所有风险指标都是基于历史数据的。市场会变,风格会变,相关性也会变。我见过太多人死磕回测指标,结果实盘一塌糊涂。记住:风险指标是工具,不是真理。用它们来约束自己,而不是欺骗自己。


公众号:蓝海资料掘金营,微信deep3321