3、最大回撤控制:最大回撤(Max Drawdown)的计算方法,最大回撤的容忍度设定,基于最大回撤的止损策略设计。

聊到量化选股的风控,有个指标是绕不开的——最大回撤

说白了,它就是你这套策略在最倒霉的时候,从山顶跌到谷底,到底亏了多少。我见过太多人,策略回测年化50%,兴奋得不行,结果实盘一个月回撤20%就扛不住割肉了。为什么?因为他对最大回撤根本没概念。

这一章,我们就把它彻底讲透。

3.1 最大回撤的计算方法

先看定义。最大回撤,指的是在选定周期内,净值从最高点回落到最低点的最大幅度。公式很简单:

Max Drawdown = (Peak Value - Trough Value) / Peak Value

注意,这里的Peak是历史最高点,Trough是随后出现的最低点。不是随便找个高点低点就算的。

举个例子。假设某策略净值序列如下:

日期 净值 当前最高 回撤
第1天 1.00 1.00 0%
第2天 1.20 1.20 0%
第3天 1.10 1.20 8.33%
第4天 1.30 1.30 0%
第5天 1.15 1.30 11.54%
第6天 1.05 1.30 19.23%
第7天 1.25 1.30 3.85%

看到没?最大回撤发生在第6天,从1.30跌到1.05,幅度19.23%。这就是该策略在观察期内的最大回撤。

核心要点:最大回撤只看「从最高点到最低点」这一段,中间不管怎么反弹,只要没创新高,回撤就还在持续。

我在项目中遇到过有人把最大回撤算成「任意两天的最大跌幅」,这是错的。你想想看,如果策略在下跌后反弹了,但没创新高,那它其实还在坑里。只有创了新高,之前的回撤才算结束。

代码实现也很简单,Python里几行就搞定:

import numpy as np

def max_drawdown(nav_series):
    # nav_series: 净值序列
    peak = np.maximum.accumulate(nav_series)
    drawdown = (peak - nav_series) / peak
    return np.max(drawdown)

# 示例
nav = [1.00, 1.20, 1.10, 1.30, 1.15, 1.05, 1.25]
print(f"最大回撤: {max_drawdown(nav):.2%}")

输出结果就是19.23%。

3.2 最大回撤的容忍度设定

算出来最大回撤是20%,然后呢?你得知道这个数字对你意味着什么。

我个人习惯把容忍度分成三个等级:

  • 保守型(10%以内):适合资金量大、风险偏好低的投资者。比如养老金、保险资金。
  • 稳健型(10%-20%):大多数量化私募的默认红线。我自己的策略一般设在这个区间。
  • 激进型(20%-30%):适合高风险偏好、能扛住波动的投资者。但说实话,超过30%的回撤,大部分人的心理防线就崩了。

怎么设定?我建议你问自己三个问题:

  1. 你能接受账户亏多少钱而不失眠?
  2. 你的资金有没有时间压力?比如半年后要买房。
  3. 你的策略历史上最大回撤是多少?留出1.5倍的安全边际。

我的经验:容忍度不要只看数字,要看「回撤修复时间」。如果一个策略最大回撤20%,但需要3年才能涨回来,那这个容忍度就是虚的。你扛得住20%的亏损,但扛不住3年的等待。

我曾经见过一个策略,最大回撤只有15%,但修复时间长达2年。投资者在第18个月的时候赎回了,结果刚赎回就创新高。嗯,这就是典型的「死在黎明前」。

3.3 基于最大回撤的止损策略设计

知道了最大回撤,怎么用它来设计止损?这里有两种主流思路。

3.3.1 固定比例止损

最简单粗暴。设定一个阈值,比如15%。一旦回撤达到15%,全部清仓。

def fixed_stop(nav_series, threshold=0.15):
    peak = nav_series[0]
    for i, nav in enumerate(nav_series):
        if nav > peak:
            peak = nav
        drawdown = (peak - nav) / peak
        if drawdown >= threshold:
            return i  # 触发止损的索引
    return None

优点:简单、执行成本低。缺点:容易误伤。如果市场只是正常波动,你可能会被频繁止损出局。

3.3.2 动态回撤止损

这个更聪明一些。它根据策略的历史表现动态调整止损线。

举个例子。策略历史最大回撤是20%,但最近市场波动率上升了。这时候我会把止损线放宽到25%,给策略多一点喘息空间。反之,如果市场平稳,我会收紧到15%。

注意:动态止损不是让你随意改参数。它需要一套规则,比如「当20日波动率超过X%时,止损线放宽Y%」。没有规则的动态止损,就是情绪化交易。

我在项目中用过一种方法:把最大回撤止损和移动止损结合起来。具体来说:

  • 当净值创新高时,止损线自动上移到「当前净值 × (1 - 最大回撤容忍度)」。
  • 当净值下跌时,止损线保持不变。
  • 一旦净值跌破止损线,立即平仓。

这样做的好处是,你能锁定部分利润,同时给策略留出合理的回撤空间。

下面我用一张图来展示整个最大回撤控制的知识体系:

最大回撤控制知识体系 计算方法 容忍度设定 止损策略设计 公式:MD = (Peak - Trough) / Peak Python实现:cummax & drawdown 保守型:<10% 稳健型:10%-20% 激进型:20%-30% 固定比例止损 动态回撤止损 移动止损 + 回撤止损 核心:计算 → 设定 → 执行,形成闭环

最后说一句。最大回撤控制不是让你永远不亏钱,而是让你在亏钱的时候知道「底线在哪」。我见过太多人,策略回测漂亮,实盘一遇到回撤就慌了手脚,改参数、换策略、追涨杀跌,最后亏得比市场还惨。

为什么?因为他没有一套基于最大回撤的止损规则。规则定好了,就严格执行。别问「这次会不会不一样」,不会的。市场永远在重复,人性也永远在重复。

一句话总结:最大回撤是你的安全气囊。你可以希望永远用不到它,但你必须知道它在哪里、怎么用。

专注资料整理