在去中心化金融 (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?
買入 ALT 會讓池中 ALT 的數量減少;付出 USD 會讓池中的 USD 數量增加。
無論如何改變 x 或 y,池內 tokens 數量必須滿足前述等式,將其畫成圖如下,藍線為雙曲線的一支。
所以只要有交易發生,該點就會在藍線上移動。
成交價格如何決定?
有了 Δx 及 Δy 後就能算出此筆交易的成交價格:
例如:買 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,只需經過幾個步驟的簡化就能更直觀地去理解其運作的機制。
做市模型
先將其改寫為較為親民長相,這裡先假設這個池子內只有 3 種資產(即 t = 3)
次方上的權重 W 即為該資產在池子內的比例,其總和為 1 (100%)。
若將其設為 1/3、1/3、1/3,則可再簡化方程式:
池中有三種資產,這樣怎麼交易?
Ans: 先把其中一種遮起來,留下要交易的那兩種即可。
所謂交易就是拿 A 幣換 B 幣。
假設 x、y、z 分別為 ALT、USD、SHIT 三種的數量,若我今天打算用 USD 買入 ALT,那整個過程其實跟 SHIT 的數量沒有關係,因此可以將 z 當成常數合併到 k 之中,如此一來方程式就變得跟 Uniswap 完全一樣了!
改以圖像再次說明這件事情:
將 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 的圖:
接著就能按照前述定義計算成交價:
資產配置比例如何影響價格?
有了上述概念後,接著將權重的數字以符號替代,重新再整理一次:
由上比較可看出,在成交價的計算中 Uniswap 與 Balancer 的形式基本相同,唯一的區別只在次方項,且該數值由權重決定。
現價 (Spot Price) 及總資產價值
如前所述,知道成交價的計算方式後,只要讓 Δx << x(即 Δx ➝ 0)即可求得現價:
有了現價就能計算出池內各個幣種的價值:
以上計算可證明 個別資產 = 總資產 × 權重
這個基本的事實。
代表無論池內資產數量如何變化,每個幣種的價值都會維持在最初設定的比例。
在 Balancer 中打造自己專屬的資產配置!
如前所述, Balancer 內部的每種資產會固定於初始設定的比例,我想這也是為什麼要叫做 “Balancer” 的原因。
因此我們可以利用此性質,在 Balancer 中打造自己專屬,且全自動的投資組合!
假設舉例來說:
我希望自己 Crypto 的資產配置能固定為10% DAI + 45% PERP + 45% HAKKA
狀況 1:單純持有現貨,將其放於錢包/交易所
當其中一個幣種的價格產生了變化,整體的比例就會失衡,需自行在三個幣種之間買賣以調整比例,此動作稱為再平衡。
要想一直維持比例必須頻繁的執行,且還須精算每個幣種要買賣的數量,既麻煩又花時間,還要花額外的手續費。
狀況 2:利用 Balancer 打造自己專屬的流動池
若想將上述的流程自動化,則可直接在 Balancer 上增加自己專屬的流動池,操作介面如下圖:
建好池後,當其中任一種幣的價格產生變化,就會有人前來套利以平衡價格,相當於有人替我執行了再平衡 的操作,如此不僅不需花手續費,還會有手續費的收入 (Swap fee)。
備註:
Balancer 的 router 會自動在現有的池中挑選價格最好的交易,所以套利者不需逐池檢查最優價格在哪。
值得特別注意的是,以上說明必須在資金量體足夠大時才能被妥善執行,因為要是流動池太淺,會非常容易滑價,滑價代表價格差,則 router 就會優先讓其他深度好的池先被交易,此狀況在比例不均的池尤其嚴重(此點將於下節分析)。
深度不足解決方式有二:
- 多準備一些錢,讓流動池變深。
- 讓別人加入你的池 (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 會是對兩邊影響皆最小的比例*,因而滑點最小。
由圖可觀察出,比例越極端,滑點越高,這也是為什麼當初 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
依據個人風險承受能力的不同,每個人的做法會不同。
可能出現的狀況如下:
- 100% 梭哈買入,承擔所有大起大落的波動風險。
- 98% 近乎梭哈買入,僅保留 2% 現金。
- 80% 部分買入,稍微降低些波動風險。
- 50% 一半買入,預留一半現金,保守投資。
此時手上會有部分 HAKKA 及部分 USDC,這時除了單純握著現貨之外,還能選擇將所有資產都投入流動池,池內總資產變化如下圖:
顯而易見的,一次買入越多 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 圖的超讚工具,大幅度簡化我計算及驗證數值的時間。
第一次嘗試寫這類文章,若有任何建議或問題還請不吝指教,歡隨時找我討論!
文章有幫助的話也歡迎拍個手👏,或分享出去讓更多人知道!