教程区块链区块链技术ch099.2 自动做市商(AMM)数学模型

本页目录

在传统金融中,做市商(Market Maker)是指持续为特定资产对提供双向报价的专业机构。在 DeFi 中,自动做市商(AMM)用确定性算法替代了人工报价,用流动性池替代了订单簿。理解 AMM 的数学本质,是理解 DeFi 价格发现机制的前提。


9.2.1 恒定乘积公式:xy=kx \cdot y = k

Uniswap V2 的核心是一条极简的数学公式:

xy=kx \cdot y = k

其中 xx 是池中 Token A 的数量,yy 是 Token B 的数量,kk 是常数(每次交易前后 kk 保持不变,手续费除外)。

交易推导

Alice 用 Δx\Delta x 的 Token A 换取 Token B。新池状态为:

(x+Δx)(yΔy)=k=xy(x + \Delta x) \cdot (y - \Delta y) = k = x \cdot y

求解 Δy\Delta y

Δy=ykx+Δx=yxyx+Δx=y(1xx+Δx)=yΔxx+Δx\Delta y = y - \frac{k}{x + \Delta x} = y - \frac{x \cdot y}{x + \Delta x} = y \left(1 - \frac{x}{x + \Delta x}\right) = \frac{y \cdot \Delta x}{x + \Delta x}

含手续费情况(Uniswap V2 收取 0.3%):

Δy=yΔx(1f)x+Δx(1f),f=0.003\Delta y = \frac{y \cdot \Delta x \cdot (1 - f)}{x + \Delta x \cdot (1 - f)}, \quad f = 0.003

9.2.2 价格与滑点

瞬时价格:当前 Token A 对 Token B 的交换比率为:

PA/B=yxP_{A/B} = \frac{y}{x}

执行价格(考虑滑点):

Pexec=ΔyΔx=yx+ΔxP_{exec} = \frac{\Delta y}{\Delta x} = \frac{y}{x + \Delta x}

Δxx\Delta x \ll x 时,PexecPA/BP_{exec} \approx P_{A/B};当 Δx\Delta x 较大时,滑点显著。

滑点=PA/BPexecPA/B=1xx+Δx=Δxx+Δx\text{滑点} = \frac{P_{A/B} - P_{exec}}{P_{A/B}} = 1 - \frac{x}{x + \Delta x} = \frac{\Delta x}{x + \Delta x}

9.2.3 恒定和与恒定乘积混合:Curve 的稳定币 AMM

对于价格锚定资产(如 USDC/USDT/DAI),恒定乘积曲线会产生巨大滑点(因为 xyx \approx y 时池子位于曲线"平坦区"的远端)。Curve 引入混合曲线:

Annxi+D=AD+Dn+1nnxiA \cdot n^n \cdot \sum x_i + D = A \cdot D + \frac{D^{n+1}}{n^n \cdot \prod x_i}

简化为双资产情况:

A(x+y)+xy=AD+D24A(x + y) + xy = A \cdot D + \frac{D^2}{4}

AA 很大时,曲线近似为恒定和 x+y=Dx + y = D(零滑点);当池子失衡时,曲线近似为恒定乘积(防止枯竭)。

graph TD
    A[x+y=const 直线] --- B[混合曲线<br>低滑点+防枯竭]
    B --- C[x*y=const 双曲线]
    style B fill:#ccffcc

9.2.4 无常损失(Impermanent Loss)

流动性提供者(LP)面临的核心风险:外部价格变化导致 LP 资产价值低于单纯持有的价值

设初始投入时价格为 P0=y0/x0P_0 = y_0/x_0,之后外部价格变为 P1=y1market/x1marketP_1 = y_1^{market}/x_1^{market}

LP 提供的流动性强制池子维持 xy=kx \cdot y = k,因此份额价值为:

VLP=x1P1+y1=2kP1V_{LP} = x_1 \cdot P_1 + y_1 = 2\sqrt{k \cdot P_1}

单纯持有价值为:

Vhold=x0P1+y0V_{hold} = x_0 \cdot P_1 + y_0

无常损失比例:

IL=VholdVLPVhold=2r1+r1,r=P1P0IL = \frac{V_{hold} - V_{LP}}{V_{hold}} = \frac{2\sqrt{r}}{1 + r} - 1, \quad r = \frac{P_1}{P_0}

r=1r = 1(价格不变),IL=0IL = 0;当 r=4r = 4(价格涨 4 倍),IL20%IL \approx -20\%

ts
// amm-constant-product.ts
// 纯内置:模拟恒定乘积 AMM 的交易、滑点和无常损失

class ConstantProductAMM {
  x: number; // Token A reserve
  y: number; // Token B reserve
  k: number;
  fee = 0.003;

  constructor(x: number, y: number) { this.x = x; this.y = y; this.k = x * y; }

  swapAforB(deltaX: number): { deltaY: number; priceBefore: number; priceAfter: number; slippage: number } {
    const effectiveX = deltaX * (1 - this.fee);
    const newX = this.x + effectiveX;
    const newY = this.k / newX;
    const deltaY = this.y - newY;
    const priceBefore = this.y / this.x;
    const priceAfter = newY / newX;
    const slippage = (priceBefore - deltaY / deltaX) / priceBefore;
    this.x = newX; this.y = newY; this.k = newX * newY;
    return { deltaY, priceBefore, priceAfter, slippage };
  }

  addLiquidity(xAdd: number, yAdd: number): number {
    // 按当前比例添加
    const ratio = xAdd / this.x;
    this.x += xAdd; this.y += yAdd; this.k = this.x * this.y;
    return ratio; // LP token 比例
  }

  impermanentLoss(priceRatio: number): number {
    const r = priceRatio;
    return (2 * Math.sqrt(r) / (1 + r)) - 1; // 负值表示损失
  }
}

const amm = new ConstantProductAMM(1000, 3000); // 1 WETH = 3 USDC
console.log(`初始价格: ${amm.y / amm.x} USDC/WETH`);

const swap = amm.swapAforB(10);
console.log(`换出 swap.deltaY.toFixed(2)USDC,滑点:{swap.deltaY.toFixed(2)} USDC, 滑点:{(swap.slippage * 100).toFixed(2)}%`);

// 价格翻倍后的无常损失
console.log(`价格翻倍无常损失: ${(amm.impermanentLoss(2) * 100).toFixed(2)}%`);
console.log(`价格 4 倍无常损失: ${(amm.impermanentLoss(4) * 100).toFixed(2)}%`);
// 输出: 价格涨 4 倍时,LP 相对持有损失约 20%

9.2.5 集中流动性:Uniswap V3 的 =xP\ell = x \cdot \sqrt{P}

Uniswap V3 的核心改进:允许 LP 将流动性集中在特定价格区间,而非全价格域。这意味着同样的资本可以产生更高的费用收入,但也带来了:

  • 价格区间外无流动性:当价格超出选定区间,LP 全部变为单一资产,不再赚取费用;
  • NFT 化 LP 头寸:每个价格区间的流动性头寸是独一无二的,ERC-721 代币化;
  • 刻度系统(Tick):价格空间按 P\sqrt{P} 的 0.01% 间隔离散化,每个刻度可独立提供流动性。

关键认知二:AMM 不是"自动化做市商"的简单翻译,而是用确定性算法替代主观报价的数学承诺。恒定乘积 xy=kx \cdot y = k 的美妙之处在于:它无需预言机输入、无需订单簿撮合、无需信任任何报价者,但也因此引入了滑点和无常损失——这是为"无需许可+去中心化"付出的代价。


← 9.1 DeFi 可组合性 | 前往 → 9.3 稳定币机制

评论

0

评论加载中…

发表评论

0/2000