淺談穩定幣互換機制:從 Balancer 到 Curve

意義不明的 LOGO,大概是要表示自己很酷的意思,與 Curve 實際用的做市數學模型沒啥關聯。

穩定幣為一種錨定法定貨幣價值的虛擬貨幣,可在這動盪的市場中作為相對可靠的避險資產。

以美元為例,市場常見且流通性足夠的美元穩定幣就超過 3 種,每種的應用場景及背後的風險皆不相同,因而市場上產生了穩定幣之間互換的需求。

本文將探討 Curve 這個去中心化的穩定幣互換協議。先從 Balancer 出發,根據需求修改模型,一步步推導出 Curve 所使用的公式。再根據該模型的特性分析其優缺點及相關延伸應用。

穩定幣穩定嗎?

理想上,美元穩定幣的價值應恆等於 1 USD,但實際上卻常有著不小的波動,其中一個原因為每種穩定幣的發行機制不同,而對應了不一樣的風險。

發行機制可簡單分為下列三種:

此外,穩定幣也如同其他幣種一般,會因市場供需而產生不一樣的價格。如流動性挖礦熱潮中,不少農場以 DAI 做為農具,就使得 DAI 的價格迅速攀升。

2020/1/1 至 2020/11/12 的穩定幣價格走勢圖。source: CoinGecko

由上圖可見,穩定幣其實不太穩定。
特別是在 312 慘案時,為避免 MakerDAO 中的抵押物 ETH 被清算而導致 DAI 的需求量突然大增使幣價大漲,當時在一些交易所甚至出現超過 10% 的溢價。

總合以上所述,價差源自於需求及風險的不同,價格則是在交易中產生,所以市場上需要一個能交換各種的環境。

如何交換穩定幣?

在 Balancer 建立資金池?

要想建立一個能交換多種穩定幣的環境,一個簡單的方式就是直接在 Balancer 中建立一個資金池,其中包含了各種穩定幣,且讓每個幣種有著相同的權重。

池內各資產數量會遵守以下方程式:

Balancer AMM 模型,設各幣種權重相等

此模型稱作恆定乘積做市商 (Constant Product Market Maker)。

若對 Balancer 做市機制不熟悉的話可參考下文說明,此處僅簡單帶過重點:
《淺談自動做市商 (AMMs) 機制:從 Uniswap 理解 Balancer》

由於一次的互換僅與兩個變數有關,其他變數可暫時當作常數。
為方便說明,假設 x 為池內 USDC 總量,y 為 池內 DAI 總量,將方程式作圖如下:

現價等於該點切線之斜率(取絕對值)

圖中 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 做交換,永遠不會滑價,以數學來表示即為:

池內每種穩定幣存量的總和為一定值

此模型稱作恆定總量做市商 (Constant Sum Market Maker)。

mStable 中有五種穩定幣,分別為:USDT、USDC、DAI、sUSD 及 TUSD。

由於一次穩定幣的交換僅與兩個幣種有關聯,因此也可暫時將其他變數視為常數,函數圖形如下:

以交換 USDC 及 DAI 為例

由於價格不會因供需而改變,因此當外部市場的穩定幣間出現價差時,就會有人前來套利,直到其中一邊的資金池枯竭為止,會使這些幣種在池內失去流動性。

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 以一些數學技巧,結合了上述兩種模型的優點,以下將一步步推導,說明方程式怎麼來的。

藍線曲率太大,價格變化過快;綠線則太直,價格毫無彈性。
較理想的穩定幣交換模型是建構出介於兩者之間的函數。

P 點為兩曲線之交點,此時 USDC 與 DAI 的存量皆為 D/2。
將 P 點帶入方程式即可求出兩式之常數 k

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

想要建構出介於兩者之間的函數,最簡單的方式就是對兩式做加權平均
但由於二式的因次 (Dimension,或稱單位) 不同,所以相加時除了分別設權重為 β 及 α 之外,還要在下式多乘上 D,使兩式的因次皆為 [數量×數量] 。

加權平均後之方程式

調整 α 及 β 的大小即可決定新函數的特性要偏向 Constant Product 還是 Constant Sum,但實際上真正決定新函數特性的是 α 及 β 的比例,因此我們可以將上式左右同除 β ,並將 α/β 設成 χ。

接著簡單分析一下權重大小對此函數的影響

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

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

到目前這步,我們已經設計出一條曲線,能在價格為 1 : 1 的位置附近穩定價格,有效降低價格的波動,且能透過參數的調整決定價格變化的幅度。

但此模型目前仍有個缺陷。若我們希望價格越穩定,則曲線會越接近直線,此時就會面臨和 mStable 一樣的問題:一但出現較大的價差時,池內其中部分幣種可能會被掏空,出現只能賣無法買的局面,使池內流動性劇減。

這種情況不會發生在 Uniswap 或 Balancer 上,在 Constant Product 模型中無論幣價如何波動,池內永遠都會有幣能交易。

為達成類似效果,我們希望當池內資產存量偏離平衡點時,曲線能恢復成 Contant Product 的性質——也就是離平衡點越遠時,χ 要越小

引入動態參數 (Dynamic Parameter)

為達成上述效果,我們首先觀察下圖:

橫軸為池內 USDC 的數量 x,縱軸為 USDC 及DAI 的數量的乘積 xy。

上方虛線為 Constant Product 函數曲線的 xy 乘積,根據定義,該數值為常數。
而 Constant Sum 函數及其他合成函數則是一條開口向下的曲線,該數值離平衡點越遠會越小

我們可以根據以上事實,重新定義 χ,使其成為動態的參數:

藍色部分為動態參數,數值介於 0 與 1 之間

離平衡點越接近時,藍色項越接近 1,函數調製效果最佳;
離平衡點越遠離時,藍色項越接近 0,函數退化回 Constant Product。

A 則為放大係數 (Amplification Coefficent),決定此曲線在平衡點附近的曲率——也就是價格的穩定程度:A 越大,越不容易滑價。

將此動態參數帶入後方程式變為:

經整理後:

再將其繪成圖:

實線為動態參數,虛線為固定參數

由實線及虛線的比較可明顯看出,在加上了動態參數後,偏離平衡點位置的將如同 Uniswap,永遠都會存在一些些的流動性,池內資產不會歸零。

為了方便說明,以上皆以池內僅 2 個幣種做計算,理論上 Curve 池中一次能存入更多幣種,因此我們可直接將上式推廣至任意幣種數量 i:

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)

先將方程式寫成 explicit function y=f(x) 的形式,再對其微分並加負號,即可計算出現價

此處假設了三種不同的 A 值,取樣平衡點附近 ±70% 的資料點去計算價格的標準差。

由圖上的資料可看出,計算結果與 Michael 的描述相當一致,因此我們只要觀察 A 值的大小,就能簡單判斷此池容許幣價波動的程度。

*調整 A 值的過程若不當,會創造出巨大風險,讓攻擊者有機會奪取池內資金,詳情可參考此篇文章:”Curve Vulnerability Report”。筆者認為此篇文章相當值得一讀,文中點出了 Curve 一個嚴重的漏洞,該漏洞經過數間專業公司的合約審計都沒被發現。這提醒了所有參與者要特別注意風險的控管,不要看到一審計過了就放心的梭哈。

滑價 (slippage) 分析

滑價探討的是一次交易使價格改變的程度,單筆交易的量體越大對價格的影響越大。

一般而言,池內資產越多則價格越不容易變化。除此之外,Curve 還透過 A 值來調整曲線在 $1 附近的形狀,「放大了」$1 附近的交易深度。

成交價格 (Trading Price, Effective Price) 的計算方式如下:

以上計算假設交易前池內各資產為平衡狀態(也就是 x_0 = y_0 = D/2),再計算大額交易導致的價格變化。

由圖可見,Uniswap 的模型很不適合做穩定幣交易,Curve 則可透過 A 值的調整有效的放大 $1 附近的交易深度。

如何吸引人增加流動性?

交易深度是交易所的根本,要有足夠的深度才能降低滑價,以提供更好的交易環境。為了吸引資金挹注提供流動性,Curve 提供了以下幾種獎勵作為誘因:

手續費收入

每筆交易都會收取 0.04% 的手續費,其中一半給流動性提供者,另一半為 admin fee 會分給 CRV 的持有者,實際分配分配方式由 DAO 決定。

目前給個池的手續費皆相同。source: https://www.curve.fi/compound

借貸協議及收益聚合器

Curve 中有許多不同的資金池,有些池 (Compound Pool & USDT Pool) 會將資金放至 Compound 中,如此一來除了能賺取交易手續費之外,還可以收到 Compound 產生的借貸利息。

以 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% 。

以 Compound 池為例,APY 的數字會根據 CRV 的現價即時調整。source: https://www.curve.fi

為什麼要有這麼多種池?

Curve 的數學模式允許池內存在任意數量的幣種,那為什麼不把所有的幣都放到同個池子內,集中手續費收入呢?

因為這樣非常危險,設想以下情況真實發生:

要是因為任何可能原因使 USDT 與 USD 嚴重脫鉤,迅速貶值,那 Curve 池會發生什麼事?

由於 Curve 的 AMM 機制是強制讓價格穩定於 1 美元附近,會無視外部市場對 USDT 的定價,所以當 USDT 歸零時大家就會跑來 Curve 交易,把 USDT 換成其他仍具價值的穩定幣。這會使池內其他穩定幣近乎被掏空,只剩下大量的 USDT。如此一來,流動性提供者僅能換回大量且沒價值的 USDT,將承受極大的損失。

由上說明可知,池內一次存在太多種幣種是非常危險的,只要其中一個穩定幣崩盤,就會連帶影響池內其他幣種。簡單來說就是,一顆老鼠屎會壞了整個池。

此外還有個問題。以 Curve 目前的設計來說,流動池一但開啟,就無法增加/減少池內幣種,若想要上架一個新的穩定幣,則必須建立新合約,開啟新的資金池。

但開太多池會使 DAI、USDC、USDT 等常見穩定幣太過於分散,可能會使每個池的流動性都不佳,為解決這些問題, Curve 提出了 Base/MetaPools 這概念。

BasePools & MetaPools

先以示意圖來說明:

Base/Meta Pools 示意圖(沒按照實際資金使用比例繪製)

MetaPool 是一種依附於 Base Pool 的池,可與 Base Pool 共享部分流動性,且有效分割風險。這樣能在不直接稀釋主流穩定幣的情況下,替其他小幣創造交易深度。

目前 Curve 唯一的 Base Pool 為 3pool,由共識最強的三種穩定幣 DAI、USDC 及 USDT 所組成。

以下以數字說明該池如何運作:

假設現在 3pool 內共有 100 DAI + 100 USDC + 100 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 & MetaPools 雙邊的交易手續費。
(但無法同時賺取兩邊的 CRV, 因為要產生 CRV 獎勵必須將 LP token 質押至 Gauge。)

缺點:更大的風險
若是 HUSD 不幸崩盤,則 HUSD pool 中的 DAI、USDC 及 USDT 將被洗劫一空,僅剩 HUSD 在池內,如此一來 3pool 就會失去這 10% 的流動性。

但這並不會影響到另外 270 個 3CRV 的持有者,他們仍然握有另外 90% 的資金。

簡單來說就是 3CRV 的持有者可以自由選擇是否要曝險於其他的穩定幣上,以換取更高的收益,這種做法能讓較新或較小的穩定幣更容易地獲得流動性。

每個池的價格及深度都不同,要如何交易?

作為一個交易者,最重要的是成交於最好的價格。

在 Curve 中你僅需要簡單的選取自己要交易的幣種,並輸入自己想交易的數量即可。網頁前端會自動幫你在所有池中比價,並計算出最划算的交易方式,此做法與 Balancer 類似,當交易量較大時能同時在數個池做交換(見下圖)。

上方選取幣種並輸入數量;中間選擇想互換的池;下方輸入滑價上限及 gas fee。網頁前端會自動計算出最划算的交易方式。

會有無常損失嗎?

而作為一個流動性提供者,最在乎的可能會是 Impermanent Loss,若該損失大於手續費收入及挖礦獎勵則會產生虧損。

對 Impermanent Loss 的概念不熟悉的話可參考下文說明:
《淺談無常損失 (Impermanent Loss) 及其避險方式》

Curve 只是個變形的 Uniswap,所以當幣價變化時,流動性提供者當然也需承受 Impermanent Loss,且與 Uniswap 相比,Curve 的 Impermanent Loss 很大,也很小。

很大是因為:
由於 A 值的放大效果,一但價格偏離 $1 時,幣價就會急速上升/下降,且兩幣種數量會急劇的變更不平衡。

很小是因為:
正常情況下穩定幣不會在 -100% ~ +300% 之間波動,±5% 會是較為合理的波動範圍,因此我們改以此區間重繪上圖:

由圖可看出,在 A=1000 時,僅管幣價 ±5% 波動,Impermanent Loss 仍不會超過 -2.5%,該損失以目前的總體收益來說,回本賺錢絕對不是夢。

注意,此處分析僅為粗估,供數字數量級做參考。以上計算要成立有兩個假設:
1. 池內僅有 2 種穩定幣。
2. 增加流動性時池內資產在平衡狀態,且等比例加入。

由於 Curve 的數學模型相對複雜,實際狀況會比上述計算複雜得多,因此較難計算出每個情況下精確的數值,此處僅提供一個概念作參考。

所以到底要注意什麼啦

實際在增加/移除流動性時確實也不需考量到上述數學,只要你相信穩定幣會在 $1 附近震盪,不會永遠折價或溢價,那僅需記得一個原則就夠了:

讓池內各個幣種數量越平衡越好。

若存入池內佔比較少的幣種,能立即獲得額外 bonus;若存入池內佔比較高的幣種,則會因滑價而導致些許虧損。

實際數字會顯示於存/取款介面下方:

獎勵為綠匡 (標註為 Bonus);滑價則為紅匡 (標註為 Slippage)

以圖上例子來說,因為池內 DAI 存量較少,所以存入 DAI 會有 Bonus 0.732%。

此獎勵並不是額外發放的,產生原因為目前 DAI 在池內價值高於 $1,因此存入 DAI 相當於將手上部分的 DAI 高價賣成更多的 USDC 及 USDT,此即 Bonus 的來源。而存入另外兩種幣相當於在低點出售該幣種,會導致手上穩定幣總量減少。

額外補充: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 的應用場景不僅限於穩定幣互換。

例如 renBTC、wBTC 及 sBTC 都是錨定 Bitcoin 價值的 ERC-20 代幣,有些是中心化託管發行,有些則是分散式的跨鏈協議,因發行方式的不同而有不同的風險,進而產生了互換的需求。

理想上這些不同的比特幣們要有相同的價值,只要理想上能以 1:1 互換,就適用 Curve 的數學模型。

sbtc pool,能互換三種不同穩定幣。source: https://www.curve.fi/sbtc

結論

單以做市機制設計來說,Curve 是個相當優良的穩定幣互換協議,是一個有效率的穩定幣交換系統,能根據市場現況彈性的調整參數,更加完善了 DeFi 的世界。

後記

做研究寫文章的過程對我而言是相當有趣的,總能從中發現許多巧妙且聰明的機制設計,且還能以分散式、全自動的方式在以太坊上永續運行。

雖有趣但其實也相當不容易,寫文章寫到失眠、眼睛看螢幕看到發炎、私訊騷擾 Curve CEO 問問題、睡到半夜驚醒,起來算 Impermanent loss,連在夢中都還在算數學畫曲線⋯⋯最後總算是完成了這篇 Curve 白皮書的解析(翻譯)。

若文中有任何疏漏或錯誤還請不吝告知,有任何想法也都歡迎找我討論!

文章有幫助的話可以幫我拍個手 👏,也歡迎分享出去讓更多人了解 Curve 的美麗 🥺

References:

業餘韭菜,興趣使然

Love podcasts or audiobooks? Learn on the go with our new app.