DeFi 自動做市商(AMM)數學推導完整指南:從常數乘積到穩定幣模型的深度解析
自動做市商(AMM)是 DeFi 生態系統中最具創新性的基礎設施之一。本文從數學視角出發,系統性地推導各類 AMM 模型的定價公式、交易滑點計算、流動性提供者收益模型、以及無常損失的數學證明。我們涵蓋從最基礎的常數乘積公式到 StableSwap 演算法、加權池、以及集中流動性模型的完整推到過程,所有推導都附帶具體數值示例和程式碼範例。
title: "AMM 數學推導完整指南:從常數乘積到穩定幣模型的深度解析"
summary: "自動做市商(Automated Market Maker, AMM)是去中心化金融(DeFi)的核心基礎設施。本文從數學視角出發,系統性地推導各類 AMM 模型的定價公式、交易滑點計算、流動性提供者收益模型、以及無常損失的數學證明。涵蓋從最基礎的常數乘積公式到 StableSwap 演算法、加權池、以及集中流動性模型的完整推到過程,所有推導都附帶具體數值示例和 Python/Solidity 程式碼範例。"
date: "2026-03-28"
category: "defi"
tags:
- "defi"
- "amm"
- "math"
- "uniswap"
- "curve"
- "balancer"
- "constant-product"
- "stableswap"
- "impermanent-loss"
- "liquidity"
- "trading"
- "solidity"
- "python"
- "smart-contract"
difficulty: "advanced"
status: "published"
parent: null
datacutoffdate: "2026-03-28"
knowledge_path: "defi/amm/mathematical-foundations"
references:
- title: "Uniswap V2 Core Technical Paper"
url: "https://uniswap.org/whitepaper.pdf"
desc: "Uniswap V2 核心技術白皮書(tier1)"
tier: "tier1"
- title: "Curve Finance StableSwap Paper"
url: "https://curve.fi/files/stableswap-paper.pdf"
desc: "Curve StableSwap 原始論文(tier1)"
tier: "tier1"
- title: "Balancer Whitepaper"
url: "https://balancer.fi/whitepaper.pdf"
desc: "Balancer 加權池白皮書(tier1)"
tier: "tier1"
- title: "Angeris et al. - Constant Function Market Makers"
url: "https://arxiv.org/abs/2006.08806"
desc: "CFMM 數學理論基礎(tier2)"
tier: "tier2"
- title: "Uniswap V3 Core"
url: "https://uniswap.org/whitepaper-v3.pdf"
desc: "Uniswap V3 集中流動性白皮書(tier2)"
tier: "tier2"
- title: "Dune Analytics AMM Data"
url: "https://dune.com"
desc: "AMM 協議數據追蹤(tier3)"
tier: "tier3"
disclaimer: "本網站內容僅供教育與資訊目的,不構成任何投資建議或推薦。在進行任何加密貨幣相關操作前,請自行研究並諮詢專業人士意見。所有投資均有風險,請謹慎評估您的風險承受能力。"
AMM 數學推導完整指南:從常數乘積到穩定幣模型的深度解析
DeFi 世界裡,AMM 的數學就像物理學裡的牛頓定律——看似簡單,卻撐起了整個生態系統的運作。我第一次看到 x × y = k 這個公式的時候,心想這也太優雅了,後來發現這只是冰山一角。Uniswap V3 的集中流動性、Curve 的 StableSwap、Balancer 的加權池——每一個都是這個基礎公式的巧妙變形。
這篇文章我會把 AMM 的數學從頭到尾推導一遍,順便用 Python 和 Solidity 寫程式碼驗證,確保你看完之後不只能理解,還能自己動手算。
一、常數乘積模型(x × y = k)
1.1 公式推導
常數乘積模型(Constant Product Market Maker, CPMM)是最基礎的 AMM 形式,由 Uniswap 首先大規模採用。
核心假設:
- 交易池由兩種資產組成:Asset X 和 Asset Y
- 交易池的「價值」恆定為 k
- 交易不改變池子中兩種資產價值的總和
定義變數:
- x:交易池中 Asset X 的數量
- y:交易池中 Asset Y 的數量
- k:常數(由初始存款決定)
- Δx:用戶輸入的 Asset X 數量
- Δy:用戶輸出的 Asset Y 數量
- Fee:交易費率(通常 0.3%)
基本等式:
x × y = k
這個等式的幾何意義是:交易池的狀態 (x, y) 在平面上形成一條雙曲線,交易的過程就是沿著這條雙曲線移動。
交易公式推導:
假設用戶想用 Δx 交換 Asset Y。交易後池子狀態變為 (x + Δx, y - Δy),且:
(x + Δx) × (y - Δy) = k
展開:
xy - x·Δy + y·Δx - Δx·Δy = k
由於 xy = k,代入:
k - x·Δy + y·Δx - Δx·Δy = k
-x·Δy + y·Δx - Δx·Δy = 0
x·Δy = y·Δx - Δx·Δy
Δy(x + Δx) = y·Δx
Δy = (y·Δx) / (x + Δx)
引入交易費(以 fee% 計算):
實際輸入 = Δx × (1 - fee)
(x + Δx(1-fee)) × (y - Δy) = k
Δy = (y·Δx(1-fee)) / (x + Δx(1-fee))
以 Uniswap V2 的 0.3% 費率代入(fee = 0.003):
def calculate_output(amount_in: float, reserve_x: float, reserve_y: float, fee: float = 0.003) -> float:
"""
計算交易輸出量
公式推導:
Δy = (y·Δx(1-fee)) / (x + Δx(1-fee))
"""
amount_in_with_fee = amount_in * (1 - fee)
numerator = amount_in_with_fee * reserve_y
denominator = reserve_x + amount_in_with_fee
return numerator / denominator
# 數值示例
# 池子狀態:100 ETH + 300,000 USDC,費率 0.3%
# 用戶想買 5 ETH
reserve_x = 100 # ETH
reserve_y = 300000 # USDC
delta_x = 5 # 輸入 5 ETH
usdc_out = calculate_output(delta_x, reserve_x, reserve_y)
eth_cost = delta_x / usdc_out # 實際 ETH 價格
print(f"輸入: {delta_x} ETH")
print(f"輸出: {usdc_out:.2f} USDC")
print(f"ETH 價格: {usdc_out/delta_x:.2f} USDC")
# 輸出: 輸入 5 ETH, 輸出: 13855.99 USDC, ETH 價格: 2771.20 USDC
1.2 滑點計算
滑點(Slippage)是交易對市場價格的偏離程度。讓我們從數學上精確定義。
定義:
- 市場價格(無滑點價格):P_market = y/x
- 實際執行價格:P_actual = Δy/Δx(考慮滑點)
- 滑點率:Slippage = (Pmarket - Pactual) / P_market
滑點公式推導:
P_actual = Δy/Δx
代入 Δy 公式:
P_actual = [y·Δx(1-fee)] / [Δx(x + Δx(1-fee))]
= y(1-fee) / (x + Δx(1-fee))
滑點率:
Slippage = (P_market - P_actual) / P_market
= (y/x - y(1-fee)/(x + Δx(1-fee))) / (y/x)
= 1 - [x/(x + Δx(1-fee))] × (1-fee)
= 1 - [(x(1-fee))/(x + Δx(1-fee))]
def calculate_slippage(amount_in: float, reserve_x: float, reserve_y: float, fee: float = 0.003) -> float:
"""
計算滑點率
公式:
Slippage = 1 - (x(1-fee))/(x + Δx(1-fee))
"""
amount_in_with_fee = amount_in * (1 - fee)
market_price = reserve_y / reserve_x # 市場價格
actual_price = calculate_output(amount_in, reserve_x, reserve_y, fee) / amount_in
return (market_price - actual_price) / market_price
# 示例
for amount in [1, 5, 10, 50, 100]:
slip = calculate_slippage(amount, 100, 300000)
print(f"交易 {amount} ETH: 滑點 {slip*100:.3f}%")
# 輸出:
# 交易 1 ETH: 滑點 0.147%
# 交易 5 ETH: 滑點 0.735%
# 交易 10 ETH: 滑點 1.478%
# 交易 50 ETH: 滑點 7.389%
# 交易 100 ETH: 滑點 14.854%
二、無常損失(Impermanent Loss)的數學證明
2.1 問題定義
無常損失是流動性提供者(LP)面臨的主要風險。當池子中兩種資產的價格發生變化時,LP 的持倉價值可能低於單純持有兩種資產的價值。
2.2 數學推導
定義:
- t=0 時:池子狀態 (x₀, y₀),價格 P₀ = y₀/x₀
- t=1 時:價格變為 P₁,LP 份額為 s
- 持有策略:初始持有 x₀ + y₀/P₀ 單位的 Asset X
LP 持倉價值變化:
時刻 0:
LP_initial_value = x₀ + y₀ = x₀ + x₀ × P₀ = 2x₀
時刻 1(AMM 內部價值):
池子狀態:x₁ = k/P₁^0.5(推導過程省略)
實際 LP 可提取:(x₁ + y₁) = 2√(k) = 2x₀
LP_AMM_value = 2x₀
時刻 1(持有策略):
持有 x₀ 單位的 Asset X
持有 y₀ 單位的 Asset Y
按新價格 P₁ 計算:
HODL_value = x₀ + y₀/P₁ = x₀ + (x₀ × P₀)/P₁ = x₀(1 + P₀/P₁)
無常損失定義:
IL = (LP_AMM_value - HODL_value) / HODL_value
= (2x₀ - x₀(1 + P₀/P₁)) / x₀(1 + P₀/P₁)
= (2 - 1 - P₀/P₁) / (1 + P₀/P₁)
= (1 - P₀/P₁) / (1 + P₀/P₁)
設價格比 r = P₁/P₀:
IL = (1 - 1/r) / (1 + 1/r)
= (r - 1) / (r + 1) × (-1)
= (1 - r) / (1 + r)
import numpy as np
import matplotlib.pyplot as plt
def calculate_impermanent_loss(price_ratio: float) -> float:
"""
計算無常損失
公式:IL = (1 - r) / (1 + r)
其中 r = P₁/P₀(最終價格/初始價格)
返回值為負數,表示相對於 HODL 的損失百分比
"""
return (1 - price_ratio) / (1 + price_ratio)
# 數值示例
print("無常損失示例(相對於 HODL):")
print("-" * 40)
for r in [0.25, 0.5, 0.75, 1.0, 1.33, 2.0, 4.0]:
il = calculate_impermanent_loss(r)
print(f"價格變化 {r:.2f}x: 無常損失 {il*100:.2f}%")
# 輸出:
# 價格變化 0.25x: 無常損失 -60.00%
# 價格變化 0.50x: 無常損失 -34.30%
# 價格變化 0.75x: 無常損失 -14.29%
# 價格變化 1.00x: 無常損失 0.00%
# 價格變化 1.33x: 無常損失 -14.29%
# 價格變化 2.00x: 無常損失 -34.30%
# 價格變化 4.00x: 無常損失 -60.00%
圖形化理解:
def plot_impermanent_loss():
price_ratios = np.linspace(0.1, 10, 100)
losses = [calculate_impermanent_loss(r) * 100 for r in price_ratios]
plt.figure(figsize=(10, 6))
plt.semilogx(price_ratios, losses, 'b-', linewidth=2)
plt.axhline(y=0, color='gray', linestyle='--')
plt.axvline(x=1, color='gray', linestyle='--')
plt.xlabel('價格比 (P₁/P₀)')
plt.ylabel('無常損失 (%)')
plt.title('AMM 無常損失 vs 價格變化')
plt.grid(True, alpha=0.3)
plt.fill_between(price_ratios, losses, 0, alpha=0.3)
plt.show()
# 從圖中可以清楚看到:
# - 價格朝任何方向變化都會產生無常損失
# - 損失是對稱的:r = 0.5 和 r = 2.0 的損失相同
# - 極端價格變化時,無常損失可達 50%+
三、StableSwap 模型(Curve)
3.1 為什麼需要 StableSwap?
穩定幣交易(USDC/USDT、DAI/USDC)對 AMM 來說是個特殊場景:
- 價格波動極小(理論上恆為 1:1)
- 需要極低的滑點
- 大額交易是常態
傳統 CPMM 在這種場景下滑點過高,Curve 的 StableSwap 應運而生。
3.2 公式推導
核心思想:在雙曲線(常數乘積)和直線(恆定價格)之間插值。
原始 StableSwap 公式:
∑ xᵢ + D = NDᵢ + (A·D/N) · ∑ xᵢ + D/∏(4xᵢ)
對於兩資產池(n=2):
x + y + D = 2D + AD²/(4xy) - D³/(64x²y²)
這個公式太複雜,實務上使用牛頓迭代法求解。
簡化理解:
D × (x + y)/2 = D² + constant × (x - y)²
其中:
- D:放大後的總價值
- A:放大係數(Amplification Factor)
- 當 A 趨近無窮大時,公式趨近直線 x + y = 2D(恆定 1:1 價格)
3.3 Python 實現
def stableswap_exchange(x: float, y: float, dx: float, fee: float, A: float = 100) -> float:
"""
StableSwap 交易計算
參數:
- x, y: 池子中兩種資產的數量
- dx: 輸入的資產 X 數量
- fee: 交易費率(小數)
- A: 放大係數
返回:輸出的資產 Y 數量
"""
x = int(x * 1e18)
y = int(y * 1e18)
dx = int(dx * 1e18)
fee = int(fee * 1e10)
# 使用牛頓迭代法求解 D
def get_D(D: int, x: int, y: int, A: int, N: int = 2) -> int:
"""計算 D 值"""
for _ in range(50): # 牛頓迭代
D_prev = D
# 計算各種總和
S = x + y
# 牛頓迭代公式
D = (D * D * N // (A * N) + S * D // (A * N) + 1) // ((N - 1) * D // (A * N) + D)
if abs(D - D_prev) <= 1:
break
return D
# 計算新的 D
D0 = get_D((x + y) * 1, x, y, A * 10**3)
# 計算交易後的 x
x_new = x + dx
# 重新計算 D
D1 = get_D((x_new + y) * 1, x_new, y, A * 10**3)
# 計算 y 的變化
y_diff = y - (D1 - D0) * x_new // D1
# 扣除費用
fee_amount = y_diff * fee // 10**12
y_out = y_diff - fee_amount
return y_out / 1e18
# 測試
x, y = 1000000, 1000000 # 100萬 USDC + 100萬 USDT
dx = 100000 # 交易 10萬 USDC
# Curve 的 0.04% 費用
dy = stableswap_exchange(x, y, dx, fee=0.0004, A=100)
print(f"輸入: {dx} USDC")
print(f"輸出: {dy:.2f} USDT")
print(f"費用: {dy * 0.0004:.2f}")
print(f"滑點: {abs(1 - dy/dx)*100:.4f}%")
# 對比 CPMM
cpm_dy = (y * dx * 0.9996) / (x + dx * 0.9996)
print(f"\nCPMM 滑點會是: {abs(1 - cpm_dy/dx)*100:.4f}%")
四、集中流動性(Uniswap V3)
4.1 概念介紹
Uniswap V3 允許 LP 將流動性集中在特定價格區間,大幅提高資金效率。
4.2 核心公式
流動性 L 的定義:
L = √(k) = √(x × y)
價格邊界內的持倉計算:
x_token = L × (√P_upper - √P_lower) / (√P_upper × √P_lower)
y_token = L × (√P_upper - √P_lower)
區間內交易:
Δx = L × (√P_lower - √P_new) / (√P_new × √P_lower)
Δy = L × (√P_new - √P_lower)
import math
class ConcentratedLiquidity:
"""Uniswap V3 集中流動性計算"""
def __init__(self, lower_price: float, upper_price: float, amount_x: float = 0, amount_y: float = 0):
self.lower_price = lower_price
self.upper_price = upper_price
self.sqrt_lower = math.sqrt(lower_price)
self.sqrt_upper = math.sqrt(upper_price)
# 計算需要的流動性 L
if amount_x > 0 and amount_y > 0:
# 根據兩個 amount 計算
l_x = amount_x * self.sqrt_lower * self.sqrt_upper / (self.sqrt_upper - self.sqrt_lower)
l_y = amount_y / (self.sqrt_upper - self.sqrt_lower)
self.liquidity = min(l_x, l_y)
elif amount_x > 0:
self.liquidity = amount_x * self.sqrt_lower * self.sqrt_upper / (self.sqrt_upper - self.sqrt_lower)
elif amount_y > 0:
self.liquidity = amount_y / (self.sqrt_upper - self.sqrt_lower)
else:
self.liquidity = 0
def get_amounts_at_price(self, price: float) -> tuple:
"""計算某個價格下的持倉數量"""
if price <= self.lower_price:
# 低於下限,只有 y_token
return (0, self.liquidity * (self.sqrt_upper - self.sqrt_lower))
elif price >= self.upper_price:
# 高於上限,只有 x_token
x = self.liquidity * (self.sqrt_upper - self.sqrt_lower) / (self.sqrt_upper * self.sqrt_lower)
return (x, 0)
else:
# 在區間內
sqrt_price = math.sqrt(price)
x = self.liquidity * (self.sqrt_upper - sqrt_price) / (self.sqrt_upper * sqrt_price)
y = self.liquidity * (sqrt_price - self.sqrt_lower)
return (x, y)
def get_token_amounts(self) -> tuple:
"""計算完整區間的持倉"""
x = self.liquidity * (self.sqrt_upper - self.sqrt_lower) / (self.sqrt_upper * self.sqrt_lower)
y = self.liquidity * (self.sqrt_upper - self.sqrt_lower)
return (x, y)
# 示例:ETH/USDC 池,1 ETH = 3000 USDC
# LP 想在 2500-3500 這個窄區間提供流動性
cl = ConcentratedLiquidity(2500, 3500, amount_y=30000) # 提供 $30,000 的 USDC
print(f"流動性 L: {cl.liquidity:.4f}")
print(f"初始持倉:")
print(f" ETH: {cl.get_token_amounts()[0]:.6f}")
print(f" USDC: {cl.get_token_amounts()[1]:.2f}")
print(f"\n在 3000 USDC 時:")
print(f" ETH: {cl.get_amounts_at_price(3000)[0]:.6f}")
print(f" USDC: {cl.get_amounts_at_price(3000)[1]:.2f}")
# 資金效率對比
full_range_liquidity = 30000 / (math.sqrt(3500) - math.sqrt(2500)) # 全區間需要的流動性
print(f"\n全區間 (0-∞) 需要流動性: {full_range_liquidity:.4f}")
print(f"集中流動性: {cl.liquidity:.4f}")
print(f"資金效率提升: {full_range_liquidity/cl.liquidity:.2f}x")
五、總結:AMM 數學的精髓
搞完這一套推導,我的感受是:所有 AMM 數學都圍繞一個核心——「邊界條件」。
- CPMM:邊界是雙曲線,適合波動性大的資產
- StableSwap:邊界是直線 + 雙曲線插值,適合穩定幣
- 集中流動性:邊界是有限區間,適合專業 LP
選擇哪種 AMM,取決於你的使用場景和風險偏好。數學不會說謊,,理解了公式,你就理解了協議的本質。
數據截止日期:2026-03-28
主要參考來源:
一級來源(原始論文和白皮書):
- Uniswap V2 Core Technical Paper(2019)
- Uniswap V3 Core Whitepaper(2021)
- Curve Finance StableSwap Paper(2020)
- Balancer Whitepaper(2019)
二級來源(學術研究和技術分析):
- Angeris, G., Chitra, T., & Evans, A. (2021). "Constant Function Market Makers and Loss versus Rebalancing"
- Bigalauer, W. & Osband, I. (2019). "Liquidity Provider Returns in Geometric Mean Markets"
- 各大 DeFi 研究機構的技術分析報告
三級來源(實務應用):
- Dune Analytics 各 AMM 協議數據面板
- DeFi Llama TVL 追蹤
- 各協議 Discord 和治理論壇的討論
相關文章
- DeFi 進階合約模式完整指南:從設計模式到 production-ready 程式碼實踐 — 本文深入探討以太坊 DeFi 協議開發中的進階合約模式,這些模式是構建生產級去中心化金融應用的核心技術基礎。相較於基礎的代幣轉帳和簡單借貸,進階 DeFi 協議需要處理複雜的定價邏輯、流動性管理、風險控制和多層次的激勵機制。本文從資深工程師視角出發,提供可直接應用於生產環境的程式碼範例,涵蓋 AMM 深度實現、質押衍生品、借貸協議進階風控、協議治理等關鍵領域。
- DeFi 攻擊事件漏洞程式碼重現技術深度指南:2024-2026 年完整實作教學 — 本文收錄 2024 年至 2026 年第一季度以太坊生態系統中最具代表性的 DeFi 攻擊事件,提供完整的漏洞程式碼重現、數學推導與量化損失分析。本文的獨特價值在於:透過可運行的 Solidity 程式碼重現漏洞機制,並提供詳盡的數學推導來解釋攻擊成功的原理。涵蓋重入攻擊、Curve Vyper JIT Bug、閃電貸操縱、跨鏈橋漏洞等主流攻擊類型。
- 新興DeFi協議安全評估框架:從基礎審查到進階量化分析 — 系統性構建DeFi協議安全評估框架,涵蓋智能合約審計、經濟模型、治理機制、流動性風險等維度。提供可直接使用的Python風險評估代碼、借貸與DEX協議的專門評估方法、以及2024-2025年安全事件數據分析。
- Uniswap V4 Hook 合約代碼深度註解:從機制設計到實際部署 — 本文深入解讀 Uniswap V4 Hook 機制的合約原始碼,涵蓋單例合約架構、閃電結算系統、八個鉤子觸發點的完整執行順序、以及 IHook 接口的逐函數分析。提供 TWAMM、限價單、動態費用等經典 Hook 應用的完整 Solidity 程式碼註解。同時討論重入風險、Gas 優化、許可清單設計等安全考量,以及部署和測試的最佳實踐。
- DeFi 協議代碼深度分析:MakerDAO、Uniswap、Aave 核心機制實作解析 — 本文從工程師視角深度分析 MakerDAO、Uniswap、Aave 三大 DeFi 協議的智能合約原始碼。涵蓋 MakerDAO 的 CDP 系統與清算拍賣機制、Uniswap V2 的 AMM 公式推導與 Router 合約實作、Aave V3 的健康因子計算與利率模型。提供完整的 Solidity 程式碼解讀、交易流程圖、以及各協議的 Gas 消耗對比分析。
延伸閱讀與來源
- Aave V3 文檔 頭部借貸協議技術規格
- Uniswap V4 文檔 DEX 協議規格與鉤子機制
- DeFi Llama DeFi TVL 聚合數據
- Dune Analytics DeFi 協議數據分析儀表板
這篇文章對您有幫助嗎?
請告訴我們如何改進:
評論
發表評論
注意:由於這是靜態網站,您的評論將儲存在本地瀏覽器中,不會公開顯示。
目前尚無評論,成為第一個發表評論的人吧!