DeFi 自動做市商(AMM)數學推導完整指南:從常數乘積到穩定幣模型的深度解析

自動做市商(AMM)是 DeFi 生態系統中最具創新性的基礎設施之一。本文從數學視角出發,系統性地推導各類 AMM 模型的定價公式、交易滑點計算、流動性提供者收益模型、以及無常損失的數學證明。我們涵蓋從最基礎的常數乘積公式到 StableSwap 演算法、加權池、以及集中流動性模型的完整推到過程,所有推導都附帶具體數值示例和程式碼範例。

DeFi 自動做市商(AMM)數學推導完整指南:從常數乘積到穩定幣模型的深度解析

概述

自動做市商(Automated Market Maker,簡稱 AMM)是去中心化金融(DeFi)生態系統中最具創新性和影響力的基礎設施之一。與傳統交易所的訂單簿模型不同,AMM 採用數學公式來決定交易價格,其定價機制的優劣直接影響流動性效率、交易滑點與資金利用率。從 2018 年 Uniswap 推出基於常數乘積公式的 AMM 開始,這一領域經歷了爆發式增長,涌现了Curve 的 StableSwap 演算法、Balancer 的加權池、以及 Balancer V2 的 LBP 等多種創新模型。

本文從數學視角出發,系統性地推導各類 AMM 模型的定價公式、交易滑點計算、流動性提供者收益模型、以及無常損失的數學證明。我們將涵蓋從最基礎的常數乘積公式(Constant Product Formula)到最新的自動化集中流動性模型(Automated Concentrated Liquidity),提供完整的推到過程與實務應用指南。所有數學推導都將附帶具體的數值示例和程式碼範例,幫助讀者從理論到實踐全面掌握 AMM 的數學基礎。

第一章:AMM 數學基礎與核心概念

1.1 市場做市的基本問題

在深入探討 AMM 的數學模型之前,我們需要理解傳統金融市場中「做市」(Market Making)的基本問題。做市商的核心職責是在金融市場中同時提供買入和賣出報價,從買賣價差(Bid-Ask Spread)中獲取利潤,同時為市場提供流動性。

傳統訂單簿模型

在紐約證券交易所或加密貨幣交易所(如 Binance、Coinbase)中,買家和賣家分別提交限價訂單,形成訂單簿。做市商在訂單簿的買一(Best Bid)和賣一(Best Ask)之間設定報價。

訂單簿示例(ETH/USDT 交易對):

買單(Bid)                    賣單(Ask)
┌─────────┬────────┐         ┌─────────┬────────┐
│ 價格    │ 數量   │         │ 價格    │ 數量   │
├─────────┼────────┤         ├─────────┼────────┤
│ $3,495  │ 2.5    │         │ $3,500  │ 1.2    │
│ $3,490  │ 5.0    │         │ $3,502  │ 3.8    │
│ $3,485  │ 8.3    │         │ $3,505  │ 2.1    │
│ $3,480  │ 12.0   │         │ $3,510  │ 5.5    │
└─────────┴────────┘         └─────────┴────────┘

最佳買價(Best Bid):$3,495
最佳賣價(Best Ask):$3,500
買賣價差(Spread):$5
中間價(Mid Price):$3,497.50

AMM 的核心創新

AMM 的核心創新在於用數學公式取代了傳統的訂單簿。流動性提供者(Liquidity Provider, LP)將資金存入流動性池(Liquidity Pool),而 AMM 公式決定了任何時刻的交易價格。

這種設計的優勢包括:

然而,AMM 也有其局限性:

1.2 AMM 的數學表示

一般而言,AMM 可以用以下數學框架來描述:

設流動性池包含 $n$ 種資產,數量分別為 $x1, x2, ..., x_n$。AMM 定義了一個不變量函數 $V$:

$$V(x1, x2, ..., x_n) = k$$

其中 $k$ 是一個常數(在交易過程中保持不變)。不同的 AMM 模型定義不同的 $V$ 函數。

交易過程可以描述為:交易者向流動性池輸入資產 $i$,獲得資產 $j$ 作為輸出。交易前後,不變量 $V$ 必須保持恆定:

$$V(x1, ..., xi + \Delta xi, ..., xj - \Delta xj, ..., xn) = V(x1, ..., xn) = k$$

1.3 價格與邊際價格的定義

在 AMM 中,資產 $j$ 相對於資產 $i$ 的邊際價格(Marginal Price)定義為:

$$P{j/i} = \frac{\partial xj}{\partial xi} \bigg|{V = k} = -\frac{\partial V / \partial xi}{\partial V / \partial xj}$$

負號表示當一種資產數量增加時,另一种資產數量必然減少。

滑點(Slippage)

交易滑點是指交易執行價格與預期價格之間的差異。在 AMM 中,滑點來自於交易的非零規模——當你購買資產時,你實際上改變了資產的邊際價格。

滑點可以用以下公式計算:

$$Slippage = \frac{P{execution} - P{expected}}{P_{expected}} \times 100\%$$

滑點的大小取決於:

第二章:常數乘積公式(Constant Product Formula)

2.1 公式推導與基本性質

常數乘積公式是 Uniswap V1 和 V2 採用的核心 AMM 模型,由白皮書提出者設計。其數學表達式為:

$$x \cdot y = k$$

其中:

不變量的證明

假設初始狀態為 $(x0, y0)$,則 $k = x0 \cdot y0$。

交易者希望用 $\Delta x$ 數量的資產 $x$ 換取資產 $y$。交易後的狀態 $(x1, y1)$ 必須滿足:

$$x1 \cdot y1 = k = x0 \cdot y0$$

由 $x1 = x0 + \Delta x$,可得:

$$(x0 + \Delta x) \cdot y1 = x0 \cdot y0$$

$$y1 = \frac{x0 \cdot y0}{x0 + \Delta x}$$

交易者獲得的資產 $y$ 數量為:

$$\Delta y = y0 - y1 = y0 - \frac{x0 \cdot y0}{x0 + \Delta x} = y0 \left(1 - \frac{x0}{x_0 + \Delta x}\right)$$

簡化可得:

$$\Delta y = \frac{y0 \cdot \Delta x}{x0 + \Delta x}$$

2.2 邊際價格與滑點推導

邊際價格的推導

對 $x \cdot y = k$ 兩邊微分:

$$y \cdot dx + x \cdot dy = 0$$

$$\frac{dy}{dx} = -\frac{y}{x}$$

因此,資產 $y$ 相對於資產 $x$ 的邊際價格為:

$$P_{y/x} = -\frac{dy}{dx} = \frac{y}{x}$$

這意味著邊際價格等於池中兩種資產數量的比率。

滑點的計算

假設交易者希望獲得 $\Delta y$ 數量的資產 $y$。根據上面的推導:

$$\Delta y = \frac{y0 \cdot \Delta x}{x0 + \Delta x}$$

解出 $\Delta x$:

$$\Delta x = \frac{x0 \cdot \Delta y}{y0 - \Delta y}$$

交易的邊際價格在交易過程中是變化的。讓我們計算交易的平均價格和滑點。

平均執行價格

$$\bar{P} = \frac{\Delta x}{\Delta y} = \frac{x0}{y0 - \Delta y}$$

初始邊際價格

$$P0 = \frac{y0}{x_0}$$

滑點公式

$$Slippage = \frac{\bar{P} - P0}{P0} = \frac{\frac{x0}{y0 - \Delta y} - \frac{x0}{y0}}{\frac{x0}{y0}} = \frac{y0}{y0 - \Delta y} - 1 = \frac{\Delta y}{y_0 - \Delta y}$$

或者用交易份額($\gamma = \Delta y / y_0$)表示:

$$Slippage = \frac{\gamma}{1 - \gamma}$$

2.3 數值示例

讓我們用一個具體例子來說明這些計算:

初始狀態:
- ETH 池:1,000 ETH
- USDT 池:3,500,000 USDT(假設 ETH 價格 = $3,500)
- k = 1,000 × 3,500,000 = 3.5 × 10^9

初始邊際價格:
P₀ = 3,500,000 / 1,000 = $3,500/ETH

交易情境 1:購買 10 ETH

Δx = 10 ETH
Δy = (1,000 × 3,500,000) / (1,000 + 10) - 3,500,000
Δy = 3,465,346.53 - 3,500,000
Δy = -34,653.47 USDT(獲得)

實際支付:34,653.47 USDT
預期支付:10 × $3,500 = $35,000
滑點:($35,000 - $34,653.47) / $35,000 = 0.99%

交易後狀態:
- ETH 池:1,010 ETH
- USDT 池:3,465,346.53 USDT
- 新邊際價格:3,465,346.53 / 1,010 = $3,431.63/ETH

交易情境 2:購買 100 ETH(10倍規模)

Δx = 100 ETH
Δy = (1,000 × 3,500,000) / (1,000 + 100) - 3,500,000
Δy = 3,181,818.18 - 3,500,000
Δy = -318,181.82 USDT

實際支付:318,181.82 USDT
預期支付:100 × $3,500 = $350,000
滑點:($350,000 - $318,181.82) / $350,000 = 9.09%

交易後狀態:
- ETH 池:1,100 ETH
- USDT 池:3,181,818.18 USDT
- 新邊際價格:3,181,818.18 / 1,100 = $2,892.56/ETH

滑點與交易規模的關係

交易規模(ETH)實際支付(USDT)預期支付(USDT)滑點
1034,653.4735,0000.99%
50175,000.00175,0000.00%
100318,181.82350,0009.09%
200583,333.33700,00016.67%
5001,166,666.671,750,00033.33%
9001,642,857.143,150,00047.85%

從這個表格可以看出,常數乘積公式的滑點隨交易規模呈非線性增長。當交易規模超過池流動性的 50% 時,滑點急劇上升——這正是「擠出效應」的數學本質。

2.4 Python 程式碼實現

以下是用 Python 實現常數乘積 AMM 的程式碼:

class ConstantProductAMM:
    """
    常數乘積 AMM 實現
    
    公式:x * y = k
    
    交易數學:
    - 輸入 Δx,獲得 Δy = y - k / (x + Δx)
    - 邊際價格:P = y / x
    """
    
    def __init__(self, reserve_x: float, reserve_y: float):
        """
        初始化 AMM
        
        Args:
            reserve_x: 資產 X 的初始儲備量
            reserve_y: 資產 Y 的初始儲備量
        """
        assert reserve_x > 0 and reserve_y > 0, "儲備量必須為正"
        self.reserve_x = reserve_x
        self.reserve_y = reserve_y
        self.k = reserve_x * reserve_y
        
    def get_output_amount(self, input_amount: float, input_is_x: bool = True) -> float:
        """
        計算交易輸出量
        
        Args:
            input_amount: 輸入資產數量
            input_is_x: True 表示輸入資產 X,False 表示輸入資產 Y
            
        Returns:
            輸出資產數量
        """
        if input_is_x:
            new_reserve_x = self.reserve_x + input_amount
            new_reserve_y = self.k / new_reserve_x
            return self.reserve_y - new_reserve_y
        else:
            new_reserve_y = self.reserve_y + input_amount
            new_reserve_x = self.k / new_reserve_y
            return self.reserve_x - new_reserve_x
    
    def get_input_amount(self, output_amount: float, output_is_x: bool = True) -> float:
        """
        計算達到目標輸出量所需的輸入量
        
        Args:
            output_amount: 目標輸出資產數量
            output_is_x: True 表示輸出資產 X,False 表示輸出資產 Y
            
        Returns:
            所需輸入資產數量
        """
        if output_is_x:
            new_reserve_x = self.reserve_x - output_amount
            new_reserve_y = self.k / new_reserve_x
            return new_reserve_y - self.reserve_y
        else:
            new_reserve_y = self.reserve_y - output_amount
            new_reserve_x = self.k / new_reserve_y
            return new_reserve_x - self.reserve_x
    
    def get_spot_price(self, input_is_x: bool = True) -> float:
        """
        獲取現貨價格(邊際價格)
        
        Args:
            input_is_x: True 表示計算 Y/X 價格,False 表示計算 X/Y 價格
            
        Returns:
            現貨價格
        """
        if input_is_x:
            return self.reserve_y / self.reserve_x
        else:
            return self.reserve_x / self.reserve_y
    
    def get_slippage(self, input_amount: float, input_is_x: bool = True) -> float:
        """
        計算交易滑點
        
        Args:
            input_amount: 輸入資產數量
            input_is_x: True 表示輸入資產 X
            
        Returns:
            滑點(小數形式)
        """
        output_amount = self.get_output_amount(input_amount, input_is_x)
        spot_price = self.get_spot_price(input_is_x)
        
        if input_is_x:
            # 交易者支付 input_amount × P₀ 價值的 Y
            expected_cost = input_amount * spot_price
            actual_cost = self.reserve_y - (self.k / (self.reserve_x + input_amount))
            return (expected_cost - actual_cost) / expected_cost
        else:
            # 交易者支付 input_amount × P₀ 價值的 X
            expected_cost = input_amount / spot_price
            actual_cost = self.reserve_x - (self.k / (self.reserve_y + input_amount))
            return (expected_cost - actual_cost) / expected_cost
    
    def execute_swap(self, input_amount: float, input_is_x: bool = True) -> dict:
        """
        執行交易並返回詳細信息
        
        Args:
            input_amount: 輸入資產數量
            input_is_x: True 表示輸入資產 X
            
        Returns:
            交易詳情字典
        """
        spot_price = self.get_spot_price(input_is_x)
        output_amount = self.get_output_amount(input_amount, input_is_x)
        slippage = self.get_slippage(input_amount, input_is_x)
        
        if input_is_x:
            self.reserve_x += input_amount
            self.reserve_y -= output_amount
            effective_price = input_amount / output_amount
        else:
            self.reserve_y += input_amount
            self.reserve_x -= output_amount
            effective_price = output_amount / input_amount
        
        return {
            'input_amount': input_amount,
            'output_amount': output_amount,
            'spot_price': spot_price,
            'effective_price': effective_price,
            'slippage': slippage,
            'slippage_percent': slippage * 100,
            'reserve_x': self.reserve_x,
            'reserve_y': self.reserve_y
        }

# 使用示例
amm = ConstantProductAMM(reserve_x=1000, reserve_y=3_500_000)
print(f"現貨價格: ${amm.get_spot_price(True):.2f}/ETH")

result = amm.execute_swap(input_amount=10, input_is_x=True)
print(f"交易 10 ETH:")
print(f"  輸出 USDT: {result['output_amount']:.2f}")
print(f"  有效價格: ${result['effective_price']:.2f}")
print(f"  滑點: {result['slippage_percent']:.2f}%")

第三章:常數和公式(Constant Sum Formula)

3.1 公式與性質

常數和公式是另一種簡單的 AMM 模型,其數學表達式為:

$$x + y = k$$

這種模型的特點是邊際價格恆定為 1:1,不存在滑點。然而,這種模型存在一個致命的缺陷:當兩種資產的市場價格偏離 1:1 時,套利者會幾乎耗盡其中一種資產。

3.2 缺陷分析

假設市場上資產 $Y$ 相對於資產 $X$ 的價格為 $P_{market} = 1.1$(即 $Y$ 更貴)。

初始狀態:
- 池中 X = 1000
- 池中 Y = 1000
- 邊際價格 = 1(固定)

套利過程:
1. 市場上用 $X$ 購買 $Y$,價格 1.1:1
2. 在 AMM 中用 $X$ 換 $Y$,價格 1:1
3. 獲利:每交換 1 單位 $X$,可獲得 1 單位 $Y$,在市場上出售可獲得 1.1 單位 $X$
4. 重複直到池中 $X$ 或 $Y$ 耗盡

結果:套利者幾乎可以免費獲得池中所有的 $X$ 或 $Y$

這種「單一價格失敗」(Single Price Failure)是常數和公式無法單獨使用的主要原因。然而,它們在其他場景中有應用價值——例如,與常數乘積組合形成混合模型。

第四章:StableSwap 演算法

4.1 穩定幣交易的特殊挑戰

穩定幣交易是 AMM 應用中的一個重要場景。USDC/USDT、DAI/USDC 等交易對的特點是:

然而,常數乘積公式在這種場景下的表現不佳。讓我們計算:

假設 USDC/USDT 池:
- USDC = 10,000,000
- USDT = 10,000,000
- k = 10^14

邊際價格 = 1

交易 1,000,000 USDC:
Δy = (10^14) / (10^7 + 10^6) - 10^7
Δy = 9,090,909.09 - 10,000,000
Δy = -909,090.91 USDT

滑點 = (10^6 - 909,090.91) / 10^6 = 9.09%

即使是 swap 10% 的流動性,滑點就達到了 9.09%——這對於本應 1:1 交易的穩定幣來說是不可接受的。

4.2 StableSwap 不變量的推導

Curve Finance 的 StableSwap 演算法為穩定幣交易提供了解決方案。其核心思想是結合常數和(線性)和常數乘積(雙曲線)的特點:

$$V = \sum{i} xi^D + \sum{i} xj^D = D^n + D^n$$

然而,Curve 實際使用的公式更加複雜。讓我們介紹 Stableswap 的核心不變量:

Stableswap 不變量

對於 n 種資產的穩定幣池,Stableswap 不變量為:

$$\sum{i=1}^{n} xi^D \cdot D^{n-1} + \prod{i=1}^{n} xi = 2 \cdot D^n + \prod{i=1}^{n} xi$$

對於兩種資產的情況,這簡化為:

$$x^D + y^D = 2 \cdot D^D + x \cdot y$$

其中 $D$ 是「擴展美元值」(Amplified Dollar Value),$x$ 和 $y$ 是池中兩種資產的數量。

放大係數(Amplification Factor)

Curve 引入了一個放大係數 $\gamma$(gamma)來控制曲線在 1:1 區間的平坦程度:

$$K_{stable} = \frac{x \cdot y}{(x + y)^2} \cdot (1 + \gamma)$$

放大後的不變量為:

$$D \cdot \sum{i} xi + \prod{i} xi = D^2 + D \cdot \sum{i} xi + \prod{i} xi$$

4.3 混合曲線的數學推導

Curve 的突破性洞察是:在正常交易區間(接近 peg),曲線應該接近線性(無滑點);在偏離 peg 的情況下,曲線應該接近雙曲線(抗耗竭)。

混合公式

$$V = A \cdot n^n \cdot \sum{i} xi + D = A \cdot D + \prod{i} xi$$

其中:

邊際價格的推導

對於兩資產情況,不變量為:

$$V = A \cdot D^2 + D \cdot (x + y) = A \cdot D^2 + x \cdot D + y \cdot D$$

對 $x$ 求偏導:

$$\frac{\partial V}{\partial x} = 0 = 2A \cdot D \cdot \frac{\partial D}{\partial x} + D + x \cdot \frac{\partial D}{\partial x} + y \cdot \frac{\partial D}{\partial x}$$

$$(2A \cdot D + x + y) \cdot \frac{\partial D}{\partial x} = -D$$

$$\frac{\partial D}{\partial x} = -\frac{D}{2A \cdot D + x + y}$$

由不變量對 $y$ 求偏導:

$$\frac{\partial D}{\partial y} = -\frac{D}{2A \cdot D + x + y}$$

因此邊際價格為:

$$P = \frac{dy}{dx} = \frac{\partial D / \partial x}{\partial D / \partial y} = 1$$

當接近 peg 時,Stableswap 的邊際價格恆為 1!

4.4 數值示例

讓我們比較常數乘積和 Stableswap 在穩定幣交易中的表現:

USDC/USDT 池(初始):
- USDC = 10,000,000
- USDT = 10,000,000
- 放大係數 A = 100

Stableswap 不變量計算:
D = (x + y) / 2 × (1 + 1/A)^(1/2)
D = 10,000,000 × 1.004987... ≈ 10,049,875

交易 1,000,000 USDC:

常數乘積:
滑點 ≈ 9.09%

Stableswap:
使用牛頓法求解新 D'
滑點 ≈ 0.01%  或更低

4.5 Stableswap 的 Solidity 實現

// Stableswap 核心計算(Simplified)
contract StableswapPool {
    // 放大係數
    uint256 public A;
    
    // 資產數量
    uint256 public N;
    
    // 虛擬儲備量
    uint256 public D;
    
    // 池中的資產
    uint256[] public balances;
    
    // 初始化
    constructor(uint256 _A, uint256 _N) {
        A = _A;
        N = _N;
    }
    
    // 計算 D(使用牛頓法)
    function getD(uint256[] memory xp) public view returns (uint256) {
        uint256 D;
        uint256 Ann = A * N;
        
        // 初始猜測
        D = 0;
        for (uint256 i = 0; i < N; i++) {
            D += xp[i];
        }
        D = D / N;
        
        // 牛頓迭代
        uint256 D_P = D;
        for (uint256 i = 0; i < 255; i++) {
            uint256 D_Ptemp = D_P;
            for (uint256 j = 0; j < N; j++) {
                D_Ptemp = (D_Ptemp * D_P) / (xp[j] * N);
            }
            uint256 D_P_P = (D_Ptemp * D_P) / (D_P * N);
            uint256 D2 = ((Ann * D_P + D_P_P * N) * D) / ((Ann - 1) * D_P + (N + 1) * D_P_P);
            
            if (D_P > D2) {
                if (D_P - D2 <= 1) {
                    return D2;
                }
                D_P = D2;
            } else {
                if (D2 - D_P <= 1) {
                    return D2;
                }
                D_P = D2;
            }
        }
        return D;
    }
    
    // 計算輸出量
    function getDy(
        uint256 i, 
        uint256 j, 
        uint256 dx
    ) public view returns (uint256) {
        uint256[] memory xp = balances;
        uint256 x = xp[i] + dx;
        
        uint256 y = getYD(xp, i, x);
        
        // 計算 dy,並考慮費用(假設 0.04%)
        uint256 dy = xp[j] - y - 1;
        uint256 fee = dy * 4 / 10000;
        dy -= fee;
        
        return dy;
    }
}

第五章:無常損失(Impermanent Loss)的數學分析

5.1 無常損失的定義

無常損失(Impermanent Loss,簡稱 IL)是流動性提供者面臨的最重要風險之一。雖然名為「無常」,但這種損失往往是實實在在的——當流動性從池中撤出時,損失就會「固化」(變成永久損失)。

定義

假設 LP 在時間 $t0$ 向流動性池存入 $x0$ 單位的資產 $X$ 和 $y0$ 單位的資產 $Y$。此時市場價格為 $P0 = y0 / x0$。

經過一段時間,在時間 $t1$,市場價格變為 $P1$。LP 的持倉價值為:

策略 A(存入流動性池)

在時間 $t_1$,LP 的流動性份額價值為:

$$V{LP}(t1) = 2 \cdot \sqrt{x1 \cdot y1}$$

其中 $x1 \cdot y1 = x0 \cdot y0 = k$(常數乘積不變量),且 $y1 / x1 = P_1$。

由 $y1 = P1 \cdot x1$ 和 $x1 \cdot y_1 = k$:

$$x1^2 \cdot P1 = k$$

$$x1 = \sqrt{k / P1} = \sqrt{x0 \cdot y0 / P_1}$$

因此:

$$V{LP}(t1) = 2 \cdot \sqrt{x1 \cdot y1} = 2 \cdot \sqrt{k} = 2 \cdot \sqrt{x0 \cdot y0}$$

有趣的是,在常數乘積 AMM 中,LP 的總持倉價值(以資產數量計)與市場價格無關!

策略 B(簡單持有)

如果 LP 不存入流動性池,而是簡單持有初始資產:

$$V{HODL}(t1) = x0 + y0 \cdot P1 = x0 + \frac{y0}{P0} \cdot P_1$$

無常損失的定義

$$IL = \frac{V{LP}(t1) - V{HODL}(t1)}{V{HODL}(t1)}$$

5.2 無常損失的精確推導

讓我們進行完整的數學推導。

基本假設

LP 持倉分析

在時間 $t_1$,池中資產滿足:

$$x1 \cdot y1 = x0 \cdot y0 = k$$

$$y1 / x1 = P_1$$

由上式:

$$x1^2 \cdot P1 = k = x0 \cdot y0 = x0^2 \cdot P0$$

$$x1 = x0 \cdot \sqrt{P0 / P1} = x_0 / \sqrt{\alpha}$$

同理:

$$y1 = y0 \cdot \sqrt{\alpha}$$

LP 持有池份額的總價值(以 $Y$ 計):

$$V{LP}(t1) = x1 \cdot P1 + y1 = x0 \cdot P1 / \sqrt{\alpha} + y0 \cdot \sqrt{\alpha}$$

$$= x0 \cdot P0 \cdot \alpha / \sqrt{\alpha} + y_0 \cdot \sqrt{\alpha}$$

$$= x0 \cdot P0 \cdot \sqrt{\alpha} + y_0 \cdot \sqrt{\alpha}$$

$$= (x0 \cdot P0 + y_0) \cdot \sqrt{\alpha}$$

$$= 2 \cdot y_0 \cdot \sqrt{\alpha}$$

HODL 持倉分析

$$V{HODL}(t1) = x0 \cdot P1 + y0 = x0 \cdot P0 \cdot \alpha + y0$$

$$= y0 \cdot \alpha + y0 = y_0 \cdot (1 + \alpha)$$

無常損失計算

$$IL = \frac{V{LP} - V{HODL}}{V{HODL}} = \frac{2 \cdot y0 \cdot \sqrt{\alpha} - y0 \cdot (1 + \alpha)}{y0 \cdot (1 + \alpha)}$$

$$IL = \frac{2 \cdot \sqrt{\alpha} - (1 + \alpha)}{1 + \alpha}$$

這個公式就是常數乘積 AMM 無常損失的精確表達式。

5.3 無常損失的性質分析

讓我們分析這個函數的性質:

當 $\alpha = 1$(價格不變)

$$IL = \frac{2 - 2}{2} = 0$$

當 $\alpha > 1$(資產 $Y$ 升值)

令 $\alpha = t^2$($t > 1$):

$$IL = \frac{2t - (1 + t^2)}{1 + t^2} = \frac{2t - 1 - t^2}{1 + t^2} < 0$$

當 $\alpha < 1$(資產 $Y$ 貶值)

令 $\alpha = 1/t^2$($t > 1$):

$$IL = \frac{2/t - (1 + 1/t^2)}{1 + 1/t^2} = \frac{2t - (t^2 + 1)}{t^2 + 1} < 0$$

結論:在所有價格變動的情況下(除了 $\alpha = 1$),無常損失恆為負!

無常損失的數值表

價格變動倍數(α)無常損失(IL)
0.25 (下跌 75%)-42.4%
0.50 (下跌 50%)-5.7%
0.75 (下跌 25%)-0.6%
1.00 (不變)0.0%
1.25 (上漲 25%)-0.6%
1.50 (上漲 50%)-5.7%
2.00 (上漲 100%)-13.4%
4.00 (上漲 300%)-33.0%
5.00 (上漲 400%)-42.4%

5.4 無常損失的 Python 計算

import numpy as np
import matplotlib.pyplot as plt

def impermanent_loss(alpha):
    """
    計算常數乘積 AMM 的無常損失
    
    Args:
        alpha: 價格倍數(相對於初始價格)
        
    Returns:
        無常損失(小數形式)
    """
    return (2 * np.sqrt(alpha) - (1 + alpha)) / (1 + alpha)

# 計算不同價格倍數下的無常損失
alphas = np.linspace(0.1, 10, 1000)
ils = impermanent_loss(alphas)

# 繪製圖表
plt.figure(figsize=(12, 8))
plt.plot(alphas, ils * 100, 'b-', linewidth=2)
plt.axhline(y=0, color='r', linestyle='--', alpha=0.5)
plt.axvline(x=1, color='g', linestyle='--', alpha=0.5)
plt.xlabel('價格倍數 (α)', fontsize=12)
plt.ylabel('無常損失 (%)', fontsize=12)
plt.title('常數乘積 AMM 無常損失分析', fontsize=14)
plt.grid(True, alpha=0.3)
plt.xlim(0.1, 10)
plt.ylim(-50, 5)
plt.savefig('impermanent_loss.png', dpi=150)
plt.show()

# 輸出關鍵數值
print("無常損失關鍵數值:")
for alpha in [0.25, 0.5, 0.75, 1, 1.25, 1.5, 2, 3, 4, 5]:
    il = impermanent_loss(alpha)
    print(f"α = {alpha:5.2f}: IL = {il * 100:7.2f}%")

第六章:加權池與動態池模型

6.1 加權池的數學模型

Balancer 引入的加權池(Weighted Pool)將常數乘積公式推廣到多資產和非均等權重。其數學表達式為:

$$\prod{i} xi^{w_i} = k$$

其中 $wi$ 是資產 $i$ 的權重,滿足 $\sumi w_i = 1$。

當所有權重相等($w_i = 1/n$)時,這簡化為常數乘積公式:

$$\prod{i} xi^{1/n} = k$$

$$\prod{i} xi = k^n$$

6.2 雙資產加權池的推導

對於兩個資產的加權池:

$$x^{w} \cdot y^{1-w} = k$$

對兩邊取對數:

$$w \cdot \ln x + (1-w) \cdot \ln y = \ln k$$

邊際價格的推導

$$\frac{dy}{dx} = -\frac{w \cdot y}{(1-w) \cdot x}$$

$$P_{y/x} = \frac{dy}{dx} = \frac{w \cdot y}{(1-w) \cdot x}$$

這與常數乘積公式的關鍵區別是:加權池的邊際價格不僅取決於儲備量比率,還取決於權重。

特殊情況分析

當 $w = 0.5$ 時:

$$P_{y/x} = \frac{y}{x}$$

這正是常數乘積的情況。

當 $w = 0.8$ 時:

$$P_{y/x} = \frac{0.8 \cdot y}{0.2 \cdot x} = 4 \cdot \frac{y}{x}$$

這意味著邊際價格被人為調整了 4 倍。

6.3 收益率模型的推導

LP 收益來源

加權池中 LP 的收益來自三個部分:

  1. 交易費用:每筆交易收取的比例費用
  2. 資產增值:池中資產的市場價格變動
  3. 權重效應:非均等權重帶來的價格調整效應

持有收益 vs 池份額收益

假設 LP 持有池份額的價值為 $V{LP}$,而如果簡單持有資產(按照初始權重分配)的價值為 $V{HODL}$。

加權池的一個關鍵特性是:當市場價格朝有利方向變動時,LP 可能獲得比 HODL 更高的收益。

第七章:集中流動性模型

7.1 Uniswap V3 的突破

Uniswap V3 引入的「集中流動性」(Concentrated Liquidity)是 AMM 設計的重大突破。其核心思想是:LP 可以將流動性集中在特定價格區間內,而不是整個 $[0, \infty)$ 範圍。

7.2 集中流動性的數學模型

在 Uniswap V3 中,LP 選擇一個價格區間 $[Pa, Pb]$ 並提供流動性。合約追蹤每個 LP 在每個區間的「虛擬儲備量」。

流動性參數 $L$

定義流動性參數 $L$(類似於常數乘積中的 $\sqrt{k}$):

$$L = \sqrt{x \cdot y}$$

區間內的價格-數量關係

在價格 $P$ 位於 $[Pa, Pb]$ 區間內時:

$$x = \frac{L}{\sqrt{P}} + x_{virtual}$$

$$y = L \cdot \sqrt{P} + y_{virtual}$$

其中 $x{virtual}$ 和 $y{virtual}$ 是虛擬儲備量。

7.3 集中流動性的無常損失分析

集中流動性的無常損失比普通池更加複雜,因為 LP 的曝險會隨價格變動而改變。

當價格在區間內

如果市場價格 $P$ 保持在 LP 設定的區間內,LP 的實際無常損失為 0(假設不考慮費用)。

當價格離開區間

一旦價格離開 LP 的區間,LP 的曝險變成了完全的單邊曝險,相當於持有一種資產。此時:

$$V{LP} = V0 \cdot \frac{P{exit}}{P{entry}}$$

假設 $P$ 變動為 $\alpha$ 倍,LP 可能遭受完全與 HODL 相比的損失。

第八章:進階 AMM 模型與未來方向

8.1 動態費用模型

傳統 AMM 採用固定的交易費用(如 0.3%),這在市場波動劇烈時可能不足以補償 LP 的風險。動態費用模型嘗試根據市場條件自動調整費用。

費用調整公式

一種簡單的動態費用模型:

$$fee(P, \sigma) = fee_{base} + k \cdot \sigma \cdot \sqrt{P \cdot (1-P)}$$

其中 $\sigma$ 是市場波動率,$P$ 是當前現價。

8.2 自動化集中流動性

Uniswap V4 引入的「鉤子」(Hooks)機制允許實現自動化集中流動性。LP 可以設定目標價格區間,協議自動在高波動期間擴大區間,在低波動期間縮小區間。

8.3 垂直整合 AMM

新興的 AMM 模型正在探索「垂直整合」——將訂單路由、流動性聚合和費用優化整合在同一框架中。這些模型旨在提供比傳統 AMM 更低的滑點和更好的 LP 收益。

結論

本文系統性地推導了 DeFi 自動做市商(AMM)的數學基礎。從最基礎的常數乘積公式到複雜的 StableSwap 演算法,從無常損失的精確推導到集中流動性的理論框架,我們涵蓋了理解現代 DeFi 所需的核心數學工具。

這些數學模型不僅是學術研究的對象,更是實際協議設計和風險管理的基礎。對於協議開發者,深入理解這些模型有助於設計更高效、更安全的 AMM;對於交易者和 LP,理解數學原理有助於做出更明智的決策;對於研究者,這些模型為探索 AMM 的邊界提供了理論框架。

DeFi 領域仍在快速演進。隨著 Layer 2 解決方案的成熟、ZK 技術的進步、以及機構採用的擴大,AMM 的數學模型也將繼續演變。然而,常數乘積、邊際價格、滑點和無常損失等核心概念將繼續是理解這一領域的基石。

延伸閱讀

標籤

defi, amm, mathematical-derivation, uniswap, curve, balancer, constant-product, stableswap, impermanent-loss, liquidity, trading, solidity, python

延伸閱讀與來源

這篇文章對您有幫助嗎?

評論

發表評論

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

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