恒定乘积自动做市商 (CPAMM) 学习笔记
目录
恒定乘积自动做市商 (CPAMM) 学习笔记
核心摘要 (Key Takeaways)
- CPAMM 核心公式: 是恒定乘积自动做市商(Constant Product Automated Market Maker, CPAMM)的核心,它定义了去中心化交易所(DEX)中流动性池中两种资产数量的关系。
- DEFI 基石:该公式是 2020-2021 年 DEFI 浪潮的起点,支撑了数百亿美元的 DEFI 市值发展,实现了无需中心化对手方的代币交换。
- 交换中的 K 值恒定:在用户进行代币买卖(Swap)时,池子的总流动性 保持不变,但池中两种代币的比例会根据交易量动态调整。
- 滑点 (Slippage):交易量相对于池子总流动性的比例越大,交易产生的滑点就越大,导致实际成交价格偏离预期市场价格。用户在交易时可设置滑点容忍度。
- 流动性提供者 (LP):用户可以通过向池子提供两种代币,成为流动性提供者,获得 LP 凭证 (LPT) 并赚取交易手续费;添加和移除流动性会改变 值。
1. 恒定乘积自动做市商 (CPAMM) 核心原理
1.1 定义与核心公式
- 名称:恒定乘积自动做市商 (Constant Product Automated Market Maker, CPAMM),简称 AMM 或 CPMM。
- 核心公式:
- X:池中 token0 的数量。
- Y:池中 token1 的数量。
- K:池子的总流动性 (Liquidity)。在用户进行代币交换(Swap)时,K 值保持恒定。
- 数学图像:如果将公式表示为 ,其在坐标系中呈现为一条双曲线。在这条曲线上的任何点,X 和 Y 的乘积都等于 K。
- 对比:与恒定乘积 AMM 相对,还有理论上的恒定和自动做市商 (Constant Sum AMM),其公式为 。但这种模型在实际中几乎不被使用,因为它无法在不耗尽其中一种资产的情况下支持无限交易。
1.2 DEFI 中的重要性
- CPAMM 公式是 Uniswap 等去中心化交易所(DEX)的核心机制,直接推动了 DEFI 市场的爆发式增长,实现了无需传统订单簿的自动化做市。
1.3 交易机制
CPAMM 允许用户在没有中心化对手方的情况下进行代币交换。其基本逻辑是:当一种代币进入池子,另一种代币就会流出池子,以维持 的恒定乘积。
- 用户卖出 token0 (买入 token1):
- 用户将 数量的 token0 卖给池子。
- 池中 token0 数量增加:。
- 为了保持 值不变,池中 token1 数量必须减少:。
- 公式变为:
- 用户买入 token0 (卖出 token1):
- 用户从池子中买入 数量的 token0。
- 池中 token0 数量减少:。
- 为了保持 值不变,池中 token1 数量必须增加:。
- 公式变为:
2. 案例展示与计算
以下案例均基于一个初始的 ETH/USDT 交易对池:
- ETH (X) = 10 个
- USDT (Y) = 20,000 个
- 初始流动性 (K) =
2.1 场景一:用户卖出 5 ETH (买入 USDT)
- 操作:用户向池子卖出 5 ETH。
- 池子变化:
- ETH 数量变为:
- USDT 数量变为:
- 计算 :
- 结果:用户卖出 5 ETH,可以获得 6666.67 USDT。
2.2 场景二:用户持有 10,000 USDT 买入 ETH
- 操作:用户向池子卖出 10,000 USDT,买入 ETH。
- 池子变化:
- USDT 数量变为:
- ETH 数量变为:
- 计算 :
- 结果:用户用 10,000 USDT,可以买入 3.33 ETH。
2.3 场景三:极端情况 - 用户卖出 100,000 ETH
- 操作:用户向池子卖出 100,000 ETH (远超池中 ETH 数量)。
- 池子变化:
- ETH 数量变为:
- USDT 数量变为:
- 计算 :
- 结果:用户卖出 100,000 ETH,可以获得约 19998 USDT。
- 分析:即使交易量远超池中现有资产,CPAMM 理论上也能完成交易。池子中的 USDT 会被几乎掏空,但永远不会完全为零,会无限接近于零。这表明 CPAMM 曲线可以支撑代币在任何价格上的买卖。
2.4 场景四:小额交易 - 用户卖出 0.01 ETH
- 操作:用户向池子卖出 0.01 ETH。
- 池子变化:
- ETH 数量变为:
- USDT 数量变为:
- 计算 :
- 结果:用户卖出 0.01 ETH,可以获得约 19.98 USDT。
- 分析:小额交易对池子影响小,执行价格会非常接近市场价。
3. 价格与滑点 (Slippage)
3.1 价格决定机制
- 市场供需:CPAMM 池中代币的价格由市场供需关系自动决定。
- 套利机器人:如果池内价格与外部市场价格出现差异,套利机器人会迅速介入,通过在价格较低的池子买入并在价格较高的市场卖出,从而将池内价格“搬平”,使其与市场价保持一致。
3.2 即时价格 (Spot Price)
- 定义:池中两种 token 数量的比值,代表当前池子的理论价格。
- 公式:
- 初始价格计算 (基于初始池子):
3.3 滑点 (Slippage)
- 定义:衡量实际成交价格与预期市场价格之间的差异。在 DEX 中,由于交易会改变池中代币的比例,大额交易会导致价格显著偏离即时价格。
- 公式:
- Execution Price (执行价格):实际成交的单价。
- Expected Price (预期价格):交易发生前的即时价格 (Spot Price)。
- 滑点容忍度 (Slippage Tolerance):用户在进行交易时可以设置的最大可接受滑点百分比。如果实际滑点超过此容忍度,交易将失败。
- 案例滑点计算:
- 场景一 (卖出 5 ETH):
- 预期价格:2000 USDT/ETH
- 执行价格:
- 滑点: (用户实际卖出价格远低于预期)
- 场景二 (买入 3.33 ETH):
- 预期价格:2000 USDT/ETH
- 执行价格:
- 滑点: (用户实际买入价格远高于预期)
- 场景三 (卖出 100,000 ETH):
- 预期价格:2000 USDT/ETH
- 执行价格:
- 滑点: (极端亏损)
- 场景四 (卖出 0.01 ETH):
- 预期价格:2000 USDT/ETH
- 执行价格:
- 滑点: (滑点很小,接近市场价)
- 场景一 (卖出 5 ETH):
3.4 滑点影响因素与池子深度
- 交易量比例:交易量占池子总流动性的比例越大,产生的滑点越大。
- 池子深度 (Liquidity Depth):
- 定义:衡量池子中总流动性的大小。K 值(或 L 值)越大,池子越深。
- 影响:池子越深,对于相同交易量的冲击(Price Impact)越小,交易产生的滑点也越小。
- 大户交易:大额交易者需要寻找深度足够的流动性池,以确保交易以接近市场价的价格成交,减少磨损。
4. 流动性与提供者
4.1 流动性 (Liquidity)
- K 值:直接表示 的乘积,可以用来衡量流动性的大小。
- L 值:在实际应用中,为了保持量纲一致性(例如,如果 X 和 Y 都是 token 数量,K 的量纲是 token 数量的平方),通常使用 来表示流动性。L 值与 K 值同样可以衡量池子的深浅。
4.2 流动性提供者 (Liquidity Provider, LP)
- 定义:向交易池提供两种代币资产以增加流动性的用户。
- 动机:通过提供流动性,LP 可以赚取该池子中所有交易产生的手续费。
- 行业术语:
- “做 LP”:指提供流动性。
- “LP 赚了很多钱”:指通过提供流动性赚取了手续费。
4.3 LP 凭证 (Liquidity Provider Token, LPT)
- 定义:LP 提供流动性后,会收到一个代表其在池中份额的凭证代币。
- 作用:LPT 证明了 LP 对池子的所有权,可以用来赎回其提供的流动性及赚取的手续费。
- 协议标准:
- Uniswap V2:LPT 通常是 ERC-20 协议代币。
- Uniswap V3:LPT 是 ERC-721 协议的 NFT,因为 V3 引入了集中流动性,每个 LP 头寸都是独特的。
5. 添加与移除流动性
5.1 添加流动性 (Add Liquidity)
- 原则:LP 在添加流动性时,必须按照当前池中两种代币的市场价格比例(即 比例)进行添加。
- 公式:即
- 原因:如果 LP 不按比例添加,会直接改变池子的价格,并立即被套利机器人“搬平”,导致 LP 承担损失。
- 初始流动性:
- 对于一个新发行的代币,项目方首次在 DEX 上线并提供流动性时,这被称为添加初始流动性。
- 初始流动性决定了该代币的初始发行价格(或开盘价)。
- K 值变化:添加流动性时,池中的 和 都会增加,因此 K 值会增加 ()。
5.2 移除流动性 (Remove Liquidity)
- 原则:LP 在移除流动性时,也是按照移除时池子的当前比例进行移除。
- 公式:。
- 重要性:由于市场交易可能导致池中 的比例发生变化,LP 移除流动性时获得的两种代币数量,很可能与最初添加时的数量不一致。
- 例子:如果 LP 在 ETH 价格为 2000 USDT/ETH 时添加了 5 ETH 和 10,000 USDT,但之后 ETH 价格上涨,池中 ETH 变少,USDT 变多,LP 移除时可能会获得少于 5 ETH 但多于 10,000 USDT 的资产。
- 撤底池 (Rug Pull):
- 定义:项目方将所有初始提供的流动性全部移除。
- 含义:通常意味着项目方“跑路”,导致代币失去流动性,价格暴跌。
- K 值变化:移除流动性时,池中的 和 都会减少,因此 K 值会减少 ()。
6. AMM 交易流程 (Mermaid Diagram)
graph TD
A[用户发起交易请求] --> B{选择交易对和数量};
B --> C{计算预期价格和滑点};
C --> D{用户确认交易};
D -- (X * Y = K) --> E[更新池子中Token数量];
E --> F[计算实际成交价格];
F --> G{用户收到Token};
G --> H[套利机器人监测价格差异];
H -- (若存在套利机会) --> I[套利机器人执行交易];
I --> E;
graph TD
A[用户发起交易请求] --> B{选择交易对和数量};
B --> C{计算预期价格和滑点};
C --> D{用户确认交易};
D -- (X * Y = K) --> E[更新池子中Token数量];
E --> F[计算实际成交价格];
F --> G{用户收到Token};
G --> H[套利机器人监测价格差异];
H -- (若存在套利机会) --> I[套利机器人执行交易];
I --> E;
graph TD
A[用户发起交易请求] --> B{选择交易对和数量};
B --> C{计算预期价格和滑点};
C --> D{用户确认交易};
D -- (X * Y = K) --> E[更新池子中Token数量];
E --> F[计算实际成交价格];
F --> G{用户收到Token};
G --> H[套利机器人监测价格差异];
H -- (若存在套利机会) --> I[套利机器人执行交易];
I --> E;graph TD
A[用户发起交易请求] --> B{选择交易对和数量};
B --> C{计算预期价格和滑点};
C --> D{用户确认交易};
D -- (X * Y = K) --> E[更新池子中Token数量];
E --> F[计算实际成交价格];
F --> G{用户收到Token};
G --> H[套利机器人监测价格差异];
H -- (若存在套利机会) --> I[套利机器人执行交易];
I --> E;
流程解释:
- 用户发起交易请求:用户决定要交换的代币对(例如 ETH/USDT)和数量。
- 计算预期价格和滑点:AMM 根据当前池中代币的比例计算理论上的预期价格,并预估此次交易可能产生的滑点。用户在此阶段会看到预估的滑点,并可以设置滑点容忍度。
- 用户确认交易:用户审查预期价格和滑点后,决定是否执行交易。
- 更新池子中 Token 数量:一旦交易确认,AMM 会根据核心公式 来调整池中两种代币的数量。例如,用户卖出 ETH,池中 ETH 增加,USDT 减少。
- 计算实际成交价格:根据更新后的池子状态,确定最终的成交价格。
- 用户收到 Token:用户收到其购买的代币。
- 套利机器人监测价格差异:在整个过程中,套利机器人持续监控 AMM 池内的价格与外部市场价格。
- 套利机器人执行交易:如果 AMM 价格与外部市场价格存在差异,套利机器人会立即执行交易,在价格较低的地方买入,在价格较高的地方卖出,从而赚取利润。
- 更新池子中 Token 数量 (通过套利):套利交易也会导致池中代币数量更新,这有助于将 AMM 池的价格重新校准到与外部市场一致。
7. 总结
- CPAMM 核心: 是其基石,实现了去中心化环境下的自动化做市。
- K 值动态:
- 在代币交换 (Swap) 过程中,K 值保持恒定。
- 在添加流动性和移除流动性时,K 值会发生变化(增加或减少)。
- 滑点关键:交易量占池子总流动性的比例是影响滑点大小的关键因素。交易量越大,池子越浅,滑点越大。用户可以通过设置滑点容忍度来控制交易风险。
- 流动性提供者:LP 通过提供流动性来赚取手续费,但需注意无常损失和移除流动性时资产比例可能变化的问题。