TL;DR
- 穿仓的根因不是“强平规则写错”,而是 风险发生 → 风控判定 → 强平下单 → 成交回报 之间存在不可消除的时延窗口;极端行情里这段窗口会被市场跳空“放大成亏损”。
- 要把风险控制在可接受范围,关键是接受异步(各组件对“现在”的认知不一致),并用架构补偿:事件流 + 内存状态 + 分区单线程,同时做好背压/降级。
- 强平执行别迷信一把梭的市价单:更稳的是 限价 IOC/FOK 的“小步快跑”,以破产价为硬底线,逐步吃流动性。
- 兜底必须成体系:保险基金用于吸收坏账;基金不足时才启用 ADL(自动减仓) 作为最后防线。
1. 先把概念说清:破产价(Bankruptcy)≠ 强平成交价(Liquidation Fill)
在高杠杆衍生品里,“穿仓”在工程上表现为用户保证金账户出现负余额。
典型场景是闪崩:价格在毫秒级跳空,风控虽触发强平,但订单真正进入订单簿并成交时,最优对手价已经远低于用户破产价,最终由平台承担差额坏账。
你需要盯的不是“触发线”,而是“窗口期”
从“价格触发强平线”到“强平单完全成交”,中间串着网络、队列、计算、撮合、回报等链路。
正常行情下窗口期很小;极端行情下窗口期不变,但价格变化速度变了,结果就是滑点爆炸。
2. 穿仓三连击:时延鸿沟、流动性真空、系统雪崩
- 时延鸿沟:风险判定是基于“近似当前”的行情与状态快照做出的,但执行一定发生在未来;越快的行情,越容易“决策已过期”。
- 流动性黑洞:闪崩时买盘撤退,盘口深度塌陷;强平卖单会进一步砸穿盘口,形成自激式负反馈。
- 系统雪崩:同时强平的用户过多,风控、消息队列、撮合入口排队增长,延迟继续抬升,反过来扩大穿仓。
3. 原理视角:这是分布式系统的“时序 + 状态一致性”问题
行情、撮合、风控三套系统天然异步:风控看到的价格、仓位、未成交委托,永远是一份带延迟的快照。
你无法靠“全局锁”把它们变成同步系统(性能会先死)。更现实的做法是:
- 用事件流组织状态更新(行情 tick、成交回报、订单状态),让状态由事件驱动演进;
- 风险引擎内存化保存关键状态(仓位/保证金/委托),避免查询链路把延迟拉长;
- 通过分区(sharding)+ 单线程事件循环规避锁竞争,让延迟可预测;
- 用快照 + 事件回放(event sourcing)保证可恢复性与一致性对账。
4. 风控工程最容易踩的坑:背压没有设计好
极端行情本质是“惊群效应”。当撮合入口队列变长、发送缓冲区被打满、下游消费变慢时,压力会沿链路反向传导。
如果你没有明确的背压策略(限流、合并、优先级、熔断、降级),系统会用最糟糕的方式自发降级:延迟飙升 + 丢消息/断链。
建议:当检测到撮合侧拥塞时,风控优先处理风险敞口最大的仓位;对“边缘风险”仓位延迟/合并处理,避免把系统推入雪崩。
5. 强平执行策略:用“可控滑点”的 IOC/FOK 迭代替代一把梭
市价强平看似最快,但在流动性真空里最容易穿仓。
一个更稳的策略是:基于盘口与破产价计算“最差可接受价格”,发出限价 IOC/FOK 强平单,
未成交部分立即撤销,然后根据最新盘口再次迭代(小步快跑)。
- 优点:把最坏成交价限制在风险模型允许的范围内,降低一次性砸盘造成的额外滑点。
- 代价:可能需要更多轮次(时间换空间),要求更稳定的事件处理与队列容量规划。
6. 兜底体系:保险基金 + ADL(自动减仓)
- 保险基金(Insurance Fund):用强平盈余等方式持续积累,用于吸收穿仓坏账,把系统从“单次黑天鹅”里救出来。
- ADL(Auto-Deleveraging):当保险基金不足时的最后防线,按“盈利×杠杆”等规则挑选对手方仓位强制减仓,避免平台资不抵债。
7. 适用场景:什么团队该立刻把这套东西当成‘生存需求’
- 做高杠杆衍生品(永续/期货/期权),且追求低延迟撮合与高并发。
- 撮合、网关、风控、清算已开始服务多资产/多交易对,强平量在波动日会成倍放大。
- 你已经经历过一次“行情崩 + 系统延迟雪崩”的事故复盘,知道这不是靠加机器能解决的。