4、最大回撤控制:回撤的定义与测量、回撤修复时间、动态止损与回撤控制
聊到资金管理,绕不开的一个话题就是「回撤」。
我见过太多策略,回测曲线漂亮得像教科书,一上实盘就崩。为什么?因为回测里的回撤是「纸面回撤」,实盘里的回撤是「真金白银的煎熬」。今天我们就来把这层窗户纸捅破。
4.1 回撤的定义与测量
先给个最朴素的定义:回撤,就是从最近的高点,跌到当前低点的幅度。说白了,就是「你账户里最多亏了多少」。
但这里有个坑——很多人只看「最大回撤」这一个指标。我个人习惯,至少看三个维度:
- 绝对回撤:从最高点到最低点的金额差。比如账户从100万跌到80万,绝对回撤就是20万。
- 相对回撤:绝对回撤 / 最高点净值。上面那个例子,相对回撤就是20%。
- 当前回撤:从最近一次创出新高后,到现在的跌幅。这个指标最实时,也最扎心。
我在项目中遇到过一位交易员,他只看最大回撤,觉得15%以内都能接受。结果有一次连续回撤了12%,他以为「还没到极限」,结果第13天直接崩到18%。为什么?因为他忽略了「回撤的连续性」——连续回撤和单次回撤,对人的心理冲击完全不同。
核心公式:
回撤率 = (当前净值 - 历史最高净值) / 历史最高净值 × 100%
注意:这里的「历史最高净值」是滚动计算的,不是固定值。
嗯,这里要注意:回撤不是亏损。亏损是相对于成本价,回撤是相对于最高点。你100万入场,涨到150万再跌回120万,亏损是0(还赚20万),但回撤是20%。
4.2 回撤修复时间
这个指标,很多人不重视,但我认为它比回撤幅度本身更重要。
回撤修复时间,就是从回撤的最低点,重新涨回前高所用的时间。为什么重要?因为时间是有成本的。
举个例子:
- 策略A:最大回撤20%,修复时间3个月
- 策略B:最大回撤15%,修复时间12个月
你选哪个?我选A。因为3个月后你就能重新开始赚钱,而B策略虽然回撤小,但你要熬一整年。这一年里,你的资金被「锁死」在回撤中,机会成本极高。
我的经验法则:
回撤修复时间超过6个月的策略,除非年化收益超过30%,否则直接放弃。我曾经踩过这个坑——一个策略回撤修复用了11个月,年化才12%,算下来还不如买理财。
怎么计算修复时间?很简单:
# 伪代码示例
def calc_recovery_time(equity_curve):
peak = equity_curve[0]
recovery_days = []
for i, value in enumerate(equity_curve):
if value > peak:
peak = value
elif value < peak * 0.9: # 回撤超过10%
# 找到修复到前高的日期
for j in range(i, len(equity_curve)):
if equity_curve[j] >= peak:
recovery_days.append(j - i)
break
return np.mean(recovery_days) if recovery_days else 0
你想想看,如果回撤修复时间越来越长,说明什么?说明策略的「弹性」在变差。这时候就要警惕了,可能是市场环境变了,也可能是策略本身在退化。
4.3 动态止损与回撤控制
固定止损?那是新手干的事。真正的量化交易,用的是动态止损。
什么叫动态止损?就是止损线不是固定的,而是随着账户净值的变化、市场波动率的变化、策略状态的变化而调整。
我常用的几种动态止损方法:
- 移动止损(Trailing Stop):止损线跟随最高点上移。比如设定回撤5%就止损,那么当净值从100万涨到120万,止损线就从95万上移到114万。
- 波动率止损:根据当前市场的波动率(比如ATR)来设定止损宽度。波动率大的时候,止损宽一点;波动率小的时候,止损窄一点。
- 时间止损:如果持仓超过一定时间还没盈利,强制平仓。这个在期权策略里特别有用——因为时间价值每天都在衰减。
避坑指南:
我曾经犯过一个错误:把移动止损设得太紧,结果频繁被假突破扫出场。后来我加了一个「确认机制」——只有连续两个收盘价跌破止损线,才执行止损。虽然多亏了0.5%,但避免了80%的假信号。
回撤控制的核心,其实就一句话:别让亏损失控。怎么做到?
- 设定总账户的「硬止损线」——比如总回撤超过20%,全部清仓休息一周
- 每个策略单独设止损——一个策略亏完了,不影响其他策略
- 回撤加速时,主动减仓——如果连续3天回撤超过2%,仓位减半
我个人习惯,会在交易系统中嵌入一个「回撤监控模块」:
class DrawdownController:
def __init__(self, max_drawdown=0.15, recovery_threshold=0.05):
self.max_drawdown = max_drawdown
self.recovery_threshold = recovery_threshold
self.peak = None
self.current_drawdown = 0
def update(self, current_value):
if self.peak is None or current_value > self.peak:
self.peak = current_value
self.current_drawdown = (self.peak - current_value) / self.peak
if self.current_drawdown > self.max_drawdown:
return "STOP_ALL" # 全部停止
elif self.current_drawdown > self.max_drawdown * 0.8:
return "REDUCE_50%" # 减半仓
else:
return "NORMAL"
这个模块每天跑一次,一旦触发「STOP_ALL」信号,系统自动把所有持仓平掉,然后发邮件通知我。嗯,我承认,有时候半夜被邮件吵醒挺烦的,但总比爆仓强。
4.4 知识体系总览
下面这张图,是我自己整理的回撤控制知识框架。你可以把它当成一个「检查清单」——每次设计策略时,对着这张图过一遍,基本不会漏掉关键点。
这张图里,三个模块是环环相扣的。你先要测量回撤,然后评估修复时间,最后用动态止损来控制。缺了任何一个环节,资金管理都会出问题。
最后说一句:回撤控制不是用来「消灭回撤」的,而是用来「管理回撤」的。没有回撤的策略,往往也没有收益。我们要做的,是把回撤控制在可接受的范围内,然后耐心等待修复。
本章核心要点:
- 回撤要分三个维度看:绝对、相对、当前
- 回撤修复时间比回撤幅度更重要
- 动态止损是回撤控制的核心手段
- 建立回撤监控模块,自动化执行
公众号:蓝海资料掘金营,微信 deep3321