浅谈稳定币互换机制:从Balancer 到Curve

本文将探讨Curve 这个去中心化的稳定币互换协议。先从Balancer 出发,根据需求修改模型,一步步推导出Curve 所使用的公式。再根据该模型的特性分析其优缺点及相关延伸应用。

说明:本文作者为 Ethan Chen,原文为繁中版本,发布于作者 Medium,授权 DAppChaser 发布简体版本,如引用,请注明来源;如转载,请先联系,标注来源,附上作者简介。

浅谈稳定币互换机制:从Balancer 到Curve

意义不明的LOGO,大概是要表示自己很酷的意思,与Curve 实际用的做市数学模型没啥关联。

稳定币为一种锚定法定货币价值的虚拟货币,可在这动荡的市场中作为相对可靠的避险资产。

以美元为例,市场常见且流通性足够的美元稳定币就超过3 种,每种的应用场景及背后的风险皆不相同,因而市场上产生了稳定币之间互换的需求。

本文将探讨Curve 这个去中心化的稳定币互换协议。先从Balancer 出发,根据需求修改模型,一步步推导出Curve 所使用的公式。再根据该模型的特性分析其优缺点及相关延伸应用。

稳定币稳定吗?

理想上,美元稳定币的价值应恒等于1 USD,但实际上却常有着不小的波动,其中一个原因为每种稳定币的发行机制不同,而对应了不一样的风险。

发行机制可简单分为下列三种:

  1. 法币资产抵押型:
    以实际美元做为抵押而发行,会有储备金不足造成的挤兑风险
    最具代表性的为 Tether 发行的 USDT 及 CoinbaseCircle 发行的 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)。

若对Balancer做市机制不熟悉的话可参考下文说明,此处仅简单带过重点:

《浅谈自动做市商(AMMs)机制:从 Uniswap 理解 Balancer》

由于一次的互换仅与两个变数有关,其他变数可暂时当作常数。

为方便说明,假设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

source: https://app.mstable.org/#/swap date: 2020/11/3

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

Curve 模型设计

Curve 以一些数学技巧,结合了上述两种模型的优点,以下将一步步推导,说明方程式怎么来的。

蓝线曲率太大,价格变化过快;绿线则太直,价格毫无弹性。

较理想的稳定币交换模型是建构出介于两者之间的函数。

浅谈稳定币互换机制:从Balancer 到Curve

P点为两曲线之交点,此时 USDC 与 DAI 的存量皆为D/2。

将P点带入方程式即可求出两式之常数 k

浅谈稳定币互换机制:从Balancer 到Curve

右下方之中括弧为因次分析

想要建构出介于两者之间的函数,最简单的方式就是对两式做加权平均

但由于二式的因次( Dimension,或称单位)不同,所以相加时除了分别设权重为β及α之外,还要在下式多乘上D,使两式的因次皆为[数量×数量] 。

浅谈稳定币互换机制:从Balancer 到Curve

加权平均后之方程式

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

浅谈稳定币互换机制:从Balancer 到Curve

接着简单分析一下权重大小对此函数的影响

当α = 0 或者α << β 时,χ = 0,方程式退化回 Constant Product;

当β = 0 或者α >> β 时,χ = ∞,方程式退化回 Constant Sum。

浅谈稳定币互换机制:从Balancer 到Curve

到目前这步,我们已经设计出一条曲线,能在价格为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

实线为动态参数,虚线为固定参数

由实线及虚线的比较可明显看出,在加上了动态参数后,偏离平衡点位置的将如同 Uniswap,永远都会存在一些些的流动性,池内资产不会归零。

为了方便说明,以上皆以池内仅2 个币种做计算,理论上 Curve 池中一次能存入更多币种,因此我们可直接将上式推广至任意币种数量i:

浅谈稳定币互换机制:从Balancer 到Curve

终于,推导出 Curve 使用的公式了!

那 A 怎么决定?

如前所述,A 为放大系数,决定曲线了价格在$1 附近的稳定程度,A 越大越不容易滑价。

那越不容易滑价越好吗?不尽然。

滑不滑价其实并非重点。

以流动性提供者的角度或协议收入角度来看,最大化手续费收入才是首要目标。

最大化手续费需要最大化交易量,因此决定A值时要考量的是池内币价的波动率。若池内币种锚定$1时常不太稳定的话,则要选择较低的A值,以免一但波动出现,池内就会有币种近乎被掏空,导致交易量大减。

初始的A值由开发团队以历史币价回测,经模拟后决定最佳化的数值。

而服务上线后则可分析实际资金使用率,再经由DAO提案以调整A值*。

根据 Curve Founder & 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 Vulnerability Report。笔者认为此篇文章相当值得一读,文中点出了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 & 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 的数学模式允许池内存在任意数量的币种,那为什么不把所有的币都放到同个池子内,集中手续费收入呢?

因为这样非常危险,设想以下情况真实发生:

浅谈稳定币互换机制:从Balancer 到Curve

要是因为任何可能原因使 USDT 与 USD 严重脱钩,迅速贬值,那Curve 池会发生什么事?

由于 Curve 的 AMM机制是强制让价格稳定于1美元附近,会无视外部市场对USDT的定价,所以当 USDT 归零时大家就会跑来 Curve交易,把 USDT换成其他仍具价值的稳定币。这会使池内其他稳定币近乎被掏空,只剩下大量的 USDT。如此一来,流动性提供者仅能换回大量且没价值的 USDT,将承受极大的损失。

由上说明可知,池内一次存在太多种币种是非常危险的,只要其中一个稳定币崩盘,就会连带影响池内其他币种。简单来说就是,一颗老鼠屎会坏了整个池。

此外还有个问题。以 Curve 目前的设计来说,流动池一但开启,就无法增加/减少池内币种,若想要上架一个新的稳定币,则必须建立新合约,开启新的资金池。

但开太多池会使 DAI、USDC、USDT 等常见稳定币太过于分散,可能会使每个池的流动性都不佳,为解决这些问题, Curve 提出了 Base/MetaPools 这概念。

BasePools & MetaPools

先以示意图来说明:

浅谈稳定币互换机制:从Balancer 到Curve

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

MetaPool 是一种依附于 Base Pool的池,可与 Base Pool共享部分流动性,且有效分割风险。这样能在不直接稀释主流稳定币的情况下,替其他小币创造交易深度。

目前Curve 唯一的 Base Pool 为 3pool,由共识最强的三种稳定币 DAI、USDC 及USDT 所组成。

以下以数字说明该池如何运作:假设现在 3pool 内共有100 DAI + 100 USDC + 100 USDT,且共发行了300 个3 CRV(此为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 & 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,若该损失大于手续费收入及挖矿奖励则会产生亏损。

对 Impermanent Loss的概念不熟悉的话可参考下文说明:

《浅谈无常损失(Impermanent Loss)及其避险方式》

Curve只是个变形的Uniswap,所以当币价变化时,流动性提供者当然也需承受Impermanent Loss,且与Uniswap相比,Curve 的 Impermanent Loss很大,也很小。

很大是因为:

由于A值的放大效果,一但价格偏离$1时,币价就会急速上升/下降,且两币种数量会急剧的变更不平衡。

浅谈稳定币互换机制:从Balancer 到Curve

很小是因为:

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

浅谈稳定币互换机制:从Balancer 到Curve

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

注意,此处分析仅为粗估,供数字数量级做参考。
以上计算要成立有两个假设:
1.池内仅有2种稳定币。
2.增加流动性时池内资产在平衡状态,且等比例加入。

由于Curve 的数学模型相对复杂,实际状况会比上述计算复杂得多,因此较难计算出每个情况下精确的数值,此处仅提供一个概念作参考。

所以到底要注意什么啦

实际在增加/移除流动性时确实也不需考量到上述数学,只要你相信稳定币会在$1附近震荡,不会永远折价或溢价,那仅需记得一个原则就够了:让池内各个币种数量越平衡越好。

若存入池内占比较少的币种,能立即获得额外bonus;若存入池内占比较高的币种,则会因滑价而导致些许亏损。

实际数字会显示于存/取款介面下方:

浅谈稳定币互换机制:从Balancer 到Curve

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

以图上例子来说,因为池内DAI 存量较少,所以存入DAI 会有Bonus 0.732%。

此奖励并不是额外发放的,产生原因为目前 DAI 在池内价值高于$1,因此存入DAI 相当于将手上部分的 DAI 高价卖成更多的 USDC 及 USDT,此即 Bonus 的来源。而存入另外两种币相当于在低点出售该币种,会导致手上稳定币总量减少。

额外补充: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)。

More than Stablecoins

任何锚定相同标的的币种都适合在 Curve 上交易

Curve 的应用场景不仅限于稳定币互换。

例如 renBTCwBTCsBTC 都是锚定 Bitcoin 价值的 ERC-20 代币,有些是中心化托管发行,有些则是分散式的跨链协议,因发行方式的不同而有不同的风险,进而产生了互换的需求。

理想上这些不同的比特币们要有相同的价值,只要理想上能以1:1互换,就适用Curve的数学模型。

浅谈稳定币互换机制:从Balancer 到Curve

sbtc pool,能互换三种不同稳定币。source: https://www.curve.fi/sbtc

结论

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

后记

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

虽有趣但其实也相当不容易,写文章写到失眠、眼睛看萤幕看到发炎、私讯骚扰Curve CEO 问问题、睡到半夜惊醒,起来算Impermanent loss,连在梦中都还在算数学画曲线⋯⋯最后总算是完成了这篇Curve 白皮书的解析(翻译)。

References:

  • Curve Whitepaper
    其实白皮书中有详细的推导过程,本篇文只是附加更更细的说明。

原创文章,作者:Ehan Chen,如若转载,请注明出处:https://www.dappchaser.com/an-introduction-to-stablecoin-swaps-from-balancer-to-curve/

发表评论

邮箱地址不会被公开。 必填项已用*标注

评论列表(3条)

  • Promesx 2021年3月10日 13:18

    半小时只能利用记忆里还残存的高中数学知识看懂1/5。作为已入学术深坑四载有余的咸鱼,对写作背后素材收集和整理的艰辛深有体会,空余会好好研读,Respect.

  • ttchen 2021年3月23日 18:40

    学习了

  • 半夏 2024年1月16日 14:30

    此时 HUSD Pool内除了有 HUSD 之外,还会与 3pool共享这10%的流动性(包含30 DAI + 30 USDC + 30 USDT)
    这一段应该修改成,因为只占有了10%的流动性,初始是100
    “此时 HUSD Pool内除了有 HUSD 之外,还会与 3pool共享这10%的流动性(包含10 DAI + 10 USDC + 10 USDT)”

    感谢作者科普,认真学习到了

联系我们

邮件:contact@dappchaser.com

QR code