AMM 池怎样提供报价?
用一次交换看懂储备如何移动、滑点从哪里来,以及 LP 为什么愿意提供流动性。
- 用储备和恒定乘积解释 AMM 的报价
- 观察交易规模、手续费与价格冲击如何互相影响
- 解释 LP 收取手续费却承担库存风险的原因
- 上一章课程开始
- 本章AMM 池怎样提供报价?
用一次交换看懂储备如何移动、滑点从哪里来,以及 LP 为什么愿意提供流动性。
- 下一章报价为什么会越换越差?
先想一想这几个问题
展开答案前,可以先在心里做个判断。与预期不同的内容可以加入复习列表。
Q01池子没有挂单人,为什么还能一直和我交易?+
LP 预先放入两种资产,曲线把库存变成连续报价。它不是无限流动性:你买得越多,池中目标资产越少,下一单位就越贵。
订单簿需要另一个人站在交易的另一边。AMM 把这个问题改写成:如果我们把两种资产放进一个公开资金池,能不能只靠储备比例给出下一笔报价?
先忘掉“找对手方”
在订单簿里,你提交 BUY YES,系统要等待某个卖单与它相遇。AMM 没有买一、卖一,也没有一个叫 Alice 的人必须在线。池子自己持有两种储备,任何人都可以按照同一条规则交换。
这里的两种资产叫 X 和 Y。实验室把它们显示成“积分 / TOKEN”:池子起初有 120,000 积分和 1,000 TOKEN,意味着现货价格约为 120 积分 / TOKEN。
Credits / TOKEN
池子不需要等待另一个人挂单,它用储备比例给出下一笔报价。
交换手续费会留在池子里,让 k 缓慢增长;存入或取出流动性也会改变储备规模。
先看池子的两种储备,再拖动交换数量。小额交易靠近现货价,大额交易会沿曲线越走越远。
- 01
资金池创建:120,000 积分 + 1,000 TOKEN,初始价格为 120 积分 / TOKEN。
拖动滑块可以回到此前的步骤。从那里继续操作时,后续记录会替换为新的操作序列。
x · y = k 不是价格公式,而是状态约束
恒定乘积池用两种储备的乘积描述当前状态:
x = 120,000 积分
y = 1,000 TOKEN
k = x · y = 120,000,000
当你用积分买 TOKEN,池子收到 X、送出 Y。为了让新的储备仍然满足约束,输出数量不能简单地按交易前的 120 兑换。你买得越多,池子里的 TOKEN 越稀缺,下一份 TOKEN 就越贵。
手续费为什么会让 k 变大
真实 AMM 通常不会把输入的全部数量用于计算输出。假设手续费是 0.30%,交易者输入 12,000 积分,其中 36 积分留在池子里,只有 11,964 积分参与曲线计算。
这带来两个结果:
- 交易者得到的 TOKEN 少于没有手续费时的报价;
- 手续费留在储备里,长期让
x · y缓慢增长,成为流动性提供者的收入来源。
手续费不是“凭空奖励”。它来自交易者愿意为即时成交支付的成本,最终改变了 LP 持有的两种资产数量。
LP 提供的不是一笔存款,而是一份库存风险
任何人都可以把两种资产按接近当前比例存入池子,获得 LP 份额。之后交易产生的手续费会留在池子里,LP 可以按份额取回更多资产。
但 LP 并没有锁定一个固定的资产比例。交易者持续买走 TOKEN 时,池子会留下更多积分、减少 TOKEN;如果外部市场价格已经变化,套利者会继续交易,直到池内价格接近外部价格。LP 最后取回的资产组合,可能和最初存入的不一样。
这就是为什么“赚手续费”和“承担无常损失”必须放在同一张账上观察。只看到 APY,而不看库存变化,会漏掉 AMM 最重要的风险。
展开:这一步如何实现
fee = amountIn × 30 / 10,000
amountAfterFee = amountIn - fee
amountOut = reserveOut × amountAfterFee
--------------------------
reserveIn + amountAfterFee
reserveIn += amountIn
reserveOut -= amountOut
实现中使用整数资产单位,并在每一步向下取整。生产合约还要处理舍入方向、极端储备、最小输出量和重入等安全问题。
为什么一笔大额交换通常会比现货价更差?
把一个 AMM 读成四个问题
走完实验后,你应该能分别回答:
- 池子里现在各有多少 X 和 Y?
- 当前现货价和这笔交易的平均执行价差多少?
- 手续费让谁获得了什么,
k为什么会增长? - 如果你是 LP,价格变化后取回的资产组合发生了什么?
这四个问题比背下 x·y=k 更重要。公式只是压缩规则,真正的机制藏在储备、交易者和 LP 之间的资产流动里。