• 首页

  • 文章归档

  • 友链

  • 关于页面
D u e l s , I S h e e p !
D u e l s , I S h e e p !

ISheep

Code for fun, Make world better

12月
12
blockchain

AMM算法

发表于 2021-12-12 • 字数统计 2898 • 被 274 人看爆

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

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

AMM原理

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

$$ x*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
$$
假设用\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的数量,所以交易前和交易后的市场价格是会变化的。换句话说,交易者会改变市场价格。交易后的市场价格公式:
根据

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

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

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

最终计算公式

$$ P兑换后=\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真正发挥作用的一年,一定是先从基础建设开始。

分享到:
CoinGeco《How to NFT》中文版
【转载】张忠谋分享60年经验
  • 文章目录
  • 站点概览
ISheep

🐏 ISheep

放羊么?

Github Twitter Email Telegram RSS
看爆 Top5
  • 2020年终总结 563次看爆
  • 【转载】 2010年的房地产调控,我们收获了什么?写在房价暴涨前 461次看爆
  • 正则表达式入门 451次看爆
  • 搬家 437次看爆
  • 二〇二一 · 迷茫 、恐慌 410次看爆

站点已萌萌哒运行 00 天 00 小时 00 分 00 秒(●'◡'●)ノ♥

Copyright © 2022 ISheep 浙ICP备19046944号

由 Halo 强力驱动 · Theme by Sagiri · 站点地图