为Balancer池计算价值、暂时性损失和滑点

这篇文章详细讨论了Balancer协议中池的价值计算、价格波动对池价值的影响以及滑点的定义和计算方法。作者使用数学公式和逻辑推理来解释流动性提供者在动态市场中的策略选择,并阐述了无法避免的无常损失概念,文章内容深度和逻辑性强,适合对去中心化金融有一定了解的读者。

编辑:本文中的滑点应理解为价格影响。关于这两个术语的混淆可在 这里 中讨论。

如果你有机会阅读 Balancer 的白皮书,可能会觉得跟上所有涉及的数学公式很艰巨。幸运的是,理解和使用该协议并不需要大多数复杂的偏导数和证明。我们所称的简单不变量,即价值函数(Value Function),确保了 Balancer 池的所有有趣的自我平衡特性:

其中 Biwi 分别是代币余额和权重。

Balancer 池的价值

一个 Balancer 池最多可以包含 8 种不同的 ERC20 代币,每种代币的权重可以是任意的。权重表示池在任何时候应持有的每种代币的价值百分比。只要市场中有理性的套利者活跃 并且 池费较低,池中每种代币持有的价值百分比预计将始终非常接近池权重(请参见如何通过允许更高的价值偏离定义的权重来使高费 Balancer 池充当波动交易者)。

在低费用的情况下,只要任何代币相对其他代币的价格发生变化,套利者就会被激励将各代币的池价值分布恢复到最初的预定义权重。

对于每种代币的灵活权重选择的一个有趣的效果是,池流动性提供者可以控制他们希望对每个资产承受的风险水平。比如,如果他们对 MKR(相对于 ETH)持看涨态度,他们可以选择向一个在 MKR 中权重较高、在 ETH 中权重较低的池中添加流动性。或者如果不存在这样的池,他们可以自己创建一个。这样,当 MKR 相对于 ETH 上涨时,他们将保留大部分的 MKR 上涨收益。

当然:上涨幅度不会与持有 100% 的 MKR 相同,但肯定会比持有 50/50 的 MKR 和 ETH 的组合要好得多。以下是 MKR 最近一次上涨的屏幕截图,展示了这一点。

感谢 @followthechain 的关注

不同基础代币价格下的池价值

在为 Balancer 池提供流动性时,可以问的一些关键问题是:

  • 有没有办法概括在基础代币价格都发生变化后,Balancer 池的价值计算?
  • 如果 MKR 的价格翻倍而 ETH 保持不变,持有 75% MKR 和 25% ETH(如上截图所示)的池的价值会增长多少?
  • 如果一个权重为 10% 的代币下跌 5 倍,池的损失会是多少?

一个非常简单的公式为所有这些问题提供了答案。Balancer 池在任何参考(例如 USD)下的价值,随其基础代币的价格变化而变化:

其中

是代币 i 的美元价格变化,和

是代币 i 的权重。

该公式的详细证明可以在我们网站上找到的这篇详尽的文章中查看。

有了这个公式,我们可以轻松回答之前提出的问题。请注意,价格不变的代币对池价值没有影响(ΔP_usd^w = 1^w = 1),无论这些代币的权重是多少。因此我们得出:

  • 如果 MKR 的价格翻倍,一个 75% MKR 和 25% ETH 的池将总价值增长 68.2%(=2^0.75=1.682),相比之下一个 50/50 的池的增长为 41.4%(=2^0.5=1.414)。
  • 一个权重为 10% 的代币下跌 5 倍(80% 崩溃,或 ΔP_usd = 0.2)的池,其总价值仅下降大约 15%(=0.2^0.1=0.8513)。

无常损失

术语 无常损失 随着 Pintail 发布的很有见地的文章变得广为人知。如果你之前没有听说过这个术语,请阅读他关于 Uniswap 池收益的重要 文章

根据定义,无常损失(IL) 描述的是一个池的价值低于如果他们没有持有池内代币而是持有代币的成本百分比。换句话说:

这个公式考虑了一个理论上的 0% 费用的池。当没有费用时,Balancer 的价值函数是路径无关的(即交易的_顺序_不会改变池的最终状态)。这意味着,如果流动性提供者在所有相对代币价格与添加流动性时相同的情况下移除流动性,无常损失 将为零:他们将拥有与他们投资的代币数量完全相同的代币。

在公式中加入费用后,流动性提供者的最终利润将是以美元计的自累积费用与 无常损失 的百分比总池价值之间的差额。

我们可以使用以下有关池的持有价值变化的定义,扩展上面的 无常损失 公式:

为了解释这个公式,假设,例如,一个持有代币权重为 50% 的篮子,该代币的价值在美元中翻倍。持有篮子的总价值将增加 50%,或 1.5 倍(=1 * 50% + 2 * 50% = 1.5)。换句话说,假设最初持有 500 美元的代币 A 和 500 美元的代币 B,总共 1000 美元。如果代币 B 的价值翻倍,那么你将持有 500 美元的代币 A 和 1000 美元的代币 B,总价值为 1500 美元(1.5 倍或多 50%,如预期)。

正如上述 文章 中详细说明的那样,无常损失 还可以用 池价值持有价值变化 来表示:

那么将上面的公式替换,我们得到了 Balancer 池中 无常损失 的最终表达式:

请注意,由于价值函数的凸性,无常损失 将始终为零或负数。这可能会导致将负损失解释为收益的混淆。实际上,IL 总是为负数的真正含义是,相对代币价格的任何变化都总会有某种程度的 无常损失

在 Balancer 池中的滑点

根据定义,滑点是交易中实际支付价格相对于现货价格的百分比变化。现货价格被定义为当交易量趋于零时有效价格的极限。

在带费用的 Balancer 池中,现货价格定义为(请注意,从此处开始 i 表示输入代币,即正被交易者发送/出售给池的代币):

交易的有效价格根据定义是交易者出售的金额(amountIn)与他们得到的其他代币的金额(amountOut)的比率:

使用我们白皮书中得出的amountOut 的公式,我们可以将其重写为:

请注意,尽管我们正在处理用户定义想要出售的金额(amountIn)的交易,下面的整个推导也可以用于用户定义想要购买的金额(amountOut),这一点在以下章节中有详细说明。

我们可以将滑点定义为有效价格超过现货价格的百分比。这是一个由交易的 amountInAi)影响的函数,因为它影响有效价格:

因此,如果交易的有效价格为 102,现货价格为 100,则滑点为 2%。

在 Balancer 中,滑点并非线性:随着交易量的增加,滑点增长得更快。不过,作为一种近似方法,我们可以线性化小额交易的滑点。下图显示了以蓝色表示的增加的销售量下的有效价格,以及以橙色显示的滑点线性化有效价格(所有数字均为虚构):

这种线性化对许多算法优化(包括我们的 智能订单路由器 (SOR))非常有用。

通过线性化,我们可以将滑点重写为交易量的线性函数:

滑点斜率(SL)只是上面定义的滑点公式在 Ai = 0 时的导数。可以通过不同的方法计算,但最终的解决方案是:

滑点计算的实际例子

举个例子,假设有一个 70% AST / 30% WETH 的池。在写这篇文章时,该池大约有 414.7 万 AST 和 491 WETH:

我们使用上述推导的公式来计算一次交易 1 WETH 对这个池造成的滑点。费用为 0.0099(0.99%),Bi 是出售给池的代币的余额(491 WETH),wi 是出售给池的代币的权重(0.3),wo 是从池中购买的代币的权重(0.7)。因此这个池的线性滑点公式为:

那么WETH与AST的交易“线性化滑点”可以写为:

对于交易 1 WETH,我们应该期望滑点为 0.14%。如果我们在 balancer.exchange 模拟这笔交易,得到的就是这个结果:

AmountOut 的滑点

为了完整起见,让我们推导给定购买量 amountOutAo)的滑点公式。公式非常相似,我们从同一有效价格公式开始:

但这次我们需要将 Ai 展开为 Ao 的函数,如我们在 白皮书 中派生的:

那么滑点可以写成 Ao 的函数:

线性化为:

解导数我们得到:

有趣的是,正如预期的那样,滑点在 Balancer 池中是对称的。也就是说,如果一个人进行相对于池大小的小额交易,那么无论是从代币 A 到 B,还是从代币 B 到 A,都会没有区别:相同价值的交易滑点应该是相同的。可以观察到,上述关于 AoAi 的滑点斜率是相同的,以 % 每价值 进行交易,它们只是单位不同。SLi 是以 % 每 Ai 交易,SLo 是以 % 每 Ao 交易:

  • 原文链接: medium.com/balancer-prot...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
fernandocmartinelli
fernandocmartinelli
江湖只有他的大名,没有他的介绍。