AMM,Defi 的原理,自动化做市商,相较于传统的交易所做市商,完全由机器来决定买方和卖方的报价。
做市商的工作是向某个市场提供流动性。做市商主要通过三种方式赚钱:指定做市安排(传统上由资产发行商支付费用) 、交易费回扣 (传统上由交易所支付) 以及从做市中赚价差(Dex 中的手续费)
AMM 原理#
其实 AMM 可以只用一个函数来解释
也就是反比例函数
流动性影响#
所谓恒定乘积算法,指的是在流动性池没有添加或减少流动性的情况下,只有交易行为发送的情况下,k 值不变。
影响 K 值得几种情况
-
交易手续费影响 k 值
比如 uniswap 交易需要交千 3 的手续费,完成交易后,手续费会被添加到流动性池里
-
添加流动性影响 k 值
如果现在资金池里有 xETH/yUSDT,K=x*y。现在有人又添加了流动性,增加了 dx 个 ETH 和 dy 个 usdt,并且 dx/dy=x/y。
如果你使用 Uniswap 的默认设定,即你添加流动性时,先输入 ETH 的数量,然后 uniswap 会默认计算出需要多少 usdt,这个默认计算就是保持 dx/dy=x/y。
但,添加完流动性后,流动性池里的资金变成了:(x+dx) ETH/(y+dy) USDT。此时,(x+dx)(y+dy)>x*y。所以添加流动性 K 值变大了。
同样的减少流动性,会减少 K 值。
-
捐赠影响 k 值
如果你在添加流动性时,不是按 dx/dy=x/y 的比例去添加,而是直接往合约地址里转了 dx>0,dy=0,也是可以的。这同样会改变 K 值。
这样的事是经常发生的,有些人错误地将 ETH 转入一个 uniswap 流动性池合约地址里,就产生了捐赠行为,白白把币送给了所有原来的流动性所有者。
这种非 K 值比例添加流动性的行为,被 uniswap 称为捐赠。
但这种捐赠行为,在设计上是可以被其他人套利的。比如有人充值了 dx>0,dy=0;此时另外的人可以充值按 K 值比例的 dy,并且执行一个添加流动性的操作,就可以把那 dx 的捐赠给薅走。这个挺复杂的,细节我也搞不清楚。
任何不是按 K 值比例添加的流动性,都会产生捐赠。比如 dx/dy>x/y,则先添加 (dx-ddx)/dy=x/y 的流动性,并返回给用户对应数量的 LPtoken。然后 ddx 就变成了捐赠。
还有,在同一个区块里,可能即有交易是添加流动性的,也有交易是买卖,那 K 值就会更复杂的变化。
IDO#
以 pancakeswap 为案例,所有计算忽略手续费
假设我在 BSC 这条链上发布了一个 token 名字叫 $SHEEP,然后我以 SHEEP/BNB 作为交易对放进流动性池,5000SHEEP 和 100BNB 放进池子,此时,我 SHEEP 的 ido 价格就被我定下来了。
假设 BNB/USDT=500,则
- SHEEP/BNB=0.02
- SHEEP/USDT=10
即一颗 SHEEP=10U
根据公式,得 k=500000,画出曲线,由于斜率不是恒定的,每次交易都会影响 token 的价格
那么假设我这个 token 的作用是购买去中心化存储服务,那么,有需求的人就会来购买 sheep。在这个场景下会出现三种角色。
- 流动性提供者(A)
- 真正需要购买存储服务的人(B)
- 套利者 / 炒币(C)
pancakeswap 会给提供流动性的人奖励手续费(所以不用担心没有人来提供流动性),计算公式是
成交量 * 0.3% * 提供的流动性占这个池子的比例
这时 A 认为我这个项目挺有前景的,会有大量的人来交易,他决定提供一点流动性,这时他往池子里放入了 500 颗 SHEEP 和 10 颗 BNB(假设 500 颗 SHEEP 是通过 airdrop 得到的,这里必须提供与原有池子等值的两个币种),那么 A 就大概占据了 10/110=9% 的池子流动性,现在池子中有 5500 颗。(假设后续有大户进场的话,这个比例会越来越小)(为了保证 k 值不变,去除流动性提供的情况,原理相同)
B 不信任中心化存储服务,想尝试我这个项目,那么他购买了 500 颗 SHEEP,由于 k 是不变的,x=4500 那么 y=500000/4500=111.1,那么他需要支付 11.1 颗 BNB 才能购买 500 颗 SHEEP,此时池子中 SHEEP 有 4500 颗,BNB 有 111.1 颗
- SHEEP/BNB=0.024689
- SHEEP/USDT=12.34
也就是说 SHEEP 涨价了,这时候 C 看到价格涨了,就把 airdrop 获得的 500 颗 SHEEP 卖掉,那么池子又回到了原有的样子。
必须要理解的是,这个交易体现在曲线上是一个动态的过程,一次性买的越多,则花的越多,一般套利者不会一次性下大单。
兑换价格的计算方法#
假设交易前 DAI 和 ETH 的数量分别是 X 和 Y,交易后是 X' 和 Y'。那么交易遵循 X*Y=k=X'*Y' 的规则,k 恒定不变
那么多少 DAI 可以获得多少的 ETH
根据公式得出,实际成交的价格和∂成正比例(∂的意思是支付的 DAI 占池子里 DAI 的比例,0<∂)。即 成交的数量越大,∂越大,价格和支付币种的占比呈一次函数等比上升。∂=△x/X
兑换后市场价格的计算方法#
市场价格= 池子里 DAI 的数量 / 池子里 ETH 的数量(P 市场 = X/Y)。假设市场数量趋近于无穷大,兑换价格无限趋近于 X/Y
兑换价格= 支付 DAI 的数量 / 获得 ETH 的数量(P 兑换 =△x /△y)
由于用户交易会改变池子里的 DAI 和 ETH 的数量,所以交易前和交易后的市场价格是会变化的。换句话说,交易者会改变市场价格。交易后的市场价格公式:
根据
可得,购买 ETH 后的市场价为
最终计算公式
无常损失#
大概就是当你提供了流动性之后,币价的上涨获得的收益,比你全部持有此币种的收益要低。
参考文章
滑点#
滑点是指下单时,交易点位与实际交易点位有价格差别的一种交易现象。
Uniswap#
v3 版本看起来更新了很多,可以参考一下whitepapar
2022 年的 Defi#
Defi 狂热潮已经过了一年了,我没有赶上,不能说是错过,毕竟 7000% 的年化可不是天天都有,风险也很大。只能说错过亏钱的机会吧,2022 年 Defi 一定不会占据很大的热度,毕竟只是一个金融工具(虽然已经有去中心化金融衍生品了)。Defi 平台币永远躲不过流动性提供者大量的抛压,特别是在经历了 DYDX 之后,我已经不打算买任何做市的币。2022 年一定是 Web3 真正发挥作用的一年,一定是先从基础建设开始。