加密货币交易所六:风险管理系统
10 倍杠杆做多 BTC,开仓 50000,跌到 45000 会被强平吗?不会,45226 就到了。这一篇把强平价一步步算出来,再把强平、清算、穿仓、自动减仓这四个被混作一谈的环节拆开。
一道题,拿计算器就能验:
你用 10 倍杠杆做多 1 个 BTC,开仓价 50000 USDT,逐仓,初始保证金 5000 USDT。维持保证金率 0.5%。忽略手续费和资金费率。价格跌到多少会被强平?
多数人的第一反应是 45000 —— 10 倍杠杆,跌 10% 就把保证金亏光了。这个答案错了,而且错的方向是危险的那一边:真实的强平价是 45226.13,比 45000 早了 226 USDT。
强平价比「跌 1/L」来得更早
差在哪?强平不是等你亏光才发生,是等你只剩维持保证金那么多就发生。交易所不能让你亏到 0,因为平仓需要时间,等你归零再动手,滑点一出就是负数,那笔钱得它自己贴。
所以触发条件是一个等式:
保证金余额 = 维持保证金
其中: 保证金余额 = 初始保证金 + 未实现盈亏 = 5000 + (P − 50000) × 1 维持保证金 = 当前名义价值 × 维持保证金率 = P × 1 × 0.5%要紧的是右边那一项:维持保证金按当前名义价值算,不是按开仓时的。 价格一动,你要守住的那条线自己也在动。这是「跌 10%」那个直觉出错的全部原因。(这是 Binance U 本位的算法,代进它公布的强平价公式得到的就是下面这个数。各家不完全统一 —— Bybit 公布的公式按开仓名义价值算维持保证金,同样的参数解出来是 45250。)
代进去解:
5000 + P − 50000 = 0.005P P − 0.005P = 45000 0.995P = 45000 P = 45226.13验算一遍:价格 45226.13 时,浮亏 4773.87,保证金余额剩 226.13;此刻的维持保证金是 45226.13 × 0.5% = 226.13。两边相等,正好在线上。
同一个式子换杠杆再算几遍(1 BTC,开仓 50000,维持保证金率固定 0.5%):
| 杠杆 | 初始保证金 | 强平价 | 实际跌幅 | 「1/杠杆」的粗算 |
|---|---|---|---|---|
| 5× | 10000 | 40201.01 | 19.60% | 20% |
| 10× | 5000 | 45226.13 | 9.55% | 10% |
| 20× | 2500 | 47738.69 | 4.52% | 5% |
| 50× | 1000 | 49246.23 | 1.51% | 2% |
| 100× | 500 | 49748.74 | 0.50% | 1% |
看最后两列的差距怎么随杠杆张开。5 倍杠杆时粗算法只差 0.4 个百分点,100 倍杠杆时它差了整整一半 —— 你以为能扛 1% 的回撤,实际只能扛 0.5%。原因不难看出:维持保证金率 0.5% 相对于 100 倍杠杆的初始保证金率 1%,已经吃掉了一半的缓冲。杠杆越高,维持保证金这一截在你的本金里占比越大。
两个必须补上的前提。第一,判定用的是标记价格,不是最新成交价 —— 这是第一篇讲标记价格时那个设计的落点,用最新成交价的话,一次插针就能扫掉一片本来健康的仓位。第二,上面全程忽略了手续费和资金费率,它们都从保证金余额里出,真实的强平价会比 45226 再高一点。
维持保证金率不是一个常数,它跟着仓位大小走
上面那张表把维持保证金率钉死在 0.5%,方便算,但不真实。真实的规则叫风险限额(也叫阶梯保证金):仓位的名义价值越大,维持保证金率越高,允许的最大杠杆越低。
分档的道理很直接。一个 5000 USDT 的仓位被强平,市价单打出去几乎没有冲击,0.5% 的缓冲够用。一个 5000 万 USDT 的仓位被强平,这笔单子自己就能把价格砸穿好几个档位 —— 交易所要为这个冲击预留更厚的垫子,所以对大仓位要求更高的维持保证金率。同一个理由让最大杠杆随着仓位往下降:不能让一个人用 100 倍杠杆开出一个能砸穿市场的头寸。
具体的档位各家不同、各品种也不同,得看交易所自己的合约规则页。给两个有出处的坐标:Bybit 的 BTCUSDT 永续,仓位价值在 200 万 USDT 以内维持保证金率是 0.5%,涨到 260 万时升到 0.56%;Binance 的 BTCUSDT 最高杠杆档是 125 倍,对应初始保证金率 0.8%、维持保证金率 0.4%。
这里有个容易想错的地方:跨过档位边界,维持保证金并不会一次性跳变。 档位表里除了费率还带一个扣减项(Binance 叫 maintenance amount,Bybit 叫维持保证金速算额),它的存在就是为了把边界抹平:
第一档 0 – 100 万 费率 0.5% 扣减 0第二档 100 万以上 费率 1% 扣减 5000
边界上 100 万: 100万 × 0.5% − 0 = 5000 100万 × 1% − 5000 = 5000 ← 两边相等,连续名义价值 120 万: 120万 × 1% − 5000 = 7000所以变的不是总额,是边际:超出边界的那部分按更高的费率计,维持保证金成了一条斜率逐段变陡的折线。真正会硬跳变的是最大杠杆 —— 仓位跨进下一档,允许的杠杆直接下调,想再加仓就必须先补保证金。
- 加仓会同时抬高维持保证金和压低可用杠杆。 前者是连续的、后者是跳变的,两个方向都在把你往强平线推,而价格一动没动。
- 强平过程中仓位在缩小,档位会往回走。 平掉一部分之后名义价值降下来,边际费率退回低档 —— 这正是「部分强平」能救回一个仓位的机制原理,不只是「少平一点」这么简单。
全仓和逐仓解的是同一个不等式,分子不一样
判定条件的形状对两种模式是一样的:保证金余额跌破维持保证金就触发。区别在保证金余额里装的是什么。
| 逐仓 | 全仓 | |
|---|---|---|
| 保证金余额 | 这个仓位单独划出的那笔钱 + 它自己的浮盈浮亏 | 账户全部可用余额 + 所有仓位的浮盈浮亏之和 |
| 触发范围 | 只强平这一个仓位 | 从整个账户的角度判定 |
| 亏损上界 | 划进去的那笔保证金 | 账户里的全部钱 |
全仓模式允许盈利仓位补贴亏损仓位,整体保证金效率更高。一个赚着的 ETH 多头能替一个亏着的 BTC 多头顶住,两个仓位加起来只要还在线上就不触发。逐仓把每个仓位关进自己的盒子,BTC 那边爆掉也波及不到 ETH。
效率和隔离只能二选一,这不是哪个更好的问题。逐仓的代价是资金利用率低,而且你得逐个仓位去盯;全仓的代价是风险在账户内部传导,一个仓位的亏损会缩短其它所有仓位的寿命 —— 而这件事在界面上不会有任何提示,你只会看到另外几个仓位的强平价莫名其妙地往里挪了。
全仓还带来一个工程上的难题:账户级的风险判定需要把这个账户在所有交易对上的仓位凑齐才能算,而这些仓位散落在不同的撮合分片上(第五篇讲过分片)。风控服务因此必须有一份跨分片的账户视图,它的更新延迟直接就是风险判定的延迟。
强平是触发,清算是处置,穿仓是结果
这三个词经常被混作一谈,实际上是三个不同的环节。原文档里那种「强制平仓机制」的说法把它们压成了一件事,而排查线上问题的时候,分清楚这三层是第一步。
强平(触发) 是那个不等式成立的一瞬间。它只是一个判定结果,此刻还什么都没发生。
清算(处置) 是接下来那一整套动作,而且不止一种走法:
- 部分减仓。 先平掉一部分,让名义价值降下来。上一节说过,这同时把维持保证金率拉回低档,双向都在救这个仓位。够了就停,这是对用户损失最小的走法。
- 全部平仓。 部分减仓不够,或者仓位本来就小到不值得分批,整个平掉。
- 接管。 有些交易所在这一步把仓位从用户账户转移到清算引擎名下,由它按自己的节奏去市场上出清,用户账户当场结清。这样做的好处是,出清过程中的额外滑点不再算在用户头上。
注意流程里「冻结账户操作」排在「生成强平订单」之前。顺序不能反:不先冻结的话,用户在平仓单执行的那几百毫秒里还能继续开仓,风控刚算出来的那个结论立刻就过期了。
穿仓 是清算没能兜住的结果:仓位平完,保证金余额是负的。用户不会被追缴(合约交易所普遍承诺这一点),那这个窟窿谁填?下一节。
保险基金和自动减仓是最后两道
穿仓的亏损先由保险基金吸收。这笔钱的来源不是交易所拨款,而是清算本身的收益:强平订单如果成交在比强平价更好的位置,多出来的那部分归保险基金。所以保险基金在平静时期一直在长,在剧烈行情里被大口消耗。
保险基金也见底的时候,只剩最后一招:自动减仓(ADL)。系统从对手方里挑出一批仓位强制平掉,用他们的盈利去填这个窟窿。被挑中的排序通常按「盈利率 × 有效杠杆」,也就是赚得最多、杠杆用得最狠的那批人先被减。
ADL 是整套风险体系里最不受欢迎的机制,因为它惩罚的是判断正确的那一方 —— 你看对了方向、赚了钱,仓位却被系统强行平掉一部分。但它的替代方案更糟:不做 ADL,交易所就得自己承担穿仓损失,承担不了就是资不抵债,所有人的钱一起出问题。ADL 是把一个可能击穿整个平台的损失,摊到少数几个赚得最多的账户头上。
从触发到 ADL 这四层,越往后越极端,也越少发生。但风控系统的设计要照着最后一层来 —— 前三层每天都在跑,只有最后一层决定极端行情里这个平台还在不在。
保证金要求应该跟着市场走,不是钉死
为了应对市场波动,保证金要求应该能够动态调整。固定的保证金率在平静期太松、在极端行情里又调得太晚,几个真正该看的输入是:
- 波动率。 同样的 0.5% 缓冲,在日波动 2% 的市场里够用,在日波动 20% 的市场里几分钟就穿了。
- 订单簿深度。 维持保证金要覆盖的是清算时的冲击成本,而冲击成本直接由深度决定。深度掉一半,同样大小的仓位清算起来贵一倍。
- 持仓集中度。 一个账户占了某个合约未平仓量的很大一块,它的强平本身就是一次流动性事件。风险限额的分档处理的是这件事的静态部分,动态调整处理的是它随行情变化的部分。
难点全在调整的时机上,而且两个方向都会出事。提前调高保证金要求,等于在行情还没坏之前就逼一批人减仓,用户会说你在收割;等行情坏透了再调,那些本来能扛过去的仓位会被这次调整直接推进强平 —— 调保证金这个动作本身就能制造一波强平。 这也是为什么这类参数的变更普遍要提前公告,而不是让系统实时自动去动。
这套系统真正难的地方
风险判定的延迟就是穿仓的概率。 标记价格更新到风险重算之间的这段时间,如果价格继续往不利方向跑,等系统反应过来仓位已经在水下了。这段延迟压不到零,只能压小。它也是「强平价算出来是 45226,实际成交在 45100」这类落差的主要来源之一。
清算订单是市场冲击的来源,而不只是它的受害者。 一批强平单同时打进订单簿,把价格推得更低,推低之后触发下一批强平 —— 这个正反馈在剧烈行情里是真实发生的。部分强平、分批出清、接管,这些机制都是在拆这个反馈环,代价是清算变慢,而慢本身又提高了穿仓风险。没有一个设定能同时让清算既快又不冲击市场。
保险基金的规模是个公开的信号,也是个负担。 它的余额通常是公开的,用户会拿它当平台安全的指标。规模不够,极端行情里 ADL 频繁触发,用户跑;规模过大,说明清算收益长期没有回馈给市场,那是另一种批评。BitMEX 历史上维持过规模相当可观的保险基金,并且以 BTC 计价公开披露 —— 用哪种资产计价本身也是个决策,以 BTC 计价的基金在币价下跌时购买力同步缩水,而穿仓恰恰更容易发生在下跌行情里。
压力测试只能测你想得到的情景。 重放 2020 年 3 月那种历史行情、假设主要交易对短时间内波动 50%、把某个参数单独拨动看系统怎么响应 —— 这些都有价值,但它们共同的盲区是:真正击穿系统的那次,通常是几个单独看都在容忍范围内的因素同时发生。反过来问「什么情况会让保险基金耗尽」比正着推演有用,因为它逼你说出一个具体的数字,而不是一句「系统表现稳定」。
这篇是 加密货币交易所的第 6 篇。前一篇是 加密货币交易所五:交易引擎,后一篇是 加密货币交易所七:清算系统。