Curve Finance是DeFi领域最重要的项目之一,相信行业从业者都对该项目的机制有基本的了解,本文详细解析该项目的Stable Swap功能(即V1版本),揭示其产品设计背后的数学思想。
1. 基础做市方程
Curve Finance的Stable Swap功能旨在实现一种稳定币兑换的做市机制,该机制需要满足2个条件:
在大部分的做市区间中能够满足接近1:1兑换的用户需求。
在满足第1条的前提下,极端情况下依然能够做到无限流动性,以防止资金池枯竭。
相信许多人都知道,以上两个条件是互相矛盾的,且分别对应两个不同的做市方程,以两种代币X和Y为例:
满足第一个条件,需要两种代币的和为常数K,在这种情况下,用户每往池子中增加1枚X,就能从池子种相应的兑换出1枚Y,反之亦然,从而实现1:1的兑换。但这种做市机制的缺点在于,一旦用户投入的X数量超过了常数K,Y就会变成负值,也就意味着池子流动性被掏空。
\(X+Y=K\)满足第二个条件,需要两种代币的积为常数K,这也是大名鼎鼎的Uniswap做市方程。在这种情况下,无论用户往池子中增加多少X,Y都只会趋于0而不可能等于0,因此池子中X和Y的数量都不会被提空,从而实现无限的流动性。
\(X*Y=K\)
这两个方程各自能满足产品的部分需求,Curve Finance创始人Michael Egorov 天才般地将两者进行了组合,形成了Curve独特的Stable Swap做市方程。
2. 多币种拓展
在讲解组合的方法之前,我们先对这两个方程做一下拓展。当前这两个做市方程都只允许两个变量,而Curve想要满足支持多个代币在同一个池子的兑换,即从变量X和Y拓展到变量X1,X2,······Xn。拓展的方法如下。
方程1变化为如下形式,即从2个不同的变量x和y之和为常数,拓展至n个不同的变量x之和是常数。
\(\sum_{i=1}^n x_i=\sum_{i=1}^{n}\frac{D}{n}=D\)方程2变化为如下形式,及从2个不同的变量x和y之积为常数,拓展至n个不同的变量x之积是常数。
\(\prod_{i=1}^{n}x_i=\prod_{i=1}^{n}\frac{D}{n}=({\frac{D}{n}})^n\)
3. 做市方程合并
下面我们讲解Michael的合并思路,首先将上述两个方程直接相加进行组合。
由于这两个等式是直接相加进行的组合,所以如果两个等式存在幂级差距的话,就会导致只有在D接近1的时候,两个等式才有比较意义。简单举例,实际情况下池子中存放资金会比较大,假设流动性D=10,000,代币数量n=2时,(D/n)^n=(10,000/2)^2=25,000,000,后者比前者大了3个以上的数量级,会导致前者的影响微乎其微,进而导致实际的做市方程无限接近于方程2,为了解决这个问题,Michael给方程前半部分的等式两边分别乘以D^(n-1)这个常数,以统一幂级至n次幂如下。
可是,依然存在一个问题,即需要一个方法,能够调整前后两项对做市方程的相对影响,这个在数学上很容易实现,即在其中一方增加一个新的参数,Michael选择将参数加在前者,即如下公式。
至此,我们得到了Michael对Curve推导的第一阶段公式,读者可对比Curve V1白皮书第4页末。
4. 动态参数设定
现在,我们面临一个新的问题,即Curve想要实现的是,当池子中所有资金的存量都足够的时候(即所有的x金额接近,或者至少都不接近0时),能够尽可能以方程1为主来为客户进行1:1的兑换。而当池子中的某一个或几个代币的资金存量不足的时候(即某一个或几个x趋近于0时),能够切换到以方程2为主来偏离1:1的价格,以较大的滑点为代价为客户提供无限流动性。
仅对于上述做市方程而言,方程1和方程2的影响孰大孰小取决于参数χ的大小。由于参数χ是加在方程1上面的,所以:
χ越大,则做市方程越趋近于方程1,如果χ是无穷大,则做市方程就等于方程1。
相反χ越小,则做市方程越趋近于方程2,如果χ是0,则做市方程就等于方程2。
结合上述推导,我们需要实现的方法需要满足如下几点:
χ不能为常量,而必须是一个和x相关的动态变化量
当池子中x的数量越平衡时,χ越大。
池子中x的数量越不平衡时,χ越小。
当存在一个或多个x的数量趋近于0时,χ也要趋近于0。
基于以上特点,最符合χ值特征的就是x的乘积,Michael给出的方法如下。
我们对如上方法进行拆解,其分为三个部分。
核心部分是分子的右半部分,即x的乘积
由于此前提到的幂级关系的问题,当分子上增加了n次幂,分母必须有相同幂级的常数来抵消幂级影响,因此分母上增加了同样是n次幂的常数。
最后,为了能够人为调整方程1和方程2之间的相对影响力以获取最佳做市方程,在分子上增加常数A,完成χ的构建。
将χ的值代入做市方程后得到Curve V1的核心做市方程如下。
至此,我们得到了Curve V1版本的核心做市方程,读者可自行对比白皮书第5页的公式。
5. 参数模拟
产品模型完成后,还有三个优化问题需要解决。
常数A如何设置能达到最优。
交易费率如何设置能达到最优。
投入资金池的LP用户的年化收益率能够达到多少,是否足以吸引到用户。
Michael使用的方法是金融工程中比较普遍的历史数据模拟。白皮书写于2019年11月,Michael使用当时体量最大的三个稳定币USDT、USDC、DAI作为模拟对象。价格选取的是:
Coinbase Pro DAI/USDC
Binance USDC/USDT
HitBtc USDT/DAI
选取了从2019年5月至10月共6个月的数据,并假设资金池中存入了$30,000的流动性。仅在相对价格变化超出设定阈值时进行模拟交易,具体模拟参数没有在白皮书中公布。模拟的结果如下:
常数A的最优设置是:85。
最优兑换手续费率是:0.06%。
LP用户年化收益率即APR是:312%。
这里再啰嗦两句。首先,对于常数A来说,理解了我们之前的公式推衍逻辑的读者应该能明白其现实意义,即在池中所有代币数量都相等的最平衡情况下,恒定和方程相对恒定积方程的作用倍数。由于方程设计的初衷就是在越是平衡的状态下,越要以恒定和方程为主,所以A必然是一个相对较大但不能有产生明显幂级差距的数字,这里选用85从数学思想上是合理的。
其次,Michael选用的流动性参数相比产品上线后的实际情况实在太小了,这也是导致后面两个参数和实际情况不符,尤其是APR差了接近100倍。
白皮书的最后Michael还提到了会对一些收益型代币,如cToken进行专项产品优化,这才最终Curve的成型产品中有体现,如果后续我们讨论其代码的工程实现再展开讨论,这里不复赘言。
6. 总结
读者如有兴趣品味Michael亲笔原文请移步白皮书,Curve白皮书写的相对简洁,行文很短,没有大篇幅的行业知识普及,也没有涉及具体的代码工程实现,这在行业内也属于一股清流。
