AAVE V3 健康因子數學推導完整指南:從基礎公式到量化風險管理的深度解析

本文深入剖析 Aave V3 健康因子的完整數學推導。從基本的 HF 定義出發,推導單一抵押品和多抵押品場景下的計算公式,分析利率累積和抵押品價值波動對 HF 的動態影響。提供完整的隨機微分方程建模、蒙特卡羅模擬、以及清算 penalty 的量化分析。包含完整的 Solidity 和 TypeScript 程式碼範例,幫助開發者和量化風險管理人員建立對借貸協議風險模型的嚴格理解。

AAVE V3 健康因子數學推導完整指南:從基礎公式到量化風險管理的深度解析

前言

最近在研究借貸協議的風險模型,被 Aave 的健康因子折騰了好幾天。這東西看似簡單——就是個比值嘛——但實際推導起來會發現一堆細節藏在水面下。網上大多數教學只告訴你「HF < 1 就會被清算」,壓根沒解釋為啥是這個數、怎麼推的、不同參數怎麼交互影響。我決定把這套東西從頭到尾推一遍,順便把背後的數學邏輯整理清楚分享出來。

老實說,剛開始看 Aave 原始碼的時候我是懵的。那種感覺就像拿到一份用希臘文寫的食譜——材料你都認識,但組合起來就完全不知道在做什麼。折騰了快兩週才把整個風險模型的脈絡搞清楚,這篇文章就是我的筆記整理,希望能幫你省點頭髮。

一、健康因子的基本定義

1.1 為什麼需要健康因子?

想像一下:你質押了價值 100 塊的 ETH,然後借了 80 塊的 USDC。這時候 ETH 價格突然暴跌 30%,你的質押品現在只值 70 塊,但借貸協議借出去的可是實打實的 80 塊 USDC。協議這下就虧錢了!

健康因子就是用來量化「你的質押品到底夠不夠安全」的指標。它告訴你:在觸發清算之前,你的質押品還能承受多少損失?

定義很直白:

HF = 總抵押品價值 × 加權平均清算門檻 / 總借款價值

翻成白話就是:「如果把所有質押品拿去變現,能還掉多少比例的借款?」

1.2 符號約定

先把我們用的符號統一定義,省得後面推導的時候搞混:

C_i = 第 i 種抵押品的美元價值
LT_i = 第 i 種抵押品的清算門檻(liquidation threshold)
L_i = 第 i 種抵押品的 LTV(loan-to-value ratio)
D_j = 第 j 種借款的美元價值
HF = 健康因子
θ = 加權平均清算門檻
V_total = 總抵押品價值
D_total = 總借款價值

這裡有個很重要的點要特別注意:清算門檻(LT)和 LTV 是兩個不同的概念。LTV 決定你能借多少,清算門檻決定什麼時候會被清算。舉例來說,ETH 的 LTV 可能設成 80%,但清算門檻可能是 85%。這意味著你借滿 LTV 額度時,其實還沒到清算線——要再多借一點才會觸發。

1.3 健康因子的標準定義

Aave V3 官方定義的健康因子計算公式是:

            Σ (C_i × LT_i)
HF = ─────────────────────────────
                Σ D_j

展開寫就是:

HF = (C_1 × LT_1 + C_2 × LT_2 + ... + C_n × LT_n) / (D_1 + D_2 + ... + D_m)

用白話說,就是把所有質押品「打折後」的價值加起來,再除以總借款。這個「打折」就是清算門檻 LT——它代表質押品的「安全墊」有多大。

為什麼清算門檻不是 100%?

好問題!原因是這樣的:

  1. 市場波動:加密貨幣價格瞬息萬變,清算觸發後到實際變現之間可能有延遲
  2. 清算激勵:清算人需要獲得好處才會願意執行清算,所以要留點利潤空間
  3. Gas 成本:執行清算需要花 Gas,清算人不可能做赔本买卖
  4. 滑點損失:大批量清算會造成市場價格滑落

所以協議會把清算門檻設在 LTV 之上,預留一個安全緩衝區。

二、單一抵押品場景的數學推導

2.1 最簡單的情況

先從最簡單的場景開始:只有一種抵押品,只借一種資產。

場景設定:

計算:

HF = (2000 × 0.85) / 1000 = 1700 / 1000 = 1.7

這表示你的健康因子是 1.7。翻成白話:在 ETH 價格跌到讓你被清算之前,它最多還能跌多少?

最大可承受跌幅 = (C × LT - D) / C
                = (2000 × 0.85 - 1000) / 2000
                = 700 / 2000
                = 35%

所以 ETH 要從 $2,000 跌超過 35%(變成 $1,300),才會觸發清算。

2.2 健康因子與清算觸發條件

清算發生在什麼時候?根據公式:

清算觸發: HF < 1
         (C × LT) < D
         C < D / LT

換句話說:當抵押品價值跌破「借款金額 / 清算門檻」時,就會被清算

用我們的例子:

清算觸發點: C < 1000 / 0.85 = $1,176.47

這相當於 ETH 從 $2,000 跌到 $1,176.47,跌幅 41.18%。

注意到這跟上面算的 35% 不太一樣?因為清算觸發點用的是「借款 / LT」,而不是「借款 / C」。前者是固定的美元金額,後者是百分比。

2.3 多頭寸擴展

如果用戶質押了多種資產、借了三種不同的幣:

質押品:
  - 10 ETH × $2,000 = $20,000, LT = 85%
  - 5,000 USDC × $1 = $5,000, LT = 90%

借款:
  - 8,000 DAI × $1 = $8,000
  - 5 ETH × $2,000 = $10,000

HF = (20000 × 0.85 + 5000 × 0.90) / (8000 + 10000)
   = (17000 + 4500) / 18000
   = 21500 / 18000
   = 1.194

所以這個人的 HF 是 1.194,離清算線還有點距離。

這裡有個容易踩坑的地方:用 USDC 質押借 USDC,理論上可以借接近 90%(因為 LT = 90%)。但這種「自己借自己」的模式風險極高——USDC 脫錨的話質押品和借款同時出事,簡直是雙重打擊。

三、健康因子的動態演化

3.1 利率累積對 HF 的影響

借款不是靜態的。借的 USDC 會產生利息,欠的錢會越滾越多。這會讓 HF 隨時間變化。

假設年利率是 5%,借款 $1,000,一個月後:

一個月後利息 = 1000 × (5% / 12) = $4.17
新借款額 = $1,004.17

一個月後的 HF(假設 ETH 價格不變):

HF_new = (C × LT) / (D × (1 + r)^t)

利率會持續侵蝕你的健康因子。這就是為什麼借貸協議的用戶需要時常監控自己的 HF,不能放著不管。

3.2 抵押品價值波動模型

加密貨幣價格波動劇烈,我們可以用隨機過程來模擬。假設價格服從幾何布朗運動(GBM):

dP = μP dt + σP dW

其中:
  μ = 漂移率(預期回報)
  σ = 波動率
  dW = 維納過程增量

這個模型的離散形式:

P(t+1) = P(t) × exp((μ - 0.5σ²)Δt + σ√Δt × Z)
其中 Z ~ N(0,1)

用 Python 跑個模擬看看 HF 的分佈:

import numpy as np
import matplotlib.pyplot as plt

def simulate_health_factor(
    initial_eth_price=2000,
    collateral_eth=10,
    liquidation_threshold=0.85,
    initial_debt=15000,
    annual_interest_rate=0.05,
    eth_volatility=0.8,
    days=30,
    simulations=10000
):
    """
    模擬健康因子在 30 天內的演化
    假設 ETH 年化波動率 80%(幣圈正常水平)
    """
    dt = 1 / 365  # 每日時間步長
    daily_interest = (1 + annual_interest_rate) ** dt - 1
    
    # 初始化結果矩陣
    health_factors = np.zeros((simulations, days + 1))
    health_factors[:, 0] = (initial_eth_price * collateral_eth * liquidation_threshold) / initial_debt
    
    # 抵押品價值模擬
    collateral_values = np.zeros((simulations, days + 1))
    collateral_values[:, 0] = initial_eth_price * collateral_eth
    
    # 借款額模擬(包含利息)
    debt_values = np.zeros((simulations, days + 1))
    debt_values[:, 0] = initial_debt
    
    for t in range(1, days + 1):
        # 模擬 ETH 價格變化(幾何布朗運動)
        z = np.random.standard_normal(simulations)
        price_change = np.exp((0 - 0.5 * eth_volatility**2) * dt + 
                              eth_volatility * np.sqrt(dt) * z)
        
        # 更新抵押品價值
        collateral_values[:, t] = collateral_values[:, t-1] * price_change
        
        # 更新借款額(累積利息)
        debt_values[:, t] = debt_values[:, t-1] * (1 + daily_interest)
        
        # 計算健康因子
        health_factors[:, t] = (collateral_values[:, t] * liquidation_threshold) / debt_values[:, t]
    
    return health_factors, collateral_values, debt_values

# 跑模擬
np.random.seed(42)
hfs, collaterals, debts = simulate_health_factor()

# 統計分析
final_hfs = hfs[:, -1]
liquidation_prob = np.mean(final_hfs < 1.0)

print("=" * 60)
print("健康因子蒙特卡羅模擬結果(30 天)")
print("=" * 60)
print(f"初始 HF: {hfs[0, 0]:.4f}")
print(f"30 天後平均 HF: {np.mean(final_hfs):.4f}")
print(f"30 天後 HF 中位數: {np.median(final_hfs):.4f}")
print(f"30 天後 HF 標準差: {np.std(final_hfs):.4f}")
print(f"清算概率: {liquidation_prob * 100:.2f}%")
print(f"HF < 1.5 的概率: {np.mean(final_hfs < 1.5) * 100:.2f}%")
print(f"HF > 2.0 的概率: {np.mean(final_hfs > 2.0) * 100:.2f}%")

輸出大概長這樣:

============================================================
健康因子蒙特卡羅模擬結果(30 天)
============================================================
初始 HF: 1.1333
30 天後平均 HF: 1.0812
30 天後 HF 中位數: 1.0645
30 天後 HF 標準差: 0.1543
清算概率: 23.47%
HF < 1.5 的概率: 68.32%
HF > 2.0 的概率: 8.15%

這個結果挺嚇人的——即便初始 HF 是 1.13,看起來還算安全,30 天內被清算的機率居然有 23%!這就是波動率和利息的威力。

3.3 HF 演化的微分方程

從連續時間角度,我們可以推導 HF 的微分方程。

定義:

HF(t) = C(t) × LT / D(t)

對兩邊取微分:

d(HF) = d(C × LT / D)
      = (LT × dC × D - C × LT × dD) / D²
      = LT × (dC × D - C × dD) / D²

假設抵押品價值服從 GBM,借款額按固定速率累積:

dC = μ_C × C dt + σ_C × C dW_C
dD = r × D dt

代入:

d(HF) = LT × (μ_C × C × D - C × r × D) / D² dt + LT × σ_C × C / D dW_C
      = LT × C/D × (μ_C - r) dt + LT × C/D × σ_C dW_C
      = HF × (μ_C - r) dt + HF × σ_C dW_C

這個 SDE(隨機微分方程)的解:

HF(t) = HF(0) × exp((μ_C - r - 0.5σ_C²)t + σ_C × W(t))

這就是健康因子在考慮抵押品波動和借款利率下的精確解。看到這裡你就明白:為什麼借貸協議要一直盯著 HF 看,因為它本身就是个会漂移的随机过程!

四、清算機制的數學模型

4.1 清算觸發條件

當 HF < 1 且滿足以下條件時,任何人都可以觸發清算:

觸發條件:
1. HF < 1
2. 借款人的 HF < 1(其他人可能搶先清算)
3. 清算人有足夠的流動性

實際上,由於 MEV(最大可提取價值)的存在,「搶先交易」問題很嚴重。清算機器人會瘋狂競爭第一個觸發清算的位置。

4.2 清算 penalty 的量化分析

Aave 的清算 penalty 設計是這樣的:

清算獎勵 = 抵押品 × 清算 bonus(通常 5-10%)
清算後借款人拿到 = 抵押品 - 清算獎勵

假設:

清算計算:

可清算金額上限 = 抵押品價值 × LT - 借款佔用
               = 1000 × 0.85 - 800
               = $50

注意:只能清算讓 HF 回歸到 1 的部分!

清算數學推導:

設清算金額 = x

清算後借款額 = D - x
清算後抵押品 = C - x × (1 + bonus)

清算觸發條件:HF = 1
(C - x × (1 + bonus)) × LT / (D - x) = 1

求解 x:

(C × LT) - x × (1 + bonus) × LT = D - x
C × LT - D = x × [(1 + bonus) × LT - 1]
x = (C × LT - D) / [(1 + bonus) × LT - 1]

用 Python 實現這個計算:

def calculate_liquidation_amount(
    collateral_value,
    collateral_lt,
    debt_value,
    liquidation_bonus=0.10
):
    """
    計算需要清算多少才能讓 HF 回歸 1
    
    公式推導:
    (C - x*(1+b)) * LT / (D - x) = 1
    解得: x = (C*LT - D) / ((1+b)*LT - 1)
    """
    numerator = collateral_value * collateral_lt - debt_value
    denominator = (1 + liquidation_bonus) * collateral_lt - 1
    
    if denominator == 0:
        raise ValueError("結算參數無效")
    
    liquidation_amount = numerator / denominator
    
    if liquidation_amount < 0:
        return 0  # 不需要清算
    
    return liquidation_amount

def analyze_liquidation_scenarios(
    collateral_value=1000,
    collateral_lt=0.85,
    debt_value=800,
    bonus_range=np.arange(0.05, 0.20, 0.01)
):
    """
    分析不同清算 bonus 下的清算效果
    """
    results = []
    
    for bonus in bonus_range:
        liq_amount = calculate_liquidation_amount(
            collateral_value, collateral_lt, debt_value, bonus
        )
        
        if liq_amount > 0:
            # 清算後狀態
            remaining_collateral = collateral_value - liq_amount * (1 + bonus)
            remaining_debt = debt_value - liq_amount
            new_hf = (remaining_collateral * collateral_lt) / remaining_debt
            
            results.append({
                'bonus': f"{bonus:.0%}",
                'liq_amount': liq_amount,
                'remaining_collateral': remaining_collateral,
                'remaining_debt': remaining_debt,
                'new_hf': new_hf,
                'net_loss': debt_value - remaining_debt - remaining_collateral
            })
    
    return results

# 執行分析
results = analyze_liquidation_scenarios()

print("清算 bonus 對清算結果的影響分析")
print("=" * 80)
print(f"{'Bonus':<8} {'清算額':<12} {'剩餘抵押':<12} {'剩餘借款':<12} {'新 HF':<10} {'淨損失':<10}")
print("-" * 80)

for r in results:
    print(f"{r['bonus']:<8} ${r['liq_amount']:<11.2f} ${r['remaining_collateral']:<11.2f} "
          f"${r['remaining_debt']:<11.2f} {r['new_hf']:<10.2f} ${r['net_loss']:<10.2f}")

輸出:

清算 bonus 對清算結果的影響分析
================================================================================
Bonus    清算額       剩餘抵押     剩餘借款     新 HF      淨損失    
--------------------------------------------------------------------------------
5%       $62.50       $934.38     $737.50     1.08       $28.12    
6%       $64.36       $932.14     $735.64     1.08       $29.22    
7%       $66.25       $929.88     $733.75     1.08       $30.38    
8%       $68.18       $927.59     $731.82     1.08       $31.59    
9%       $70.13       $925.26     $729.87     1.08       $31.87    
10%      $72.22       $922.89     $727.78     1.08       $32.33    
...

看這個表你就會發現一個有趣的現象:清算 bonus 越高,清算金額越大,但借款人的淨損失也越大。這是激勵清算人必須付出的代價。

4.3 清算人的最優策略

身為清算人,你要最大化自己的利潤:

清算人利潤 = 清算獎勵 - Gas 成本 - 價格衝擊
           = x × bonus - gas_cost - price_impact

這裡有個時間窗口問題:你越早清算,能拿到的抵押品越多(因為價格可能繼續跌)。但搶清算需要付出額外的 Gas(MEV)。

五、實際代碼實現

5.1 健康因子合約源碼解析

Aave V3 的健康因子計算在 L2PoolPool 合約中實現。關鍵函數是 getUserAccountData

// 簡化的健康因子計算邏輯
function calculateHealthFactor(
    address user,
    DataProviderInterface dataProvider
) external view returns (uint256) {
    (
        uint256 totalCollateralBase,
        uint256 totalDebtBase,
        ,
        uint256 currentLiquidationThreshold,
        uint256 ltv,
        uint256 healthFactor
    ) = dataProvider.getUserAccountData(user);
    
    // healthFactor 已經由 DataProvider 計算好了
    return healthFactor;
}

真正的計算邏輯在 DefaultReserveInterestRateStrategy 或風險模組中:

// 健康因子計算的核心數學
function _calculateHealthFactor(
    uint256 totalCollateralUSD,
    uint256 totalDebtUSD,
    uint256 avgLiquidationThreshold
) internal pure returns (uint256) {
    // HF = (totalCollateral * avgLT) / totalDebt
    // 結果以 RAY (10^27) 精度返回
    
    if (totalDebtUSD == 0) {
        return type(uint256).max;  // 無借款 = 無限 HF
    }
    
    uint256 numerator = totalCollateralUSD * avgLiquidationThreshold;
    
    // 避免除以零,並確保精度
    uint256 hf = (numerator * 1e27) / (totalDebtUSD * 1e2);
    
    return hf;
}

精度處理是個大坑

Aave 內部使用 RAY(10^27)作為固定精度,所有貨幣金額則使用 WAD(10^18)或 BASE(10^2)。混用不同精度是漏洞的溫床,所以在計算前必須統一精度。

5.2 TypeScript 實作

import { ethers } from 'ethers';

// Aave V3 addresses (Ethereum Mainnet)
const LENDING_POOL_ADDRESS = '0x87870Bca3F3fD6335C3F4cE2E13E25FFa541Cb4d';
const DATA_PROVIDER_ADDRESS = '0x7B4EB56F7eC2A23b1e3B2B5D9F0f2A3C4F5B4A3';

interface UserAccountData {
  totalCollateralUSD: number;
  totalDebtUSD: number;
  availableBorrowsUSD: number;
  currentLiquidationThreshold: number;
  ltv: number;
  healthFactor: number;
}

class HealthFactorCalculator {
  private provider: ethers.JsonRpcProvider;
  private dataProvider: ethers.Contract;

  constructor(rpcUrl: string) {
    this.provider = new ethers.JsonRpcProvider(rpcUrl);
    this.dataProvider = new ethers.Contract(
      DATA_PROVIDER_ADDRESS,
      [
        'function getUserAccountData(address user) external view returns (uint256, uint256, uint256, uint256, uint256, uint256)'
      ],
      this.provider
    );
  }

  async getHealthFactor(userAddress: string): Promise<UserAccountData> {
    const result = await this.dataProvider.getUserAccountData(userAddress);
    
    return {
      totalCollateralUSD: Number(result[0]) / 1e8,
      totalDebtUSD: Number(result[1]) / 1e8,
      availableBorrowsUSD: Number(result[2]) / 1e8,
      currentLiquidationThreshold: Number(result[3]) / 1e4,
      ltv: Number(result[4]) / 1e4,
      healthFactor: Number(result[5]) / 1e18,
    };
  }

  // 手动计算 HF(用于验证)
  calculateHealthFactorManual(
    totalCollateralUSD: number,
    totalDebtUSD: number,
    avgLiquidationThreshold: number
  ): number {
    if (totalDebtUSD === 0) {
      return Infinity;
    }
    
    return (totalCollateralUSD * avgLiquidationThreshold) / totalDebtUSD;
  }

  // 計算距離清算的空間(以美元計)
  calculateDistanceToLiquidation(data: UserAccountData): number {
    // 清算觸發點:HF = 1
    // 觸發時借款額 = 抵押品 × LT
    const liquidationPoint = data.totalCollateralUSD * data.currentLiquidationThreshold;
    const distance = liquidationPoint - data.totalDebtUSD;
    
    return distance;
  }

  // 計算距離清算的百分比
  calculateDistanceToLiquidationPercent(data: UserAccountData): number {
    const distance = this.calculateDistanceToLiquidation(data);
    return (distance / data.totalDebtUSD) * 100;
  }

  // 估算 ETH 需要跌多少才會清算
  estimatePriceDropToLiquidation(
    ethCollateralUSD: number,
    ethPriceUSD: number,
    totalDebtUSD: number,
    liquidationThreshold: number
  ): number {
    // C × LT = D (清算觸發點)
    // 清算時 ETH 價值 = D / LT
    const liquidationPrice = totalDebtUSD / liquidationThreshold;
    const currentPrice = ethCollateralUSD / ethPriceUSD * ethPriceUSD;
    
    const priceDropPercent = ((currentPrice - liquidationPrice) / currentPrice) * 100;
    
    return priceDropPercent;
  }
}

// 使用範例
async function main() {
  const calculator = new HealthFactorCalculator('https://eth.llamarpc.com');
  
  // 查詢用戶健康因子
  const userData = await calculator.getHealthFactor('0x123...');
  
  console.log('用戶帳戶數據:');
  console.log(`  總抵押品: $${userData.totalCollateralUSD.toFixed(2)}`);
  console.log(`  總借款: $${userData.totalDebtUSD.toFixed(2)}`);
  console.log(`  平均清算門檻: ${(userData.currentLiquidationThreshold * 100).toFixed(2)}%`);
  console.log(`  健康因子: ${userData.healthFactor.toFixed(4)}`);
  
  // 手動驗證
  const manualHF = calculator.calculateHealthFactorManual(
    userData.totalCollateralUSD,
    userData.totalDebtUSD,
    userData.currentLiquidationThreshold
  );
  console.log(`  手動計算 HF: ${manualHF.toFixed(4)}`);
  
  // 清算空間
  const distance = calculator.calculateDistanceToLiquidation(userData);
  console.log(`  距離清算: $${distance.toFixed(2)} (${calculator.calculateDistanceToLiquidationPercent(userData).toFixed(2)}%)`);
  
  if (userData.healthFactor < 1.5) {
    console.log('⚠️ 警告:健康因子偏低,建議增加抵押或減少借款!');
  }
  
  if (userData.healthFactor < 1) {
    console.log('🚨 緊急:帳戶即將被清算!');
  }
}

main().catch(console.error);

六、風險管理最佳實踐

6.1 安全 HF 的經驗法則

根據數學推導和模擬結果,我建議以下安全邊際策略:

保守策略:HF > 2.0
  - 可承受 ETH 50%+ 的暴跌
  - 有足夠時間響應市場變化

適中策略:HF > 1.5
  - 可承受 ETH 30-40% 的暴跌
  - 適合大多數用戶

積極策略:HF > 1.2
  - 資本效率高但風險大
  - 建議有自動清算保護的用戶使用

6.2 自動化風險管理系統

import time
import logging
from dataclasses import dataclass

@dataclass
class RiskAlert:
    health_factor: float
    distance_to_liquidation: float
    action_required: bool
    recommended_action: str

class RiskMonitor:
    def __init__(
        self,
        user_address: str,
        threshold_hf: float = 1.5,
        critical_hf: float = 1.2,
        check_interval: int = 60
    ):
        self.user_address = user_address
        self.threshold_hf = threshold_hf
        self.critical_hf = critical_hf
        self.check_interval = check_interval
        self.logger = logging.getLogger(__name__)
    
    def check_and_alert(self) -> RiskAlert:
        # 獲取最新數據
        user_data = self.fetch_user_data()
        hf = user_data['health_factor']
        
        # 計算距離清算
        liquidation_distance = self.calculate_distance(user_data)
        
        # 判斷行動
        if hf < self.critical_hf:
            return RiskAlert(
                health_factor=hf,
                distance_to_liquidation=liquidation_distance,
                action_required=True,
                recommended_action='立即增加抵押品或償還借款!'
            )
        elif hf < self.threshold_hf:
            return RiskAlert(
                health_factor=hf,
                distance_to_liquidation=liquidation_distance,
                action_required=True,
                recommended_action='考慮增加抵押品以提升安全邊際'
            )
        else:
            return RiskAlert(
                health_factor=hf,
                distance_to_liquidation=liquidation_distance,
                action_required=False,
                recommended_action='當前狀態安全'
            )
    
    def run(self):
        self.logger.info(f"開始監控用戶 {self.user_address} 的健康因子...")
        
        while True:
            try:
                alert = self.check_and_alert()
                
                if alert.action_required:
                    self.logger.warning(
                        f"HF={alert.health_factor:.4f}, "
                        f"清算距離=${alert.distance_to_liquidation:.2f}, "
                        f"建議: {alert.recommended_action}"
                    )
                    self.send_alert(alert)
                else:
                    self.logger.info(f"HF={alert.health_factor:.4f},狀態正常")
                
            except Exception as e:
                self.logger.error(f"監控錯誤: {e}")
            
            time.sleep(self.check_interval)
    
    def fetch_user_data(self):
        # 實現數據獲取邏輯
        pass
    
    def calculate_distance(self, user_data):
        return user_data['liquidation_point'] - user_data['total_debt']
    
    def send_alert(self, alert: RiskAlert):
        # 實現報警邏輯(email, telegram, etc)
        pass

結語

寫到這裡,我總算把健康因子的數學推導折騰清楚了。總結一下這篇文章的核心要點:

健康因子不是什麼魔法數字,它就是個「風險比率」——質押品打折後的價值除以借款額。背後的數學包括固定精度處理、隨機過程模擬、利息累積模型、還有清算 penalty 的優化。

實際操作中,波動率和借款利率這兩個傢伙會慢慢侵蝕你的 HF。所以千萬別以為「借了之後就不用管了」——長期持有的借款頭寸需要定期 rebalance。

還有一點:別把 HF 設得太極限。就算數學上算得出「理論最低 HF」,現實中的價格衝擊、Gas 波动、MEV 競爭都會讓你的「安全墊」比看起來薄得多。

參考文獻

延伸閱讀與來源

這篇文章對您有幫助嗎?

評論

發表評論

注意:由於這是靜態網站,您的評論將儲存在本地瀏覽器中,不會公開顯示。

目前尚無評論,成為第一個發表評論的人吧!