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 可以相互堆疊和混合
然而,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\%$$
滑點的大小取決於:
- 交易規模相對於流動性池的規模
- AMM 的曲率(由不變量函數決定)
- 資產的價格相關性
第二章:常數乘積公式(Constant Product Formula)
2.1 公式推導與基本性質
常數乘積公式是 Uniswap V1 和 V2 採用的核心 AMM 模型,由白皮書提出者設計。其數學表達式為:
$$x \cdot y = k$$
其中:
- $x$ 是第一種資產的數量
- $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) | 滑點 |
|---|---|---|---|
| 10 | 34,653.47 | 35,000 | 0.99% |
| 50 | 175,000.00 | 175,000 | 0.00% |
| 100 | 318,181.82 | 350,000 | 9.09% |
| 200 | 583,333.33 | 700,000 | 16.67% |
| 500 | 1,166,666.67 | 1,750,000 | 33.33% |
| 900 | 1,642,857.14 | 3,150,000 | 47.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 等交易對的特點是:
- 標的資產的市場價格非常接近 1:1
- 交易者預期價格變動極小
- 大額交易不應該有太大的滑點
然而,常數乘積公式在這種場景下的表現不佳。讓我們計算:
假設 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$$
其中:
- $A$ 是放大係數(Amplification Coefficient)
- $n$ 是資產數量
- $D$ 是虛擬儲備量
- $x_i$ 是第 $i$ 種資產的數量
邊際價格的推導:
對於兩資產情況,不變量為:
$$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 無常損失的精確推導
讓我們進行完整的數學推導。
基本假設:
- 初始狀態:存入 $x0$ 資產 $X$ 和 $y0$ 資產 $Y$
- 初始價格:$P0 = y0 / x_0$
- 初始總價值(以 $Y$ 計):$V0 = x0 \cdot P0 + y0 = 2 \cdot y_0$
- 市場價格變動:$P1 = \alpha \cdot P0$($\alpha$ 是價格倍數)
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 的收益來自三個部分:
- 交易費用:每筆交易收取的比例費用
- 資產增值:池中資產的市場價格變動
- 權重效應:非均等權重帶來的價格調整效應
持有收益 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 的數學模型也將繼續演變。然而,常數乘積、邊際價格、滑點和無常損失等核心概念將繼續是理解這一領域的基石。
延伸閱讀
- Uniswap V2 白皮書:常數乘積公式的完整推導
- Curve Finance 白皮書:StableSwap 不變量的數學證明
- Balancer 白皮書:加權池的理論基礎
- Uniswap V3 技術文檔:集中流動性的實現細節
- 《Fiat Lux: An Introduction to Constant Function Market Makers》- Guillermo Angeris et al.
標籤
defi, amm, mathematical-derivation, uniswap, curve, balancer, constant-product, stableswap, impermanent-loss, liquidity, trading, solidity, python
相關文章
- DeFi 進階合約模式完整指南:從設計模式到 production-ready 程式碼實踐 — 本文深入探討以太坊 DeFi 協議開發中的進階合約模式,這些模式是構建生產級去中心化金融應用的核心技術基礎。相較於基礎的代幣轉帳和簡單借貸,進階 DeFi 協議需要處理複雜的定價邏輯、流動性管理、風險控制和多層次的激勵機制。本文從資深工程師視角出發,提供可直接應用於生產環境的程式碼範例,涵蓋 AMM 深度實現、質押衍生品、借貸協議進階風控、協議治理等關鍵領域。
- 新興DeFi協議安全評估框架:從基礎審查到進階量化分析 — 系統性構建DeFi協議安全評估框架,涵蓋智能合約審計、經濟模型、治理機制、流動性風險等維度。提供可直接使用的Python風險評估代碼、借貸與DEX協議的專門評估方法、以及2024-2025年安全事件數據分析。
- 以太坊智能合約開發除錯完整指南:從基礎到生產環境的實戰教學 — 本文提供完整的智能合約開發除錯指南,涵蓋常見漏洞分析(重入攻擊、整數溢位、存取控制)、調試技術(Hardhat/Foundry)、Gas 優化技巧、完整測試方法論,以及動手實驗室單元。幫助開發者從新手成長為能夠獨立開發生產環境就緒合約的工程師。
- DeFi 協議程式碼實作完整指南:從智能合約到前端交互 — 本文提供從智能合約層到前端交互的完整程式碼範例,涵蓋 ERC-20 代幣合約、借貸協議、AMM 交易所、質押協議等主要 DeFi 應用場景,使用 Solidity 和 JavaScript/TypeScript 提供可直接運行的程式碼範例。
- DeFi 流動性提供完整指南:AMM 機制、收益計算與風險管理 — 去中心化金融(DeFi)的核心創新之一是自動做市商(Automated Market Maker, AMM)機制。與傳統訂單簿模式不同,AMM 採用「流動性池」模式,允許用戶作為流動性提供者(Liquidity Provider, LP)向池中存入資產,並從交易費用中獲得收益。本指南深入解析 AMM 的技術機制、流動性提供的收益計算、風險因素,以及實際操作流程,幫助讀者從理論到實踐全面掌握 DeF
延伸閱讀與來源
- Aave V3 文檔 頭部借貸協議技術規格
- Uniswap V4 文檔 DEX 協議規格與鉤子機制
- DeFi Llama DeFi TVL 聚合數據
- Dune Analytics DeFi 協議數據分析儀表板
這篇文章對您有幫助嗎?
請告訴我們如何改進:
評論
發表評論
注意:由於這是靜態網站,您的評論將儲存在本地瀏覽器中,不會公開顯示。
目前尚無評論,成為第一個發表評論的人吧!