ISheep

ISheep

Badminton | Coding | Writing | INTJ
github

AMM算法

AMM,Defi 的原理,自动化做市商,相较于传统的交易所做市商,完全由机器来决定买方和卖方的报价。

做市商的工作是向某个市场提供流动性。做市商主要通过三种方式赚钱:指定做市安排(传统上由资产发行商支付费用) 、交易费回扣 (传统上由交易所支付) 以及从做市中赚价差(Dex 中的手续费)

AMM 原理#

其实 AMM 可以只用一个函数来解释

xy=kx*y=k

也就是反比例函数

流动性影响#

所谓恒定乘积算法,指的是在流动性池没有添加或减少流动性的情况下,只有交易行为发送的情况下,k 值不变。

影响 K 值得几种情况

  1. 交易手续费影响 k 值

    比如 uniswap 交易需要交千 3 的手续费,完成交易后,手续费会被添加到流动性池里

  2. 添加流动性影响 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 值。

  3. 捐赠影响 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。在这个场景下会出现三种角色。

  1. 流动性提供者(A)
  2. 真正需要购买存储服务的人(B)
  3. 套利者 / 炒币(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

假设用ΔxDAIΔyETH,则P交易=ΔxΔy=P×(1+)假设用\Delta x个DAI换\Delta y个ETH,则 P交易=\frac{\Delta x}{\Delta y} =P原\times (1+\partial )

根据公式得出,实际成交的价格和∂成正比例(∂的意思是支付的 DAI 占池子里 DAI 的比例,0<∂)。即 成交的数量越大,∂越大,价格和支付币种的占比呈一次函数等比上升。∂=△x/X

兑换后市场价格的计算方法#

市场价格= 池子里 DAI 的数量 / 池子里 ETH 的数量(P 市场 = X/Y)。假设市场数量趋近于无穷大,兑换价格无限趋近于 X/Y

兑换价格= 支付 DAI 的数量 / 获得 ETH 的数量(P 兑换 =△x /△y)

由于用户交易会改变池子里的 DAI 和 ETH 的数量,所以交易前和交易后的市场价格是会变化的。换句话说,交易者会改变市场价格。交易后的市场价格公式:
根据

XY=XY=(X+Δx)(YΔy)Δy=YΔxX+ΔxX*Y=X^{'} * Y^{'}=(X+\Delta x) *(Y-\Delta y)\Delta y=Y*\frac{\Delta x}{X+\Delta x}
Δy=YΔxX+Δx\Delta y=Y*\frac{\Delta x}{X+\Delta x}

可得,购买 ETH 后的市场价为

XY=1XY(X+Δx)2=XY(1+)2\frac{X^{'} }{Y^{'}} =\frac{1}{X*Y}*(X+\Delta x)^{2} =\frac{X}{Y}*(1+\partial ) ^{2}

最终计算公式

P兑换后=ΔxΔy=P×(1+)2P兑换后=\frac{\Delta x}{\Delta y} =P原\times (1+\partial )^{2}

无常损失#

大概就是当你提供了流动性之后,币价的上涨获得的收益,比你全部持有此币种的收益要低。

参考文章

  1. Pintail
  2. Bancor
  3. 为什么自动做市商可能会亏钱

滑点#

滑点是指下单时,交易点位与实际交易点位有价格差别的一种交易现象。

Uniswap#

v3 版本看起来更新了很多,可以参考一下whitepapar

2022 年的 Defi#

Defi 狂热潮已经过了一年了,我没有赶上,不能说是错过,毕竟 7000% 的年化可不是天天都有,风险也很大。只能说错过亏钱的机会吧,2022 年 Defi 一定不会占据很大的热度,毕竟只是一个金融工具(虽然已经有去中心化金融衍生品了)。Defi 平台币永远躲不过流动性提供者大量的抛压,特别是在经历了 DYDX 之后,我已经不打算买任何做市的币。2022 年一定是 Web3 真正发挥作用的一年,一定是先从基础建设开始。

加载中...
此文章数据所有权由区块链加密技术和智能合约保障仅归创作者所有。