编者按:本文来自巴比特资讯,作者:FernandoMartinelli,译者:洒脱喜,星球日报经授权发布。随着近期Compound治理代币COMP的大热,Defi“流动性挖矿”潮正式来临,而同样备受市场期待,又有着高级版uniswap之称的Balancer,也即将迎来自己的治理代币挖矿。而在参与Balancer的流动性挖矿之前,你需要对几个概念有所了解,一是如何计算Balancer储备池的值,二是计算无常损失,最后则是关于滑点的计算,对于这些,Balancer首席执行官FernandoMartinelli将为我们一一道来。
如果你有曾读过Balancer的白皮书,那你可能会觉得,要理解所有涉及到的数学知识会让人感到畏惧。幸运的是,大多数复杂的偏导数和证明,对于理解和使用协议而言其实是不必要的。一个简单的不变量确保了Balancer资产储备池具有的所有有趣的自平衡属性:
其中Bi和Wi分别是代币余额和权重。Balancer储备池的值
一个Balancer储备池,可以由多达8种不同的ERC20代币组成,并且每种代币都有自己任意的权重。这个权重表示储备池在任何时候,应在每个代币中保持的值的百分比。只要市场上有活跃的理性套利者,且池的费用很低,则储备池持有的每个代币的价值百分比,预计总是非常接近池的权重。在低费用的情况下,只要任何一个代币相对于另一个代币有价格变化,套利者就会受到激励,以使代币之间的资产池价值分配,恢复到原始预定义权重。为每个代币灵活选择权重的有趣效果是,储备池流动性提供者,可以控制他们希望对每种资产承担的风险水平。例如,如果他们看好MKR,他们可以选择向MKR权重高、ETH权重低的储备池中添加流动性。如果不存在这样的储备池,他们也可以自己创建一个。这样,当MKR相对于ETH上升时,他们将获得MKR的大部分上行空间。当然,这一优势并不等同于持有100%的MKR,但它将比在MKR和ETH之间拥有50/50的储备池要好得多。下面的截图,显示了在实践中的情况。
在向Balancer储备池提供流动性时,你可能会问的一些关键问题是:在基础代币的价格全部改变之后,是否有一种方法可以概括计算出Balancer储备池的值?如果MKR的价格翻倍,且ETH保持不变,那么持有75%MKR和25%ETH的储备池的价值将增加多少?如果权重为10%的代币价格下跌80%,那么储备池损失是多少?一个非常简单的公式,可以为以上所有问题提供答案。Balancer池的值,根据其每个基础代币的同一参考的价格变化而变化:
其中
是代币i的美元价格变化,而
是代币i的权重。这个方程的长形式证明,可以在我们网站上的详细文章中找到。有了这个公式,我们就可以轻松回答上面提到的问题,请注意,无论代币的权重如何,不变的代币价格都不会影响储备池的值,无论这些代币的权重如何。所以我们有:如果MKR的代币价格翻番,75%MKR和25%ETH的储备池的总价值将增加68.2%,而一个50/50比例储备池的总价值则增加41.4%。如果一个储备池中某个代币的权重为10%,且其价格崩盘80%,那么这个储备池的总价值只会下降约15%。流动性提供者的无常损失
“无常损失”一词在Pintail的文章推出后被广泛传播。如果你之前从未听过这个词,可以阅读下Pintail写的关于Uniswap储备池回报的重要文章。根据定义,无常损失描述的是这样一种损失:在储备池中的资产,较这些资产在池外的情况下损失的百分比,用公式来表达便是:
上面这个公式考虑的是0费用的储备池情况。不含费用的Balancer价值函数与路径无关。这意味着,如果流动性提供者在移除其所有相关代币的流动性时,代币的价格与增加流动性时相同,则无常损失将为零:他们将拥有与其投资的代币数量完全相同的代币。在等式中加上费用,流动性提供者的最终美元收益将是累计费用,减去无常损失。我们可以使用以下定义来更改池中持有价值的变化,来扩展上述无常损失的公式:
为了说明这个公式,我们举个例子,例如,假设一个篮子投资组合中,有一个权重为50%的代币,而它的价格翻了一番。那么这个篮子投资组合的总价值将增加50%,或1.5倍。换言之,假设我最初持有500美元的代币A和500美元的代币B,两者总共1000美元。如果代币B的价值翻倍,那么我就持有了500美元的代币A和1000美元的代币B,总计1500美元。如上面所述,无常损失也可以用储备池值和持有池的变化来表示:
因此,替换上面的公式,就可以得出Balancer池中无常损失的最终表达式:
请注意,由于值函数的凸性,无常损失将始终为零或负数。这可能导致一种混淆,即负损失被解释为收益。事实并非如此:无常损失总是负的真正含义是,代币价格的任何相对变化,总是会导致一些短暂损失。Balancer储备池的滑点
根据定义,滑点是指交易中,实际支付价格相对于现货即期价格的百分比变化。在存在费用的Balancer储备池中,即期价格的定义如下:
根据定义,交易的有效价格是交易者出售的金额除以他们获得的其他代币金额的比率:
使用我们白皮书中得出的amountOut公式,我们可以将其重写为:
请注意,即使我们处理的是用户定义要出售的金额的交易,也可以在用户定义要购买的金额时进行以下整个推导,详见下一部分内容。我们可以将滑点定义为有效价格超过即期价格的百分比。这是关于交易金额的一个函数,因为它会影响有效价格:
因此,如果一笔交易的有效价格是102,而即期价格是100,那么滑点就是2%。在Balancer中,滑点并不是线性的:它随着交易量的增加而增长得更快。不过,作为一个近似值,我们可以线性化小额交易的滑点。下图以蓝色显示了增加数量的有效价格,以橙色表示的是有效价格的线性化:
这种线性化对于许多算法优化)非常有用。通过线性化,我们可以将滑点重写为交易金额的线性函数:
滑动斜率只是上面在Ai=0时定义的滑动公式的导数。可以用不同的方法来计算,但最终的解决方案是:
滑点计算实例
以一个70%AST/30%WETH的储备池为例。在撰写本文时,该储备池有414.7万AST和491WETH:
让我们用上面导出的公式,来计算一笔交易会导致这个储备池的滑点。这里设置的费用是0.0099(0.99%),Bi是出售给储备池的代币余额,Wi是出售给储备的代币权重,wo是从池中购买代币的权重。所以这个储备池的线性滑点公式是:
用WETH交易AST的线性滑点可以写成:
也就是说,如果我们要交易1WETH,那么预计就会有0.14%的价格下滑。这正是我们在balancer.exchange上进行模拟交易时得到的结果:
另一种情况的滑点:为了完整性起见,让我们推导出购买一种代币时,即amountOut的滑点公式。公式非常相似,我们从相同的有效价格公式开始:
但这一次我们将Ai扩展为Ao的函数,正如我们白皮书中得出的:
滑点可以写成Ao的函数:
线性化为:
求导数,我们有:
有趣的是,正如人们所期望的那样,滑点在Balancer储备池中是对称的。也就是说,如果一个参与者相对于储备池的大小进行了少量的交易,那么其交易的方向应该无关紧要:对于所交易的相同价值,以%表示的滑点应该是相同的。这可以在实践中观察到,因为针对Ao和针对Ai计算的滑动斜率,在交易的每价值百分比上相同,只是以不同的单位表示。SLi是每Ai交易的百分比,SLo是每Ao交易的百分比:
郑重声明: 本文版权归原作者所有, 转载文章仅为传播更多信息之目的, 如作者信息标记有误, 请第一时间联系我们修改或删除, 多谢。