2. 最大回撤控制:设定单日、单周、单月最大回撤阈值,以及触发后的熔断机制
做高频做市,最怕什么?
不是行情突变,不是策略失效。最怕的是——你眼睁睁看着账户回撤,却停不下来。
我见过太多人,一天亏了5%,想着“明天能回来”。结果一周亏了20%。然后呢?爆仓离场。
所以,回撤控制不是技术问题,是生存问题。今天我们就聊聊怎么设阈值、怎么熔断。
2.1 为什么必须设回撤阈值?
说白了,高频做市是“薄利多销”的生意。你每次赚0.1个tick,一天做几千笔。但如果一次大亏,可能吃掉你一周的利润。
我个人的习惯是:把回撤阈值当成“止损线”来用。不是策略止损,是账户止损。
核心逻辑:
- 单日回撤超过阈值 → 说明当天市场状态异常
- 单周回撤超过阈值 → 说明策略可能失效或参数需要调整
- 单月回撤超过阈值 → 说明系统性问题,必须停盘复盘
你想想看,如果一天亏了3%,你还在继续做,那是在赌。做市不是赌博,是做概率。
2.2 阈值怎么设?实战经验
阈值没有标准答案,但有个经验公式:阈值 = 日均盈利 × 3 ~ 5倍。
举个例子:
- 你的策略日均盈利0.5%
- 单日回撤阈值可以设在1.5% ~ 2.5%
- 单周阈值设在3% ~ 5%
- 单月阈值设在6% ~ 10%
我在项目中遇到过一个问题:阈值设得太小,频繁触发熔断,影响交易连续性。设得太大,又起不到保护作用。
后来我总结了一个原则:阈值要“松紧适度”。怎么判断?看历史回测中最大回撤的80%分位数。
| 时间维度 | 建议阈值范围 | 触发后动作 |
|---|---|---|
| 单日 | 日均盈利 × 3 | 暂停交易30分钟,检查市场状态 |
| 单周 | 日均盈利 × 10 | 当日停止交易,复盘策略参数 |
| 单月 | 日均盈利 × 20 | 全面停盘,回测+参数优化 |
小技巧: 我习惯把阈值设成动态的。比如根据过去20天的波动率调整。波动率大时,阈值放宽一点;波动率小时,阈值收紧一点。
2.3 熔断机制:不是停了就完事
熔断不是“一键停止”那么简单。你想想看,如果熔断后什么都不做,第二天开盘可能继续亏。
所以,熔断机制要包含三个步骤:
- 触发熔断:自动停止所有新开仓,只允许平仓
- 状态评估:检查当前持仓、市场波动、策略表现
- 恢复条件:设定明确的恢复条件,比如“市场波动率回归正常”或“策略信号重新有效”
我曾经犯过一个错误:熔断后直接手动恢复交易,结果当天又亏了一次。后来我加了一个“冷却时间”——熔断后至少休息30分钟,让情绪平复。
注意: 熔断机制不能有“人工干预跳过”的漏洞。我见过有人觉得“这次不一样”,手动关闭熔断,结果爆仓。相信我,没有一次是“不一样”的。
2.4 代码实现:一个简单的回撤监控器
下面是一个Python示例,实现了回撤监控和熔断逻辑。嗯,这里要注意:代码要跑在实盘环境里,延迟要低。
class DrawdownController:
def __init__(self, daily_limit=0.02, weekly_limit=0.05, monthly_limit=0.10):
self.daily_limit = daily_limit
self.weekly_limit = weekly_limit
self.monthly_limit = monthly_limit
self.initial_equity = None
self.daily_peak = None
self.weekly_peak = None
self.monthly_peak = None
self.frozen = False
self.frozen_until = None
def update(self, current_equity, timestamp):
if self.initial_equity is None:
self.initial_equity = current_equity
self.daily_peak = current_equity
self.weekly_peak = current_equity
self.monthly_peak = current_equity
return
# 更新峰值
self.daily_peak = max(self.daily_peak, current_equity)
self.weekly_peak = max(self.weekly_peak, current_equity)
self.monthly_peak = max(self.monthly_peak, current_equity)
# 计算回撤
daily_dd = (self.daily_peak - current_equity) / self.daily_peak
weekly_dd = (self.weekly_peak - current_equity) / self.weekly_peak
monthly_dd = (self.monthly_peak - current_equity) / self.monthly_peak
# 检查是否触发熔断
if daily_dd > self.daily_limit:
self.frozen = True
self.frozen_until = timestamp + 1800 # 熔断30分钟
print(f"单日回撤 {daily_dd:.2%} 超过阈值,触发熔断")
elif weekly_dd > self.weekly_limit:
self.frozen = True
self.frozen_until = timestamp + 86400 # 熔断到次日
print(f"单周回撤 {weekly_dd:.2%} 超过阈值,触发熔断")
elif monthly_dd > self.monthly_limit:
self.frozen = True
self.frozen_until = timestamp + 604800 # 熔断一周
print(f"单月回撤 {monthly_dd:.2%} 超过阈值,触发熔断")
def can_trade(self, timestamp):
if not self.frozen:
return True
if timestamp >= self.frozen_until:
self.frozen = False
self.frozen_until = None
# 重置峰值
self.daily_peak = None
self.weekly_peak = None
self.monthly_peak = None
return True
return False
避坑指南: 我曾经把峰值重置逻辑写错了,导致熔断后回撤计算错误。建议每次恢复交易前,手动检查一下峰值是否清零。
2.5 熔断后的恢复策略
熔断不是终点,是起点。恢复交易前,我建议做三件事:
- 检查市场状态:是不是有突发事件?流动性是不是枯竭了?
- 检查策略参数:是不是参数过拟合了?是不是需要重新校准?
- 检查资金曲线:是不是有隐藏的风险敞口?
我个人习惯是:熔断后先做一次完整的压力测试。用当前参数跑历史数据,看看如果继续交易会怎样。如果压力测试都过不了,那就别急着恢复。
一句话总结: 回撤控制不是限制你赚钱,是保护你活下去。高频做市是一场马拉松,不是百米冲刺。