2. 风险度量指标:波动率、最大回撤、夏普比率、索提诺比率、卡尔玛比率、VaR、CVaR

做量化交易,说白了就是在跟不确定性打交道。你赚多少钱,取决于你扛住了多少风险。但风险这东西,看不见摸不着,怎么量化?

我个人习惯,先把风险拆成几个维度来看:波动有多大?回撤有多深?收益划不划算?极端情况下会亏多少? 这七个指标,就是回答这些问题的工具。

核心观点: 没有完美的单一指标。每个指标都有盲区,组合使用才能看清全貌。

2.1 波动率:最基础的“颠簸感”

波动率衡量的是价格变动的剧烈程度。数学上就是收益率的标准差。

为什么看它?因为波动越大,你持仓时的心跳越快,爆仓的概率也越高。我在做CTA策略时,遇到过一种情况:策略年化收益30%,但波动率高达40%。结果呢?实盘三个月,客户就受不了清盘了。收益再好,拿不住也是白搭。

计算方式:

import numpy as np

# 假设 daily_returns 是日收益率序列
daily_vol = np.std(daily_returns, ddof=1)
annual_vol = daily_vol * np.sqrt(252)  # 252个交易日

避坑指南: 我曾经用30天滚动窗口算波动率,结果遇到市场急跌,波动率瞬间飙升,策略直接停止交易。后来我改用指数加权移动平均(EWMA),让近期数据权重更大,反应更灵敏。

2.2 最大回撤:你最痛的那一刀

最大回撤,就是从净值最高点跌到最低点的幅度。它告诉你:在最坏的情况下,你会亏掉多少钱。

我个人觉得,这个指标比波动率更贴近真实感受。波动率是“平均颠簸”,最大回撤是“最惨的那次颠簸”。你想想看,账户从100万跌到60万,和从100万跌到80万,心理压力完全不是一个量级。

关键点:

  • 最大回撤是路径依赖的。同样的最终收益,回撤路径不同,体验天差地别。
  • 回撤修复时间也很重要。跌了50%,要涨100%才能回来。时间成本你扛得住吗?

注意: 最大回撤是一个历史统计值,不代表未来不会更大。我见过一个策略,回测最大回撤15%,实盘直接干到30%。为什么?因为市场结构变了,历史没包含那种极端情况。

2.3 夏普比率:收益与风险的“性价比”

夏普比率 = (策略收益率 - 无风险利率) / 波动率。它衡量的是:每承担一单位风险,能换来多少超额收益。

夏普比率大于1,算及格;大于2,算优秀;大于3,你就要怀疑是不是回测过拟合了。我见过有人把夏普做到5以上,结果实盘一塌糊涂。为什么?因为夏普比率对正态分布假设很敏感,而真实市场的收益率分布是尖峰厚尾的。

代码实现:

def sharpe_ratio(returns, risk_free_rate=0.03):
    excess_returns = returns - risk_free_rate / 252
    return np.sqrt(252) * np.mean(excess_returns) / np.std(excess_returns, ddof=1)

我的经验: 夏普比率高,不一定代表策略好。它只惩罚了“波动”,没惩罚“回撤”。一个策略如果经常小赚大亏,夏普可能还不错,但实盘你会亏得很惨。

2.4 索提诺比率:只惩罚“坏波动”

索提诺比率是夏普比率的改良版。它只把下行波动率(亏损时的波动)作为分母。上涨时的波动,它不管。

为什么这样改?因为上涨波动是好事啊!你想想看,一个策略天天涨5%,波动率很大,但你会不开心吗?夏普比率会惩罚这种“好波动”,索提诺不会。

计算公式:

def sortino_ratio(returns, risk_free_rate=0.03, target=0):
    downside_returns = returns[returns < target]
    downside_vol = np.std(downside_returns, ddof=1)
    excess_return = np.mean(returns) - risk_free_rate / 252
    return np.sqrt(252) * excess_return / downside_vol

个人习惯: 我一般把目标收益率设为0,只考虑亏损时的波动。这样更贴近“我不喜欢亏钱”的真实心理。

2.5 卡尔玛比率:回撤与收益的“性价比”

卡尔玛比率 = 年化收益率 / 最大回撤。它直接告诉你:每承受1%的回撤,能换来多少收益。

这个指标我特别喜欢,因为它直观。比如卡尔玛比率是3,意味着你每亏1块钱,能赚3块钱。听起来是不是很舒服?

对比一下:

指标 分母 关注点
夏普比率 总波动率 整体稳定性
索提诺比率 下行波动率 亏损时的稳定性
卡尔玛比率 最大回撤 最坏情况下的代价

注意: 卡尔玛比率对回撤时间窗口很敏感。如果最大回撤发生在早期,后期收益很高,卡尔玛会很好看。但如果你在回撤期入场,体验会很差。

2.6 VaR:在险价值

VaR回答的是:在95%(或99%)的置信水平下,未来一天(或一周)最大可能亏损是多少?

比如,日VaR(95%) = -2%,意思是有95%的概率,明天亏损不超过2%。听起来很美好,但问题来了:那剩下的5%呢?

我见过有人用VaR做风控,结果遇到2008年那种极端行情,VaR完全失效。因为VaR只告诉你“95%的情况”,没告诉你“那5%的极端情况有多极端”。

三种计算方法:

  • 参数法: 假设收益率服从正态分布,直接用均值和标准差算。简单,但假设太强。
  • 历史模拟法: 直接用过去N天的收益率排序,取第5%分位数。真实,但依赖历史数据。
  • 蒙特卡洛模拟: 随机生成大量路径,统计亏损分布。灵活,但计算量大。
# 历史模拟法计算VaR
def historical_var(returns, confidence=0.95):
    return np.percentile(returns, (1 - confidence) * 100)

避坑指南: 我曾经用参数法算VaR,结果遇到市场波动率突变,VaR严重低估了风险。后来我改用历史模拟法,并定期更新数据窗口,效果好了很多。

2.7 CVaR:条件在险价值

CVaR是VaR的升级版。它回答的是:当亏损超过VaR时,平均会亏多少?

比如,VaR(95%) = -2%,CVaR(95%) = -5%。意思是:在最坏的5%情况下,平均亏损是5%。这个指标比VaR更全面,因为它考虑了尾部风险。

我个人觉得,做风控一定要看CVaR。VaR告诉你“最坏情况的下限”,CVaR告诉你“最坏情况的平均水平”。两者结合,才能对极端风险有更清晰的认知。

代码实现:

def conditional_var(returns, confidence=0.95):
    var = historical_var(returns, confidence)
    tail_returns = returns[returns <= var]
    return np.mean(tail_returns)

我的经验: 在构建投资组合时,我通常用CVaR作为优化目标,而不是方差。因为CVaR能更好地控制尾部风险,避免“黑天鹅”事件带来的毁灭性打击。

2.8 知识体系总览

下面这张图,帮你理清这七个指标的关系:

风险度量指标 波动与回撤维度 收益风险比维度 尾部风险维度 波动率 最大回撤 夏普比率 索提诺比率 卡尔玛比率 VaR CVaR 使用建议 • 波动率 + 最大回撤:评估策略的“颠簸感”和“最坏情况” • 夏普 + 索提诺 + 卡尔玛:从不同角度衡量收益风险性价比 • VaR + CVaR:量化尾部风险,防范黑天鹅 • 组合使用,不要依赖单一指标!

嗯,这七个指标,每个都有它的用处,也都有它的局限。波动率告诉你平均颠簸,最大回撤告诉你最痛一刀,夏普比率看整体性价比,索提诺只罚坏波动,卡尔玛看回撤代价,VaR和CVaR盯住尾部风险。

我个人习惯,在策略评估时至少看三个指标:夏普比率、最大回撤、CVaR。一个看收益风险比,一个看最坏情况,一个看尾部风险。三者结合,基本能覆盖大部分风险场景。

最后提醒一句: 指标是工具,不是真理。再漂亮的指标,也抵不过市场的一次结构突变。保持敬畏,持续监控,才是风控的核心。


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