AMM机制与滑点:恒定乘积公式、流动性池深度、滑点计算公式
聊到DEX的滑点,咱们得先搞清楚AMM是怎么定价的。说白了,AMM不像传统交易所那样有个订单簿,它靠的是一个数学公式来算价格。这个公式,就是大名鼎鼎的恒定乘积公式。
恒定乘积公式:AMM的定价基石
我记得刚接触Uniswap V2时,第一眼看到 x * y = k 这个公式,觉得也太简单了吧?但实际用起来,你会发现它非常巧妙。
公式里:
x是交易对中代币A的储备量y是代币B的储备量k是一个常数,代表流动性池的“深度”
交易的本质是什么?就是往池子里塞一种代币,同时取出另一种。但有个铁律:交易前后,x * y 的乘积必须保持不变(扣除手续费前)。
举个例子:假设一个ETH/USDC池,里面有10个ETH和20,000个USDC。那么 k = 10 * 20000 = 200,000。
你想用1个ETH换USDC。交易后,池子里ETH变成11个。为了保持乘积不变,USDC的数量必须变成 200,000 / 11 ≈ 18,181.82 个。
所以你能拿到的USDC是:20,000 - 18,181.82 = 1,818.18 个。
嗯,这里要注意:你实际拿到手的会比这个少一点,因为还要扣手续费。但定价逻辑就是这样。
流动性池深度:滑点的“缓冲垫”
池子深度,说白了就是池子里有多少钱。深度越深,你交易时对价格的影响就越小。
我个人习惯把流动性池想象成一个水池。你往里面扔一块石头(交易),水面会波动(价格变化)。水池越大,波动越小。水池越小,稍微扔块石头就水花四溅。
我在项目中遇到过好几次这样的情况:一个刚上线的土狗币,池子深度可能就几万美金。你买个几百美金,价格就往上窜了5%。这就是典型的“浅池子”问题。
深度通常用两个指标衡量:
- 总锁仓价值(TVL): 池子里所有代币的总价值。TVL越高,深度越好。
- 滑点容忍度: 在给定滑点范围内,你能交易的最大金额。
滑点计算公式:量化你的交易成本
滑点到底怎么算?其实公式不复杂。我们一步步来。
假设你想买入 Δx 个代币X(即你往池子里塞的代币)。池子当前有 x 个X和 y 个Y。
交易后,池子里X的数量变成 x + Δx。根据恒定乘积公式:
(x + Δx) * (y - Δy) = x * y
其中 Δy 是你得到的Y代币数量。解这个方程:
Δy = y - (x * y) / (x + Δx)
= y * [1 - x / (x + Δx)]
= y * [Δx / (x + Δx)]
这个 Δy 就是你实际得到的数量。但注意,这是理论值。实际交易中还要扣除手续费(比如Uniswap V2是0.3%)。
那滑点怎么算?滑点就是实际成交价格与当前市场价格之间的偏差百分比。
当前市场价格(即边际价格)是 P = y / x。你交易的实际平均价格是 P_actual = Δy / Δx。
滑点公式:
Slippage = |P_actual - P| / P * 100%
= |(Δy / Δx) - (y / x)| / (y / x) * 100%
把 Δy 的表达式代入,化简后得到:
Slippage = Δx / (x + Δx) * 100%
你看,滑点只跟两个因素有关:
- 你的交易量
Δx:交易量越大,滑点越高 - 池子深度
x:池子越深,滑点越低
知识体系结构图
下面这张图,帮你理清AMM、滑点和流动性池之间的关系:
实际交易中的滑点计算示例
咱们用个真实数据算一遍,你感受一下。
假设ETH/USDC池子:
- ETH储备:100个
- USDC储备:300,000个
- 当前ETH价格:3,000 USDC
你想买入10个ETH(即往池子里塞USDC,取出ETH)。
根据公式,你塞入的USDC数量 Δy 和取出的ETH数量 Δx 满足:
(100 - Δx) * (300,000 + Δy) = 100 * 300,000
解出 Δy:
Δy = (100 * 300,000) / (100 - 10) - 300,000
= 30,000,000 / 90 - 300,000
= 333,333.33 - 300,000
= 33,333.33 USDC
你的实际买入价格是 33,333.33 / 10 = 3,333.33 USDC/ETH。
滑点 = (3,333.33 - 3,000) / 3,000 * 100% ≈ 11.11%
你看,买10个ETH,滑点就超过11%了。这就是为什么大额交易一定要拆分,或者用聚合器。
Δx / (x + Δx) ≤ 0.01,解出 Δx ≤ x / 99。也就是说,你的交易量不要超过池子储备的1%。
好了,这一章的内容就这些。记住三个关键词:恒定乘积公式是定价基础,流动性池深度是滑点的缓冲垫,滑点计算公式帮你量化交易成本。下次交易前,先算算滑点,别让钱白白流失。