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的涨幅程度,纵坐标为无偿损失比例值
横坐标为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,感激不尽。

参考资料:

Subscribe to berwinYes
Receive the latest updates directly to your inbox.
Mint this entry as an NFT to add it to your collection.
Verification
This entry has been permanently stored onchain and signed by its creator.