berwinYes

Posted on Aug 09, 2022Read on Mirror.xyz

DeFi概念介绍(三)——无常损失和滑点

上篇文章我们讲了AMM的原理,并在最后提到了无常损失这个概念。今天这篇文章就来详细介绍无常损失和滑点这两个概念。

无常损失

当你成为一个做交易流动池添加者(又称做市商、矿工)时,相当于是和所有交易者做一个对手盘,如果所有交易者的盈亏加在一起还是盈利状态,那这部分的利润就来自于每个做市商的无常损失。

同时无常损失不是永久性的,价格经历短暂下跌后又重新恢复,收益也会修正。

那么如何计算无常损失呢?

还是先列出AMM的核心公式:

K = A * B

假设以BNB和BUSD为例:

  • Cbnb - 池中当前BNB 的数量 为上式中的A

  • Cbusd - 池中当前BUSD 的数量 为上式中的B

  • Pbnb - bnb当前价格

  • Pbusd - busd当前价格 恒定为1u 可省略

当K恒定时,我们可以得到任何时刻池中的BNB和BUSD数量

真实场景

假如,我们在 1 BNB = 500 BUSD 的时候,组了一组 LP 。我们拿出了 20 个 BNB 和 10000 个 BUSD 进行 LP 流动性提供代币兑换。此时我们得到了这几个变量:

并且,我们保证此时的 K 也是后续所有情况下的常数 K,即组完 LP 代币后即时生效的常数。

情况1:BNB上涨

过了 10 天,BNB的价格在外部的交易所中开始上涨。中心化交易所的BNB价格从500涨到了550美元。当前价格为 1 BNB = 550 BUSD 。于是其他市场参与者(称为套利者)就开始工作了。套利者注意到CEX和DEX之间的价格差异,并将其视为套利机会,俗称搬砖。

当搬砖结束后,DEX中的BNB与BUSD的价格也到达了:1 BNB = 550 BUSD

我们可以得到此时的LP池中BNB和BUSD数量:

这意味着:在 BNB 涨价到 550 BUSD 时,我们发现等值的 LP Token 兑换只能换回 19.069 个 BNB 和 10488.09 个 BUSD。如果我们来换算成 BUSD 作为单位来对比一下前后收益:

价格变化前我的总投入为:

20BNB*500 + 10000BUSD = 20000U

不进行LP挖矿,当BNB 涨价到 550 BUSD时,同数量BNB、BUSD情况

20BNB*550 + 10000BUSD = 21000U

进行LP挖矿,当BNB 涨价到 550 BUSD时,根据AMM推导,拿回资产的总价值

19.069BNB*550 + 10488.09BUSD = 20976.04U 

根据计算,发现在BNB上涨时,组 LP Token 比持有亏损 21000−20976.04=23.96 U。损失比例为 23.96/20000 = 0.11%.

情况2:BNB下跌

我们看完了BNB上涨时的情况,再来看一下BNB下跌时的情况

LP挖矿价值: 21.082BNB*450 + 9486.83BUSD = 18973.73U 
持有价值:20BNB*450 + 10000BUSD = 19000U

根据计算,发现在BNB上涨时,组 LP Token 比持有亏损 19000−18973.73=26.27 U。损失比例为 26.27/20000 = 0.13%.

结论

经过以上分析,无论是BNB上涨还是下跌,组LP都比持有代币出现亏损,这就是所说的无偿损失。其中0.12% 和 0.13%分别为 BNB相对BUSD涨幅10%、BNB相对BUSD跌幅10%后,无偿损失的比率值。

Uniswap: A Good Deal for Liquidity Providers?这篇论文中,给出了一张代币增长率和无偿损失的关系图:

横坐标为tokenA对比TokenB的涨幅程度,纵坐标为无偿损失比例值

这里推荐大家两个 无常损失计算工具 | 无常损失计算器2

既然亏钱,为什么要进行流动性挖矿(组LP池)?

项目方已经想到了这个问题,也给出了解决方案,让矿工们获利

  1. 用 BNB 和 BUSD 换取 BNB-BUSD LP 代币:相当于你为 BNB 和 BUSD 流动池增加了代币。并且你获得了 BNB ⇄ BUSD 这个交易中的对应代币份额的抽成奖励占比;

    1. 这里就体现了 DEX 通过换取流动性证明,从而完成了一种激励模式;

    2. PancakeSwap 在文档中提到,其 0.2% 的交易手续费当中,有 0.17% 的比例是提供给 LP 持有者的抽成奖励的。剩下的 0.03% 是平台的利润。具体规则可以查看官方文档

  2. BNB-BUSD 代币挖矿:当我们拿到 BNB-BUSD LP Token 之后,我们可以继续放在 PancakeSwap 的 Farms 中进行挖矿(其年化 APR 如以下截图所示)。

LP 代币说明

其实 LP Token 也是一种代币,它也拥有自己的合约地址。比如 Pancakeswap 上的 BNB-BUSD LP 代币合约地址 0x58F876857a02D6762E0101bb5C46A8c1ED44Dc16 。是代币肯定就有一个方式来计算数量,这里 Pancakeswap 和 Uniswap 的计算方式一样,采用以下公式:

所以,当我们用 20 个 BNB 和 10000 个 BUSD 兑换 LP 代币的时候,我们会获得大约 447.21 个 LP Token。

有些土矿是支持单币挖矿的,这样则可能不会出现无常损失,还可能有得赚。就拿上面的例子BNB/BUSD例子,如果你只存入10000BUSD,匹配到存20个BNB的组成LP,当BNB涨到550时,你将得到10488.09BUSD,是盈利的,亏损的部分被单BNB挖矿的人承担。下图给出了不同情况下的收益率。

滑点(Slippage)

基于之前AMM的介绍,我们都知道DEX的交易模式并非订单簿的一次性成交,AMM的核心公式X*Y=K,实际的交易中因扣除手续费,实际的K值并非恒定,但幅度非常小,为了方便计算滑点,我们这里暂且不计手续费的影响。

滑点定义

什么是滑点,滑点一般指预设成交价位与真实成交价位的偏差。恒定乘积AMM中同样存在滑点,一旦发生交易,池中资产的储备发生变化,资产实际的交易执行价就会发生变化,产生滑点。交易额越大,滑点越大,交易者的损失就越大

滑点有2种定义。本文采用第二种定义方法,反映交易者成交后的损失。

  1. (成交平均价格-初始价格)/ 初始价格 uniswap V3

  2. (成交后价格-初始价格)/ 初始价格 uniswap V1/V2

    这里使用第二种。

滑点产生推导:

为了简化推导,依旧使用BNB和BUSD对,利用BUSD购买BNB。y代表BNB在LP池中数量,x代表BUSD数量。

其中 NewPriceBNB = dx/dy ,可以在图中看出真实BNB价格是此时的斜率。

最终带入得到

真实例子

假设当前BNB/BUSD池中有 20 个 BNB 和 10000 个 BUSD 进行 LP 流动性提供代币兑换。

此时可计算得到此时的比率为 1 BNB = 500 BUSD 。

此时我们想用250BUSD兑换0.5BNB,理论上可行,但是实际上却不行。

根据核心公式

K = X*Y

20*10000 = (10000+250)*(20-dy)
=> dy = 0.487

这就是说 此时只能用 250BUSD 换的 0.487个BNB。此时的BNB价格为

PBNB = 250/0.487 = 513BUSD
根据公式:
slippage = dx/x = 250/10000 = 2.5%
根据推导:
slippage = (513-500)/500 = 0.026 = 2.5%  

交易量dx越大,产生的滑点就越大,偏离实际价位就越大,而池中的资金储备越多、交易深度越大,则能尽量减少滑点的溢价,使用户的交易损耗降低。

利用滑点估算TVL(池子深度):

一般池子内的锁仓量(TVL)也就是池子深度代表了项目的热度及安全性,是非常重要的数字指标,深度越小,项目越危险,实际兑换过程中,根据滑点可以迅速计算出池子TVL,作为我们投资的辅助依据。

在DEX进行交易时,有一个参数为PriceImpact

带入公式:

x = 3/9.32% -3 = 29.21U

poocoin结果验证基本一致:

故TVL 锁仓29u 。

写在最后

希望通过这篇博客,让大家能更深入的弄清楚AMM中最重要的两个概念,希望帮助每个人对DeFi有更加深入了解。

这里是berwin的Mirror,创作不易,希望看完顺手关注我的Twitter,感激不尽。

https://twitter.com/coolberwin_eth

参考资料:

https://www.desgard.com/2021/04/25/defi-lp-math.html

https://zhuanlan.zhihu.com/p/375371767

https://www.jinse.com/news/blockchain/1054106.html

https://docs.google.com/presentation/d/1BGv7POJLa16M2sO77DTR5doKjAECbpqXMYuaUax0nYQ/edit#slide=id.g123d4319d47_0_359