第四章:风控系统设计

风控系统,说白了就是做市商的「刹车片」。没有它,你的策略跑得再快,也迟早要翻车。我见过太多团队,策略收益曲线漂亮得不行,结果一次黑天鹅事件,直接归零。

嗯,咱们今天就把风控系统拆开揉碎了讲。我个人习惯把风控分成五个核心模块:资金风控、频率风控、价格偏离度风控、熔断机制、实时监控告警。一个一个来。

4.1 资金风控:守住你的钱袋子

资金风控是底线中的底线。我最早做做市商的时候,犯过一个低级错误——没有限制单笔最大订单金额。结果有一次行情剧烈波动,策略自动下了一笔巨量订单,直接把账户流动性干穿了。从那以后,我把资金风控放在了第一位。

4.1.1 最大敞口控制

最大敞口,就是你账户里「暴露在风险中」的头寸上限。比如你总资金100万,设定最大敞口30%,那任何时刻你的净头寸都不能超过30万。

我个人习惯用动态敞口,而不是固定值。为什么?因为市场波动率在变。波动大的时候,敞口应该自动缩小;波动小的时候,可以适当放大。

核心公式:
动态敞口 = 基础敞口 × (基准波动率 / 当前波动率)
# 伪代码示例:动态敞口计算
def calc_dynamic_exposure(base_exposure, base_vol, current_vol):
    if current_vol <= 0:
        return base_exposure
    ratio = base_vol / current_vol
    # 限制最大放大倍数,防止过度冒险
    ratio = min(ratio, 2.0)
    return base_exposure * ratio

4.1.2 最大订单金额

这个更直接——单笔订单不能超过某个阈值。我建议按账户净值的百分比来设,比如单笔不超过总资金的5%。

曾经有个团队找我复盘,他们的策略在流动性极差的时候,下了一笔占市场深度80%的订单。结果呢?成交价滑了十几个tick,直接亏损。这就是没设最大订单金额的后果。

账户规模 建议单笔上限 说明
100万以下 5% 小账户更脆弱,需要更保守
100万-1000万 3% 中等规模,平衡收益与风险
1000万以上 1%-2% 大账户,流动性冲击成本高
小技巧: 最大订单金额最好和交易所的「最小交易量」挂钩。有些交易所最小交易量是0.01 BTC,你设个0.005 BTC的订单,根本下不出去。

4.2 交易频率风控:别把交易所当玩具

交易频率风控,很多人会忽略。你想想看,做市商策略本质上是高频交易,每秒可能发几十笔订单。但交易所不是你家开的,它有速率限制(Rate Limit)。

我记得有一次,我们的策略因为一个bug,在1秒内发了2000笔订单。交易所直接封了我们的API Key,整整停了4个小时。那4个小时的损失,够我买一辆车了。

频率风控的核心就两点:

  • 订单频率限制: 每秒/每分钟最多发多少笔订单
  • 撤单频率限制: 做市商经常撤单重挂,撤单率也要控制
# 频率风控示例:令牌桶算法
import time

class RateLimiter:
    def __init__(self, max_tokens, refill_rate):
        self.tokens = max_tokens
        self.max_tokens = max_tokens
        self.refill_rate = refill_rate  # 每秒补充的令牌数
        self.last_refill = time.time()
    
    def allow_request(self):
        now = time.time()
        # 补充令牌
        elapsed = now - self.last_refill
        self.tokens = min(self.max_tokens, 
                         self.tokens + elapsed * self.refill_rate)
        self.last_refill = now
        
        if self.tokens >= 1:
            self.tokens -= 1
            return True
        return False
注意: 不同交易所的Rate Limit规则完全不同。有的按IP限,有的按API Key限,有的按交易对限。一定要仔细读文档,别想当然。

4.3 价格偏离度风控:别被市场耍了

价格偏离度风控,是用来防止「价格异常」的。比如,正常情况下BTC在50000美元附近波动,突然出现一笔成交价是45000美元。这时候你该不该跟?

我的答案是:不跟。除非你能确认这是真实成交,否则大概率是交易所数据异常或者插针。

具体怎么做?我一般设两个阈值:

  • 相对偏离度: 当前价格与最近N笔成交均价偏离超过X%
  • 绝对偏离度: 当前价格与参考价格(如指数价格)偏离超过Y美元

曾经有一次,某交易所的BTC/USDT交易对因为深度不足,价格瞬间跌了5%。我们的策略因为没做价格偏离度检查,直接跟着挂了卖单。结果呢?成交在最低点,亏惨了。

经验值参考:
对于主流币种(BTC/ETH),相对偏离度建议设为0.5%-1%
对于山寨币,建议放宽到2%-3%(流动性差,波动大)

4.4 熔断机制:最后的救命稻草

熔断机制,就是当所有风控都失效时,直接「拔网线」。我把它分成三级:

  1. 一级熔断(软熔断): 暂停新订单,但保留现有持仓。通常触发条件是连续N笔亏损,或者价格波动超过阈值。
  2. 二级熔断(硬熔断): 撤销所有未成交订单,平掉所有持仓。触发条件更严格,比如单笔亏损超过总资金的2%。
  3. 三级熔断(终极熔断): 关闭整个交易系统,发送紧急通知给运维人员。这个一般用于极端情况,比如交易所API异常、网络中断等。
# 熔断逻辑示例
class CircuitBreaker:
    def __init__(self):
        self.state = "NORMAL"  # NORMAL, SOFT, HARD, EMERGENCY
        self.consecutive_losses = 0
        self.max_consecutive_losses = 3
    
    def check_and_trigger(self, trade_result):
        if trade_result['pnl'] < 0:
            self.consecutive_losses += 1
        else:
            self.consecutive_losses = 0
        
        if self.consecutive_losses >= self.max_consecutive_losses:
            self.state = "SOFT"
            # 触发一级熔断
            self.trigger_soft_breaker()
        
        # 检查单笔亏损
        if abs(trade_result['pnl']) > 0.02 * total_equity:
            self.state = "HARD"
            self.trigger_hard_breaker()
重要: 熔断触发后,一定要有「恢复机制」。不能熔断了就永远停着。我一般设一个冷却时间,比如5分钟后自动尝试恢复。如果恢复后再次触发,冷却时间加倍。

4.5 实时监控告警:看得见的风险才可控

风控系统再完善,如果没人盯着,也是白搭。实时监控告警,就是你的「哨兵」。

我个人习惯把告警分成三个等级:

等级 颜色 触发条件 通知方式
INFO 蓝色 正常状态变化,如订单成交 日志记录
WARNING 黄色 接近风控阈值,如敞口达到80% 邮件 + 即时消息
CRITICAL 红色 触发熔断,或系统异常 电话 + 短信 + 即时消息

嗯,这里要注意一点:告警不能太多。否则就是「狼来了」效应,真正出问题的时候反而没人重视。我建议每个告警等级每天不超过10条,超过就说明阈值设得太敏感了。

4.6 风控系统整体架构

说了这么多,咱们用一张图来总结风控系统的整体架构。这张图是我自己项目里用的,经过多次迭代,算是比较成熟了。

做市商风控系统架构图 交易策略 风控引擎(核心调度器) 接收策略指令 → 逐项检查 → 通过/拒绝 资金风控 最大敞口 最大订单金额 频率风控 订单频率 撤单频率 价格偏离度 相对偏离 绝对偏离 熔断机制 一级/二级/三级 自动恢复 实时监控 & 告警系统 INFO → WARNING → CRITICAL 交易所API / 订单执行

这张图里,风控引擎是核心调度器。所有策略指令必须先经过风控引擎,逐项检查通过后,才能发往交易所。任何一个模块检查不通过,指令就会被拒绝,并触发告警。

我的建议: 风控引擎一定要独立于策略运行。不能把风控逻辑写在策略代码里,否则策略出bug的时候,风控也跟着失效了。独立进程,独立部署,这是底线。

好了,风控系统设计就讲到这里。记住一句话:风控不是为了限制你赚钱,而是为了让你能一直赚钱。没有风控的做市商,就像没有刹车的跑车——快是快,但迟早要出事。


公众号:蓝海资料掘金营,微信deep3321