恒定乘积公式:x*y=k的数学推导、交易对价格影响、滑点与深度、流动性池的构建逻辑
各位同学,今天我们来啃AMM最核心的一块骨头——恒定乘积公式。说实话,这个公式看起来就一行字:x*y=k,但背后藏着的门道,够我们聊一整节课。我在2020年刚接触Uniswap时,第一反应也是「就这?」,后来在实战中被狠狠教育了几次,才真正理解它的精妙之处。
一、公式的数学推导:从直觉到严谨
先问大家一个问题:为什么是x*y=k,而不是x+y=k,或者x²+y²=k?
嗯,这其实是个经济学问题。我们想要一个自动做市机制,让两种资产的价格能根据供需自动调整。假设池子里有x个TokenA和y个TokenB,总价值要保持某种「守恒」。
恒定乘积的核心思想很简单:无论你怎么交易,池子里两种资产数量的乘积保持不变。写成数学形式就是:
x * y = k
其中k是一个常数。当你用Δx个TokenA买入TokenB时,池子里的x会增加Δx,y会减少Δy。交易完成后,新的乘积必须等于原来的k:
(x + Δx) * (y - Δy) = k
展开一下:
xy - xΔy + yΔx - ΔxΔy = xy
→ yΔx - xΔy - ΔxΔy = 0
→ Δy = (y * Δx) / (x + Δx)
这个公式就是交易定价的基础。你投入Δx个TokenA,能得到的TokenB数量就是Δy。我在项目中遇到过不少新手直接拿这个公式去算,结果忽略了ΔxΔy这一项,导致滑点计算偏差很大。
核心要点:恒定乘积公式保证了交易前后池子总价值的「乘积守恒」,而不是「总和守恒」。这意味着价格会随着交易量非线性变化——这正是AMM自动定价的数学基础。
二、交易对价格影响:为什么大额交易会「砸盘」
有了上面的公式,我们来看看价格是怎么算的。池子里TokenA相对于TokenB的价格,其实就是两者的数量比:
P = y / x
为什么?因为如果你用1个TokenA去换,能换到y/x个TokenB。但注意,这只是「边际价格」——也就是交易量趋近于0时的价格。实际交易中,你投入的Δx越大,得到的平均价格就越差。
举个例子。假设池子里有100个ETH和200,000个USDC,那么ETH的价格就是2000 USDC。现在你想用10个ETH来换USDC:
Δy = (200,000 * 10) / (100 + 10) = 2,000,000 / 110 ≈ 18,181.82 USDC
平均价格是1,818 USDC/ETH,比原来的2000低了近10%。这就是滑点——交易量对价格的冲击。
| 交易量(ETH) | 获得USDC | 平均价格 | 滑点 |
|---|---|---|---|
| 1 | 1,980.20 | 1,980.20 | 0.99% |
| 10 | 18,181.82 | 1,818.18 | 9.09% |
| 50 | 66,666.67 | 1,333.33 | 33.33% |
| 100 | 100,000.00 | 1,000.00 | 50.00% |
看到没?交易量越大,滑点越夸张。我曾经在测试网上模拟过一笔占池子50%的交易,滑点直接飙到50%以上——这在实际主网中就是灾难,会被MEV机器人狠狠夹击。
避坑指南:我曾经因为没注意滑点保护,在Uniswap V2上做了一笔大额交易,结果实际到账比预期少了15%。后来我养成了习惯:任何交易前,先用公式估算滑点,再设置合理的滑点容忍度(一般不超过1-2%)。
三、滑点与深度:流动性池的「厚度」
滑点的大小,说白了取决于池子的深度。深度就是池子里总流动性的多少。池子越深,同样一笔交易对价格的冲击就越小。
怎么量化深度?我习惯用「1%深度」这个概念——也就是让价格变动1%所需要的交易量。从公式推导一下:
假设当前价格P = y/x,想让价格变成P' = 0.99P(下跌1%)
新的x' = x + Δx,y' = y - Δy
价格P' = y'/x' = 0.99 * y/x
代入恒定乘积:(x + Δx) * (y - Δy) = xy
解出来:Δx ≈ 0.0101x
也就是说,要让价格下跌1%,需要买入大约池子总量1%的TokenA。这个比例是恒定的——不管池子大小,1%深度总是对应约1%的池子总量。但池子总量越大,这个1%的绝对值就越大,深度就越「厚」。
个人经验:我在评估一个新项目时,会先看它的流动性池深度。如果某个池子的总流动性不到100万美元,我基本不会在里面做大额交易——滑点太吓人了。深度够的池子,比如Uniswap上的ETH/USDC主池,几十亿的流动性,几百万美元的交易滑点都不到0.1%。
这里有个重要的概念叫「无常损失」。当价格波动时,做市商(LP)的资产价值会发生变化。恒定乘积公式决定了:价格波动越大,无常损失越明显。我在后面的章节会专门讲这个,今天先记住一个结论——深度越深,无常损失越小。
四、流动性池的构建逻辑:从零到一
好了,理论讲完了,我们来看看实际怎么构建一个流动性池。假设我要创建一个ETH/USDC池:
- 选择初始价格:比如当前ETH市场价是2000 USDC,那么初始数量比应该是y/x = 2000。我选择存入100 ETH和200,000 USDC。
- 计算初始k值:k = 100 * 200,000 = 20,000,000。这个k值会一直保持不变,直到有人添加或移除流动性。
- 铸造LP代币:系统会根据你存入的资产比例,铸造相应的LP代币。初始LP代币总量通常是存入资产价值的几何平均数。
- 开启交易:一旦池子创建成功,任何人都可以按照x*y=k的规则进行交易。
这里有个关键点:添加流动性时必须按当前比例存入。如果你只存ETH不存USDC,池子的价格平衡就会被打破,你会被套利者瞬间搬平。我在项目中见过有人不小心只存了一种资产,结果几分钟内就被套利机器人薅走了大部分价值。
构建池子的核心原则:
- 初始价格由存入的两种资产数量比决定
- 添加流动性必须按当前池子比例存入
- 移除流动性时按比例取出两种资产
- k值只在添加/移除流动性时变化,交易过程中保持不变
最后,我用一张图来总结恒定乘积公式的核心逻辑:
嗯,这张图把今天讲的核心内容串起来了。从流动性池出发,经过恒定乘积公式的计算,输出交易结果,同时产生价格影响。底部的四个概念——流动性深度、滑点、无常损失、套利——它们之间是环环相扣的。
最后说一句,恒定乘积公式虽然简单,但它是整个DeFi自动做市商生态的基石。理解了它,后面学Curve的稳定币池、Balancer的加权池、甚至是Uniswap V3的集中流动性,都会轻松很多。我在实际项目中,每次遇到定价问题,第一反应就是回到这个公式重新推导一遍——往往能找到问题的根源。
公众号:蓝海资料掘金营,微信deep3321