建立稳定币互换机制:从Balancer到Curve

  • A+
所属分类:区块链

chatGPT账号

稳定币为一种锚定法定货币价值的虚拟货币,可在这动荡的市场中作为相对可靠的避险资产。以美元为例,市场常见且流通性足够的美元稳定币就超过 3 种,每种的应用场景及背后的风险皆不相同,因而市场上产生了稳定币之间互换的需求。
本文将探讨 Curve 这个去中心化的稳定币互换协议。先从 Balancer 出发,根据需求修改模型,一步步推导出 Curve 所使用的公式。再根据该模型的特性分析其优缺点及相关延伸应用。

稳定币稳定吗?
理想上,美元稳定币的价值应恒等于 1 USD,但实际上却常有着不小的波动,其中一个原因为每种稳定币的发行机制不同,而对应了不一样的风险。
发行机制可简单分为下列三种:
1. 法币资产抵押型:
以实际美元做为抵押而发行,会有储备金不足造成的挤兑风险。
最具代表性的为 Tether 发行的 USDT 及 Coinbase 与 Circle 发行的 USDC。
2. 加密资产抵押型:
以加密资产作为抵押而发行,其稳定性会受该抵押品的价值而影响。
最具代表性的为 MakerDAO 抵押 ETH 发行的 DAI,及 Synthetix 抵押 SNX 发行的 sUSD。
3. 合成资产型:
以各种稳定币合成铸造,只要其中一个币种出问题就会连带影响全部。
例如 mUSD 理想上是由五种常见稳定币合成而成的。
此外,稳定币也如同其他币种一般,会因市场供需而产生不一样的价格。如流动性挖矿热潮中,不少农场以 DAI 做为农具,就使得 DAI 的价格迅速攀升。

建立稳定币互换机制:从Balancer到Curve

2020/1/1 至 2020/11/12 的稳定币价格走势图。 source: CoinGecko

由上图可见,稳定币其实不太稳定。
特别是在 312 惨案时,为避免 MakerDAO 中的抵押物 ETH 被清算而导致 DAI 的需求量突然大增使币价大涨,当时在一些交易所甚至出现超过 10% 的溢价。
综合以上所述,价差源自于需求及风险的不同,价格则是在交易中产生,所以市场上需要一个能交换各种的环境。

如何交换稳定币?

在 Balancer 建立资金池?
要想建立一个能交换多种稳定币的环境,一个简单的方式就是直接在 Balancer 中建立一个资金池,其中包含了各种稳定币,且让每个币种有着相同的权重。
池内各资产数量会遵守以下方程式:

建立稳定币互换机制:从Balancer到Curve

Balancer AMM 模型,设各币种权重相等

此模型称作恒定乘积做市商 (Constant Product Market Maker)。由于一次的互换仅与两个变数有关,其他变数可暂时当作常数。

为方便说明,假设 x 为池内 USDC 总量,y 为 池内 DAI 总量,将方程式作图如下:

建立稳定币互换机制:从Balancer到Curve

现价等于该点切线之斜率(取绝对值)

图中 A 点位置为池内两个币种存量相等时,此时互换的比率为 1 : 1,对于稳定币来说是最理想的价格。但由于 Balancer 曲线的特性,一旦有人交易使蓝点移动后,价格就会明显改变。

举例来说,若有人卖出大量USDC ,使池内USDC 数量增加30%(A 点移至B 点),则价格会从1 DAI/USDC 掉至0.56 DAI/USDC,这对于稳定币来说几乎是不可能被接受的价格。
若希望价格波动能控制在 1 DAI/USDC ±2% 内,则一次交易的量必须小于池内资金量的 1%。这代表资金使用率极低,交易量非常小,所以手续费收入非常少,如此一来无法吸引人投入更多流动性,流动性低造成价格更不稳定,如此反覆产生了负面循环。
由以上分析可知,Balancer 并不适合作为稳定币的交易所,此模型函数曲率过大,价格变化太快,因此我们需要更平滑的曲线。
以下将介绍另一种极端的状况:币币等值。
币币等值:以 mStable 为例,在 mStable 这个协议中, 所有稳定币都是等价的,可以任意以 1 : 1 做交换,永远不会滑价,以数学来表示即为:

建立稳定币互换机制:从Balancer到Curve

池内每种稳定币存量的总和为一定值

此模型称作恒定总量做市商 (Constant Sum Market Maker)。
mStable 中有五种稳定币,分别为:USDT、USDC、DAI、sUSD 及 TUSD。由于一次稳定币的交换仅与两个币种有关联,因此也可暂时将其他变数视为常数,函数图形如下:

建立稳定币互换机制:从Balancer到Curve

以交换 USDC 及 DAI 为例

由于价格不会因供需而改变,因此当外部市场的稳定币间出现价差时,就会有人前来套利,直到其中一边的资金池枯竭为止,会使这些币种在池内失去流动性。

建立稳定币互换机制:从Balancer到Curve

由上图可知,本该由五种稳定币组合而成的 mUSD,现在只剩下 USDC 及 TUSD 还有存量,其他币种皆被洗劫一空。
备注:此处仅以 mStable 的数据来举例 Constant Sum Market Maker 会遇到的问题,并非在表达 mStable 是个全然失败的协议。其实 mStable 还有提出自己的应用场景及相关解决方案,如治理代币 Meta (MTA) 在稳定币脱钩时能起到保护资产的功能,至于实际效果如何……
Curve 并非是为了改进 mStable 而出现的,实际上是先有 Curve,才有 mStable。

Curve 模型设计

Curve 以一些数学技巧,结合了上述两种模型的优点,以下将一步步推导,说明方程式怎么来的。
蓝线曲率太大,价格变化过快;绿线则太直,价格毫无弹性。较理想的稳定币交换模型是建构出介于两者之间的函数。

建立稳定币互换机制:从Balancer到Curve

x(池内USDC数量),Y(池内DAI数量)

P 点为两曲线之交点,此时 USDC 与 DAI 的存量皆为 D/2。将 P 点带入方程式即可求出两式之常数 k。

想要建构出介于两者之间的函数,最简单的方式就是对两式做加权平均。但由于二式的因次(Dimension,或称单位) 不同,所以相加时除了分别设权重为β 及α 之外,还要在下式多乘上D,使两式的因次皆为[数量×数量] 。

建立稳定币互换机制:从Balancer到Curve

加权平均后之方程式

调整α 及β 的大小即可决定新函数的特性要偏向Constant Product 还是Constant Sum,但实际上真正决定新函数特性的是α 及β 的比例,因此我们可以将上式左右同除β ,并将α/β 设成χ。

建立稳定币互换机制:从Balancer到Curve

接着简单分析一下权重大小对此函数的影响。
当 α = 0 或者 α β 时,χ = 0,方程式退化回 Constant Product;
当 β = 0 或者 α β 时,χ = ∞,方程式退化回 Constant Sum。

建立稳定币互换机制:从Balancer到Curve

x(池内USDC数量),Y(池内DAI数量)

到目前这步,我们已经设计出一条曲线,能在价格为 1 : 1 的位置附近稳定价格,有效降低价格的波动,且能透过参数的调整决定价格变化的幅度。但此模型目前仍有个缺陷。若我们希望价格越稳定,则曲线会越接近直线,此时就会面临和mStable 一样的问题:一旦出现较大的价差时,池内其中部分币种可能会被掏空,出现只能卖无法买的局面,使池内流动性剧减。

这种情况不会发生在 Uniswap 或 Balancer 上,在 Constant Product 模型中无论币价如何波动,池内永远都会有币能交易。为达成类似效果,我们希望当池内资产存量偏离平衡点时,曲线能恢复成 Contant Product 的性质——也就是离平衡点越远时,χ 要越小。
引入动态参数 (Dynamic Parameter),为达成上述效果,我们首先观察下图:

建立稳定币互换机制:从Balancer到Curve

横轴为池内 USDC 的数量 x,纵轴为 USDC 及DAI 的数量的乘积 xy。

上方虚线为 Constant Product 函数曲线的 xy 乘积,根据定义,该数值为常数。而 Constant Sum 函数及其他合成函数则是一条开口向下的曲线,该数值离平衡点越远会越小。
我们可以根据以上事实,重新定义 χ,使其成为动态的参数:

建立稳定币互换机制:从Balancer到Curve

蓝色部分为动态参数,数值介于 0 与 1 之间

离平衡点越接近时,蓝色项越接近 1,函数调制效果最佳;
离平衡点越远离时,蓝色项越接近 0,函数退化回 Constant Product。
A 则为放大系数 (Amplification Coefficent),决定此曲线在平衡点附近的曲率——也就是价格的稳定程度:A 越大,越不容易滑价。

将此动态参数带入后方程式变为:

建立稳定币互换机制:从Balancer到Curve

经整理后:

建立稳定币互换机制:从Balancer到Curve

再将其绘成图:

建立稳定币互换机制:从Balancer到Curve

x(池内USDC数量),Y(池内DAI数量)  ;实线为动态参数,虚线为固定参数

由实线及虚线的比较可明显看出,在加上了动态参数后,偏离平衡点位置的将如同 Uniswap,永远都会存在一些些的流动性,池内资产不会归零。
为了方便说明,以上皆以池内仅 2 个币种做计算,理论上 Curve 池中一次能存入更多币种,因此我们可直接将上式推广至任意币种数量 i:

建立稳定币互换机制:从Balancer到Curve

Curve 白皮书中的公式

终于,推导出 Curve 使用的公式了!
那 A 怎么决定?

如前所述,A 为放大系数,决定曲线了价格在 $1 附近的稳定程度,A 越大越不容易滑价。那越不容易滑价越好吗?不尽然。滑不滑价其实并非重点。

以流动性提供者的角度或协议收入角度来看,最大化手续费收入才是首要目标。最大化手续费需要最大化交易量,因此决定 A 值时要考量的是池内币价的波动率。若池内币种锚定 $1 时常不太稳定的话,则要选择较低的 A 值,以免一旦波动出现,池内就会有币种近乎被掏空,导致交易量大减。
初始的 A 值由开发团队以历史币价回测,经模拟后决定最佳化的数值。而服务上线后则可分析实际资金使用率,再经由 DAO 提案以调整 A 值*。根据 Curve Founder u0026 CEO Michael Egorov 的说法,A 值与币价的关系为:
approximately optimal A
= 1 / stdev(prices)
为了验证这个关系是否正确,我做了相关的计算:
首先要知道 Curve 做市模型恒等式上每个点的现价 (Spot Price, Mid Price)

建立稳定币互换机制:从Balancer到Curve

先将方程式写成 explicit function y=f(x) 的形式,再对其微分并加负号,即可计算出现价

建立稳定币互换机制:从Balancer到Curve

此处假设了三种不同的 A 值,取样平衡点附近 ±70% 的资料点去计算价格的标准差。由图上的资料可看出,计算结果与 Michael 的描述相当一致,因此我们只要观察 A 值的大小,就能简单判断此池容许币价波动的程度。
*调整 A 值的过程若不当,会创造出巨大风险,让攻击者有机会夺取池内资金, Curve 有一个严重的漏洞,该漏洞经过数间专业公司的合约审计都没被发现。这提醒了所有参与者要特别注意风险的控管,不要看到一审计过了就放心的梭哈。

滑价 (slippage) 分析

滑价探讨的是一次交易使价格改变的程度,单笔交易的量体越大对价格的影响越大。一般而言,池内资产越多则价格越不容易变化。除此之外,Curve 还透过 A 值来调整曲线在 $1 附近的形状,放大了$1 附近的交易深度。
成交价格 (Trading Price, Effective Price) 的计算方式如下:

建立稳定币互换机制:从Balancer到Curve

建立稳定币互换机制:从Balancer到Curve

以上计算假设交易前池内各资产为平衡状态(也就是 x_0 = y_0 = D/2),再计算大额交易导致的价格变化。
由图可见,Uniswap 的模型很不适合做稳定币交易,Curve 则可透过 A 值的调整有效的放大 $1 附近的交易深度。

如何吸引人增加流动性?

交易深度是交易所的根本,要有足够的深度才能降低滑价,以提供更好的交易环境。为了吸引资金投注提供流动性,Curve 提供了以下几种奖励作为诱因:
手续费收入
每笔交易都会收取 0.04% 的手续费,其中一半给流动性提供者,另一半为 admin fee 会分给 CRV 的持有者,实际分配分配方式由 DAO 决定。

建立稳定币互换机制:从Balancer到Curve

目前给个池的手续费皆相同。 source: https://www.curve.fi/compound

借贷协议及收益聚合器
Curve 中有许多不同的资金池,有些池 (Compound Pool u0026 USDT Pool) 会将资金放至 Compound 中,如此一来除了能赚取交易手续费之外,还可以收到 Compound 产生的借贷利息。

建立稳定币互换机制:从Balancer到Curve

以 Compound 池为例,该池部分 APY 收益源自手续费收入 + lending 利息。 source: https://www.curve.fi

值得特别注意的是,有些池虽然会将资金放到 Compound 中,但目前这两个 Compound 池无法领取 COMP,那些挖出来的 COMP 被永久的锁在合约内。 Curve Dev 已开发完成能领取 COMP 的新合约,目前在审计中。
除了 Compound 外还可选择收益聚合器池 (如 Y Pool 或 PAX Pool),此类池会在动态将资金放至的市场上收益最高的协议。此类池以 DeFi 乐高的方式堆叠出了额外的收益,伴随而来的是额外的风险,在 Curve Deposit 的页面中都会特别说明每个池的潜在风险,使用上需要审慎评估。
另外,由于任何资金的进出都需与其他协议互动,因此无论是存/取款或者交易,都需耗费较高的 gas fee,这对于流动性提供者或交易者也都是负面的影响。

CRV 奖励
目前只要在 Curve 中提供流动性就能持续获得 CRV 作为奖励。而 CRV 为 Curve 的治理代币,持有者可参与 Curve 的治理及分润协议收入。

网页上显示的 APY 为一个范围「+16.28% to 40.70% CRV」,实际能领取的数字取决于个人 CRV 的锁仓量与锁仓时间。以图上的例子来说,最低 APY 16.28%,经锁仓后最高可变为 2.5 倍的 40.70% 。

建立稳定币互换机制:从Balancer到Curve

以 Compound 池为例,APY 的数字会根据 CRV 的现价即时调整。 source: https://www.curve.fi

为什么要有这么多种池?

Curve 的数学模式允许池内存在任意数量的币种,那为什么不把所有的币都放到同个池子内,集中手续费收入呢?
要是因为任何可能原因使 USDT 与 USD 严重脱钩,迅速贬值,那 Curve 池会发生什么事?

由于 Curve 的 AMM 机制是强制让价格稳定于 1 美元附近,会无视外部市场对 USDT 的定价,所以当 USDT 归零时大家就会跑来 Curve 交易,把 USDT 换成其他仍具价值的稳定币。这会使池内其他稳定币近乎被掏空,只剩下大量的 USDT。如此一来,流动性提供者仅能换回大量且没价值的 USDT,将承受极大的损失。
由上说明可知,池内一次存在太多种币种是非常危险的,只要其中一个稳定币崩盘,就会连带影响池内其他币种。简单来说就是,一颗老鼠屎会坏了整个池。
此外还有个问题。以 Curve 目前的设计来说,流动池一旦开启,就无法增加/减少池内币种,若想要上架一个新的稳定币,则必须建立新合约,开启新的资金池。但开太多池会使 DIA、USDC、USDT 等常见稳定币太过于分散,可能会使每个池的流动性都不佳,为解决这些问题, Curve 提出了 Base/MetaPools 这概念。

BasePools u0026 MetaPools
先以示意图来说明:

建立稳定币互换机制:从Balancer到Curve

Base/Meta Pools 示意图(没按照实际资金使用比例绘制)

MetaPool 是一种依附于 Base Pool 的池,可与 Base Pool 共享部分流动性,且有效分割风险。这样能在不直接稀释主流稳定币的情况下,替其他小币创造交易深度。目前 Curve 唯一的 Base Pool 为 3pool,由共识最强的三种稳定币 DAI、USDC 及 USDT 所组成。
以下以数字说明该池如何运作:
假设现在 3pool 内共有 100 DAI + 100 USDC + USDT,且共发行了 300 个 3CRV(此为 3pool 的 LP token)。且我将手中的 30 个 3CRV (占总体 10%)存入 HUSD Pool 这个 MetaPool 中,换取 husd3CRV (HUSD Pool 的 LP token)。
此时 HUSD Pool 内除了有 HUSD 之外,还会与 3pool 共享这 10% 的流动性(包含 30 DAI + 30 USDC + 30 USDT)。
对于 MetaPool 的流动性提供者来说,这种做法的优缺点如下:

优点:更高的收益
可以同时赚取 Base u0026 MetaPools 双边的交易手续费。但无法同时赚取两边的 CRV, 因为要产生 CRV 奖励必须将 LP token 质押至 Gauge。

缺点:更大的风险
若是 HUSD 不幸崩盘,则 HUSD pool 中的 DAI、USDC 及 USDT 将被洗劫一空,仅剩 HUSD 在池内,如此一来 3pool 就会失去这 10% 的流动性。但这并不会影响到另外 270 个 3CRV 的持有者,他们仍然握有另外 90% 的资金。
简单来说就是 3CRV 的持有者可以自由选择是否要曝险于其他的稳定币上,以换取更高的收益,这种做法能让较新或较小的稳定币更容易地获得流动性。
每个池的价格及深度都不同,要如何交易?
作为一个交易者,最重要的是成交于最好的价格。在 Curve 中你仅需要简单的选取自己要交易的币种,并输入自己想交易的数量即可。网页前端会自动帮你在所有池中比价,并计算出最划算的交易方式,此做法与 Balancer 类似,当交易量较大时能同时在数个池做交换(见下图)。

建立稳定币互换机制:从Balancer到Curve

上方选取币种并输入数量;中间选择想互换的池;下方输入滑价上限及 gas fee。网页前端会自动计算出最划算的交易方式。

会有无常损失吗?
而作为一个流动性提供者,最在乎的可能会是 Impermanent Loss,若该损失大于手续费收入及挖矿奖励则会产生亏损。
Curve 只是个变形的 Uniswap,所以当币价变化时,流动性提供者当然也需承受 Impermanent Loss,且与 Uniswap 相比,Curve 的 Impermanent Loss 很大,也很小。
很大是因为:
由于 A 值的放大效果,一但价格偏离 $1 时,币价就会急速上升/下降,且两币种数量会急剧的变更不平衡。

建立稳定币互换机制:从Balancer到Curve

很小是因为:
正常情况下稳定币不会在 -100% +300% 之间波动,±5% 会是较为合理的波动范围,因此我们改以此区间重绘上图:

建立稳定币互换机制:从Balancer到Curve

由图可看出,在 A=1000 时,仅管币价 ±5% 波动,无常损失仍不会超过 -2.5%,该损失以目前的总体收益来说,回本赚钱绝对不是梦。

注意,此处分析仅为粗估,供数字数量级做参考。
以上计算要成立有两个假设:
1. 池内仅有 2 种稳定币。
2. 增加流动性时池内资产在平衡状态,且等比例加入。
由于 Curve 的数学模型相对复杂,实际状况会比上述计算复杂得多,因此较难计算出每个情况下精确的数值,此处仅提供一个概念作参考。
所以到底要注意什么?
实际在增加/移除流动性时确实也不需考量到上述数学,只要你相信稳定币会在 $1 附近震荡,不会永远折价或溢价,那仅需记得一个原则就够了:

让池内各个币种数量越平衡越好。
若存入池内占比较少的币种,能立即获得额外收益;若存入池内占比较高的币种,则会因滑价而导致些许亏损。
实际数字会显示于存/取款界面如下方:

建立稳定币互换机制:从Balancer到Curve

奖励为绿匡 (标注为 Bonus);滑价则为红匡 (标注为 Slippage)

以图上例子来说,因为池内 DAI 存量较少,所以存入 DAI 会有 Bonus 0.732%。
此奖励并不是额外发放的,产生原因为目前 DAI 在池内价值高于 $1,因此存入 DAI 相当于将手上部分的 DAI 高价卖成更多的 USDC 及 USDT,此即收益的来源。而存入另外两种币相当于在低点出售该币种,会导致手上稳定币总量减少。
额外补充:Curve 收益统计

建立稳定币互换机制:从Balancer到Curve

3pool 池内收益统计。 source: https://www.curve.fi/combinedstats

由上图统计表可看出,只要有人持续在交易,Curve 就能捕获价值以累积收益。蓝线收益以 real price 做计算,计价单位为 USDC。会上下震荡是由于池内稳定币的比例改变导致的价格浮动。黑线收益则是以 virtual price 做计算,该价格只涨不跌,且不随币价波动。代表的是当池内回到平衡状态时,每个 LP token 的价值。以数学是来表达即为:virtual price = D/(amount of LP tokens)。

结论

单以做市机制设计来说,Curve 是个相当优良的稳定币互换协议,是一个有效率的稳定币交换系统,能根据市场现况弹性的调整参数,更加完善了 DeFi 的世界。

后记

做研究写文章的过程对我而言是相当有趣的,总能从中发现许多巧妙且聪明的机制设计,且还能以分散式、全自动的方式在以太坊上永续运行。

免责声明

发文时比特币价格:$15778

当前比特币价格:[crypto coins=”BTC” type=”text” show=”price”]

当前比特币涨幅:[crypto coins=”BTC” type=”text” show=”percent”]

免责声明:

本文不代表路远网立场,且不构成投资建议,请谨慎对待。用户由此造成的损失由用户自行承担,与路远网没有任何关系;

路远网不对网站所发布内容的准确性,真实性等任何方面做任何形式的承诺和保障;

网站内所有涉及到的区块链(衍生)项目,路远网对项目的真实性,准确性等任何方面均不做任何形式的承诺和保障;

网站内所有涉及到的区块链(衍生)项目,路远网不对其构成任何投资建议,用户由此造成的损失由用户自行承担,与路远网没有任何关系;

路远区块链研究院声明:路远区块链研究院内容由路远网发布,部分来源于互联网和行业分析师投稿收录,内容为路远区块链研究院加盟专职分析师独立观点,不代表路远网立场。

  • 我的微信
  • 这是我的微信扫一扫
  • weinxin
  • 我的电报
  • 这是我的电报扫一扫
  • weinxin
chatGPT账号
路远

发表评论

您必须登录才能发表评论!