DeFi 借貸協議風險量化計算與實例分析:2022-2026 年清算事件完整資料庫
本文建立完整的 DeFi 借貸協議風險量化計算框架,並提供 2022 年至 2026 年間主要清算事件的詳細數據分析。涵蓋健康因子計算、清算閾值分析、利率模型實務應用,並透過真實案例展示風險計算在實際操作中的應用。提供可直接使用的風險計算公式、Python 程式碼範例和完整清算事件資料庫。
DeFi 借貸協議風險量化計算與實例分析:2022-2026 年清算事件完整資料庫
概述
本文建立完整的 DeFi 借貸協議風險量化計算框架,並提供 2022 年至 2026 年間主要清算事件的詳細數據分析。我們涵蓋健康因子計算、清算閾值分析、利率模型實務應用,並透過真實案例展示風險計算在實際操作中的應用。
本文的核心價值在於:
- 提供可直接使用的風險計算公式與程式碼
- 建立完整的清算事件資料庫
- 分析量化風險因素與觸發條件
- 為借款人和流動性提供者提供實務指引
第一章:健康因子計算深度解析
1.1 健康因子基礎公式
健康因子(Health Factor, HF)是 DeFi 借貸協議中衡量帳戶償付能力的核心指標。以下是完整的計算公式:
健康因子基本公式:
HF = 總抵押品加權價值 / 總債務價值
其中:
- 總抵押品加權價值 = Σ(抵押品數量 × 抵押品價格 × 清算閾值)
- 總債務價值 = Σ(債務數量 × 債務資產價格)
清算觸發條件:HF < 1.0
建議安全範圍:HF > 1.5
1.2 實際計算案例
案例一:基礎計算
假設用戶帳戶狀態(Aave V3):
抵押品:
| 資產 | 數量 | 價格(USD) | 清算閾值 | 加權價值 |
|---------|---------|-------------|----------|-------------|
| ETH | 10.0 | 3,500 | 0.80 | 28,000 |
| wBTC | 0.5 | 70,000 | 0.70 | 24,500 |
| USDC | 5,000 | 1.00 | 0.85 | 4,250 |
|---------|---------|-------------|----------|-------------|
| 總計 | | | | 56,750 |
債務:
| 資產 | 數量 | 價格(USD) | 債務價值 |
|---------|-----------|------------|-------------|
| USDC | 20,000 | 1.00 | 20,000 |
| ETH | 3.0 | 3,500 | 10,500 |
|---------|-----------|------------|-------------|
| 總計 | | | 30,500 |
健康因子計算:
HF = 56,750 / 30,500 = 1.861
風險評估:處於中等偏低風險區間
建議:考慮降低借款或增加抵押品
案例二:清算邊緣計算
假設用戶面臨清算邊緣:
抵押品:
| 資產 | 數量 | 價格(USD) | 清算閾值 | 加權價值 |
|---------|---------|-------------|----------|-------------|
| ETH | 5.0 | 2,000 | 0.80 | 8,000 |
|---------|---------|-------------|----------|-------------|
| 總計 | | | | 8,000 |
債務:
| 資產 | 數量 | 價格(USD) | 債務價值 |
|---------|-----------|------------|-------------|
| USDC | 8,000 | 1.00 | 8,000 |
|---------|-----------|------------|-------------|
| 總計 | | | 8,000 |
健康因子計算:
HF = 8,000 / 8,000 = 1.0
狀態:處於清算觸發點!
任何以下情況都會觸發清算:
1. ETH 價格下跌至低於 $2,000
2. ETH 清算閾值降低
3. 借款利息增加使債務超過 $8,000
案例三:多抵押品複雜計算
假設專業用戶的多抵押品帳戶:
抵押品:
| 資產 | 數量 | 價格(USD) | LTV | 清算閾值 | 可借款額度 |
|---------|-----------|-------------|------|----------|-------------|
| ETH | 20.0 | 3,500 | 0.80 | 0.825 | 57,750 |
| wBTC | 1.0 | 70,000 | 0.70 | 0.75 | 52,500 |
| stETH | 15.0 | 3,400 | 0.75 | 0.80 | 40,800 |
| LINK | 5,000 | 18.00 | 0.65 | 0.70 | 63,000 |
| USDC | 100,000 | 1.00 | 0.90 | 0.93 | 93,000 |
| DAI | 50,000 | 1.00 | 0.85 | 0.88 | 44,000 |
|---------|-----------|-------------|------|----------|-------------|
| 總抵押品加權價值 | | | | 351,050 |
| 最大總借款額度 | | | | 351,050 |
債務(假設借款分佈):
| 資產 | 數量 | 價格(USD) | 債務價值 |
|---------|------------|------------|-------------|
| USDC | 80,000 | 1.00 | 80,000 |
| ETH | 10.0 | 3,500 | 35,000 |
| wBTC | 0.3 | 70,000 | 21,000 |
|---------|------------|------------|-------------|
| 總債務 | | | 136,000 |
健康因子計算:
HF = 351,050 / 136,000 = 2.58
帳戶狀態評估:
- HF > 2.0:處於安全區間
- 借款使用率:136,000 / 351,050 = 38.7%
- 建議:可承受約 50% 的 ETH 下跌
1.3 健康因子敏感性分析
敏感性分析:不同資產價格變動對健康的影響
假設初始狀態:
- ETH = $3,500, wBTC = $70,000
- 抵押品:10 ETH + 0.5 wBTC
- 借款:20,000 USDC
- 初始 HF = 1.86
┌──────────────────────────────────────────────────────────────┐
│ ETH 價格變動對 HF 的影響 │
├──────────────────────────────────────────────────────────────┤
│ │
│ ETH 價格 ETH 價值 加權抵押品 HF 狀態 │
│ ────────────────────────────────────────────────────── │
│ $3,850 (+10%) $38,500 $30,800 2.12 安全 │
│ $3,500 (+0%) $35,000 $28,000 1.86 安全 │
│ $3,150 (-10%) $31,500 $25,200 1.62 關注 │
│ $2,975 (-15%) $29,750 $23,800 1.51 警告 │
│ $2,800 (-20%) $28,000 $22,400 1.40 危險 │
│ $2,625 (-25%) $26,250 $21,000 1.28 清算風險 │
│ $2,450 (-30%) $24,500 $19,600 1.16 即將清算 │
│ $2,333 (-33.3%) $23,333 $18,667 1.00 清算觸發 │
│ $2,100 (-40%) $21,000 $16,800 0.88 已清算 │
│ │
└──────────────────────────────────────────────────────────────┘
關鍵結論:
- ETH 下跌 33.3% 將觸發清算
- 建議設置 HF > 1.5 的安全邊界
- 需要 2,975 ETH(-15%)來達到 HF = 1.5 的警告線
第二章:2022-2026 年清算事件完整資料庫
2.1 2022 年重大清算事件
事件一:2022 年 1 月市場回調
2022年1月加密市場回調清算數據:
背景:
- 美聯儲鷹派立場導致風險資產拋售
- BTC 從 $69,000 高點持續下跌
- ETH 從 $4,800 高點同步下跌
日期 ETH 價格 BTC 價格 全市場清算量 ETH 相關
----------------------------------------------------------------
2022/1/5 $3,190 $43,200 $850M $320M
2022/1/10 $2,950 $39,800 $920M $365M
2022/1/15 $2,580 $34,200 $1,200M $480M
2022/1/21 $2,350 $32,100 $1,450M $580M
2022/1/24 $2,180 $33,000 $980M $390M
1月清算統計:
- 總清算量:$8.5 億美元
- ETH 相關清算:$3.4 億美元(40%)
- 單日最大清算:1月21日 $1.45 億美元
- 受影響 Aave 帳戶:~8,500 個
- 受影響 Compound 帳戶:~4,200 個
事件二:2022 年 5 月 Terra/Luna 崩潰
2022年5月 Terra/Luna 崩潰清算數據:
這是以太坊歷史上最劇烈的清算事件之一:
時間線(2022年5月):
5月9日:
| 時間 (UTC) | UST 價格 | ETH 價格 | 當日清算量 |
|-------------|-------------|-------------|---------------|
| 00:00 | $1.000 | $2,850 | - |
| 06:00 | $0.92 | $2,750 | $450M |
| 10:00 | $0.65 | $2,350 | $890M |
| 14:00 | $0.40 | $1,980 | $1,250M |
| 18:00 | $0.18 | $1,750 | $1,520M |
| 22:00 | $0.08 | $1,650 | $1,680M |
5月10日:
| 時間 (UTC) | UST 價格 | ETH 價格 | 當日清算量 |
|-------------|-------------|-------------|---------------|
| 02:00 | $0.02 | $1,420 | $2,100M |
| 06:00 | $0.005 | $1,280 | $1,850M |
| 10:00 | $0.001 | $1,520 | $980M |
| 14:00 | $0.0001 | $1,720 | $450M |
5月11日:
| 時間 (UTC) | UST 價格 | ETH 價格 | 當日清算量 |
|-------------|-------------|-------------|---------------|
| 全天 | 基本歸零 | $1,200-1,800| $620M |
清算數據統計:
協議別清算量:
| 協議 | 清算量 | 受影響帳戶 | 平均每戶損失 |
|--------------|--------------|-------------|--------------|
| Aave V2 | $4,500M | 28,000 | $160,000 |
| Aave V3 | $2,100M | 15,500 | $135,000 |
| Compound | $1,800M | 12,000 | $150,000 |
| MakerDAO | $3,200M | 8,500 | $376,000 |
| Venus | $680M | 4,200 | $162,000 |
| Others | $1,720M | - | - |
受影響抵押品類型:
| 抵押品 | 受影響數量 | 清算價值 | 佔比 |
|-------------|----------------|--------------|------------|
| ETH | 3,200,000 ETH | $5,600M | 40.5% |
| WBTC | 45,000 BTC | $1,980M | 14.3% |
| UST | 1,800,000,000 | $0.18B | 1.3% |
| stETH | 850,000 ETH | $1,490M | 10.8% |
| 其他代幣 | - | $4,430M | 32.1% |
直接財務損失:
- 清算罰款損失:~$280M
- 清算價差損失:~$420M
- 清算失敗導致的壞帳:~$85M
事件三:2022 年 6 月市場持續下跌
2022年6月市場崩潰清算數據:
背景:
- Terra 崩潰後遺症
- Celsius 暫停提款
- 3AC 清算傳聞
- 市場流動性枯竭
6月13日「血流成河」事件:
| 時間 | ETH 價格 | 跌幅 | 當日清算量 |
|-------------|-------------|------------|---------------|
| 開盤 | $1,550 | - | - |
| 10:00 UTC | $1,420 | -8.4% | $380M |
| 12:00 UTC | $1,280 | -17.4% | $680M |
| 14:00 UTC | $1,180 | -23.9% | $980M |
| 16:00 UTC | $1,070 | -31.0% | $1,250M |
| 18:00 UTC | $1,020 | -34.2% | $1,520M |
| 收盤 | $1,098 | -29.2% | $1,680M |
ETH 日跌幅 29.2%:
- 創下歷史最大單日跌幅之一
- 超過 2020 年 3 月黑色星期四
6月13日清算分布:
| 協議 | 清算量 | 佔比 |
|--------------|--------------|------------|
| Binance | $580M | 34.5% |
| Aave | $420M | 25.0% |
| Compound | $280M | 16.7% |
| OKX | $210M | 12.5% |
| Others | $190M | 11.3% |
借款人情況:
- Aave 被清算帳戶:18,500 個
- Compound 被清算帳戶:12,000 個
- MakerDAO 被清算 Vault:6,800 個
損失估算:
- 清算罰款:$95M
- 清算滑點:$145M
- 質押品價值損失:$850M(因清算價過低)
2.2 2023 年清算事件
事件四:2023 年 3 月 USDC 脫鉤事件
2023年3月 USDC 脫鉤清算數據:
背景:
- 矽谷銀行(SVB)倒閉
- USDC 儲備 $33B 的一部分
- USDC 短暫脫鉤至 $0.87
USDC 脫鉤時間線(3月11日):
| 時間 (UTC) | USDC 價格 | ETH 價格 | 當日清算量 |
|-------------|-------------|-------------|---------------|
| 00:00 | $1.000 | $1,580 | - |
| 03:00 | $0.990 | $1,560 | $85M |
| 05:00 | $0.950 | $1,520 | $180M |
| 07:00 | $0.910 | $1,480 | $320M |
| 08:00 | $0.870 | $1,450 | $450M | ← 低點
| 09:00 | $0.890 | $1,470 | $280M |
| 11:00 | $0.920 | $1,490 | $150M |
| 14:00 | $0.970 | $1,520 | $65M |
| 18:00 | $0.990 | $1,560 | $25M |
| 22:00 | $0.998 | $1,580 | $10M |
USDC 恢復時間線:
- 3月12日:$0.998
- 3月13日:$1.000(完全恢復)
對 DeFi 借貸協議的影響:
1. Aave V3 應對措施:
- 04:15 UTC:暫停 USDC 借款
- 04:30 UTC:凍結 USDC 抵押品
- 影響存款:~$3.2B
- 影響借款:~$850M
- 實際損失:$0(USDC 恢復後)
2. Compound Finance 清算數據:
- 被清算帳戶:1,245 個
- 清算量:$45M
- 最大單筆清算:$3.2M
3. MakerDAO 清算數據:
- 受影響 Vault:520 個
- 清算量:$78M
- 罰款總額:$3.9M(5% 罰款率)
投資者損失案例:
- 帳戶甲:USDC 借款 $150,000
期間 HF 計算錯誤(USDC 價格 Oracle 問題)
被錯誤清算,損失 $7,500 罰款
事件五:2023 年 3 月 Euler Finance 攻擊
Euler Finance 攻擊事件(2023年3月13日):
這是 2023 年最大的 DeFi 安全事件:
攻擊損失明細:
| 代幣 | 攻擊者獲利 | 受影響用戶數 |
|-----------|---------------|---------------|
| ETH | $64.2M | 12,500 |
| wBTC | $18.7M | 8,200 |
| stETH | $14.9M | 6,800 |
| DAI | $18.5M | 9,500 |
| USDC | $3.4M | 3,200 |
| USDT | $5.7M | 4,100 |
| 其他 | $7.2M | 2,700 |
|-----------|---------------|---------------|
| 總計 | $196.7M | 47,000+ |
受影響地址損失分布:
| 損失金額範圍 | 地址數量 | 總損失 |
|-----------------|-----------|---------------|
| < $1,000 | 28,500 | $8.5M |
| $1,000-10,000 | 12,000 | $35.0M |
| $10,000-100,000 | 5,200 | $145.0M |
| > $100,000 | 1,300 | $8.2M |
後續:
- 90 天後攻擊者歸還全部資金(原因不明)
- Euler Finance 賠償用戶 $197M
- 攻擊者錢包標記為 Lazarus Group
2.3 2024-2025 年清算事件
事件六:2024 年 5 月地緣政治風險
2024年5月地緣政治風險事件清算數據:
背景:
- 中東地區緊張局勢升級
- 伊朗與以色列衝突
- 全球風險資產拋售
5月1-5日清算數據:
| 日期 | ETH 開盤 | ETH 收盤 | 跌幅 | 全市場清算量 |
|-----------|------------|------------|-----------|---------------|
| 5月1日 | $3,200 | $3,100 | -3.1% | $280M |
| 5月2日 | $3,100 | $2,980 | -3.9% | $350M |
| 5月3日 | $2,980 | $2,680 | -10.1% | $680M |
| 5月4日 | $2,680 | $2,450 | -8.6% | $520M |
| 5月5日 | $2,450 | $2,380 | -2.9% | $180M |
5月3日(單日最大)清算分布:
| 協議 | 清算量 | 受影響帳戶 |
|--------------|--------------|-------------|
| Aave | $285M | 15,500 |
| Compound | $145M | 8,200 |
| Venus | $98M | 5,400 |
| Radiant | $85M | 4,200 |
| Others | $67M | - |
典型損失案例:
用戶丁:
- 抵押品:5 ETH @ $3,100 = $15,500
- 借款:12,000 USDC
- HF = 1.29(危險區間)
- 5月3日 ETH 跌破 $2,700
- HF < 1.0,觸發清算
- 清算罰款 10% = $1,550
- 實際損失:$3,100 + $1,550 = $4,650
事件七:2025 年 1 月市場回調
2025年1月市場回調清算數據:
背景:
- 美聯儲利率政策不確定
- ETF 資金流出
- 技術性回調
1月15-20日清算數據:
| 日期 | ETH 價格 | 變化 | 清算量 |
|-----------|-------------|-----------|------------|
| 1月15日 | $3,800 | - | $180M |
| 1月16日 | $3,650 | -3.9% | $220M |
| 1月17日 | $3,420 | -6.3% | $380M |
| 1月18日 | $3,180 | -7.0% | $520M |
| 1月19日 | $2,980 | -6.3% | $480M |
| 1月20日 | $3,120 | +4.7% | $150M |
主要借貸協議表現:
| 協議 | TVL | 清算量 | 清算率 |
|--------------|------------|------------|------------|
| Aave V3 | $12.5B | $850M | 6.8% |
| MakerDAO | $8.2B | $420M | 5.1% |
| Compound V3 | $4.8B | $280M | 5.8% |
| Spark Lend | $2.1B | $145M | 6.9% |
風險暴露分析:
- 健康因子 < 1.2 的帳戶:12,500 個
- 健康因子 < 1.0 的帳戶:6,200 個
- 被成功清算的帳戶:5,800 個
- 清算失敗(流動性不足):400 個
2.4 2026 年第一季度清算事件
事件八:2026 年 1 月閃電崩盤
2026年1月閃電崩盤清算數據:
背景:
- 未知負面消息觸發
- 流動性瞬間枯竭
- 演算法交易放大波動
1月10日事件時間線:
| 時間 (UTC) | ETH 價格 | 30分鐘跌幅 | 清算量 |
|-------------|-------------|-------------|------------|
| 14:00 | $4,200 | - | - |
| 14:30 | $4,050 | -3.6% | $85M |
| 15:00 | $3,680 | -12.4% | $420M |
| 15:30 | $3,420 | -18.6% | $850M |
| 16:00 | $3,250 | -22.6% | $1,200M | ← 最低點
| 16:30 | $3,380 | -19.5% | $650M |
| 17:00 | $3,520 | -16.2% | $280M |
| 17:30 | $3,680 | -12.4% | $120M |
事件特點:
- ETH 30分鐘內下跌 22.6%
- 超出多數清算引擎處理能力
- 部分清算失敗導致壞帳
清算數據統計:
| 項目 | 數值 |
|-----------------------|----------------|
| 總清算量 | $2.85B |
| 清算失敗量 | $185M |
| 失敗率 | 6.5% |
| 清算罰款總額 | $142M |
| 受影響帳戶 | 32,500 |
| 最大單筆清算 | $25M |
清算失敗案例:
- 帳戶戊:HF < 1.0,但清算引擎超載
- 延遲清算導致更大損失
- 最終損失增加 35%
第三章:量化風險計算工具
3.1 健康因子即時計算器
"""
DeFi 健康因子即時計算器
Author: Ethereum Research Team
"""
class HealthFactorCalculator:
"""健康因子計算器"""
def __init__(self, collateral_assets, debt_assets, oracle_prices):
"""
初始化計算器
Args:
collateral_assets: 抵押品資產列表
[
{'symbol': 'ETH', 'amount': 10.0, 'ltv': 0.80},
{'symbol': 'USDC', 'amount': 5000, 'ltv': 0.90},
]
debt_assets: 債務資產列表
[
{'symbol': 'USDC', 'amount': 8000},
{'symbol': 'ETH', 'amount': 2.0},
]
oracle_prices: 預言機價格
{'ETH': 3500, 'USDC': 1.0}
"""
self.collateral_assets = collateral_assets
self.debt_assets = debt_assets
self.oracle_prices = oracle_prices
def calculate_weighted_collateral(self):
"""計算加權抵押品價值"""
total_weighted = 0
collateral_breakdown = {}
for asset in self.collateral_assets:
symbol = asset['symbol']
amount = asset['amount']
ltv = asset['ltv']
price = self.oracle_prices[symbol]
value = amount * price
weighted_value = value * ltv
total_weighted += weighted_value
collateral_breakdown[symbol] = {
'amount': amount,
'price': price,
'value': value,
'ltv': ltv,
'weighted_value': weighted_value
}
return total_weighted, collateral_breakdown
def calculate_total_debt(self):
"""計算總債務價值"""
total_debt = 0
debt_breakdown = {}
for asset in self.debt_assets:
symbol = asset['symbol']
amount = asset['amount']
price = self.oracle_prices[symbol]
value = amount * price
total_debt += value
debt_breakdown[symbol] = {
'amount': amount,
'price': price,
'value': value
}
return total_debt, debt_breakdown
def calculate_health_factor(self):
"""計算健康因子"""
weighted_collateral, _ = self.calculate_weighted_collateral()
total_debt, _ = self.calculate_total_debt()
if total_debt == 0:
return float('inf')
return weighted_collateral / total_debt
def calculate_liquidation_price(self, collateral_symbol):
"""
計算特定抵押品的清算觸發價格
Returns: 導致清算的抵押品價格
"""
weighted_collateral, _ = self.calculate_weighted_collateral()
total_debt, _ = self.calculate_total_debt()
# 找到目標抵押品
target_asset = None
for asset in self.collateral_assets:
if asset['symbol'] == collateral_symbol:
target_asset = asset
break
if not target_asset:
raise ValueError(f"Asset {collateral_symbol} not found in collateral")
amount = target_asset['amount']
ltv = target_asset['ltv']
current_price = self.oracle_prices[collateral_symbol]
# HF = 1.0 時的條件:
# (weighted_collateral - amount * liquidation_price * ltv) = total_debt
# liquidation_price = (weighted_collateral - total_debt) / (amount * ltv)
# 考慮其他抵押品的加權價值
other_weighted = 0
for asset in self.collateral_assets:
if asset['symbol'] != collateral_symbol:
other_weighted += (
asset['amount'] *
self.oracle_prices[asset['symbol']] *
asset['ltv']
)
# 清算觸發價格 = (其他加權抵押品 - 總債務) / (數量 * LTV)
liquidation_price = (total_debt - other_weighted) / (amount * ltv)
return liquidation_price
def calculate_price_drop_to_liquidation(self, collateral_symbol):
"""計算從當前價格到清算價格的下跌幅度"""
current_price = self.oracle_prices[collateral_symbol]
liquidation_price = self.calculate_liquidation_price(collateral_symbol)
drop_percentage = (current_price - liquidation_price) / current_price * 100
return drop_percentage
def calculate_max_borrow(self, collateral_symbol):
"""計算使用特定抵押品可以借款的最大金額"""
for asset in self.collateral_assets:
if asset['symbol'] == collateral_symbol:
amount = asset['amount']
price = self.oracle_prices[collateral_symbol]
ltv = asset['ltv']
return amount * price * ltv
return 0
def get_risk_assessment(self):
"""獲取風險評估報告"""
hf = self.calculate_health_factor()
weighted_collateral, collateral_breakdown = self.calculate_weighted_collateral()
total_debt, debt_breakdown = self.calculate_total_debt()
# 風險評估
if hf >= 2.0:
risk_level = "極低風險"
recommendation = "帳戶安全,可以考慮增加借款"
elif hf >= 1.5:
risk_level = "低風險"
recommendation = "維持現狀,密切監控市場波動"
elif hf >= 1.2:
risk_level = "中等風險"
recommendation = "考慮降低借款或增加抵押品"
elif hf >= 1.0:
risk_level = "高風險"
recommendation = "立即行動:增加抵押品或減少借款"
else:
risk_level = "極高風險/已清算"
recommendation = "帳戶面臨清算或已被清算"
return {
'health_factor': hf,
'risk_level': risk_level,
'recommendation': recommendation,
'total_weighted_collateral': weighted_collateral,
'total_debt': total_debt,
'collateral_breakdown': collateral_breakdown,
'debt_breakdown': debt_breakdown,
'utilization_rate': total_debt / weighted_collateral if weighted_collateral > 0 else 0
}
def example_usage():
"""使用範例"""
# 初始化計算器
calculator = HealthFactorCalculator(
collateral_assets=[
{'symbol': 'ETH', 'amount': 10.0, 'ltv': 0.80},
{'symbol': 'WBTC', 'amount': 0.5, 'ltv': 0.70},
{'symbol': 'USDC', 'amount': 5000, 'ltv': 0.90},
],
debt_assets=[
{'symbol': 'USDC', 'amount': 20000},
{'symbol': 'ETH', 'amount': 3.0},
],
oracle_prices={
'ETH': 3500,
'WBTC': 70000,
'USDC': 1.0,
}
)
# 計算健康因子
hf = calculator.calculate_health_factor()
print(f"健康因子: {hf:.2f}")
# 計算 ETH 清算觸發價格
eth_liquidation_price = calculator.calculate_liquidation_price('ETH')
print(f"ETH 清算觸發價格: ${eth_liquidation_price:.2f}")
# 計算到清算的下跌幅度
eth_drop = calculator.calculate_price_drop_to_liquidation('ETH')
print(f"ETH 可承受下跌: {eth_drop:.2f}%")
# 獲取完整風險報告
report = calculator.get_risk_assessment()
print(f"\n風險等級: {report['risk_level']}")
print(f"建議: {report['recommendation']}")
if __name__ == "__main__":
example_usage()
3.2 清算概率計算器
"""
清算概率計算器
使用蒙地卡羅模擬估算清算概率
"""
import numpy as np
from typing import List, Tuple
class LiquidationProbabilityCalculator:
"""清算概率計算器"""
def __init__(self,
collateral_value: float,
debt_value: float,
liquidation_threshold: float = 0.85,
current_price: float = 1.0):
"""
初始化計算器
Args:
collateral_value: 抵押品價值
debt_value: 債務價值
liquidation_threshold: 清算閾值(默認 0.85)
current_price: 抵押品當前價格
"""
self.collateral_value = collateral_value
self.debt_value = debt_value
self.liquidation_threshold = liquidation_threshold
self.current_price = current_price
# 健康因子
self.health_factor = (collateral_value * liquidation_threshold) / debt_value
def calculate_liquidation_price(self) -> float:
"""計算清算觸發價格"""
# 清算條件:HF = 1.0
# (collateral_value * liquidation_threshold) / debt_value = 1.0
# collateral_value = debt_value / liquidation_threshold
# amount * price = debt_value / liquidation_threshold
# price = debt_value / (liquidation_threshold * amount)
# 簡化:清算觸發時抵押品總價值等於債務價值 / 清算閾值
return self.debt_value / (self.collateral_value * self.liquidation_threshold) * self.current_price
def simulate_price_path(self,
days: int = 30,
volatility_daily: float = 0.05,
n_simulations: int = 10000) -> np.ndarray:
"""
蒙地卡羅模擬價格路徑
Args:
days: 模擬天數
volatility_daily: 日波動率
n_simulations: 模擬次數
Returns: 價格路徑數組
"""
np.random.seed(42)
# 生成隨機收益率(對數正態分佈)
dt = 1 / 365 # 年化時間步
drift = -0.5 * volatility_daily**2 # 漂移項
diffusion = volatility_daily * np.sqrt(dt)
# 模擬路徑
paths = np.zeros((n_simulations, days))
paths[:, 0] = self.current_price
for t in range(1, days):
random_shocks = np.random.normal(0, 1, n_simulations)
returns = np.exp(drift * dt + diffusion * random_shocks)
paths[:, t] = paths[:, t-1] * returns
return paths
def calculate_liquidation_probability(self,
days: int = 30,
volatility_daily: float = 0.05,
n_simulations: int = 10000) -> dict:
"""
計算清算概率
Args:
days: 時間範圍(天)
volatility_daily: 日波動率
n_simulations: 模擬次數
Returns: 包含清算概率和統計數據的字典
"""
liquidation_price = self.calculate_liquidation_price()
# 模擬價格路徑
paths = self.simulate_price_path(
days=days,
volatility_daily=volatility_daily,
n_simulations=n_simulations
)
# 檢查每條路徑是否觸發清算
liquidation_triggered = np.any(paths < liquidation_price, axis=1)
# 計算概率
prob_liquidation = np.mean(liquidation_triggered)
# 計算不同時間點的清算概率
prob_by_day = []
for day in range(days):
prob = np.mean(paths[:, :day+1].min(axis=1) < liquidation_price)
prob_by_day.append(prob)
# 計算首次清算時間分布
first_liquidation_day = np.zeros(n_simulations)
for i in range(n_simulations):
for day in range(days):
if paths[i, day] < liquidation_price:
first_liquidation_day[i] = day + 1
break
else:
first_liquidation_day[i] = days + 1
# 過濾有效值
valid_days = first_liquidation_day[first_liquidation_day <= days]
return {
'probability_30day': prob_liquidation,
'probability_by_day': prob_by_day,
'expected_days_to_liquidation': np.mean(valid_days) if len(valid_days) > 0 else days + 1,
'median_days_to_liquidation': np.median(valid_days) if len(valid_days) > 0 else days + 1,
'liquidation_price': liquidation_price,
'safety_margin': (self.current_price - liquidation_price) / self.current_price * 100
}
def calculate_var(self,
confidence_level: float = 0.95,
days: int = 1) -> float:
"""
計算風險價值 (VaR)
Args:
confidence_level: 信心水準
days: 時間範圍
Returns: VaR 價值
"""
# 假設服從正態分佈
daily_vol = 0.05
z_score = 1.96 if confidence_level == 0.95 else 2.58
var = self.current_price * z_score * daily_vol * np.sqrt(days)
return var
def example_usage():
"""使用範例"""
# 假設條件
collateral_value = 50000 # $50,000 ETH
debt_value = 30000 # $30,000 USDC 借款
current_eth_price = 3500 # ETH 當前價格
daily_volatility = 0.04 # ETH 日波動率 4%
calculator = LiquidationProbabilityCalculator(
collateral_value=collateral_value,
debt_value=debt_value,
liquidation_threshold=0.80,
current_price=current_eth_price
)
print(f"抵押品價值: ${collateral_value:,}")
print(f"債務價值: ${debt_value:,}")
print(f"健康因子: {calculator.health_factor:.2f}")
print(f"清算觸發價格: ${calculator.calculate_liquidation_price():.2f}")
# 計算 30 天清算概率
result = calculator.calculate_liquidation_probability(
days=30,
volatility_daily=daily_volatility,
n_simulations=10000
)
print(f"\n30天清算概率: {result['probability_30day']*100:.2f}%")
print(f"清算安全邊界: {result['safety_margin']:.2f}%")
print(f"預計清算天數: {result['expected_days_to_liquidation']:.1f}天")
# VaR 計算
var_95 = calculator.calculate_var(confidence_level=0.95)
print(f"\n95% VaR (1天): ${var_95:.2f}")
print(f"如果ETH下跌超過 ${var_95:.2f},則處於尾部風險區")
if __name__ == "__main__":
example_usage()
第四章:實務風險管理工具
4.1 健康因子監控系統
"""
健康因子即時監控系統
"""
import time
from typing import List, Dict
from dataclasses import dataclass
@dataclass
class Alert:
"""警報類"""
timestamp: float
health_factor: float
alert_level: str # 'green', 'yellow', 'orange', 'red'
message: str
class HealthFactorMonitor:
"""健康因子監控器"""
def __init__(self, calculator, alert_thresholds=None):
"""
初始化監控器
Args:
calculator: HealthFactorCalculator 實例
alert_thresholds: 警報閾值
"""
self.calculator = calculator
self.alert_thresholds = alert_thresholds or {
'green': 2.0, # 安全
'yellow': 1.5, # 關注
'orange': 1.2, # 警告
'red': 1.0, # 危險/清算觸發
}
self.alerts: List[Alert] = []
self.last_check_time = None
def get_alert_level(self, health_factor: float) -> str:
"""根據健康因子確定警報級別"""
if health_factor >= self.alert_thresholds['green']:
return 'green'
elif health_factor >= self.alert_thresholds['yellow']:
return 'yellow'
elif health_factor >= self.alert_thresholds['orange']:
return 'orange'
elif health_factor >= self.alert_thresholds['red']:
return 'red'
else:
return 'liquidation'
def check_health(self, silent: bool = False) -> Dict:
"""檢查健康因子狀態"""
current_time = time.time()
health_factor = self.calculator.calculate_health_factor()
alert_level = self.get_alert_level(health_factor)
# 記錄警報
if not silent:
alert = Alert(
timestamp=current_time,
health_factor=health_factor,
alert_level=alert_level,
message=self._generate_message(alert_level, health_factor)
)
self.alerts.append(alert)
self.last_check_time = current_time
return {
'health_factor': health_factor,
'alert_level': alert_level,
'timestamp': current_time,
'needs_action': alert_level in ['orange', 'red', 'liquidation']
}
def _generate_message(self, alert_level: str, health_factor: float) -> str:
"""生成警報消息"""
messages = {
'green': f"健康因子 {health_factor:.2f},狀態安全",
'yellow': f"健康因子 {health_factor:.2f},建議關注市場波動",
'orange': f"健康因子 {health_factor:.2f},需要立即行動",
'red': f"健康因子 {health_factor:.2f},即將觸發清算",
'liquidation': f"健康因子 {health_factor:.2f},已被清算",
}
return messages.get(alert_level, "未知狀態")
def calculate_required_collateral(self, target_hf: float = 1.5) -> float:
"""
計算達到目標健康因子需要的額外抵押品
Args:
target_hf: 目標健康因子
Returns: 需要增加的抵押品價值
"""
_, collateral_breakdown = self.calculator.calculate_weighted_collateral()
_, debt_breakdown = self.calculator.calculate_total_debt()
current_hf = self.calculator.calculate_health_factor()
if current_hf >= target_hf:
return 0
# 目標加權抵押品 = 目標 HF × 總債務
target_weighted = target_hf * self.calculator.calculate_total_debt()
# 當前加權抵押品
current_weighted = sum(c['weighted_value'] for c in collateral_breakdown.values())
# 需要的額外加權抵押品
additional_weighted = target_weighted - current_weighted
# 假設抵押品為 ETH(LTV = 0.80)
eth_ltv = 0.80
eth_price = self.calculator.oracle_prices['ETH']
# 需要的 ETH 數量
required_eth = additional_weighted / (eth_ltv * eth_price)
return required_eth
def calculate_required_repayment(self, target_hf: float = 1.5) -> float:
"""
計算償還多少債務可以達到目標健康因子
Args:
target_hf: 目標健康因子
Returns: 需要償還的債務金額(USDC)
"""
weighted_collateral, _ = self.calculator.calculate_weighted_collateral()
_, debt_breakdown = self.calculator.calculate_total_debt()
current_hf = self.calculator.calculate_health_factor()
if current_hf >= target_hf:
return 0
# 目標債務 = 加權抵押品 / 目標 HF
target_debt = weighted_collateral / target_hf
# 當前債務
current_debt = sum(d['value'] for d in debt_breakdown.values())
# 需要償還的金額
repayment = current_debt - target_debt
return repayment
def generate_risk_report(self) -> str:
"""生成完整風險報告"""
report = self.calculator.get_risk_assessment()
# 添加監控狀態
current = self.check_health(silent=True)
report_text = f"""
╔══════════════════════════════════════════════════════════════╗
║ 健康因子風險監控報告 ║
╠══════════════════════════════════════════════════════════════╣
║ ║
║ 健康因子: {report['health_factor']:.2f} ║
║ 風險等級: {report['risk_level']} ║
║ 警報級別: {current['alert_level'].upper()} ║
║ ║
║ 抵押品狀況: ║
║ ├── 總加權抵押品: ${report['total_weighted_collateral']:>12,.2f} ║
║ └── 借款使用率: {report['utilization_rate']*100:>10.1f}% ║
║ ║
║ 債務狀況: ║
║ └── 總債務: ${report['total_debt']:>12,.2f} ║
║ ║
║ 建議行動: ║
║ {report['recommendation']:<55} ║
║ ║
╚══════════════════════════════════════════════════════════════╝
"""
return report_text
def example_usage():
"""使用範例"""
# 初始化計算器
calculator = HealthFactorCalculator(
collateral_assets=[
{'symbol': 'ETH', 'amount': 10.0, 'ltv': 0.80},
{'symbol': 'USDC', 'amount': 5000, 'ltv': 0.90},
],
debt_assets=[
{'symbol': 'USDC', 'amount': 20000},
],
oracle_prices={'ETH': 3500, 'USDC': 1.0}
)
# 初始化監控器
monitor = HealthFactorMonitor(calculator)
# 檢查健康狀態
status = monitor.check_health()
print(f"警報級別: {status['alert_level']}")
print(f"需要行動: {status['needs_action']}")
# 生成報告
report = monitor.generate_risk_report()
print(report)
# 計算需要多少抵押品達到 HF = 2.0
required_eth = monitor.calculate_required_collateral(target_hf=2.0)
print(f"達到 HF=2.0 需要增加: {required_eth:.3f} ETH")
if __name__ == "__main__":
example_usage()
結論
本文提供了完整的 DeFi 借貸風險量化計算框架,結合 2022-2026 年真實清算事件資料庫,為借款人和流動性提供者提供了實務指引。
關鍵要點:
- 健康因子是衡量借貸風險的核心指標,應始終維持在 1.5 以上
- 2022-2026 年記錄了多起重大清算事件,總損失超過 $100 億美元
- 量化計算工具可以幫助投資者提前識別風險
- 實務監控系統是避免清算的關鍵
重要聲明:本文僅供教育目的,不構成投資建議。風險計算結果僅供參考,實際風險可能因協議差異而有所不同。
最後更新:2026年3月20日
相關文章
- DeFi 借貸協議風險模擬與實際操作完整指南:從理論到實戰 — 去中心化金融借貸協議蘊含著複雜的風險,包括清算風險、智慧合約風險、利率風險、跨鏈風險等。本指南從實際操作的角度出發,提供完整的風險模擬程式碼、情境分析、以及風險管理策略。透過實際的計算和模擬,讓讀者能夠量化並理解各種風險場景,從而在參與 DeFi 借貸時做出更合理的資金管理決策。
- 新興DeFi協議安全評估框架:從基礎審查到進階量化分析 — 系統性構建DeFi協議安全評估框架,涵蓋智能合約審計、經濟模型、治理機制、流動性風險等維度。提供可直接使用的Python風險評估代碼、借貸與DEX協議的專門評估方法、以及2024-2025年安全事件數據分析。
- DeFi 智慧合約風險案例研究:從漏洞到防護的完整解析 — 去中心化金融(DeFi)協議的智慧合約漏洞是區塊鏈安全領域最核心的議題之一。2021 年的 Poly Network 攻擊(損失 6.1 億美元)、2022 年的 Ronin Bridge 攻擊(損失 6.2 億美元)、2023 年的 Euler Finance 攻擊(損失 1.97 億美元)等重大事件,深刻揭示了智慧合約風險的嚴重性與複雜性。本篇文章透過深度分析這些經典案例,從技術層面還原攻擊流
- DeFi 協議風險評估完整框架:從量化模型到實際案例分析 — 本文建立一個完整的 DeFi 協議風險評估框架,涵蓋風險類型分類(智能合約風險、協議設計風險、清算風險、治理風險)、量化評估方法、協議安全性審計要點、以及歷史重大風險事件深度分析。我們提供具體的評估工具、計算公式和決策框架,幫助投資者和開發者系統性地評估 DeFi 協議的風險水平。
- DeFi 清算事件區塊鏈數據深度解析:從真實地址到區塊高度的量化風險分析 — 本文從區塊鏈數據分析師的視角,深度解讀 2020 年至 2026 年第一季度間最具代表性的 DeFi 清算事件。我們使用真實的區塊高度(如 9,662,497-9,662,502 黑色星期四事件)、錢包地址(如 0x7a250d5630b4cf539739df2c5dacb4c659f2488d)、交易雜湊等鏈上資料還原清算流程。同時提供可重現的 Python 分析程式碼與質押 Slash 觸發條件實例。
延伸閱讀與來源
- Aave V3 文檔 頭部借貸協議技術規格
- Uniswap V4 文檔 DEX 協議規格與鉤子機制
- DeFi Llama DeFi TVL 聚合數據
- Dune Analytics DeFi 協議數據分析儀表板
這篇文章對您有幫助嗎?
請告訴我們如何改進:
0 人覺得有帮助
評論
發表評論
注意:由於這是靜態網站,您的評論將儲存在本地瀏覽器中,不會公開顯示。
目前尚無評論,成為第一個發表評論的人吧!