4、AMM核心数学公式:恒定乘积公式x*y=k、价格计算、滑点推导、流动性提供者收益模型

自动化做市商(AMM)的核心是一组数学公式,它们决定了资产定价、交易执行、滑点大小以及流动性提供者(LP)的收益分配。理解这些公式不仅是编写智能合约的前提,更是设计安全、高效DEX(去中心化交易所)的基础。本章将深入拆解恒定乘积公式的数学本质,推导其价格与滑点关系,并建立LP收益的量化分析模型。

AMM核心数学关系图 x * y = k 恒定乘积公式 价格计算 P = y / x(边际价格) 交易后价格 P' = (y - Δy) / (x + Δx) P' = P * (1 - Δy/y) / (1 + Δx/x) 滑点推导 滑点 = (P' - P) / P 滑点公式 滑点 = (Δy/y + Δx/x) / (1 + Δx/x) ≈ Δy/y + Δx/x(小交易量近似) 求导 二阶导 LP收益模型 收益 = 交易手续费 + 无常损失 + 价格波动收益 手续费收入 γ * Δx * P 无常损失 2√r/(1+r) - 1 净收益 手续费 - 无常损失

上图展示了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 判断方法与操作流程

在实际合约实现中,判断交易是否可行需要遵循以下流程:

  1. 输入校验:检查Δx > 0且Δy > 0,防止零值交易。
  2. 储备量读取:从合约存储中读取当前x和y的实时值。
  3. 乘积计算:计算k = x * y,注意使用高精度整数运算(如Solidity的uint256)避免溢出。
  4. 输出计算:根据公式计算Δy,并扣除0.3%的手续费(实际到账为Δy * 0.997)。
  5. 状态更新:更新x' = x + Δx,y' = y - Δy,并写入存储。
合约实现要点:Solidity中应使用乘除顺序优化,先乘后除以减少精度损失。例如计算Δ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 常见误区与总结

常见误区:部分开发者误以为k值在交易后保持不变,但实际上k值会因手续费而缓慢增长。手续费收入被重新注入池中,导致k值随时间单调递增,这是LP收益的来源之一。

恒定乘积公式虽然简单,但其数学性质决定了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 常见误区与总结

经验提醒:AMM价格本身不直接作为预言机使用,因为其易受闪贷攻击和短期波动影响。实践中通常采用时间加权平均价格(TWAP),通过记录多个时间点的边际价格并取平均值来增强抗操纵性。

价格计算的本质是求解恒定乘积方程,但合约实现时需注意:使用定点数而非浮点数;在极端情况下(如池中某资产趋近于零)要防止除零错误;以及考虑手续费对实际成交价格的影响。

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. 用户设定最大滑点容忍度:例如1%,即S_max = 0.01。
  2. 合约计算实际滑点:根据交易参数计算S = Δx/(x+Δx)。
  3. 比较判断:若|S| > S_max,则回滚交易。
  4. 替代方案:更常见的做法是用户设定“最小输出量”(minOut),合约确保实际输出Δy ≥ minOut,否则回滚。
工程实践:Uniswap V2的 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 常见误区与总结

风险提示:滑点保护不能防止三明治攻击。攻击者通过监控mempool,在用户交易前后插入自己的交易,推高价格后让用户以更差价格成交,再反向平仓获利。应对措施包括:使用私有交易通道、设置更严格的滑点容忍度、或采用批量拍卖机制。

滑点推导揭示了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收益是否值得参与,需要遵循以下分析流程:

  1. 估算手续费收入:根据池子的日均交易量V_daily和LP份额s,计算年化手续费收入。
  2. 估算无常损失:预测资产价格波动范围,计算对应的IL。
  3. 比较净收益:若手续费收入 > 无常损失,则LP净收益为正,值得参与。
  4. 考虑其他激励:许多协议额外发放治理代币奖励,需将其纳入收益计算。
价格变化r无常损失IL备注
1.00%价格不变,无损失
1.250.6%上涨25%
1.52.0%上涨50%
2.05.7%上涨100%
0.55.7%下跌50%
0.2520.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收益模型的核心是“用无常损失换取手续费收入”。在波动率高的市场中,无常损失可能超过手续费收入,导致LP净亏损。专业LP通常会选择波动率较低的资产对(如稳定币对),或使用无常损失对冲策略(如期权、永续合约)。

理解LP收益模型对于合约开发者至关重要,因为它决定了池子的吸引力和可持续性。设计AMM合约时,应考虑动态手续费率、流动性激励和风险对冲机制,以平衡各方利益。

本章从恒定乘积公式出发,系统推导了价格计算、滑点公式和LP收益模型。这些数学工具不仅是合约实现的基础,更是理解AMM生态运行规律的关键。在实际开发中,应始终将数学推导与代码实现紧密结合,通过单元测试和模拟交易验证公式的正确性,确保合约在极端市场条件下依然安全可靠。