第十一章:风险控制:最大回撤限制、单笔风险限额、黑天鹅防护、熔断机制
做市交易,说白了就是跟市场做对手盘。
你赚的是买卖价差,但市场随时可能翻脸。我见过太多人,策略跑得好好的,突然一天就爆仓了。为什么?风控没跟上。
这一章,咱们聊聊怎么给系统装上「刹车」和「安全气囊」。
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月的狗狗币闪崩。做市系统最怕这个——流动性瞬间消失,价差拉大到离谱。
怎么防?
- 价格偏离检测:如果当前价格偏离最近N笔成交均价超过X%,立即暂停交易
- 流动性检测:如果买卖价差超过正常水平的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%停止当日交易
}
}
最后说一句:
风控不是限制你赚钱,而是保护你活下去。我见过太多人,策略很牛,但风控一塌糊涂,最后被市场教育了。记住:活得久,比赚得快更重要。