报价为什么会越换越差?
用不同规模的输入沿曲线走三次,区分现货价、执行均价、价格冲击和手续费。
- 区分交易前现货价和整笔交易的平均执行价
- 解释池子深度为什么决定大单的价格冲击
- 判断滑点保护应该约束哪个输出变量
- 上一章AMM 池怎样提供报价?
- 本章报价为什么会越换越差?
用不同规模的输入沿曲线走三次,区分现货价、执行均价、价格冲击和手续费。
- 下一章LP 赚到的手续费从哪里来?
先想一想这几个问题
展开答案前,可以先在心里做个判断。与预期不同的内容可以加入复习列表。
Q01如果手续费降到 0,大额交易就不会滑点了吗?+
仍然会。手续费是额外扣除,价格冲击来自你沿曲线改变了储备比例。只要池子深度有限,大单的平均执行价就会偏离交易前现货价。
一笔交易的“价格”不是屏幕上的一个数字。它可能指交易前的现货价、整笔成交的平均执行价,或者扣掉手续费后真正得到的数量。本章用三种规模的交换,把这几个数字拆开。
先做一个小实验:同一个池子,三种规模
把输入数量从小到大调节,先不要急着看公式。观察三个问题:预计得到的 TOKEN 是否按比例增长?价格冲击是否保持不变?手续费是不是也按相同比例增加?
Credits / TOKEN
池子不需要等待另一个人挂单,它用储备比例给出下一笔报价。
交换手续费会留在池子里,让 k 缓慢增长;存入或取出流动性也会改变储备规模。
同一条曲线,三种交易规模
先点一个预设,再执行交换;比较平均执行价和价格冲击如何一起变化。
先看池子的两种储备,再拖动交换数量。小额交易靠近现货价,大额交易会沿曲线越走越远。
- 01
资金池创建:120,000 积分 + 1,000 TOKEN,初始价格为 120 积分 / TOKEN。
拖动滑块可以回到此前的步骤。从那里继续操作时,后续记录会替换为新的操作序列。
如果池子起初有 120,000 积分和 1,000 TOKEN,交易前的现货价约为 120 积分 / TOKEN。它只描述曲线在当前点的切线,并不承诺你可以用这个价格买完任意数量。
深度决定了同一笔订单的冲击
恒定乘积公式要求新的储备仍然满足约束。用积分买 TOKEN 时,积分储备上升、TOKEN 储备下降;池子越小,同样数量占储备的比例越大,曲线就被推得越远。
这也是“流动性”比单纯的总锁仓量更有用的原因:你要问的是当前价格附近有多少资产可以承受交易,而不是池子里曾经放过多少钱。
手续费和价格冲击是两种不同的成本
手续费是协议预先扣下的一部分输入,通常按固定比例计算;价格冲击则来自沿曲线移动,取决于池子深度和交易规模。把手续费降到零并不会让大单变成现货价成交。
展开:这一步如何实现
fee = floor(amountIn × feeBps / 10,000)
usableIn = amountIn - fee
amountOut = reserveOut × usableIn / (reserveIn + usableIn)
executionPrice = amountIn / amountOut
priceImpact = executionPrice / spotPriceBefore - 1
生产协议还会要求调用者提供 amountOutMinimum 或允许的最大滑点。它保护的是“实际得到的输出”,不是保证池子的价格永远不动。
为什么把手续费设置为 0,也不能让一笔大单按交易前现货价成交?
把滑点保护读成一个安全边界
一个真实的交易调用通常不会只说“我要换 12,000 积分”。它还会说“至少要收到多少 TOKEN”。如果等待确认期间有人先交易,池子的报价可能已经变化;低于这个下限时,交易应该失败,而不是默默接受更差的结果。
滑点保护不是对未来价格的预测,而是用户对最坏成交结果的明确授权。它让一个模糊的“我想买”变成可验证的边界。