Day 101
Day 101:清算引擎设计 — 从标记价格到ADL
清算瀑布完整流程(标记价格→保证金监控→分级清算→保险基金→ADL→熔断)、标记价格设计(TWAP+多源)、各协议保险基金对比、ADL排序算法、Keeper激励
2026-04-18
交易清算引擎标记价格ADL保险基金KeeperDay101
核心概念
什么是清算引擎?
一句话定义:清算引擎(Liquidation Engine)是交易系统中的风险处置组件,当用户的保证金不足以覆盖亏损时,自动关闭其仓位以防止坏账,保护交易所和其他交易者不受损失。
类比理解:清算引擎就像房贷的"断供处置机制"——当你贷款买房,房价下跌导致抵押品不足以覆盖贷款时,银行会强制卖出房产(法拍)。清算引擎做同样的事,只不过速度是毫秒级的。
为什么清算引擎如此关键?
清算引擎是交易所的"最后防线":
═══════════════════════════════════════
如果清算引擎失败:
├── 用户亏损超过保证金 → 产生坏账
├── 坏账由保险基金承担 → 保险基金耗尽
├── 保险基金耗尽 → ADL(自动减仓其他用户)
├── ADL大量触发 → 用户信心崩溃
├── 信心崩溃 → 用户撤资出逃
└── 死亡螺旋 → 交易所/协议倒闭
历史教训:
├── 2020.3.12 "黑色星期四"
│ └── BitMEX清算引擎过载 → $800M清算 → BTC跌至$3800
├── 2022.5 LUNA崩溃
│ └── 级联清算 → $400亿蒸发
└── 2024.3 Hyperliquid JELLY事件
└── 巨鲸操纵清算 → 保险基金亏损$1200万
知识点详解
知识点 1:清算瀑布完整流程
清算瀑布(Liquidation Waterfall)— 六道防线:
═══════════════════════════════════════
Level 0:标记价格计算
═══════════════════════════════════════
目的:防止价格操纵触发不公平清算
方法:
├── 多交易所现货价格加权平均
├── TWAP 平滑(30s-5min窗口)
├── 异常值剔除(偏离中位数>5%的源)
└── 最终 Mark Price = Index Price + 衰减EMA(基差)
示例:
Binance BTC: $60,050 权重30%
OKX BTC: $60,030 权重25%
Coinbase: $60,080 权重25%
Bybit: $60,020 权重20%
→ Index Price ≈ $60,048
→ Mark Price = $60,048 + EMA(合约基差)
↓
Level 1:保证金实时监控
═══════════════════════════════════════
持续计算每个用户的保证金率:
Margin Ratio = (账户净值) / (仓位价值)
= (余额 + 未实现盈亏) / (持仓 × Mark Price)
维持保证金率:
├── 逐仓模式:通常 0.5% - 2%
├── 全仓模式:账户级别计算
└── 组合保证金:Portfolio Margin(更高效)
↓
Level 2:预警与减仓建议
═══════════════════════════════════════
当 Margin Ratio 接近维持保证金率时:
├── 推送预警通知
├── 建议追加保证金
├── 建议部分平仓
└── 限制开新仓
↓
Level 3:分级清算(Partial Liquidation)
═══════════════════════════════════════
不直接清算全部仓位,而是分批:
Round 1:清算 25% 的仓位
→ 重新计算 Margin Ratio
→ 如果恢复到安全水平 → 停止
Round 2:清算 25% 的仓位
→ 重新计算
→ 如果仍不足 → 继续
Round 3-4:继续清算直到安全或全部清完
好处:
├── 减少对市场的冲击
├── 给用户保留部分仓位的机会
└── 减少清算损失
↓
Level 4:保险基金吸收坏账
═══════════════════════════════════════
如果清算产生坏账(成交价差于破产价格):
├── 保险基金吸收亏损
├── 基金来源:清算手续费 + 强平利润 + 交易所注资
└── 健康度指标:基金/OI比率 > 1%为健康
↓
Level 5:ADL(自动减仓)
═══════════════════════════════════════
保险基金耗尽时的最后手段:
├── 选择对手方(盈利最多 + 杠杆最高的)
├── 强制部分平仓
├── 被选中方不情愿但必须接受
└── 这是"社会化损失"的一种形式
↓
Level 6:熔断机制
═══════════════════════════════════════
极端情况下的紧急措施:
├── 价格限制(涨跌停板)
├── 暂停交易
├── 强制降杠杆
└── 系统级风控介入
知识点 2:标记价格设计
为什么不能直接用合约最新价格?
使用最新成交价的风险:
═══════════════════════════════════════
攻击场景:
1. 攻击者在流动性差的时段下大单
2. 合约价格瞬间偏移 5-10%
3. 大量用户被清算
4. 攻击者低价接盘清算仓位
5. 价格恢复 → 攻击者获利
这就是为什么需要 Mark Price!
Mark Price 设计三原则:
├── 抗操纵:不能被单一交易所/大单影响
├── 及时性:要跟上真实市场变化
└── 平滑性:避免毛刺触发不必要的清算
标记价格计算方法
标记价格的三层计算:
═══════════════════════════════════════
Layer 1:指数价格(Index Price)
从多个现货交易所获取价格,加权平均
sources = [
{ exchange: "Binance", weight: 0.30, price: getPrice("binance") },
{ exchange: "OKX", weight: 0.25, price: getPrice("okx") },
{ exchange: "Coinbase", weight: 0.25, price: getPrice("coinbase") },
{ exchange: "Bybit", weight: 0.20, price: getPrice("bybit") },
]
// 异常值过滤
median = getMedian(sources.map(s => s.price))
filtered = sources.filter(s => abs(s.price - median) / median < 0.05)
// 加权平均
indexPrice = sum(filtered.map(s => s.price * s.weight))
/ sum(filtered.map(s => s.weight))
Layer 2:基差 EMA(Basis EMA)
// 合约价格与指数价格的差值,用EMA平滑
basis = lastTradedPrice - indexPrice
basisEMA = EMA(basis, window=5min)
Layer 3:标记价格(Mark Price)
markPrice = indexPrice + basisEMA
// 限制 Mark Price 不能偏离 Index Price 太多
if abs(markPrice - indexPrice) / indexPrice > 0.005:
markPrice = indexPrice * (1 + sign(basisEMA) * 0.005)
TWAP(时间加权平均价格)
TWAP 计算:
═══════════════════════════════════════
目的:平滑价格波动,减少瞬时异常影响
简单TWAP(30秒窗口):
prices = [60050, 60045, 60055, 60040, 60060, 60048]
twap = average(prices) = 60049.67
加权TWAP(越近的权重越大):
weights = [0.05, 0.10, 0.15, 0.20, 0.25, 0.25]
twap = sum(prices[i] * weights[i]) = 60050.25
指数移动平均(EMA):
alpha = 2 / (N + 1) // N=周期
ema[t] = alpha * price[t] + (1-alpha) * ema[t-1]
// 对近期价格更敏感
知识点 3:保险基金机制
保险基金(Insurance Fund)的运作机制:
═══════════════════════════════════════
收入来源:
├── 清算手续费(清算时额外收取0.5-1%)
├── 清算利润(清算价优于破产价时的差额)
├── 交易所初始注资
└── 交易手续费分成(部分协议)
支出:
├── 坏账吸收(清算价差于破产价时的亏损)
└── 极端行情下的巨额亏损
计算示例:
═══════════════════════════════════════
用户A:10x做多BTC @ $60,000
├── 保证金:$6,000(10%)
├── 维持保证金率:0.5%
├── 清算价格:$54,300(约)
├── 破产价格:$54,000(保证金归零)
│
├── 场景1:清算成交 @ $54,200(优于破产价)
│ └── 利润 = $54,200 - $54,000 = $200 → 注入保险基金
│
└── 场景2:清算成交 @ $53,800(差于破产价)
└── 坏账 = $54,000 - $53,800 = $200 → 保险基金承担
各协议保险基金对比
| 协议 | 基金规模 | 来源 | 特殊机制 |
|---|---|---|---|
| Binance | ~$1B+ | 清算利润+注资 | 最大,不透明 |
| Bybit | ~$300M | 清算利润 | USDT计价 |
| Hyperliquid | ~$300M+ | HLP收益+清算 | 链上可验证 |
| dYdX v4 | ~$50M | 交易费分成 | 链上透明 |
| GMX | ~$30M | GLP手续费 | LP即保险基金 |
| Aave | ~$400M | Safety Module质押 | AAVE质押者承担 |
保险基金健康度评估:
═══════════════════════════════════════
健康指标:Insurance Fund / Total Open Interest
> 2% :非常健康(可承受极端行情)
1-2% :健康
0.5-1% :关注(需要补充)
< 0.5% :危险(ADL风险高)
Hyperliquid JELLY 事件教训:
├── 巨鲸开设大额空头 → 自我清算
├── 清算仓位进入保险基金
├── 保险基金成为被动多头
├── 鲸鱼在现货市场拉盘
├── 保险基金亏损 $1200万
└── 教训:保险基金不应成为可被利用的交易对手
知识点 4:ADL(自动减仓)排序算法
ADL(Auto-Deleveraging)机制详解:
═══════════════════════════════════════
触发条件:保险基金无法覆盖坏账
ADL排序原理:
├── 选择"最应该被减仓"的对手方
├── 排序依据:盈利比例 × 杠杆倍数
└── 盈利最多+杠杆最高的用户优先被选中
排序公式(以Binance为例):
ADL_Rank = PnL_Percentage × Effective_Leverage
其中:
PnL_Percentage = 未实现盈亏 / 初始保证金
Effective_Leverage = abs(仓位名义价值) / (余额 + 未实现盈亏)
示例排序:
用户B:盈利200%,10x杠杆 → Rank = 2.0 × 10 = 20 [最先被ADL]
用户C:盈利150%,5x杠杆 → Rank = 1.5 × 5 = 7.5
用户D:盈利50%,20x杠杆 → Rank = 0.5 × 20 = 10
用户E:盈利10%,2x杠杆 → Rank = 0.1 × 2 = 0.2 [最后被ADL]
排序:B(20) > D(10) > C(7.5) > E(0.2)
ADL 指示灯:
■■■■■ 5格全亮:下一个就是你
■■■■□ 4格:高风险
■■■□□ 3格:中风险
■■□□□ 2格:低风险
■□□□□ 1格:极低风险
DeFi 中的 ADL 替代方案
DeFi 协议的损失社会化方案:
═══════════════════════════════════════
方案1:ADL(Hyperliquid, dYdX)
与CeFi相同,对手方强制平仓
方案2:坏账社会化(GMX)
坏账由GLP持有者按比例分担
├── 优点:不影响交易者仓位
└── 缺点:LP承担额外风险
方案3:Safety Module(Aave)
AAVE质押者用质押资产覆盖坏账
├── 优点:专门的风险吸收层
└── 缺点:需要足够的质押量
方案4:利率调节(Compound)
坏账通过提高借贷利率逐步消化
├── 优点:温和、无强制操作
└── 缺点:处理速度慢
知识点 5:Keeper 激励机制
DeFi清算中的 Keeper(清算机器人):
═══════════════════════════════════════
为什么需要Keeper?
CeFi:清算由交易所自己执行(内部系统)
DeFi:谁来执行清算?→ 任何人都可以 → Keeper
Keeper 激励设计:
├── 清算奖励:清算金额的 5-15%
│ ├── Aave:5%(基础清算折扣)
│ ├── Compound:8%
│ └── MakerDAO:13%
│
├── Gas 补偿:部分协议额外补贴Gas
│
└── MEV 机会:清算交易本身可以套利
Keeper 面临的挑战:
═══════════════════════════════════════
1. Gas 竞争
└── 多个Keeper抢同一笔清算 → Gas War
2. 成本风险
└── Gas花了,但被别的Keeper抢先 → 亏Gas
3. 价格波动风险
└── 从预言机更新到清算执行之间,价格可能变化
4. 技术门槛
└── 需要监控全部仓位 + 预言机 + Gas优化
Keeper 架构:
[预言机监控] → [仓位扫描] → [清算判断]
↓ ↓ ↓
[价格更新] [保证金计算] [盈利分析]
↓
[发送清算交易]
↓
[MEV保护(Flashbots)]
面试题解析
清算引擎如何防止级联清算?
简短回答(30秒版本):
通过四层防护:(1)使用TWAP+多源标记价格防止价格操纵触发虚假清算;(2)分级清算(先清25%)减少市场冲击;(3)保险基金吸收坏账防止ADL;(4)熔断机制在极端行情下暂停交易。核心思想是把大额清算分散成小额,减少对市场的正反馈冲击。
详细回答(2分钟版本):
防止级联清算的7层设计:
═══════════════════════════════════════
Layer 1:标记价格防操纵
├── 多交易所价格源
├── TWAP平滑
└── 防止单一大单触发大量清算
Layer 2:梯度保证金
├── 仓位越大,维持保证金率越高
├── 大户更早被清算(仓位较小时)
└── 减少大额清算的市场冲击
Layer 3:分级清算
├── 每次只清算25%的仓位
├── 清算后重新评估
└── 避免一次性抛售大量头寸
Layer 4:清算速度限制
├── 限制单位时间内的清算量
├── 如每分钟最多清算 $10M
└── 给市场吸收冲击的时间
Layer 5:保险基金缓冲
├── 充足的保险基金 → 不需要ADL
├── ADL是级联清算的主要传播途径
└── 保险基金越大,系统越稳定
Layer 6:价格限制(涨跌停板)
├── 5分钟内价格变动 > 5% → 暂停1分钟
├── 1小时内变动 > 15% → 暂停10分钟
└── 给市场"冷静期"
Layer 7:跨市场风控
├── 监控现货/期货/期权联动
├── 跨品种风险评估
└── 系统性风险预警
追问准备:
- Q:分级清算不就是延长了清算时间吗?A:是的,这是有意的取舍——用清算速度换市场稳定性。如果一次性清算,冲击可能导致价格进一步下跌,触发更多清算。
- Q:保险基金如何确定合适的规模?A:一般维持在总OI的1-2%以上。需要做压力测试——模拟极端行情(如30%瞬跌)下的坏账总量。
产品经理视角
PM在清算系统中需要关注的产品设计:
═══════════════════════════════════════
1. 用户体验
├── 清算前的预警通知(推送/邮件/短信)
├── 清算价格的清晰展示
├── 保证金率的实时可视化
├── 一键追加保证金功能
└── 清算后的详细报告
2. 透明度
├── 保险基金规模实时展示
├── ADL指示灯
├── 历史清算数据公开
└── 标记价格计算方法公开
3. 公平性
├── 标记价格不可操纵
├── 分级清算保护小户
├── ADL排序规则透明
└── 清算手续费合理
4. 竞品差异化
├── 更低的维持保证金率
├── 更高效的清算(更少损失)
├── 更大的保险基金
└── 更好的清算保护工具
明日预告
Day 102:实时风控系统设计 — 毫秒级风险监控 — 预防胜于清算
- 风控三层架构(预交易+持仓+压力测试)
- 动态保证金模型
- Gauntlet/Chaos Labs 风控方法论
- AI驱动的风控趋势
- DeFi风控的特殊挑战