4、AMM核心数学公式:恒定乘积公式x*y=k、价格计算、滑点推导、流动性提供者收益模型
自动化做市商(AMM)的核心是一组数学公式,它们决定了资产定价、交易执行、滑点大小以及流动性提供者(LP)的收益分配。理解这些公式不仅是编写智能合约的前提,更是设计安全、高效DEX(去中心化交易所)的基础。本章将深入拆解恒定乘积公式的数学本质,推导其价格与滑点关系,并建立LP收益的量化分析模型。
上图展示了AMM核心数学模块之间的逻辑关系:恒定乘积公式是基础,通过求导得到边际价格,通过二阶导分析滑点,最终综合手续费与无常损失构成LP收益模型。下面我们逐一展开推导与实现细节。
4.1 恒定乘积公式:x*y=k的数学本质
4.1.1 核心原理
恒定乘积公式由Uniswap V2率先大规模应用,其核心约束是:交易前后两个资产池的储备量乘积保持不变。设交易前资产X的储备量为x,资产Y的储备量为y,则恒定乘积k满足:
x * y = k
当用户向池中注入Δx数量的X资产以换取Δy数量的Y资产时,交易后的储备量变为(x+Δx)和(y-Δy),必须满足:
(x + Δx) * (y - Δy) = k
由此可解出用户获得的Y资产数量:
Δy = y - k / (x + Δx) = y - (x*y) / (x + Δx) = y * Δx / (x + Δx)
这个公式的直观含义是:交易者向池中注入的流动性越多,单位资产能换回的另一种资产就越少,体现了“深度越大,价格冲击越小”的做市原理。
4.1.2 判断方法与操作流程
在实际合约实现中,判断交易是否可行需要遵循以下流程:
- 输入校验:检查Δx > 0且Δy > 0,防止零值交易。
- 储备量读取:从合约存储中读取当前x和y的实时值。
- 乘积计算:计算k = x * y,注意使用高精度整数运算(如Solidity的uint256)避免溢出。
- 输出计算:根据公式计算Δy,并扣除0.3%的手续费(实际到账为Δy * 0.997)。
- 状态更新:更新x' = x + Δx,y' = y - Δy,并写入存储。
Δy = (y * Δx) / (x + Δx),而非 Δy = y - (x*y)/(x+Δx),后者会引入额外的取整误差。
4.1.3 案例拆解:单边流动性池
假设一个ETH/USDT池,初始储备为x=100 ETH,y=200,000 USDT,则k=20,000,000。某交易者希望用10 ETH兑换USDT:
- 交易后x' = 110 ETH,则y' = k / x' = 20,000,000 / 110 ≈ 181,818.18 USDT
- 理论获得Δy = 200,000 - 181,818.18 = 18,181.82 USDT
- 扣除0.3%手续费后实际到账:18,181.82 * 0.997 ≈ 18,127.28 USDT
- 实际成交均价 = 18,127.28 / 10 = 1,812.73 USDT/ETH,而交易前边际价格为2,000 USDT/ETH
这个案例清晰展示了即使只有10 ETH的交易量,也会造成约9.4%的价格滑点,说明池深度对交易体验的决定性影响。
4.1.4 常见误区与总结
恒定乘积公式虽然简单,但其数学性质决定了AMM的诸多行为特征:价格永远在(0, +∞)区间内连续变化,不会出现流动性枯竭;但深度有限,大额交易必然产生显著滑点。理解这一点是后续学习价格计算和滑点控制的前提。
4.2 价格计算:边际价格与交易价格
4.2.1 核心原理
AMM的“价格”有两种含义:边际价格(Marginal Price)和交易价格(Execution Price)。边际价格定义为池中两种资产储备量的比值:
P = y / x
它表示在当前储备状态下,再交易无限小单位的X资产所能获得的Y资产数量。而交易价格是实际执行一笔交易时的平均价格,等于Δy/Δx。由于恒定乘积函数的凸性,交易价格总是劣于边际价格,两者之差即为滑点。
4.2.2 判断方法与操作流程
在合约中计算交易价格时,需要区分“输入固定”和“输出固定”两种场景:
| 场景 | 已知条件 | 计算公式 | 合约函数 |
|---|---|---|---|
| 输入固定 | Δx已知 | Δy = y*Δx/(x+Δx) | getAmountOut |
| 输出固定 | Δy已知 | Δx = x*Δy/(y-Δy) | getAmountIn |
合约实现时,应优先使用“输入固定”模式,因为它更符合用户直觉,且计算路径更短、gas消耗更低。
4.2.3 案例拆解:价格计算与预言机
继续使用上述ETH/USDT池,假设当前x=100 ETH,y=200,000 USDT,边际价格P=2,000。若用户想购买5 ETH(即输出固定Δy=5 ETH),则需要计算需要支付多少USDT:
Δx = x * Δy / (y - Δy) = 100 * 5 / (200,000 - 5) ≈ 0.0025 USDT
这个结果显然不合理,因为用户想买5 ETH却只需支付0.0025 USDT,说明我们搞反了方向。正确的理解是:用户想用USDT购买ETH,即输入Δx USDT,输出Δy ETH。若用户想购买5 ETH,则Δy=5,需要计算Δx:
Δx = x * Δy / (y - Δy) = 100 * 5 / (200,000 - 5) ≈ 0.0025 ETH
这里Δx是以ETH计价的输入,但用户实际支付的是USDT,因此需要将Δx乘以边际价格P=2,000,得到实际支付约5,000 USDT。这个案例提醒我们,在合约中必须明确资产计价单位,避免方向性错误。
4.2.4 常见误区与总结
价格计算的本质是求解恒定乘积方程,但合约实现时需注意:使用定点数而非浮点数;在极端情况下(如池中某资产趋近于零)要防止除零错误;以及考虑手续费对实际成交价格的影响。
4.3 滑点推导:从公式到风险控制
4.3.1 核心原理
滑点(Slippage)定义为交易执行价格与预期价格之间的偏差率。在AMM中,滑点来源于恒定乘积函数的非线性。设交易前边际价格为P=y/x,交易后边际价格为P'=(y-Δy)/(x+Δx),则滑点S为:
S = (P' - P) / P = [(y-Δy)/(x+Δx) - y/x] / (y/x)
= [x(y-Δy) - y(x+Δx)] / [y(x+Δx)]
= -(x*Δy + y*Δx) / [y(x+Δx)]
将Δy = y*Δx/(x+Δx)代入,化简得:
S = -Δx / (x + Δx)
这个简洁的结果表明:滑点仅取决于交易量Δx与池中该资产储备量x的比值,与另一种资产的储备量无关。当Δx远小于x时,滑点近似为-Δx/x,即交易量占池深的比例。
4.3.2 判断方法与操作流程
在合约中实现滑点保护,通常遵循以下流程:
- 用户设定最大滑点容忍度:例如1%,即S_max = 0.01。
- 合约计算实际滑点:根据交易参数计算S = Δx/(x+Δx)。
- 比较判断:若|S| > S_max,则回滚交易。
- 替代方案:更常见的做法是用户设定“最小输出量”(minOut),合约确保实际输出Δy ≥ minOut,否则回滚。
swap 函数要求调用者传入 amountOutMin 参数,合约内部计算实际输出后与之比较。这种设计比直接计算滑点更简单、更安全,因为避免了浮点运算和额外的gas消耗。
4.3.3 案例拆解:大额交易的滑点控制
假设一个深度较浅的池子,x=10 ETH,y=20,000 USDT,边际价格P=2,000。某大户想用5 ETH兑换USDT:
- 理论输出:Δy = 20,000 * 5 / (10+5) = 6,666.67 USDT
- 实际滑点:S = 5 / (10+5) = 33.3%
- 交易后边际价格变为:P' = (20,000-6,666.67)/(10+5) = 888.89 USDT/ETH
- 若用户设置minOut=6,500 USDT,则交易可以执行;若设置minOut=6,600 USDT,则交易被回滚
这个案例说明,在流动性不足的池中,即使设置了滑点保护,用户仍可能以远低于市场价的价格成交。因此,专业交易者通常会先查看池深度,再决定交易规模。
4.3.4 常见误区与总结
滑点推导揭示了AMM的固有特性:流动性越深,滑点越小;交易量越大,滑点越大。合约开发者应在交易函数中强制滑点保护参数,并教育用户合理设置容忍度。
4.4 流动性提供者收益模型
4.4.1 核心原理
LP的收益由三部分组成:交易手续费收入、无常损失(Impermanent Loss)和价格波动收益。其中手续费是主要收入来源,无常损失是主要风险成本。
假设LP向池中注入等价值的x和y资产,其份额占比为s。当池中发生累计交易量V(以X资产计)时,LP获得的手续费收入为:
Fee_income = s * γ * V
其中γ为手续费率(Uniswap V2为0.3%)。而无常损失是指LP将资产存入池中与持有资产相比的价值差异。若X资产价格从P0变为P1,则无常损失率为:
IL = 2√r / (1+r) - 1
其中r = P1/P0。当r=1时IL=0;当r偏离1越远,IL越大,且无论价格上涨还是下跌,LP都会遭受损失。
4.4.2 判断方法与操作流程
评估LP收益是否值得参与,需要遵循以下分析流程:
- 估算手续费收入:根据池子的日均交易量V_daily和LP份额s,计算年化手续费收入。
- 估算无常损失:预测资产价格波动范围,计算对应的IL。
- 比较净收益:若手续费收入 > 无常损失,则LP净收益为正,值得参与。
- 考虑其他激励:许多协议额外发放治理代币奖励,需将其纳入收益计算。
| 价格变化r | 无常损失IL | 备注 |
|---|---|---|
| 1.0 | 0% | 价格不变,无损失 |
| 1.25 | 0.6% | 上涨25% |
| 1.5 | 2.0% | 上涨50% |
| 2.0 | 5.7% | 上涨100% |
| 0.5 | 5.7% | 下跌50% |
| 0.25 | 20.0% | 下跌75% |
4.4.3 案例拆解:LP收益的完整评估
假设某LP向ETH/USDT池注入流动性,池子总流动性为100 ETH + 200,000 USDT,LP份额s=10%。该池日均交易量为50 ETH,手续费率0.3%。
- 年化手续费收入:50 * 365 * 0.003 * 10% = 5.475 ETH
- LP初始投入:10 ETH + 20,000 USDT ≈ 30,000 USDT(按P=2,000计算)
- 年化手续费收益率:5.475 * 2,000 / 30,000 ≈ 36.5%
- 假设ETH价格一年内上涨50%:r=1.5,IL=2.0%,即损失600 USDT
- 净收益:10,950 - 600 = 10,350 USDT,净收益率约34.5%
这个案例表明,在高交易量池中,手续费收入可以覆盖无常损失,LP仍然有利可图。但如果交易量较低或价格波动剧烈,LP可能亏损。
4.4.4 常见误区与总结
理解LP收益模型对于合约开发者至关重要,因为它决定了池子的吸引力和可持续性。设计AMM合约时,应考虑动态手续费率、流动性激励和风险对冲机制,以平衡各方利益。
本章从恒定乘积公式出发,系统推导了价格计算、滑点公式和LP收益模型。这些数学工具不仅是合约实现的基础,更是理解AMM生态运行规律的关键。在实际开发中,应始终将数学推导与代码实现紧密结合,通过单元测试和模拟交易验证公式的正确性,确保合约在极端市场条件下依然安全可靠。