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.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 - 最大回撤容忍度)」。
- 当净值下跌时,止损线保持不变。
- 一旦净值跌破止损线,立即平仓。
这样做的好处是,你能锁定部分利润,同时给策略留出合理的回撤空间。
下面我用一张图来展示整个最大回撤控制的知识体系:
最后说一句。最大回撤控制不是让你永远不亏钱,而是让你在亏钱的时候知道「底线在哪」。我见过太多人,策略回测漂亮,实盘一遇到回撤就慌了手脚,改参数、换策略、追涨杀跌,最后亏得比市场还惨。
为什么?因为他没有一套基于最大回撤的止损规则。规则定好了,就严格执行。别问「这次会不会不一样」,不会的。市场永远在重复,人性也永远在重复。
一句话总结:最大回撤是你的安全气囊。你可以希望永远用不到它,但你必须知道它在哪里、怎么用。