4、风险指标详解:波动率(年化)、最大回撤(MDD)、下行风险、VaR(在险价值)、CVaR(条件在险价值)
做套利策略,最怕什么?
不是赚得少,而是突然某天爆仓,或者回撤大到让你怀疑人生。
我见过太多人,策略夏普比高得吓人,结果一个黑天鹅直接归零。所以今天咱们聊聊风险指标。这些指标,说白了就是给你的策略做「体检」——看看它到底扛不扛揍。
核心观点: 收益是策略的上限,风险是策略的底线。不懂风险,赚再多也是纸面富贵。
4.1 波动率(年化)—— 策略的「心跳」
波动率衡量的是策略收益的离散程度。简单说,就是你的净值曲线抖不抖。
我个人习惯把波动率看作策略的「心跳」。心跳太慢(波动率低),说明策略可能太保守;心跳太快(波动率高),说明策略可能随时猝死。
年化波动率的计算公式:
年化波动率 = 日收益率标准差 × √252
为什么是252?因为一年大概有252个交易日。这个公式假设收益率是独立同分布的,虽然现实中不完全成立,但够用了。
我的经验: 套利策略的年化波动率通常控制在5%-15%之间。如果超过20%,你就要小心了——这已经不是套利,是在赌博。
举个例子:
import numpy as np
# 假设某套利策略的日收益率序列
daily_returns = [0.001, -0.0005, 0.002, -0.001, 0.0015, ...]
std_daily = np.std(daily_returns)
annual_vol = std_daily * np.sqrt(252)
print(f"年化波动率: {annual_vol:.2%}")
嗯,这里要注意:如果策略交易频率很低(比如周频),就用周收益率乘以√52。别搞混了。
4.2 最大回撤(MDD)—— 策略的「至暗时刻」
最大回撤,就是从净值最高点到最低点的最大跌幅。它告诉你:在最坏的情况下,你会亏多少钱。
我刚开始做量化时,总觉得最大回撤就是个数字。直到有一次,我的策略回撤了18%,客户直接打电话来骂娘……从那以后,我把MDD当作策略的「生命线」。
计算公式:
MDD = max( (Peak - Trough) / Peak )
其中Peak是历史最高净值,Trough是Peak之后的最低净值。
避坑指南: 我曾经见过一个策略,回测时MDD只有5%,实盘却回撤了20%。为什么?因为回测时用的是「未来数据」——回撤还没走完就提前平仓了。记住:MDD必须是「已实现」的回撤,不能是「假设」的。
我个人习惯用「回撤修复时间」来辅助判断。如果一个策略回撤20%后,需要3年才能修复,那这个策略基本废了。
4.3 下行风险 —— 只看「坏」的波动
波动率把上涨和下跌都算进去了。但说实话,上涨的波动我们巴不得越大越好,对吧?
下行风险只关注亏损时的波动。它衡量的是策略「跌起来有多狠」。
计算公式:
下行风险 = √( 1/N × Σ min(0, r_i - r_target)² )
其中r_target是目标收益率,通常设为0或者无风险利率。
你想想看,两个策略年化波动率都是15%,但一个下行风险只有5%,另一个是12%。你会选哪个?当然是前者——它跌得少,涨得多。
我的习惯: 在评估套利策略时,我优先看下行风险,而不是总波动率。因为套利策略的核心是「低风险」,而不是「低波动」。
4.4 VaR(在险价值)—— 最坏情况下的损失
VaR问的是:在95%(或99%)的置信水平下,未来一天(或一周)最大可能亏损是多少?
说白了,就是「最坏情况下的损失底线」。
参数法(假设正态分布):
VaR_95% = μ - 1.645 × σ
其中μ是预期收益率,σ是标准差,1.645是95%置信水平对应的z值。
历史模拟法(更常用):
# 假设有1000个历史收益率
sorted_returns = sorted(historical_returns)
VaR_95 = sorted_returns[int(0.05 * len(sorted_returns))]
避坑指南: 我曾经用参数法算VaR,结果策略实盘时亏损远超VaR值。为什么?因为收益率不是正态分布——它有肥尾。所以我建议用历史模拟法,或者至少做一下正态性检验。
VaR的局限性也很明显:它只告诉你「最坏情况下的损失底线」,但没告诉你「如果超过底线,会亏多少」。这就引出了下一个指标。
4.5 CVaR(条件在险价值)—— 比VaR更狠
CVaR也叫期望损失(Expected Shortfall)。它问的是:当亏损超过VaR时,平均会亏多少?
举个例子:VaR告诉你「95%的情况下,一天最多亏5万」。CVaR告诉你「如果那5%的坏情况发生了,平均会亏8万」。
计算公式:
CVaR_95% = 平均(所有小于VaR_95%的收益率)
用代码实现:
def calculate_cvar(returns, confidence=0.95):
sorted_returns = sorted(returns)
var_index = int((1 - confidence) * len(sorted_returns))
var = sorted_returns[var_index]
cvar = np.mean(sorted_returns[:var_index])
return var, cvar
我的观点: 如果你只能选一个风险指标,我建议选CVaR。它比VaR更保守,也更真实。巴塞尔协议III现在也要求银行用CVaR替代VaR了。
4.6 五个指标的关系与选择
这五个指标不是孤立的,它们从不同角度描述风险:
| 指标 | 衡量什么 | 适用场景 |
|---|---|---|
| 年化波动率 | 整体波动幅度 | 初步筛选 |
| 最大回撤 | 历史最差表现 | 风控红线 |
| 下行风险 | 下跌时的波动 | 套利策略评估 |
| VaR | 最坏情况底线 | 日常风控 |
| CVaR | 极端损失均值 | 压力测试 |
我个人习惯这样用:先用波动率和MDD做快速筛选,再用下行风险和CVaR做深度评估。VaR作为日常监控指标。
重要提醒: 所有风险指标都是基于历史数据的。历史会重演,但不会简单重复。别把回测的VaR当成实盘的保证——我吃过这个亏。
最后说一句:风险指标不是越多越好,关键是要理解每个指标背后的含义,以及它们之间的权衡。我个人最看重CVaR和下行风险,因为它们更贴近套利策略的实际情况。
总结: 波动率看整体,MDD看历史最差,下行风险看下跌质量,VaR看底线,CVaR看极端。五个指标一起用,才能全面评估策略的风险特征。
公众号:蓝海资料掘金营,微信deep3321