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}

若在样本期内未恢复,则恢复期记为“未完成”或截断值。恢复期回答的是“亏了之后多久能回来”。

回撤四指标:峰—谷—恢复的时间结构 净值 时间 峰值 t_peak 谷值 t_trough 恢复 t_recover 最大回撤幅度 MDD 回撤持续期 恢复期

三、方法流程:一次完整的回撤计算

  1. 数据准备:获取按时间升序的净值序列,处理缺失值与复权。
  2. 计算 Running Peak:逐点取历史最大值。
  3. 计算回撤序列:用当前净值除以 Running Peak 再减 1。
  4. 定位最大回撤:找到回撤序列最小值及其对应谷值点,回溯峰值点。
  5. 计算持续期:谷值点减峰值点。
  6. 计算恢复期:从谷值点向后找到首次净值不低于峰值点的位置。
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%。

五、误区与复盘

  • 误区一:用收盘价计算却按盘中触发止损。口径不一致会导致回撤被低估。应明确使用收盘净值还是盘中极值。
  • 误区二:忽略分红与费用。未复权净值会虚增回撤或虚减回撤,必须统一复权口径。
  • 误区三:把最大回撤当成唯一风险指标。持续期和恢复期同样重要,尤其对资金占用和投资者体验。
  • 误区四:样本期过短。最大回撤对样本区间高度敏感,短样本容易低估真实风险。

复盘要点:每次回撤结束后,记录峰值、谷值、持续期、恢复期四个数字,并对比历史分布。若恢复期持续拉长,即使幅度未创新高,也应视为策略退化信号。