恒定乘积做市商模型:AMM基本原理
聊到DeFi,绕不开的就是AMM。我最早接触这个概念是在2019年,当时看到Uniswap的代码,第一反应是——就这么简单?一个公式撑起了百亿级别的流动性市场。今天我们就来拆解这个核心中的核心:恒定乘积做市商模型。
从传统订单簿到AMM
传统交易所用的是订单簿模式。你想买,得有人卖。价格由买卖双方博弈决定。但AMM不一样,它没有订单簿,取而代之的是一个资金池。
说白了,AMM就是一个自动化的做市机器人。你把两种代币放进池子里,机器人根据一个数学公式自动报价。你交易,它调整价格。整个过程不需要等待对手方。
我个人习惯把AMM理解成一个「价格弹簧」。你往一个方向压,它就会产生反方向的力。这个力的大小,由公式决定。
x * y = k:最优雅的数学公式
恒定乘积公式长这样:
x * y = k
其中:
- x = 代币A的储备量
- y = 代币B的储备量
- k = 恒定常数
这个公式的精髓在于:无论你怎么交易,x和y的乘积永远不变。你往池子里塞A,就得拿走B。塞得越多,拿走的B就越少——因为乘积要保持不变。
核心逻辑:交易的本质就是改变池子中两种代币的比例,而k值保持不变。
举个例子。假设池子里有100个ETH和200,000个USDC。那么:
k = 100 * 200,000 = 20,000,000
你想用10个ETH换USDC。交易后,池子里ETH变成110个。为了保持k不变:
110 * y' = 20,000,000
y' = 20,000,000 / 110 ≈ 181,818
所以你拿到的USDC是:200,000 - 181,818 = 18,182个。
嗯,这里要注意:你投入10个ETH,只换回18,182个USDC。如果按原始价格1 ETH = 2,000 USDC算,你应该拿到20,000个。差价就是滑点。
价格与储备量的关系
价格怎么来的?其实很简单。当前价格就是两种代币储备量的比值:
P_a = y / x (代币A的价格,以代币B计价)
P_b = x / y (代币B的价格,以代币A计价)
为什么?因为池子里有多少代币,就决定了你交易时的边际价格。你想想看,如果池子里ETH很少、USDC很多,那ETH自然就贵。
用上面的例子:
ETH价格 = 200,000 / 100 = 2,000 USDC
交易后:
ETH价格 = 181,818 / 110 ≈ 1,653 USDC
看到了吗?你买入ETH后,ETH价格反而跌了。这就是AMM的「反身性」——你的交易行为本身就在改变价格。
实战经验:我在做量化策略时,经常用这个公式估算滑点。公式很简单:滑点 ≈ (交易量 / 池子深度) * 当前价格。池子越浅,滑点越大。
公式推导:从直觉到数学
你可能好奇,为什么偏偏是乘积恒定,而不是加法或减法?
我们来推导一下。假设池子里有x个A和y个B。你投入Δx个A,换出Δy个B。交易后:
(x + Δx) * (y - Δy) = k
展开:
xy - xΔy + yΔx - ΔxΔy = k
因为xy = k,所以:
- xΔy + yΔx - ΔxΔy = 0
xΔy = yΔx - ΔxΔy
Δy = (yΔx) / (x + Δx)
这个公式就是你的实际成交数量。当Δx很小的时候,Δy ≈ (y/x) * Δx,也就是按当前价格成交。当Δx很大时,分母变大,Δy会明显小于线性预期——这就是滑点的数学本质。
我曾经踩过的坑:有一次写合约时,直接用当前价格计算交易量,忽略了滑点。结果大额交易时,用户实际到账比预期少了5%。从那以后,我所有交易计算都用这个完整公式,而不是近似值。
知识体系总览
下面这张图总结了恒定乘积做市商的核心逻辑:
实际应用中的注意事项
搞懂了公式,咱们聊聊实战中容易忽略的点:
- k值不是绝对恒定——添加或移除流动性时,k值会变。只有纯交易时k才不变。
- 价格是瞬时概念——你看到的池子价格,只代表当前这一笔交易的起始价。实际成交价是平均价。
- 深度决定一切——同样的交易量,在深池子里滑点小,在浅池子里滑点大。我见过有人拿1000 USDC去一个只有500 USDC深度的池子交易,结果滑点超过30%。
我的习惯:每次评估一个新池子,我第一件事就是看它的深度。深度不够的池子,再好的价格也别碰。公式算出来的价格和实际成交价,有时候差得离谱。
恒定乘积模型虽然简单,但它奠定了DeFi流动性池的基础。后面讲无常损失时,你会发现所有的问题都源于这个公式的数学特性。嗯,先消化这些,后面我们一步步深入。