2. 回撤基础
在讨论最大回撤约束与 De-Risking 之前,必须先建立一套可复用的回撤语言。很多团队在实盘中把“回撤”当成一个模糊概念,结果在风控阈值、止损触发和策略评价上各说各话。本节把四个基础指标拆开:回撤、最大回撤、回撤持续期、恢复期,并给出可落地的计算口径。
一、核心原理:从净值曲线到回撤序列
回撤描述的是“当前净值相对历史高点的下跌幅度”。设策略净值序列为 NAV_t,历史最高净值(Running Peak)为:
Peak_t = max(NAV_0, NAV_1, ..., NAV_t)
Drawdown_t = (NAV_t - Peak_t) / Peak_t
由于 NAV_t ≤ Peak_t,所以 Drawdown_t ≤ 0。实务中常取绝对值,记为回撤幅度。回撤是一个逐点状态量,每个交易日都有一个值;而最大回撤是一个区间极值,描述整段历史上最严重的一次下跌。
关键区分:回撤是“点”,最大回撤是“段”。回撤持续期和恢复期则是围绕“段”的时间维度指标。四者共同构成回撤的“幅度—时间”二维画像。
二、四个指标的定义与计算方法
1. 回撤(Drawdown)
逐点计算,反映当前时刻距离历史高点的距离。计算时需注意:净值序列必须按时间升序排列,且复权处理一致。若使用累计收益曲线,应先转换为净值曲线再计算。
2. 最大回撤(Maximum Drawdown, MDD)
最大回撤是回撤序列中的最小值(绝对值最大):
MDD = min(Drawdown_t) # 结果为负值
MDD_abs = abs(MDD)
它对应一个“峰—谷”区间:峰值点 t_peak 是回撤开始前的高点,谷值点 t_trough 是回撤最低点。最大回撤回答的是“最坏情况下亏多少”。
3. 回撤持续期(Drawdown Duration)
从峰值点 t_peak 到谷值点 t_trough 的时间长度,即“下跌用了多久”。若按交易日计算:
Duration = t_trough - t_peak
它衡量的是回撤的“深度形成速度”。同样 20% 的回撤,3 天完成和 3 个月完成,对风控和 De-Risking 的含义完全不同。
4. 恢复期(Recovery Period)
从谷值点 t_trough 回到前一个峰值 Peak_{t_peak} 所需的时间:
Recovery = t_recover - t_trough
其中 NAV_{t_recover} ≥ Peak_{t_peak}
若在样本期内未恢复,则恢复期记为“未完成”或截断值。恢复期回答的是“亏了之后多久能回来”。
三、方法流程:一次完整的回撤计算
- 数据准备:获取按时间升序的净值序列,处理缺失值与复权。
- 计算 Running Peak:逐点取历史最大值。
- 计算回撤序列:用当前净值除以 Running Peak 再减 1。
- 定位最大回撤:找到回撤序列最小值及其对应谷值点,回溯峰值点。
- 计算持续期:谷值点减峰值点。
- 计算恢复期:从谷值点向后找到首次净值不低于峰值点的位置。
import numpy as np
import pandas as pd
def drawdown_metrics(nav: pd.Series):
nav = nav.sort_index()
peak = nav.cummax()
dd = nav / peak - 1.0
trough = dd.idxmin()
peak_idx = nav.loc[:trough].idxmax()
mdd = dd.min()
duration = nav.index.get_loc(trough) - nav.index.get_loc(peak_idx)
after = nav.loc[trough:]
recover_mask = after >= nav.loc[peak_idx]
if recover_mask.any():
recover_idx = recover_mask.idxmax()
recovery = nav.index.get_loc(recover_idx) - nav.index.get_loc(trough)
else:
recovery = np.nan
return {"MDD": mdd, "peak": peak_idx, "trough": trough,
"duration": duration, "recovery": recovery}
四、案例与场景:同样 20% 回撤,含义不同
| 场景 | 最大回撤 | 持续期 | 恢复期 | 风控含义 |
|---|---|---|---|---|
| A:慢跌慢涨 | -20% | 120 天 | 90 天 | 可容忍,适合 De-Risking 渐进降仓 |
| B:急跌急涨 | -20% | 5 天 | 10 天 | 流动性风险高,需硬止损 |
| C:慢跌不涨 | -20% | 120 天 | 未恢复 | 策略失效信号,应强制退出 |
场景 C 是最危险的:幅度相同,但恢复期未完成,说明策略可能已失去均值回复能力。此时仅看最大回撤会低估风险,必须结合恢复期判断。
实务建议:在 De-Risking 规则中,把“最大回撤阈值”与“恢复期未完成”组合使用。例如:MDD 超过 15% 且 60 个交易日内未恢复,触发降仓至 50%。
五、误区与复盘
- 误区一:用收盘价计算却按盘中触发止损。口径不一致会导致回撤被低估。应明确使用收盘净值还是盘中极值。
- 误区二:忽略分红与费用。未复权净值会虚增回撤或虚减回撤,必须统一复权口径。
- 误区三:把最大回撤当成唯一风险指标。持续期和恢复期同样重要,尤其对资金占用和投资者体验。
- 误区四:样本期过短。最大回撤对样本区间高度敏感,短样本容易低估真实风险。
复盘要点:每次回撤结束后,记录峰值、谷值、持续期、恢复期四个数字,并对比历史分布。若恢复期持续拉长,即使幅度未创新高,也应视为策略退化信号。