第十一章:风险控制:最大回撤限制、单笔风险限额、黑天鹅防护、熔断机制

做市交易,说白了就是跟市场做对手盘。

你赚的是买卖价差,但市场随时可能翻脸。我见过太多人,策略跑得好好的,突然一天就爆仓了。为什么?风控没跟上。

这一章,咱们聊聊怎么给系统装上「刹车」和「安全气囊」。

11.1 最大回撤限制:给账户设一条底线

最大回撤,就是账户从最高点跌下来的幅度。

比如你账户最高100万,现在跌到85万,回撤就是15%。

为什么要限制这个?

因为回撤一旦失控,心态就崩了。我有个朋友,做市策略回撤到20%时还觉得能扛,结果扛到40%才割肉。嗯,后来他转行了。

核心原则:

  • 日最大回撤:不超过2%
  • 周最大回撤:不超过5%
  • 月最大回撤:不超过10%

怎么实现?

我习惯在系统里维护一个「峰值记录器」。每次计算当前净值,跟历史最高比。一旦超过阈值,立刻触发平仓。

class MaxDrawdownController:
    def __init__(self, max_drawdown=0.10):
        self.peak = 0
        self.max_drawdown = max_drawdown
        
    def check(self, current_equity):
        if current_equity > self.peak:
            self.peak = current_equity
        drawdown = (self.peak - current_equity) / self.peak
        if drawdown > self.max_drawdown:
            self.trigger_stop()
            return False
        return True
    
    def trigger_stop(self):
        print("⚠️ 最大回撤触发,停止所有交易")
        # 这里执行平仓逻辑

避坑指南:

我曾经犯过一个错:把回撤计算放在收盘后。结果盘中回撤已经超了,我还不知道。后来改成实时计算,每笔成交后都检查一次。

11.2 单笔风险限额:别把鸡蛋放一个篮子里

单笔风险限额,就是每笔交易最多亏多少钱。

你想想看,如果一笔交易亏掉账户的5%,那只需要20笔这样的交易,账户就归零了。

我建议这样设:

  • 单笔最大亏损:不超过账户净值的0.5%
  • 单品种最大持仓:不超过账户净值的5%
  • 单方向总敞口:不超过账户净值的15%

为什么是0.5%?

因为做市策略胜率通常不高,可能只有60%。如果单笔亏太多,连续几笔亏损就把你打趴下了。0.5%意味着你可以连续亏20笔,账户才缩水10%。

class SingleTradeRisk:
    def __init__(self, account_equity, risk_per_trade=0.005):
        self.max_loss = account_equity * risk_per_trade
        
    def calculate_position_size(self, entry_price, stop_loss_price):
        risk_per_unit = abs(entry_price - stop_loss_price)
        position_size = self.max_loss / risk_per_unit
        return int(position_size)
    
    def validate(self, order):
        if order.risk_amount > self.max_loss:
            print(f"❌ 单笔风险超限: {order.risk_amount} > {self.max_loss}")
            return False
        return True

注意:

单笔风险限额不是一成不变的。当账户盈利时,可以适当提高;当账户亏损时,要降低。我习惯用「凯利公式」动态调整,但那是进阶内容了。

11.3 黑天鹅防护:应对极端行情

黑天鹅事件,就是那些「不可能发生」但偏偏发生了的事。

比如2020年3月的原油暴跌,2021年5月的狗狗币闪崩。做市系统最怕这个——流动性瞬间消失,价差拉大到离谱。

怎么防?

  1. 价格偏离检测:如果当前价格偏离最近N笔成交均价超过X%,立即暂停交易
  2. 流动性检测:如果买卖价差超过正常水平的3倍,降低仓位
  3. 波动率检测:如果5分钟波动率超过阈值,切换到保守模式
class BlackSwanProtection:
    def __init__(self, price_deviation=0.05, spread_multiplier=3.0):
        self.price_deviation = price_deviation
        self.spread_multiplier = spread_multiplier
        
    def check_price_anomaly(self, current_price, recent_prices):
        avg_price = sum(recent_prices) / len(recent_prices)
        deviation = abs(current_price - avg_price) / avg_price
        if deviation > self.price_deviation:
            print(f"⚠️ 价格异常偏离: {deviation:.2%}")
            return False
        return True
    
    def check_spread_anomaly(self, bid, ask, normal_spread):
        current_spread = (ask - bid) / bid
        if current_spread > normal_spread * self.spread_multiplier:
            print(f"⚠️ 价差异常: {current_spread:.4f}")
            return False
        return True

个人经验:

我记得有一次,某个小币种突然拉涨300%。我的系统检测到价格偏离,自动暂停了交易。结果5分钟后,价格又跌回原点。那次要是没风控,我可能亏掉一个月的利润。

11.4 熔断机制:给系统装个急停按钮

熔断,就是当市场出现极端情况时,强制停止交易一段时间。

这跟股票市场的熔断是一个道理——让市场冷静一下,也让你的系统喘口气。

熔断条件:

触发条件 熔断时长 恢复条件
1分钟内亏损超过1% 5分钟 市场恢复稳定
5分钟内亏损超过3% 30分钟 人工确认
单日亏损超过5% 当日停止 次日自动恢复
class CircuitBreaker:
    def __init__(self):
        self.state = "normal"  # normal, cooldown, stopped
        self.loss_window = []
        
    def check(self, current_pnl):
        self.loss_window.append(current_pnl)
        if len(self.loss_window) > 60:  # 保留最近60秒
            self.loss_window.pop(0)
            
        # 检查1分钟亏损
        if len(self.loss_window) >= 60:
            minute_loss = min(self.loss_window[-60:])
            if minute_loss < -0.01:  # 亏损超过1%
                self.trigger_cooldown(5)
                
        # 检查5分钟亏损
        if len(self.loss_window) >= 300:
            five_min_loss = min(self.loss_window[-300:])
            if five_min_loss < -0.03:  # 亏损超过3%
                self.trigger_stop(30)
                
    def trigger_cooldown(self, minutes):
        self.state = "cooldown"
        print(f"🔴 熔断触发,冷却{minutes}分钟")
        # 停止新开仓,只允许平仓
        
    def trigger_stop(self, minutes):
        self.state = "stopped"
        print(f"🔴 深度熔断,停止{minutes}分钟")
        # 强制平仓所有头寸

重要提醒:

熔断不是万能的。我曾经遇到一种情况:熔断触发后,市场继续暴跌,等熔断结束,我的仓位已经亏更多了。所以熔断要配合「止损单」一起用——熔断期间,止损单依然有效。

11.5 风控体系架构图

下面这张图,展示了整个风控体系的运作流程:

做市系统风控体系架构 交易信号 风控检查层 最大回撤 检查 单笔风险 检查 黑天鹅 检测 熔断 检查 通过? ✅ 执行交易 ❌ 拒绝/熔断 所有交易信号必须通过风控检查层,才能进入执行阶段 任一检查不通过,系统自动拒绝交易或触发熔断

11.6 实战中的风控配置

最后,分享一套我实际用过的风控参数。你可以根据自己的资金量和风险偏好调整:

# 风控配置示例
risk_config = {
    "max_drawdown": {
        "daily": 0.02,      # 日最大回撤2%
        "weekly": 0.05,     # 周最大回撤5%
        "monthly": 0.10    # 月最大回撤10%
    },
    "single_trade": {
        "max_loss_pct": 0.005,    # 单笔最大亏损0.5%
        "max_position_pct": 0.05, # 单品种最大持仓5%
        "max_direction_pct": 0.15 # 单方向最大敞口15%
    },
    "black_swan": {
        "price_deviation": 0.05,   # 价格偏离5%触发
        "spread_multiplier": 3.0,  # 价差3倍触发
        "volatility_threshold": 0.02 # 波动率2%触发
    },
    "circuit_breaker": {
        "minute_loss": 0.01,   # 1分钟亏损1%熔断5分钟
        "five_min_loss": 0.03, # 5分钟亏损3%熔断30分钟
        "daily_loss": 0.05     # 日亏损5%停止当日交易
    }
}

最后说一句:

风控不是限制你赚钱,而是保护你活下去。我见过太多人,策略很牛,但风控一塌糊涂,最后被市场教育了。记住:活得久,比赚得快更重要。


无相订单流研究社 微信Lucian808555