作者:Leo Liu, Guangwu Xie
翻譯:Vanessa Cao
校對:Leo Liu, Guangwu Xie
排版:Jane Hu
感謝:Fangyuan Zhao, Showen Peng, DW, Lianxuan Li, Dave White, Dan Robinson, Vanessa Cao, Jane Hu
本文由星際密探和Dachale Research 戰略合作夥伴BTXCapital獨家授權星際密探發布,在本文中,我們將首先回顧由 Bancor、Uniswap、Balancer 和 Curve 協議實現的四種自動做市商 (AMM) 算法。還將討論 AMM 算法的最新發展、可能的改進和未來。
由於本論文過長,本文總共分為上、中、下篇闡述自動做市商算法、現狀及未來迭代的思考。。
上篇目錄
- Bancor Network的聯合曲線概念和交易公式
- Uniswap 的無常損失計算
- 當價格變動在2ρ之間時的正向收益
- 流動性分佈、流動性注入、Uniswap V3 範圍訂單
- Balancer 的做市函數和交易公式
- 智能訂單路由(SOR)算法
……
Bancor Network 的聯合曲線概念和交易公式:
Bancor¹利用聯合曲線的概念來確定價格。聯合曲線是代幣價格與其總供應量之間的關係。
Bancor¹
Bancor Protocol Continuous Liquidity for Cryptographic Tokens through their Smart Contracts
https://storage.googleapis.com/website-bancor/2018/04/01ba8253-bancor_protocol_whitepaper_en.pdf
聯合曲線 Bonding Curve:
聯合曲線模型可以理解為描述“代幣買賣價格”與“代幣發行總量”之間的函數關係,可以由智能合約以去中心化的方式自動執行。
https://medium.com/linum-labs/intro-to-bonding-curves-and-shapes-bf326bc4e11a
Bancor Network選擇的不變量是F,稱為連接權重。在第一個表達式中R是指流動性池中的儲備代幣數量,S是流動性池外的BNT總供應量,P是BNT和儲備代幣 的相對價格。我們可以代入P的方程,對兩邊積分²得到P和S之間的關係。這是一個指數表達式,其中指數α與連接權重F有關(F在0和1之間)。F越小,α越大,這意味着價格相對於BNT的總供應量變化得更快。
兩邊積分²
Formulas for Bancor system
https://drive.google.com/file/d/0B3HPNP-GDn7aRkVaV3dkVl9NS2M/view?resourcekey=0-mbIgrdd0B9H8dPNRaeB_TA
使用這個表達式和簡單的積分,我們可以導出T(購買的BNT代幣)和E(支付的儲備代幣)之間的關係,其中R0,S0是R和S的當前值。
如果我們想在代幣A和代幣B之間交換,則將代幣A出售給代幣B。我們首先需要使用代幣A從池A購買BNT代幣(註:如果我們沒有BNT代幣)。接下來,我們需要使用BNT從池B購買代幣B。下面是計算我們將收到多少代幣所需的精確公式。代幣A和代幣B之間的相對價格可以用BNT代幣和代幣A/B之間的相對價格表示。
優點:Bancor 允許在某些池中進行單邊流動性的注入,這由Bancor治理決定。可以存入多少單邊流動性是有限制的,這也是由Bancor治理決定的。在限額內,當用戶以其他代幣的形式存入單邊流動性時,Bancor將補充等值的 BNT 代幣。這使得用戶提供的有效流動性加倍。如果達到限額,如果人們想要存單邊流動性,就得等有人提取單邊流動性,或者有人把BNT做為單邊流動性注入。
Bancor 協議以BNT部分賺取的手續費補償用戶在存入單邊流動性時的無常損失(將在後面討論)。如果交易費用不能完全補償無常損失,Bancor將鑄造 BNT以確保無常損失為零。因此,流動性提供者如果將流動性存入一定的時間(存入滿100天可全額補償),就可以享受穩定的收入。
缺點:如上所述,所有交易都需要 BNT 代幣作為中介。因此,我們將經歷兩次滑點。由於相同的原因,所有流動性池都由 BNT 和另一個代幣組成,因此缺乏多樣性。BNT 代幣價格也可能受到影響,因為需要彈性供應才能實現無常損失補償和單邊流動性存款。
Bancor 引入了連接代幣 BNT 的概念,它連接到所有具有不同連接權重的代幣,對應不同決定價格的聯合曲線。
Uniswap 的無常損失計算:
Uniswap 使用恆定乘積做市商 (CPMM) 來決定價格。在我們深入研究 Uniswap V2 和 V3 使用的算法之前,讓我們先了解什麼是無常損失 (IL) 以及如何計算它。
恆定乘積做市商 (CPMM)
Constant Product Market Maker
強制要求兩種資產儲備量的乘積必須始終保持不變 x*y=k
https://ethresear.ch/t/improving-front-running-resistance-of-x-y-k-market-makers/1281
無常損失
Impermanent Loss
是指資金在流動性池中面臨的損失。
如果 AMM 函數是凸的(註:價格隨着我們買入而增加 / 價格隨着我們賣出而減少),那麼沒有交易費用補償的單筆交易總是會導致流動性提供者賠錢。假設一筆交易導致 AMM 函數從點 1 移動到點 2。點 1 和點 2 的現貨價格(函數導數的絕對值)是 P1 和 P2。P3 為實際交易價格。由於凸函數的性質,P1 > P3 > P2。無常損失定義為交易后池中流動性提供者代幣的當前價值與流動性提供者的代幣當前價值之間的差值,如果他只是持有他的代幣而不將它們用於流動性提供,則表示為V 和 Vheld。為方便起見,無常損失和價格將以代幣 Y 表示(1 個代幣 Y 的價格為單位 1)。經過一些簡單的推導,很容易證明無常損失總是小於零(x2 > x1,P2 < P3)。
Uniswap³ V2 使用一個簡單但功能強大的公式來確定交易。池代幣儲備數量的乘積是一個常數。與 Bancor 相比,它擺脫了連接代幣的依賴。交易完全由流動性池中的代幣數量決定。
Uniswap³
Uniswap V2 Core
https://uniswap.org/whitepaper.pdf
由於此函數的性質,池中兩個代幣的價值將始終相同(我們在本文中使用的價格將始終是相對價格)。
使用相同的邏輯,不難計算 Uniswap V2中單筆無手續費的無常損失。假設交易將價格從P更改為Pk。以百分比衡量的無常損失可以單獨表示為k的函數。
毫不奇怪,這個函數總是小於或等於零,正如我們從上面沒有費用的無常損失圖中可以看出的。如果在對數空間中繪製橫軸,則 IL(k) 將是對稱的。結論是:相對價格變化越大,無常損失就越大。這可以解釋為流動性提供者的更有價值的代幣從池中被買出,留給他們更多價值較低的代幣。
當價格變動在2ρ之間時的正向收益:
接下來,讓我們看看如果我們添加交易費用,IL(k) 會如何表現:
導出的無常損失函數 IL(k, ρ) 看起來與無費用的無常損失函數非常相似。我們可以通過將ρ設置為零來進行合理性驗證,得出相同的結果。典型的 Uniswap V2 費用百分比為ρ= 0.3%。在繪製無常損失函數時,我們可以看到在大約k= 0.994 到 1(大約 2ρ跨度)之間有一個高於零的部分。在該地區,無常損失是正的,這意味着流動性提供者實際上獲得了價值(在該地區賺取的交易費用優於損失)。通過引入交易費,當價格在一定範圍內波動時,流動性提供者將獲得正收益。
當價格變動更加波動時,流動性提供者似乎總是會出現虧損。然而,實際情況並非如此。我們知道 Dave White4(註:Paradim風險投資基金研究員)等人解決了這個難題。遺憾的是,它超出了這篇介紹性論文的範圍。我們打算在未來進一步研究這個問題。
Dave White4
Uniswap’s Financial Alchemy
https://research.paradigm.xyz/uniswaps-alchemy
至於其他流行的 AMM 算法(包括 Uniswap V3)的無常損失推導,我們向讀者推薦Jiahua Xu⁵等人的這篇論文。這些推導將是下一次的主題。
Jiahua Xu⁵
SoK: Decentralized Exchanges (DEX) with Automated Market Maker (AMM) protocols
https://arxiv.org/abs/2103.12732
優點:第一個用池中代幣數量的凸函數來確定價格。
缺點:流動性供應均勻分佈於所有價格範圍,這意味着資本效率較低。
流動性分佈、流動性注入、Uniswap V3 範圍訂單:
為了提高流動性效用並降低無常損失風險,Uniswap⁶ V3 允許用戶僅在特定價格範圍內提供流動性。
Uniswap⁶
Uniswap V3 Core
https://uniswap.org/whitepaper-v3.pdf
From Uniswap V3 whitepaper
這是通過對 Uniswap V2 函數進行平移來實現的:
From Uniswap V3 whitepaper
將函數向下平移a點的y值,向左平移b點的x值,如上圖和等式所示,確保a 和b之間的有效交易結果,就像我們使用綠色曲線作為我們的價格決定函數。當價格超出此範圍時,其中一個代幣儲備將被售罄,從而有效地將流動性集中到此價格範圍內。
Dan Robinson⁷ (註:Paradim風險投資基金研究員主管)發表了一篇關於計算多個 AMM 的流動性分佈的優秀論文。
Dan Robinson⁷
Uniswap V3: The Universal AMM
也可以簡單地證明,兩個流動性提供者在同一價格範圍內的流動性可以簡單地加在一起。
在存入流動性時,如上所示,Uniswap V3中每個資產的價值不一定相等。只有當P等於Pa和 Pb 的幾何平均值時,每個資產的價值才相等。當P小於幾何平均值時,資產X的價值大於資產Y的價值。當P大於幾何平均值時,資產X的價值小於資產Y的價值。
噹噹前價格完全超出流動性提供者設定的價格區間時,Uniswap V3將流動性提供者的輸入算作範圍訂單(Range Order),只允許其存入一種代幣(類型取決於價格區間是否完全高於或低於當前價格)。例如,考慮一個由 ETH 和 Dai 組成的流動性池。如果設定的價格區間完全高於 ETH 的當前價格,則只允許用戶存入 ETH。如果價格區間完全低於 ETH 的當前價格,則只允許用戶存入 Dai。當價格完全越過流動性提供者設定的價格區間時,他存入的資產將全部轉換為另一種的代幣。由於用戶只能存入一種代幣,範圍訂單隻能實現傳統限價訂單中四分之二的訂單(獲利訂單、買入限價訂單)。另一方面,買入止損訂單和止損訂單無法實現。截至目前,我們不知道限制範圍訂單代幣類型的目的是什麼。
範圍訂單
Range Orders
本質上並不是真正的訂單,而是 LP 向資金池某個特定價格點提供的聚合流動性。雖然不是真正的訂單,但「範圍訂單」所表現出的特性,卻很好地模擬了限價單的基本功能。
https://docs.uniswap.org/protocol/concepts/V3-overview/range-orders
優點:Uniswap V3 引入了流動性分佈的概念,允許其用戶在價格範圍內存入流動性。通過集中流動性,提高資本效率。當存入相同價值的資產時,可以獲得更高的流動性和更低的滑點。在某個價格範圍內提供流動性也在某種程度上降低了無常損失的風險。
缺點:用戶在進行範圍訂單時只能存入某些類型的代幣。因此無法實現買入止損訂單和止損訂單。
Uniswap V2 和 V3 在其 AMM 算法中引入了 CPMM 和流動性分佈。提供價格範圍內的流動性本質上使 Uniswap V3 成為一個通用的 AMM,能夠通過改變其流動性分佈成為任何可能的 AMM。
Balancer 的做市函數和交易公式:
Balancer⁸ 將 Uniswap V2 的 雙代幣池擴展到多代幣池。Balancer 池中每種資產的價值都持有一個不變的權重,加起來為 1。不難證明,這相當於每種資產的儲備數量的冪乘積是一個常數。資產 n 相對於資產 t 的價格也可以導出為資產 t 和 n 的儲備數量之間的比率,通過它們的權重進行歸一化。
Balancer⁸
A non-custodial portfolio manager, liquidity provider, and price sensor
https://balancer.fi/whitepaper.pdf
基於常數不變式,我們可以求導出有不同輸入值的交易公式(資產 o 和資產 i 之間的交易)。在這種記法標準中,資產 o 始終是買出的資產。資產 i 是賣出的資產。A 和 B 是打入/接收的代幣和當前的代幣儲備數量。我們還可以根據價格的變化計算打入的代幣或買出的代幣數量。
智能訂單路由(SOR)算法:
Balancer 還引入了智能訂單路由(SOR⁹) 算法。
SOR⁹
Smart Order Router V2
https://docs.balancer.fi/developers/smart-order-router
來源:https://docs.balancer.fi/v/v1/smart-contracts/sor/
該算法的總體思路是將一個訂單分成幾個小塊在不同的Balancer池中進行交易,以獲得更好的交易結果。假設我們要在代幣池1和代幣池2進行交易,如果我們要交易的總金額N低於上圖中的A,我們將只在代幣池1進行交易,因為代幣池1的價格總是比代幣池2價格好。如果總金額超過A,我們將部分訂單在代幣池1中交易,部分在代幣池2中交易。在每個代幣池中交易的數量將使每個池中的價格相等(B + C = N)。
很容易證明最優策略總是使每個池中的價格相等的策略(如果價格不相等,我們總是可以找到一個價格更好的池來改善我們的交易結果)。
價格函數,相對於交易量,通常是一個非線性函數。Balancer 將價格函數簡化為線性函數。如果有n個代幣池,最優策略可以表示為:
如果存在一個價格函數總是大於或小於範圍 (0, N) 的其餘價格函數,則應從上述計算中刪除該價格函數和相應的池,以確保結果有效。如果價格函數總是較小,那麼顯然的最佳策略將是在該池中交換所有代幣。
在這個計算中,不用考慮gas費用。實際上,最優策略應該是在路由收益和gas費用損失之間保持平衡。
SOR 算法,我們相信可以在更廣泛的背景下使用。例如,價格函數可以是其他 AMM 協議池的函數。由於我們目前知識的限制,我們不確定實際的 AMM 聚合器是否使用相同的邏輯來實現更好的價格。沒有任何價格函數近似的更通用的解決方案將在本文後面討論。
優點:Balancer 將 2 個代幣池推廣到多個代幣池,並引入 SOR 算法為其用戶實現更好的價格。
缺點:“流動性池的強度取決於其最弱的資產。” 一個池中的代幣類型越多,風險就越高。
Balancer 是一種多代幣投資組合管理工具,允許靈活的代幣價值分配,具有價格優化算法。
中篇目錄
- Curve 的 StableSwap 和交易公式
- Curve V2 的動態權重、可定製的價格錨定和平滑的價格過渡
- Curve V2 在 2 代幣池中的做市商函數
- 與 CPMM 和 StableSwap 相比,Curve V2 的價格函數
11. 價格重錨過程:Xcp 標準、EMA 價格預言機、相對價格變化步長 s
- Curve V2 的動態交易手續費
13. DEX 聚合器:Balancer SOR 算法的通用解決方案
14. Pivot 算法:解決無常損失問題的一種嘗試
- 單邊流動性解決方案
Curve 的 StableSwap 和交易公式:
Curve 將 恆定加和做市商 (CSMM) 和 恆定乘積做市商 (CPMM) 合併在一起,以實現更低的價格滑點。我們可以把這個算法看作是向 Uniswap/Balancer 模型添加一個固定價格部分,使最終的做市函數錨定於一個價格。
Curve¹⁰ V1,被稱為 StableSwap,設計了用於穩定幣交易的算法。它將 CSMM 與權重相乘並加上 CPMM:
Curve¹⁰ V1
StableSwap — efficient mechanism for Stablecoin liquidity
https://curve.fi/files/stableswap-paper.pdf
首先我們考慮一個特殊情況,即流動性池中每種代幣的數量是相同的。很容易證明在平衡點處時這個方程成立(χ_是權重,與Dⁿ⁻¹ 相乘以使 CSMM 和 CPMM 具有相同的數量級)。但是,當流動性池失衡時,如果χ是一個常數,則該等式將不再成立。因此,我們需要將χ變量化。Curve V1 選擇了一種χ的函數形式,使它在流動性池極端不平衡時變為零,這意味着該方程由 CPMM 主導。在平衡點下,χ等於A。A是一個常數,通過模擬歷史數據進行優化。代入χ_給了我們一個始終成立的方程。
接下來,讓我們推導出 StableSwap 如何實際計算交易結果。根據當前池中的代幣數量,我們可以計算出_D。例如,如果我們想換出代幣j,我們可以將xⱼ分離開來並求解xⱼ_的方程:
該方程可以簡化為二次形式。可悲的是,現在鏈上 Vyper 語言里沒有可以解二次方程的數學庫。因此,StableSwap 使用了牛頓法來求解_xⱼ。迭代公式每次迭代都將其精度加倍。因此,可以在設定的 gas 上限內計算可接受的xⱼ。最後,交換前後xⱼ_之間的差值將是購買的代幣 j 的數量。
牛頓法
它是一種在實數域和複數域上近似求解方程的方法
https://en.wikipedia.org/wiki/Newton%27s_method
From StableSwap whitepaper
From StableSwap whitepaper
與 CPMM 相比,StableSwap 做市商受壓、 以 x + y = 常數方向壓平。這確保交易價格接近或等於 1,在平衡點附近有非常小的滑點(當池中的一個代幣不接近幾乎售罄時)。當池中的一個代幣幾乎售罄時,價格開始急劇下降。這很容易理解:函數的曲率 / 滑點被集中 / 推到別處,以確保在平衡點附近的低滑點。
該模型中的 CPMM 和動態權重被用於懲罰提前知道消息的大額訂單,防止池中的代幣被完全售罄。
優點:通過添加 CSMM 和 CPMM 以及動態權重,Curve 的 StableSwap 實現了非常小的滑點,非常適合穩定幣。
缺點:價格始終錨定在 1。如果市場價格與流動性池價格顯著不同,流動性池將被買空。因此,StableSwap 僅適用於穩定幣。
Curve V2 的動態權重、可定製的價格錨定和平滑的價格過渡:
為了確保更平穩的價格過渡和可定製的價格錨定,Curve¹¹ V2 將動態權重_χ修改為K_,如下所示:
Curve¹¹ V2
Automatic market-making with dynamic peg
https://curve.fi/files/crypto-pools-paper.pdf
K0_在 0 (流動性池不平衡)和 1 (平衡點)之間變化,χ和K(以A歸一化)作為K0_的函數繪製如下:
我們可以從上圖中了解 Curve V2 如何使價格轉變得平滑。它實際上使動態權重在遠離平衡點時迅速下降。_γ_值越小,下降越快。使動態權重快速下降到零本質上相當於強制函數表現得更像 CPMM,即使流動性池只是有一點不平衡。
DW 在 twitter¹² 上發布了一條很棒的推文,解釋了相同的概念。
DW 在 Twitter¹²的推文
https://twitter.com/dken_w/status/1422623679150649345
價格過渡問題得到了解決。現在我們討論 Curve V2 如何實現其他不是 1 的價格錨定。有一個價格錨定(他們在白皮書中稱之為價格標度)意味着在做市曲線上存在一個平衡點,在平衡點處按價格標度縮放的代幣數量相等:
Curve V2 在 2 代幣池中的做市商函數:
縮放后的代幣數滿足與 StableSwap 類似的等式。以最簡單的 2 幣流動性池為例,做市商函數可以用A、γ、p、D、x、y表示。該函數可以簡化為關於 x, y 的三次函數(關於 D 的六次函數)。
該函數的典型值圖如下所示:
與 CPMM 和 StableSwap 相比,Curve V2 的價格函數:
也可以繪製代幣 x 相對於代幣 y 的價格曲線。在平衡點 (1000, 1000) 附近 Curve V2 價格函數恆定。與 StableSwap 相比,Curve V2 略微延遲了價格變動,而不是完全延遲。與 CPMM 相比,隨着交易量的增加,價格開始以較小的滑點做出反應。總而言之,Curve V2 在平衡點附近實現了非常小的滑點,並且在其他區域比 CPMM 實現了更好的滑點。至於其他非 1 的價格錨定,我們只需更改上面三次 / 六次方程中的_p_。因此,錨定價格的問題也解決了。
我們可以使用類似的在 StableSwap 中的牛頓法來計算交換結果。首先,我們根據池中當前的代幣數量計算_D_(這次使用牛頓法,因為方程要複雜得多)。其次,如果我們想換出代幣 i,我們再次使用牛頓法來求解 xᵢ。同樣,xᵢ的差異(按其價格標度歸一化)將是我購買的代幣數量(所有 xᵢ 都是按價格標度縮放的代幣數量)。
為了確保多項式函數的根可以在設定的 gas 上限內求解,Curve 白皮書討論了他們選擇的起始猜測,以及函數中的參數。他們使用一種稱為模糊測試(假設框架)的方法來確定這些最佳值。目前,我們不知道有關此方法的任何詳細信息,並且很想了解更多信息。
價格重錨過程:Xcp 標準、EMA 價格預言機、相對價格變化步長 s:
為了確保小滑點(在平衡點附近交易), Curve V2 通過改變價格標度不斷重錨做市商函數。然而,價格重錨可能導致流動性提供者承受價值損失。Curve V2 引入了一個名為 Xcp 的變量來緩解這個問題:
如果一次重錨后的損失大於累積的 Xcp 的一半(原始 Xcp 增加的價值),則該算法將保持做市商函數不變。有幾個問題我們想在未來回答,因為白皮書只簡要討論了 Xcp。查看其源代碼可能會有所幫助。
- Xcp 值是否與用流動性池中當前代幣數計算出的價值成正比?
- 存入或取出流動性是否計入 Xcp?
- 如果取出流動性計入 Xcp,如果 Xcp 減少幅度過大會阻止取出流動性嗎?
對於價格重錨,Curve V2 使用 EMA (註:指數移動平均線)價格預言機來確定預言機價格。新的預言機價格向量由最近一次交易價格向量和前一個預言機價格向量的線性組合確定。新價格標度向量的變化方向與預言機價格相似,但不完全等於新預言機價格。他們通過引入相對價格變化步長 s,將價格標度向量滯後於預言機價格。該方程可以使用歐幾里得幾何輕鬆導出。EMA 價格預言機和價格標度延遲是為了減少近期價格波動的影響並更好地代表長期市場價格。
關於相對價格變化步長_s,根據我們“刷新 Curve 官網”的經驗,部分流動性池的s變化頻率至少為十分鐘的量級以上。Curve V2 如何更新s_是一個有趣的問題,超出了我們當前知識的範圍。查看其源代碼也會有所幫助。
下面顯示了一個演示一次價格重錨過程的圖:
假設我們在 x = 1000 開始我們的交易,並在 x = 1400 結束我們的交易。最初,價格錨定於 1 。交易后,價格移動到 0.6。為簡化起見,僅出於演示目的,我們將新的價格標度設置為與現貨價格相等(價格現在錨定於 0.6),並求解六次方程以獲得_D_。現在做市商函數錨定於 0.6,如上所示。
價格重錨本質上相當於找到一個新的做市商函數,該函數穿過當前代幣數量位置(在 2 代幣池情況下為 (x, y)),在 (x0, y0) 處有一個平衡點,使得_y0/x0為 等於 (x0, y0_) 處導數的絕對值。一個有趣的課題是獲取真實的 Curve 流動性池參數,做一個更好的(可能是動畫)價格重錨過程的演示。
Curve V2 的動態交易手續費:
由於上面討論的 Curve V2 的做市商特性,將交易費用設為 2 級交易費用與動態權重的線性組合是合理的,衡量我們離平衡點有多遠(當前價格變動是否更像是 StableSwap 或 CPMM)。Curve V2 選擇的_fmid和fout_值分別為 0.04% 和 0.4%。下圖展示了 2 代幣池中的費用如何變化(假設沒有價格重錨或流動性變化):
優點:做市商函數可以錨定於任何價格,適合所有代幣,而不僅僅是穩定幣。價格過渡比 StableSwap 更平滑。Curve V2 還根據其內部的價格預言機不斷更新價格標度,以更好地代表市場價格,確保在平衡點附近交易。動態費用確保在此基礎上提供甚至更好的價格。
缺點:由於求解三次方程和六次方程,Gas 費用可能會更高。僅根據其內部價格預言機進行價格重錨可能存在風險。我們想知道在通過_Xcp_標準時,是否存在價格標度與市場價格明顯不同的情況。如果是這種情況,與其他預言機交叉檢查價格可能會有所幫助。
Curve 的 StableSwap 和動態錨定 V2 是為了使交易滑點儘可能小。StableSwap 始終錨定於 1,而 V2 使錨定價格跟隨市場價格。
下面將討論 AMM 算法的一些最新進展和可能的改進。
DEX 聚合器:Balancer SOR 算法的通用解決方案 :
DEX 聚合器是聚合現有 AMM 協議以實現更好交易結果的協議。如上所述,Balancer 的 SOR 算法也適用於 DEX 聚合器,以確保數學上最優的交換策略。
Balancer 的 SOR 算法的一般解決方案,沒有任何價格函數近似,可以表示如下:
因為價格函數可以是任何形式,具體取決於生成它們的 AMM 算法。這意味着滿足總代幣數量守恆和相等最終價格等條件的方程可能沒有解析解。
因此,我們引入了一種在機器學習等領域常用的技術,稱為梯度下降。我們將損失函數定義為不同價格函數值的方差。在選擇一個起始猜測(一個簡單的、不知情的猜測可以是每個池中的交易量相等_N/n_)后,我們可以迭代(通過損失函數相對於該變量的偏導數改變每個交換量,乘以學習率l) 以獲得最佳結果,在一定的誤差接受範圍內。
由於作為最終等價函數的總交易量是單調的,因此該方法應該能夠找到全局最小值(方差 = 0)。同樣,上面的計算假設沒有簡單的解決方案(沒有價格函數總是大於或小於範圍 (0,N) 上的其餘價格函數)。
Pivot 算法:解決無常損失問題的一種嘗試 :
Pivot 算法試圖通過使做市商函數經過一個固定點 (x0, y0) 來對其進行樞軸旋轉。
(x0, y0) 處的價格將始終是設計的當前市場價格 Pt。這在概念上確保套利總是將流動性池帶回到點 (x0, y0)。由於此功能,無常損失將為零。然而,實際上,該算法沒有足夠的參數來擬合當前儲備(x,y)和(x0,y0)。這意味着我們必須等待流動性池回到 (x0, y0),然後更改做市商函數。
從上圖中我們可以看出,交易后的點不在新的做市商函數上(藍色和藍色虛線)。如果當前市場價格低於當前儲備的現貨價格,則流動性池也可能沒有任何動力回到 (x0, y0)。
我們想知道是否存在這樣的函數通過 (x, y) 和 (x0, y0) 以及在 (x0, y0) 處的可調導數來適應市場價格。如果我們假設函數是凸的,那麼市場價格不能小於這兩個點之間的線性段斜率。因此,如果做市商函數必須是凸函數,則此問題可能沒有完整的解決方案。
單邊流動性解決方案 :
流動性提供者在存入流動性時可能不方便存入所有類型的資產。我想知道是否存在與 Bancor 採取的彈性供應方法不同的其他機制。直覺上,有兩種解決方案:1. 首先使用相同的協議交換部分代幣 2. 無論如何存入單邊流動性,讓套利將價格帶回市場價格。
例如,我們希望將流動性存入一個等值的 2 代幣池中。
我們只有代幣 x。不難計算我們需要交換多少,以便交換后每種代幣的價值相等。也很容易證明 β 總是在 0 和 1 之間,這意味着一個合理的結果。但是,交易后的價格可能與存入流動性時的價格不同。因此,我想知道協議是否真的將交換和流動性存入作為一項原子操作。進行交易時也存在價格滑點。到目前為止,Balancer 和 Curve 等協議如何處理單邊流動性存入仍然是我們的一個問題。如果滑點很小,則進行上述操作是合理的。
Balancer and Curve 白皮書中描述的第二種方法是是直接存入單邊流動性。這可能會大大改變價格。由此產生的套利也可能使無常損失變得重大。我們個人在 Balancer 白皮書和文檔中沒有看到任何懲罰措施。另一方面,Curve 在存入單邊流動性時引入了一種稱為不平衡費的東西,其範圍從 0% 到 0.02%。在現實中,由於套利和無常損失,在第二種方法下存入單邊流動性並沒有真正的動機。
下篇目錄
- 為 Curve V2 設計更好的動態權重
17. 當價格函數為非解析時應用價格範圍
- Clipper:針對小額交易優化的 AMM 算法
- TWAMM:針對大額長期訂單優化的 AMM 算法
- TWAMM 在恆定乘積做市商 (CPMM) 和對數市場評分規則 (LMSR) 上的應用
- TWAMM 在 YieldSpace 等與時間相關的 AMM 上的應用
- 結論和未來工作
為 Curve V2 設計更好的動態權重:
γ值
在 Curve V2 中,有一個常數稱為 γ。如果我們也讓它動態化,會發生什麼?例如,我們可以使它成為 K0 的函數。最簡單的情況是使其等於 K0。這裡的動機是讓函數在接近平衡點時表現得更像 StableSwap,當函數遠離平衡點時,使其更像 CPMM。
紫色虛線曲線位於 StableSwap 和小 γ 值曲線之間,應該為我們提供 StableSwap 和 Curve V2 之間的做市商函數。然而,當我們繪製做市商函數時,它的圖像跟 StableSwap 很相似:
這個問題有兩種解決方案:1. 使 A 更小 2. 選擇 K0 的較高冪數來表示γ。兩者似乎都是可行的, 然而 1. 破壞了 A 作為一個大數的目的:使做市商函數與價格錨定。我們進行的進一步測試似乎表明,更改 A 不會對函數行為產生影響(更改 A 后做市商函數仍然看起來像 StableSwap)。
第二種解決方案會使 gas 費用更高。K0 的更高次冪數對應於我們需要求解的更高階多項式方程。事實上,Curve V2 選擇動態權重 K 的特定形式的原因是為了模擬大指數 K0 的函數行為,同時不使多項式的階數更高。
有趣的問題是:我們能否找到一個更好的動態權重來簡化我們需要求解的方程,同時保持與 Curve V2 相同或更好的功能?在設計這樣的動態權重時,我們還必須記住,我們需要在小滑點和做市商函數對預知市場未來的大訂單做出反應的能力之間保持平衡。顯然,只有價格錨定的 StableSwap 在這方面是行不通的,因為如果錨定價格與市場價格不同,幾乎所有的代幣都會被買斷。只有在保持這種平衡的情況下,價格重錨才可行。
當價格函數為非解析時應用價格範圍 :
我們可以將價格範圍概念應用於 Curve V2。由於沒有關於池中代幣數量的價格解析表達式,我們需要擬合價格和代幣數量之間的關係。應用於做市商函數的偏移量由價格範圍決定。編寫這樣的程序可以使資本效率更高。
Clipper:針對小額交易優化的 AMM 算法 :
Clipper¹³ 使用最適合小額交易需求的 AMM 算法。它將恆定乘積做市商 (CPMM) 和恆定總和做市商 (CSMM) 概括為兩個極端情況(k = 1 和 k = 0)。
Clipper¹³ :New Invariants for Automated Market Making
https://github.com/shipyard-software/market-making-whitepaper/blob/main/paper.pdf
當只有兩種類型的代幣(X 和 Y)時,不變量可以簡化為更簡單的形式,其中 x0 和 y0 是初始流動性提供者設置的代幣數量。以下是流動性池在不同 k 值下的行為。x 和 y 軸由 x0 和 y0 歸一化。
較小的 k 值對應於 (1, 1) 附近的較低滑點(函數不太凸)。當 k 介於 0 和 1 之間時,不變函數可以與 x 和 y 軸相交。這意味着池中的代幣可能會售罄。該交叉點的價格為零,這意味着該價格在轉折點之前優於 CPMM 價格。過了轉折點后,CPMM 的價格比較好。這可以在下圖中說明:
再次對 x 軸進行歸一化。隨着我們遠離初始點 (1, 1),X 代幣相對於 Y 的價格下降。我們可以精確計算交點發生的位置:
優點: 通過引入 k,Clipper 在交易量較小時實現了更低的滑點(更好的價格)。Clipper 白皮書中的以下圖表進一步證明了這一點。
From Clipper whitepaper
缺點: 當交易量超過一定門檻時,價格會明顯低於 CPMM。
為了保證更好的價格,算法必須不斷地價格重錨(改變 x0 和 y0)以保持當前池儲備接近 (1, 1) 點。它可以使用與 Curve 相同的機制。該算法通過遵循其跟蹤市場價格的內部價格預言機進行價格重錨。本質上,這等價於求解下面的公式,但這次 x, y 是已知的。P 由價格預言機給出。最後求解 x0 的這個方程給了我們新的平衡點。
這確保我們始終以較小的滑點接近市場價格進行交易。目前我們還沒有調查 Clipper 是否實現了這一點,因為這在 Clipper 白皮書中沒有解釋。需要進一步查看其源代碼。
價格範圍概念也可以應用於 Clipper:
TWAMM:針對大額長期訂單優化的 AMM 算法 :
在上面討論的所有 AMM 中,我們一次只能在一個方向上進行交易。如果我告訴您最近出現了一種允許同時進行雙向交易的算法呢?
TWAMM¹⁴(註:時間加權自動做市商,發音為“tee-wham”)算法將一段時間內的長期訂單轉換為無限小的虛擬訂單的積分。訂單可以兩邊同時進行。此外,在同一時間範圍內、同一交易方向執行的訂單會彙集在一起以簡化計算。因此,一段時間內的長期訂單以等於該時期時間加權市場價格的價格執行。
TWAMM¹⁴
https://www.paradigm.xyz/2021/07/twamm/
截至目前,只對於兩種類型的 AMM,CPMM 和 LMSR (註:對數市場評分規則)存在解析形式的 TWAMM 解。
讓我們考慮一般情況,在一段時間內,代幣 X 的總銷售額為 xin ,Y 的總銷售額為 yin 。X 的賣出率為 _ f(t)_ ,Y 的賣出率為 g(t) 。從時間 t 到 _ t_ + _ dt_ 代幣 X 數量的凈變化可以計算為代幣 X 的銷售數量減去在此期間購買的代幣 X 數量,匯率為 dy/dx 。由於在此期間代幣 Y 的銷售量無限小,因此可以使用現貨價格作為實際匯率。
因此,我們得到一個非線性一階微分方程。取決於 dy/dx 、 _ f(t)_ 和 g(t) 的形式,方程可能有也可能沒有解析解。
TWAMM 在恆定乘積做市商 (CPMM) 和對數市場評分規則 (LMSR) 上的應用 :
當應用於 CPMM 時,方程可以被積分,如果 f(t)/g(t) 是一個常數,這意味着代幣 X 和 Y 的銷售策略是相同的。我們可以進一步簡化表達式:
存在這個積分的解析表達式。利用雙曲函數的性質,我們可以得到一個漂亮的最終解(交易后池中的代幣 X 數),它只取決於池的原始位置 _ (x0,y0)_ 和 _ xin,yin_ 。由於 CPMM 的做市商函數關於 _ x_ 和 y 完全對稱,因此也可以通過在 xend 的最終表達式中交換 xin 和 yin、x0 和 y0 的位置來表示最終的代幣 Y 數。代幣 X 數和代幣 Y 數的乘積正如預期的那樣等於 k。
這種源自 CPMM 的微分方程形式,實際上有一個數學名稱叫做“Riccati 方程”。Riccati 方程的一般形式如下:
Riccati 方程沒有一般的解析解。但是,存在可以求解 Riccati 方程的特殊情況。有一篇論文¹⁵討論了這些案例。如果 Riccati 方程的係數滿足這個條件:
論文¹⁵:Analytical solutions of the Riccati equation with coefficients satisfying integral or differential conditions with arbitrary functions
https://arxiv.org/abs/1311.1150
則 Riccati 方程可以轉化為 Bernoulli 型方程。Bernoulli 型方程可以很容易地求解。這應該給我們與以前相同的結果。從上面我們可以看出,滿足這個條件與保持 f(t)/g(t) 恆定相同,這是我們在第一種求解微分方程的方法中假設的。
當 _ f(t)/g(t)_ 不是常數時,我們可以選擇什麼形式的 _ f(t)_ 和 _ g(t)_ 使微分方程具有解析解仍然是一個懸而未決的問題。找到這樣的解決方案會給我們更多的選擇(代幣 X 和 Y 的銷售策略不必相同)。
現在讓我們將 TWAMM 應用到 LMSR:
同樣,我們假設銷售策略是相同的。然後可以對微分方程進行積分。我們可以進一步簡化最終的代幣 X 和 Y 數量表達式為:
同樣,當銷售策略不同時,也不能保證微分方程具有解析解。
一旦我們獲得了 _ xend_ 和 _ yend_ ,我們就可以計算出每方將收到多少代幣 X 和代幣 Y:
由於在此期間,同一交易方向的所有訂單都彙集在一起。每個個體交易者將根據他對 _ xin_ 和 _ yin_ 的貢獻比例獲得他應得的代幣份額。
優點: TWAMM 通過允許交易對手同時對這些大訂單進行交易,從而使大訂單的價格滑點更小。在最理想的情況下( _ xin/yin_ = x0/y0 ),可以實現零滑點交易。在這種情況下, _ xend_ = x0 , _ yend_ = _ y0_ ,TWAMM 可以理解為充當了訂單簿,在不提供流動性的情況下在雙方之間交換代幣。長期訂單被分解成無限小的訂單,這些訂單在區塊之間虛擬執行。由於這種性質,它不太容易受到 三明治攻擊 ,因為攻擊者必須在塊的末尾放置一個命令,並在下一個塊的開頭放置另一個命令。
缺點: 如果我們允許訂單在任何時候到期,gas 費用可能會非常高。這是因為我們必須多次計算積分結果(在論文中他們稱之為“懶惰計算”)。在最壞的情況下,我們必須計算每個塊的結果。因此,在實踐中我們必須讓訂單在某些區塊到期以簡化計算。此外,TWAMM 使用的流動性池必須與現有的流動性池不同,因為沒有虛擬訂單和懶惰計算的概念。普通交易者在與 TWAMM 交互時不想支付懶惰計算產生的額外 gas 費用(只要有人與之交互,流動性池就會更新)。
TWAMM 在 YieldSpace 等與時間相關的 AMM 上的應用 :
我們還可以將 TWAMM 應用於與時間相關的 AMM,例如 YieldSpace¹⁶:
YieldSpace¹⁶:An Automated Liquidity Provider for Fixed Yield Tokens
https://yield.is/YieldSpace.pdf
做市商函數有兩種形式,這兩種形式都會導出目前我們不知道如何求解的微分方程。在第二種形式的情況下,微分方程可以簡化為單個微分方程。
結論和未來工作 :
我們希望這篇綜合性的、介紹性的、學習筆記風格的論文能夠為對 AMM 算法一無所知的人和有更多經驗的人提供一些見解。
總而言之,AMM 算法的核心基本上是關於做市商函數的設計及其曲率分佈的操縱。顯然,我們需要閱讀另一篇 Guillermo Angeris 和 Tarun Chitra 寫的論文¹⁷,其中詳細討論了這一點。除此之外,還有高效的價格解決方案(如 DEX 聚合器)和高效的流動性提供解決方案(如價格範圍)。最近的 TWAMM 算法闡明了我們如何使用 AMM 算法來實現中心化交易中常見的訂單簿類型的撮合。我們相信 AMM 算法的未來將更接近訂單簿風格。
Guillermo Angeris 和 Tarun Chitra 寫的論文¹⁷:Improved Price Oracles: Constant Function Market Makers
https://arxiv.org/abs/2003.10001
至於未來的工作,我們計劃對本文中提到的一些問題進行更深入的挖掘。這包括閱讀論文 [4]、[5]、[7]、[16]、[17],推導其他 AMM 的無常損失公式,推導其他 AMM 的流動性分佈,了解模糊測試的工作原理,回答我們提出的關於 Xcp 的 3 個問題,更多地了解如何選擇最有效的價格預言機和 s 值,製作 Curve 價格重錨過程的動畫,了解更多關於單邊流動性的創新,嘗試設計更好的動態權重 K,將價格範圍應用於 其他 AMM,將 TWAMM 應用到其他 AMM 並找到更多解析解。
作者感謝 Fangyuan Zhao、Showen Peng、DW 對本文研究課題提出十分有用的意見。作者還要感謝火幣研究院的 Lianxuan Li。作者特別感謝 Paradigm 的 Dave White 和 Dan Robinson 邀請加入 TWAMM 討論組以及他們富有洞察力的討論。同時也要感謝 BTX Capital 的 Vanessa Cao 和 Jane Hu 對本文的翻譯和排版。
本文鏈接:https://www.8btc.com/article/6691254
轉載請註明文章出處