跳转到内容

AMM 原理

AMM 原理

本页内容正在整理中,欢迎贡献

概述

自动做市商(Automated Market Maker,AMM)是去中心化交易所(DEX)的核心机制,通过数学公式而非订单簿来确定资产价格。Uniswap 的 AMM 模型已成为 DeFi 的基础原语。

主要内容

恒定乘积公式(x × y = k)

Uniswap V2 使用最简单的 AMM 模型:

设流动性池中有两种资产 X 和 Y:
x = X 代币数量
y = Y 代币数量
k = 常数(流动性)
任意交易后,x × y = k 始终成立
买入 Δx 数量的 X 代币:
新的 y' = k / (x - Δx)
需要支付的 Y = y' - y = k/(x - Δx) - y
// Uniswap V2 核心交换公式(简化)
function getAmountOut(
uint amountIn,
uint reserveIn,
uint reserveOut
) public pure returns (uint amountOut) {
uint amountInWithFee = amountIn * 997; // 0.3% 手续费
uint numerator = amountInWithFee * reserveOut;
uint denominator = reserveIn * 1000 + amountInWithFee;
amountOut = numerator / denominator;
}

流动性提供

流动性提供者(LP)向池中注入两种资产,获得 LP Token 作为凭证:

添加流动性:
存入 1 ETH + 2000 USDC(当前价格 $2000/ETH)
获得 LP Token(代表池中份额)
手续费收益:
每笔交易收取 0.3% 手续费,分配给所有 LP
LP Token 可随时燃烧,赎回对应份额的资产 + 累积手续费

无常损失(Impermanent Loss)

LP 面临的主要风险:当池中资产相对价格变化时,LP 持有 LP Token 的价值低于单纯持有两种资产:

示例:
初始:存入 1 ETH($2000)+ 2000 USDC,总价值 $4000
ETH 价格翻倍至 $4000 后:
套利者会买入 ETH 直到池中价格恢复平衡
此时 LP 持有:0.707 ETH($2828)+ 2828 USDC = $5656
单纯持有:1 ETH($4000)+ 2000 USDC = $6000
无常损失 = ($6000 - $5656) / $6000 ≈ 5.7%

无常损失公式:

IL = 2 × √p / (1 + p) - 1
其中 p = 价格变化比率(新价格 / 初始价格)
p = 2(价格翻倍)→ IL ≈ -5.7%
p = 4(价格 4 倍)→ IL ≈ -20%
p = 0.5(价格减半)→ IL ≈ -5.7%

Uniswap V3:集中流动性

V3 允许 LP 将流动性集中在特定价格区间:

// Uniswap V3 添加流动性
INonfungiblePositionManager.MintParams memory params = INonfungiblePositionManager.MintParams({
token0: WETH,
token1: USDC,
fee: 3000, // 0.3%
tickLower: -887272, // 价格下限
tickUpper: 887272, // 价格上限
amount0Desired: 1 ether,
amount1Desired: 2000e6,
amount0Min: 0,
amount1Min: 0,
recipient: msg.sender,
deadline: block.timestamp + 15 minutes
});
(uint256 tokenId, , , ) = nonfungiblePositionManager.mint(params);

V3 vs V2 对比:

特性Uniswap V2Uniswap V3
流动性分布全价格区间均匀集中在指定区间
资本效率高(最高 4000x)
无常损失更高(区间外时更剧烈)
LP 管理复杂度

价格影响(Price Impact)与滑点

交易规模与价格影响:
大额交易 → 池中价格显著偏移 → 高价格影响
滑点保护:
设置最大可接受价格偏差,超过则 revert
function swap(
uint amountIn,
uint amountOutMin, // 最小接收量(滑点保护)
address[] calldata path,
address to,
uint deadline
) external returns (uint[] memory amounts)

深入阅读