淺談自動做市商 (AMMs) 機制:從 Uniswap 理解 Balancer

Ethan C.
15 min readSep 29, 2020

--

在 Balancer 中的 Uniswap

在去中心化金融 (DeFi) 的世界中,去中心化交易所 (DEX) 為最重要且最核心的一環。

其中最具代表性的為 Uniswap,以一行簡潔且優美的數學式作為模型核心,建構出一個全自動的交易市場。

Balancer 則可看作廣義的 Uniswap,賦予 Uniswap 更大的彈性,讓任何人都能在以太坊上打造自己專屬的資產配置組合,且還具備自動再平衡的功能!

相對的,Balancer 的數學模型會複雜些,但本質與 Uniswap 無太大的差異。

本篇文將從 Uniswap 出發,用圖解搭配四則運算介紹交易如何發生,再以簡化的方式將其推廣至 Balancer 的做市機制。

Uniswap 恆定乘積做市商模型簡介

一切從這行簡單的公式出發:(以 ALT/USD pair 為例)

在沒人增加或移除流動性的前提下,池中兩邊代幣總量的乘積為常數

然而上面那句話的敘述其實是錯誤的,每次只要有人進行交易貢獻手續費, k 值就隨之改變,但改變的幅度極小,詳細數學推導可參考田少谷下面這篇文:
《Uniswap 解析:恆定乘積做市商模型 Constant Product Market Maker Model 的 Vyper 實作》

因此,為簡化討論以下的計算都先暫時忽略手續費的影響。

交易如何發生?

任何交易的發生都離不開上面那條等式,假設預期買入 Δx 個 ALT,那會需要花費多少個 USD?

「買入及賣出」會改變池內 tokens 的數量

買入 ALT 會讓池中 ALT 的數量減少;付出 USD 會讓池中的 USD 數量增加。

無論如何改變 x 或 y,池內 tokens 數量必須滿足前述等式,將其畫成圖如下,藍線為雙曲線的一支。

在藍線的限制條件下,給定 Δx 就自動決定 Δy,反之亦然

所以只要有交易發生,該點就會在藍線上移動。

成交價格如何決定?

有了 Δx 及 Δy 後就能算出此筆交易的成交價格:

單位:USD/ALT

例如:買 50 ALT (Δx) 花了 100 USD (Δy),成交價格就是 100/50 = 2 USD/ALT

由圖可觀察出,成交價格即為兩點相連之直線斜率(取絕對值)。

不同買入量對成交價格的影響

不同的買入量 Δx 會對應不同的 Δy,而產生不一樣的價格。
一次買入越多,成交價格就越高(斜線越斜),此即為滑價的成因。

BlackHoleSwap 以及 Curve 皆以神奇的數學或 DeFi 樂高的堆疊很巧妙的減少了穩定幣互換的滑價問題。

現價 (Spot Price) 及總資產價值

所謂交易深度夠好,不容易滑價,在 DEX 中代表流動性佳,正常人一次交易不會改變價格太多,以數學來表示即為 Δx << x & Δy << y。所以在 Uniswap 中我們指的現價就是 Δx 非常小時的成交價

看起來可能有點像是廢話,但證明會需用到微分(略)

所以我們只要知道池內 USD 及 ALT 的數量就能算出現價,有了現價就可以算出池內總資產:

簡單證明了在 Uniswap 的流動池中,兩種資產永遠會保持 1:1 ,各佔 50%。

由上可知,在此類自動做市商模型中,價格是在交易中產生,這點跟掛單搓合式交易有極大的差別。

以台股為例,若市場預期大好,開盤即漲停 (+10%),則唯一能成交的價格就只有漲停價。賣方能一次獲得 10% 的利潤,不會有任何中間的價格成交。

但在 Uniswap 中,兼身買方及賣方的流動性提供者會被方程式所限制,必須沿著線一路往上賣,此時無法將利潤最大化。但相反來說,若市場大跌也會一路向下買,不用直接面對 -10% 的賣單。

Balancer 簡介

Balancer 的數學模型看似複雜,但其實能看作一個廣義 (Generalized) 的 Uniswap,只需經過幾個步驟的簡化就能更直觀地去理解其運作的機制。

做市模型

此為 Balancer 白皮書的定義:t 為 tokens 的種類數;V 為常數:W 為權重,其總和為 1

先將其改寫為較為親民長相,這裡先假設這個池子內只有 3 種資產(即 t = 3)

x, y, z 分別為三種資產在池內的數量,k 為常數

次方上的權重 W 即為該資產在池子內的比例,其總和為 1 (100%)。
若將其設為 1/3、1/3、1/3,則可再簡化方程式:

有沒有發現長得越來越像 Uniswap!由於 k 跟 k’ 都為常數,後面所有常數都統一以 k 來表示

池中有三種資產,這樣怎麼交易?

Ans: 先把其中一種遮起來,留下要交易的那兩種即可。

所謂交易就是拿 A 幣換 B 幣
假設 x、y、z 分別為 ALT、USD、SHIT 三種的數量,若我今天打算用 USD 買入 ALT,那整個過程其實跟 SHIT 的數量沒有關係,因此可以將 z 當成常數合併到 k 之中,如此一來方程式就變得跟 Uniswap 完全一樣了!

Balancer = Uniswap Q.E.D (?

改以圖像再次說明這件事情:

三維曲面為函數 x y z = k 所繪製的圖形,綠色為 z = const. 的平面,兩者相交即為雙曲線(的一支)

將 z 視為常數之後,剩下由 x 和 y 兩個自由度所構成的二維曲線與前述之 Uniswap 數學模型完全相同。

可以說 Balancer 內其實藏著 Uniswap!

再更複雜些:加入更多幣種,任意調整權重

實際上 Balancer 的運作可以更複雜,例如 Hakaa Finance 的流動性挖礦 Pool 2 用的就是 2% HAKKA + 4% DAI + 4% USDC + 90% BHSc$ 這個配置。

但從前面的說明可以了解到,無論池內有幾種幣,在做價格計算時僅會用到 2 種,其他皆可看作常數。

這邊以 20/60/10/10 比例的 ALT/USD/SHIT1/SHIT2 池來進一步的說明:

若每個幣種的配置比例不均等的話,那無法將方程式化簡成 Uniswap 的形式,會多出一個次方項。

此時可再多做一次轉換,重新定義變數,再次化簡方程式:

重新定義變數

將 y 的 3 次方重新定義成 Y 之後,最熟悉的 Uniswap 又出現了!

這時就能回頭套用最初 Uniswap 的圖:

經過座標轉換後,Balancer 跟 Uniswap 的數學式相同

接著就能按照前述定義計算成交價:

註:計算價格是以實際付出的 token 數量去計算,因此分子是 Δy 而非 ΔY

資產配置比例如何影響價格?

有了上述概念後,接著將權重的數字以符號替代,重新再整理一次:

兩個幣種權重的比值決定價格變化的程度
比較 Balancer 與 Uniswap 的成交價公式(下式設 Uniswap 的 y = Y 以便比較)

由上比較可看出,在成交價的計算中 Uniswap 與 Balancer 的形式基本相同,唯一的區別只在次方項,且該數值由權重決定。

現價 (Spot Price) 及總資產價值

如前所述,知道成交價的計算方式後,只要讓 Δx << x(即 Δx ➝ 0)即可求得現價:

將 y 對 x 做一次微分就能得到現價。單位:USD/ALT

有了現價就能計算出池內各個幣種的價值:

池中 ALT 的資產價值(單位:USD)
池中總資產價值(單位:USD)

以上計算可證明 個別資產 = 總資產 × 權重 這個基本的事實。

代表無論池內資產數量如何變化,每個幣種的價值都會維持在最初設定的比例。

在 Balancer 中打造自己專屬的資產配置!

如前所述, Balancer 內部的每種資產會固定於初始設定的比例,我想這也是為什麼要叫做 “Balancer” 的原因。

因此我們可以利用此性質,在 Balancer 中打造自己專屬,且全自動的投資組合!

假設舉例來說:
我希望自己 Crypto 的資產配置能固定為 10% DAI + 45% PERP + 45% HAKKA

狀況 1:單純持有現貨,將其放於錢包/交易所
當其中一個幣種的價格產生了變化,整體的比例就會失衡,需自行在三個幣種之間買賣以調整比例,此動作稱為再平衡
要想一直維持比例必須頻繁的執行,且還須精算每個幣種要買賣的數量,既麻煩又花時間,還要花額外的手續費。

狀況 2:利用 Balancer 打造自己專屬的流動池
若想將上述的流程自動化,則可直接在 Balancer 上增加自己專屬的流動池,操作介面如下圖:

若將鎖解開則能任意輸入想存入的數量,這代表著自行對池內資產定價。一旦與池外有價差則可能會有機器人大軍前來進行套利以平衡價格,將會白白損失部分資產。

建好池後,當其中任一種幣的價格產生變化,就會有人前來套利以平衡價格,相當於有人替我執行了再平衡 的操作,如此不僅不需花手續費,還會有手續費的收入 (Swap fee)。

備註:
Balancer 的 router 會自動在現有的池中挑選價格最好的交易,所以套利者不需逐池檢查最優價格在哪。

值得特別注意的是,以上說明必須在資金量體足夠大時才能被妥善執行,因為要是流動池太淺,會非常容易滑價,滑價代表價格差,則 router 就會優先讓其他深度好的池先被交易,此狀況在比例不均的池尤其嚴重(此點將於下節分析)。

深度不足解決方式有二:

  1. 多準備一些錢,讓流動池變深。
  2. 讓別人加入你的池 (Shared Pool),或找現成的池去去增加流動性(那當然就會是跟著對方配置的比例)。

Build Your Own ETFs

「固定資產比例+再平衡」即為市面上大部分 ETF 的運作模式*。

所以其實任何人都可以很容易用 Balancer 發行自己專屬且指數成分自定義的 ETF,LP token 即為該 ETF 的 token。

此基金不僅不會有內扣的管理費用,且還會有額外的手續費收入!
(因為不需主動執行再平衡,會有套利者送錢來幫你做。)

*註:
大盤指數型 ETF(如 0050、VTI、VT……等) 會根據股票市值定期調整資產比例,與上述狀況不同。

滑價 (Slippage) 分析

當有人建立了流動池後,任何人就能對其進行交易 (Swap),而身為交易者最關心的就是價格。

本節將簡單探討池子的權重如何影響交易深度

先來個小測驗:

假設有三種 Balancer Pool,Liquidity 都是 100M (USD + HAKKA) 權重分別為:
(1) 20/80
(2) 50/50
(3) 80/20

試問:假設我手上有 10M 的 USD 要入場買 HAKKA,哪個比例的池滑價會最小?

答案:(2)50/50 - 溢價 20%
其他兩個分別為:(1) 20/80 - 溢價 29.67%
(3) 80/20 - 溢價 33.08%

在這類 Uniswap-like 的 DEX 中,只要任一邊的資產數量被大幅度改變,就會對價格造成嚴重影響。

10M USD 入場購買 HAKKA ,在 20/80 池中相當於一次增加池內 50% 的 USD 總量;在 80/20 池中則等同於於一次買走池內 37.57% 的 HAKKA。所以 50/50 會是對兩邊影響皆最小的比例*,因而滑點最小。

此為 10M USD 入場買 HAKKA 時的滑點圖。橫坐標為 USD 的權重

由圖可觀察出,比例越極端,滑點越高,這也是為什麼當初 DAI/YFI 的 98:2 池開挖之後 YFI 會暴漲的主要原因之一,那時很多人在沒研究透徹的情況下直接 single-sided add liquidity,或甚至直接在 Balancer 買入YFI,從上圖可以看出這種買法會瘋狂的拉抬幣價,使 YFI 瘋狂的翻倍。

*註:
其實理論上滑價最小的比例非剛好 50/50,而是會略小於 50% (USD)。有興趣了解計算細節的可以找我討論!

提醒:
實際交易時,滑點的大小在 Balancer 中會以 “Price Slippage” 來表示,在 Uniswap 中則是寫 “Price Impact”。

但若以不同的單位(USD/HAKKA 或 HAKKA/USD)去計算滑價會得到不一樣的數值,所以建議在交易時不要看 Uniswap 或 Balancer 上 Slippage 的數字,請直接看它預估的成交價格

損益 (Profit and Loss) 及無常損失 (Impermanent Loss) 分析

「無常損失不等於幣價下跌後總資產的虧損。」

必須先強調這點,若有人對此概念仍不熟悉,建議先看一下我另一篇文的介紹:淺談無常損失 (Impermanent Loss) 及其避險方式

假設一個狀況:

我看好 HAKKA 將來會漲,所以想買入持有,且手上有一筆能拿來投資的資金 1,000 USDC

依據個人風險承受能力的不同,每個人的做法會不同。

可能出現的狀況如下:

  1. 100% 梭哈買入,承擔所有大起大落的波動風險。
  2. 98% 近乎梭哈買入,僅保留 2% 現金。
  3. 80% 部分買入,稍微降低些波動風險。
  4. 50% 一半買入,預留一半現金,保守投資。

此時手上會有部分 HAKKA 及部分 USDC,這時除了單純握著現貨之外,還能選擇將所有資產都投入流動池,池內總資產變化如下圖:

在 Balancer 中,各種比例的流動池內的總資產變化。

顯而易見的,一次買入越多 HAKKA,資產變化得越劇烈。
若有預留現金,雖然漲的時候會少賺些,但跌時也會少賠點。

一但投入流動池之後任何人都能前來交易,好處是能獲得手續費,但壞處是會有 Impemanent Loss,相較於不進池,可能會有額外的損失。

相較於拿著現貨,進池後因價格發生變化而產生的額外損失

50/50 的池會有最大的無常損失,價格變化越多,額外損失越大。

但對於流動性提供者而言,只要交易手續費的收入大於無常損失,那就會比在池外的 HODLers 有更高的收益。

所以到底要用什麼比例啦!

先簡單整理一下以上資訊,以兩個極端來舉例:

50/50
基本上是最不易滑價格的比例,能提供最穩定的交易,這也是為什麼 Uniswap 使用起來很香的原因,能有最大的交易量及最多的手續費收入,但是會有最大的無常損失

98/2
幾乎沒有無常損失,但此交易對非常容易滑價,價格十分不穩定,無法吸引人前來交易,因此交易量勢必較小,手續費也因此較少

這是天秤的兩端,需要在兩者中做取捨:
無常損失越大,滑價越小
無常損失越小,滑價越大

流動性的增加對於一個項目的發展來說是很重要的,好的交易深度能讓更多人參與二級市場,因此出現了各種獎勵機制吸引大家主動增加流動性。

80/20是個折衷的選項,有不太大的無常損失,同時也具有不錯的價格穩定性,此即為 Perpetual Protocol 選擇此以比例作為獎勵池的原因。另一方面還能降低投資者的風險,不用梭哈 PERP,手中能保有一些現金,降低整體資產的波動率,面面俱到,兩全其美。

結論

個人認為 Uniswap 及 Balancer 等 AMMs 的出現是去中心化世界的一大里程碑,能以一條簡單的方程式建構出一個全自動且完整的交易系統,再搭配獎勵機制(如 UNI 或 BAL)吸引更多人投入,以正向的循環讓整個生態更加完善(兩天就破的各種 Yield Farming 圈錢泡沫不在此列)。若有興趣參與這個市場,除了關注商業模式外,多瞭解運作原理也能避免自己不小心落入陷阱——至少要知道自己如何歸零的。

後記

最初是希望能以較直觀的方式去解釋 Balancer 的運作原理,再搭配數學一步一步從最基本的關係式,往下推導出後面所有的結果,但實際動筆後發現做不到⋯⋯全部列出來內容會太繁雜,且 Medium 不支援 LaTeX 實在很難排版方程式,更重要的是,應該沒人想看。所以後半段都只呈現圖表及結果,省略了計算過程及數學式,對過程真有興趣的歡迎找我討論,有發現任何的錯誤還請不吝告知!

(但其實只要有前半段的數學基礎,再搭配一些四則運算就能推出後面所有結果了,有興趣的可以試試看!)

References:

  • Balancer Whitepaper
    一切計算的起點,白皮書中有詳細的計算過程,但它用的符號太複雜,有些算法也略顯迂迴。
  • Fernando Martinelli, Balancer CEO & Co-Founder, 80/20 Balancer Pools
    後半段數據的呈現部分參考此篇文章,感謝 Tempo 的提供。
    (文中 Slippage 的 U 型圖的數據及描述有問題,他似乎算錯了,有不同意見的歡迎指出)
  • CalcPlot3D
    繪製 3D 圖的超讚工具,Balancer 白皮書的圖八成也是用這個畫的。
  • demos
    繪製互動式 2D 圖的超讚工具,大幅度簡化我計算及驗證數值的時間。

第一次嘗試寫這類文章,若有任何建議或問題還請不吝指教,歡隨時找我討論!
文章有幫助的話也歡迎拍個手👏,或分享出去讓更多人知道!

--

--