4、量化风险指标:波动率、最大回撤、夏普比率、索提诺比率、卡玛比率、VaR与CVaR
做量化投资,说白了就是在风险和收益之间找平衡。
很多人一上来就盯着收益率看,觉得年化50%就是好策略。我刚开始做交易那会儿也这样,结果呢?回撤30%的时候心态直接崩了。后来我才明白——不懂风险控制,赚再多钱也是过路财神。
这一章,我们就来聊聊那些真正能帮你“避坑”的风险指标。每个指标我都亲手算过、用过、踩过坑,希望能帮你少走弯路。
核心观点:风险不是用来害怕的,是用来量化的。你只有把它变成数字,才能管理它。
4.1 波动率:最基础的“心跳监测器”
波动率衡量的是资产价格变动的剧烈程度。你可以把它想象成你的心率——正常范围是60-100,太高或太低都说明有问题。
年化波动率的计算公式:
年化波动率 = 日收益率标准差 × √252
为什么乘以√252?因为一年大约有252个交易日。我习惯用这个公式,简单直接。
我的经验:波动率不是越低越好。比如国债波动率低,但收益也低。关键是看你的风险承受能力。我个人习惯把年化波动率控制在15%-25%之间,这个区间比较舒服。
4.2 最大回撤:最让人“肉疼”的指标
最大回撤(MDD)衡量的是从净值最高点跌到最低点的幅度。说白了,就是你在最惨的时候亏了多少。
计算公式:
MDD = max( (Peak - Trough) / Peak )
举个例子:你的账户从100万涨到200万,然后跌到120万。那最大回撤就是(200-120)/200 = 40%。
避坑指南:我曾经犯过一个错误——只看最大回撤的数值,没看回撤持续的时间。一个策略回撤30%但只持续了2周,另一个回撤20%却持续了6个月。后者其实更折磨人。所以,我建议你同时关注“回撤恢复天数”。
4.3 夏普比率:最经典的“性价比”指标
夏普比率衡量的是每承担一单位风险,能获得多少超额收益。公式很简单:
夏普比率 = (策略年化收益率 - 无风险利率) / 年化波动率
无风险利率通常用国债收益率或SHIBOR。我个人习惯用3%作为基准。
怎么解读?
- 夏普 > 1:不错,值得关注
- 夏普 > 2:很好,属于优秀策略
- 夏普 > 3:极好,但小心过拟合
注意:夏普比率有一个隐含假设——收益率是正态分布的。但真实市场有“肥尾”现象,所以夏普比率会低估极端风险。这就是为什么我们还需要VaR和CVaR。
4.4 索提诺比率:只关心“坏”波动
索提诺比率是夏普比率的升级版。它只把下行波动率作为分母,因为上涨的波动其实是好事。
索提诺比率 = (策略年化收益率 - 无风险利率) / 下行波动率
下行波动率只计算收益率低于某个阈值(通常是0或无风险利率)的部分。
我在项目中遇到过这样的情况:一个策略夏普比率只有0.8,但索提诺比率高达2.5。这说明它的上涨很稳健,下跌很克制。这种策略我一般会优先考虑。
4.5 卡玛比率:回撤视角的“性价比”
卡玛比率把最大回撤作为风险度量,而不是波动率。
卡玛比率 = 年化收益率 / 最大回撤
举个例子:年化收益20%,最大回撤10%,卡玛比率就是2.0。
我的经验:卡玛比率大于1.5就算不错,大于3.0就是顶级策略。但要注意——最大回撤是历史数据,不代表未来不会更大。
4.6 VaR:在险价值
VaR(Value at Risk)回答的是:在95%或99%的置信水平下,未来一段时间内最大可能亏损是多少?
举个例子:“95% VaR = -5%”意味着有95%的把握,明天亏损不会超过5%。
三种计算方法:
- 参数法:假设收益率服从正态分布,直接用均值和标准差算
- 历史模拟法:直接用过去的数据排序,取第5%分位数
- 蒙特卡洛模拟:随机生成大量路径,统计最坏情况
避坑指南:VaR有一个致命缺陷——它只告诉你“最多亏多少”,但不告诉你“亏超过这个数时,平均亏多少”。这就是为什么我们需要CVaR。
4.7 CVaR:条件在险价值
CVaR(Conditional VaR)也叫期望损失(Expected Shortfall)。它计算的是:当亏损超过VaR阈值时,平均亏损是多少?
举个例子:95% VaR = -5%,而CVaR = -8%。这意味着:在最坏的5%情况下,平均亏损是8%。
我个人更偏爱CVaR。为什么?因为它考虑了尾部风险的“深度”。两个策略可能有相同的VaR,但CVaR可能差很多。CVaR更大的那个,一旦出事会更惨。
实战建议:我一般会同时看VaR和CVaR。VaR告诉我“最可能的最坏情况”,CVaR告诉我“如果最坏情况发生了,到底有多坏”。两者结合,心里更有底。
4.8 代码实战:用Python计算这些指标
光说不练假把式。下面是我常用的计算函数,你可以直接拿去用:
import numpy as np
import pandas as pd
def calculate_risk_metrics(returns, risk_free_rate=0.03, confidence=0.95):
"""
计算全套风险指标
returns: 日收益率序列(pandas Series)
"""
# 年化波动率
annual_vol = returns.std() * np.sqrt(252)
# 最大回撤
cumulative = (1 + returns).cumprod()
running_max = cumulative.cummax()
drawdown = (cumulative - running_max) / running_max
max_drawdown = drawdown.min()
# 年化收益率
annual_return = (1 + returns).prod() ** (252 / len(returns)) - 1
# 夏普比率
sharpe = (annual_return - risk_free_rate) / annual_vol
# 索提诺比率(只考虑下行波动)
downside_returns = returns[returns < 0]
downside_vol = downside_returns.std() * np.sqrt(252)
sortino = (annual_return - risk_free_rate) / downside_vol if downside_vol != 0 else np.nan
# 卡玛比率
calmar = annual_return / abs(max_drawdown) if max_drawdown != 0 else np.nan
# VaR(历史模拟法)
var = np.percentile(returns, (1 - confidence) * 100)
# CVaR
cvar = returns[returns <= var].mean()
return {
'年化波动率': annual_vol,
'最大回撤': max_drawdown,
'夏普比率': sharpe,
'索提诺比率': sortino,
'卡玛比率': calmar,
'VaR ({}%)'.format(int(confidence*100)): var,
'CVaR ({}%)'.format(int(confidence*100)): cvar
}
# 使用示例
# 假设你有一个策略的日收益率序列
# metrics = calculate_risk_metrics(your_returns)
# print(metrics)
小技巧:我习惯把计算结果做成一个DataFrame,然后画成雷达图。这样一眼就能看出哪个策略更均衡。嗯,这个习惯帮我发现过好几次策略的潜在问题。
4.9 这些指标怎么组合使用?
单个指标都有局限性。我个人的做法是:
- 第一步:看最大回撤和CVaR。如果这两个指标超出你的心理承受范围,直接pass。
- 第二步:看夏普比率和索提诺比率。如果索提诺明显高于夏普,说明策略的下行控制做得好。
- 第三步:看卡玛比率。这个指标最直观——你愿意用多大的回撤去换收益?
- 第四步:看波动率。波动率太高,实盘时容易拿不住单。
你想想看,如果一个策略夏普比率1.5,卡玛比率2.0,CVaR控制在-3%以内——这种策略,我基本可以放心上实盘了。
最后说一句:指标只是工具,不是圣杯。再漂亮的指标,也抵不过一次黑天鹅事件。所以,永远给自己留足安全边际。
公众号:蓝海资料掘金营,微信deep3321