自動做市商(AMM)演算法的數學觀點及其未來

4月20, 2023

劉磊,謝國華在錨道實驗室

在本文中,我們將首先回顧由Bancor,Uniswap,Balancer和Curve等協定實現的四種自動做市商(AMM)演算法。還將討論AMM演算法的最新發展,可能的改進和未來。

內容

  1. Bancor的債券曲線和交易公式
  2. Uniswap 的無常損失計算
  3. 當價格在 2ρ 以內時獲得正收益
  4. Uniswap V3 中的流動性分佈、流動性沉積、範圍順序
  5. 平衡器的做市商功能和交易公式
  6. 智慧訂單路由器 (SOR) 演算法
  7. 曲線的穩定掉期和交易公式
  8. 動態權重、可定製的價格挂鉤和曲線 V2 的平滑價格過渡
  9. 2 代幣池設置中曲線 V2 的做市商功能
  10. 曲線 V2 與 CPMM 和 StableSwap 相比的價格函數
  11. 重新挂鉤過程: Xcp 標準、EMA 價格預言機、相對價格變化步長 s
  12. 曲線V2的動態交易費用
  13. DEX 聚合器:平衡器 SOR 演算法的通用解決方案
  14. 樞軸演算法:嘗試解決無常損失問題
  15. 單面流動性解決方案
  16. 為曲線 V2 設計更好的動態權重
  17. 當價格函數不具有分析性時應用價格範圍
  18. 快船:針對小額交易優化的AMM演算法
  19. TWAMM:針對大型長期訂單優化的AMM演算法
  20. TWAMM在恆定產品做市商(CPMM)和對數市場評分規則(LMSR)上的應用
  21. TWAMM在時間依賴性AMM上的應用,如YieldSpace。
  22. 三. 結論和今後的工作

班科

Bancor¹利用粘合曲線的概念來確定價格。債券曲線是代幣價格與其總供應量之間的關係。

Bancor 選擇的不變是 F,稱為連接器權重它是 R(流動性池中的儲備代幣數量)與 S(流動性池外的 BNT 總供應量)和 P(BNT 和儲備代幣之間的相對價格)的乘積之間的比率。我們可以代入 P 的方程並將兩邊積分²,得到 P S 之間的關係。這是一個指數表達式,其中指數α與連接器權重 FF 介於 0 和 1 之間)相關。F越小,α就越大,這意味著相對於BNT的總供應量,價格變化得更快。

使用此表達式和簡單的積分,我們可以推導出 T (購買的 BNT 代幣)和 E (支付的儲備代幣)之間的關係,其中 R0S0RS 的當前值。

如果我們想在代幣 A 和代幣 B 之間進行交換,將代幣 A 出售為代幣 B。我們首先需要從池 A 購買 BNT 代幣,使用代幣 A,如果我們沒有的話。接下來,我們需要使用 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 使用恆定產品做市商 (CPMM) 來確定價格。在我們深入研究 Uniswap V2 和 V3 使用的演算法之前,讓我們首先了解什麼是無常損失 (IL) 以及如何計算它。

If the AMM function is convex (the price increases as we buy / price decreases as we sell), then a single trade with no transaction fee compensation will always cause liquidity providers to lose money. Suppose one trade causes the AMM function to move from point 1 to point 2. The spot price (absolute value of the function’s derivative) at point 1 and point 2 are P1 and P2. P3 is the actual trading price. Due to the nature of convex functions, P1 > P3 > P2. Impermanent loss is defined as the difference in value between the current value of liquidity provider’s tokens in the pool after trading and the current value of liquidity provider’s tokens if he simply holds onto his tokens and does not use them for liquidity provision, which are denoted by V and Vheld. For convenience, impermanent loss and price will be expressed in terms of token Y (the price of 1 token Y is unit 1). After some simple derivations, it is easy to show that impermanent loss is always less than zero (x2 > x1, P2 < P3).

Uniswap³ V2 利用簡單但功能強大的公式來確定交易。池代幣儲備數的乘積是一個常數。與Bancor相比,它擺脫了網路令牌。交易完全由流動性池中的代幣數量決定。

由於這個函數的性質,池中兩個代幣的價值將始終相同(我們在本文中使用的價格將始終是相對價格)。

使用相同的邏輯,在 Uniswap V2 中計算單筆交易的無常損失並不難。假設交易將價格從 P 更改為 Pk。以百分比衡量的無常損失可以僅表示為 k 的函數。

毫不奇怪,這個函數總是小於或等於零,正如我們從上面的無常損失無費用數位中看到的那樣。如果水平軸繪製在對數空間中,IL (k) 將是對稱的。結論是:相對價格變化越大,無常損失就越大。這可以解釋為流動性提供者更有價值的代幣是從池中購買的,給他們留下了更多價值較低的代幣。

接下來,讓我們看看如果我們添加交易費用,IL (k) 的行為將如何:

導出的無常損失函數 IL(k,ρ) 看起來與無常損失函數非常相似。我們可以通過將 ρ 設置為零來進行健全性檢查,得出相同的結果。典型的 Uniswap V2 費用百分比為 ρ = 0.3%。在繪製無常損失函數時,我們可以看到在大約 k = 0.994 到 1(大約 2ρ 跨度)之間有一個高於零的部分。在該地區,無常損失為正,這意味著流動性提供者實際上獲得了價值(賺取的交易費用超過了該地區的損失)。通過引入交易費用,當價格在一定範圍內移動時,流動性提供者將獲得正收益。

在上面的討論中,我們只考慮了相對價格下跌的情況。我們還可以計算流動性提供者將獲得正收益的 k 的確切範圍。

當 ρ 較小時,考慮到兩個條件(價格上漲和下跌),k 的總範圍約為 4 ρ(每個 2 ρ)。 這意味著當價格在原始價格的 2ρ 以內移動時,流動性提供者將獲得正收益。我們還可以根據代幣儲備來計算最大交易量,毫不奇怪,當 ρ 很小時等於 ρ

當價格變動更加波動時,流動性提供者似乎總是會處於虧損狀態。然而,實際上情況並非如此。我們很清楚 Dave White等人的工作,它解決了這個難題。可悲的是,這超出了這篇入門級中等論文的範圍。我們打算在今後進一步研究這個問題。

至於其他流行的AMM演算法(包括Uniswap V3)的無常損失推導,我們向讀者推薦這篇由 Jiahua Xu等人撰寫的可愛論文。這些推導將成為另一天的主題。

優點: 第一個在池中實現代幣數位的凸函數來確定價格。

缺點: 流動性提供在所有價格範圍內都是均勻的,這意味著資本效率較低。

為了增加流動性效用並降低無常損失風險, Uniswap⁶ V3 允許使用者僅在特定價格範圍內提供流動性。

摘自 Uniswap V3 白皮書

這是通過轉換 Uniswap V2 函數來實現的:

摘自 Uniswap V3 白皮書

如上圖和等式所示,將函數向下平移 a 點的 y 值,向左平移 b 點的 x 值,可確保 ab 之間的有效交易結果相同,就像我們使用綠色曲線作為價格確定函數一樣。 當價格超出此範圍時,其中一個代幣儲備將被售罄,從而有效地將流動性集中在該價格範圍內。

丹·羅賓遜(Dan Robinson)⁷有一篇關於計算許多AMM的流動性分佈的優秀論文。

也可以簡單地表明,兩個流動性提供者在同一價格範圍內的流動性可以簡單地加在一起。

存入流動性時,如上所示,Uniswap V3 中每種資產的價值不一定相等。只有當 P 等於 PaPb的幾何平均值時,每個資產的價值才相等。當 P 小於幾何平均值時,資產 X 的值大於資產 Y 的值。當 P 大於幾何平均值時,資產 X 的值小於資產 Y 的值。

當當前價格完全超出流動性提供者設置的價格範圍時,Uniswap V3 將流動性提供者的輸入計為區間訂單,只允許他存入一種類型的代幣(類型取決於價格範圍是完全高於還是低於當前價格)。例如,考慮一個由ETH和Dai組成的流動性池。如果價格範圍完全高於ETH的當前價格,則使用者將只被允許存入ETH。如果價格範圍完全低於ETH的當前價格,則使用者只能存入Dai。當價格完全超過流動性提供者設定的價格範圍時,他存入的資產將全部轉換為其他類型的代幣。由於使用者只能存入一種類型的代幣,區間訂單只能實現四種傳統限價訂單中的兩種(止盈訂單、買入限價訂單)。另一方面,買入止損訂單和止損訂單無法實現。截至目前,我們不知道限制範圍訂單的代幣類型的目的是什麼。

優點: Uniswap V3 引入了流動性分配的概念,允許其使用者在價格範圍內存入流動性。通過集中流動性,它提高了資本效率。當存入相同價值的資產時,可以實現更高的流動性和更低的滑點。在價格範圍內提供流動性也在某種程度上降低了無常損失的風險。

缺點: 用戶在進行範圍訂單時只能存入某些類型的代幣。因此,買入止損訂單和止損訂單無法實現。

Uniswap V2 和 V3 在其 AMM 演算法中引入了 CPMM 和流動性分佈。在價格範圍內提供流動性本質上使 Uniswap V3 成為通用 AMM,能夠通過改變其流動性分佈成為任何可能的 AMM。

平衡器

平衡器⁸ 將 Uniswap V2 的 2 個令牌池擴展到多令牌池。平衡器池中每種類型的資產的值都有一個不變的權重,加起來為 1。不難看出,這相當於每個資產的儲備數的冪積是一個常數。資產 n 相對於資產 t 的價格也可以推匯出為資產 tn 的儲備數量之間的比率,通過它們的權重進行歸一化。

基於常數不變性,我們可以推導出具有不同輸入的交易公式(資產 o 和資產 i 之間的交易)。在此符號標準中,資產 o 始終是買斷的資產。資產 i 是發送的資產。AB 是發送/接收的令牌和當前令牌保留編號。根據價格的變化,我們還可以計算發送的代幣或買斷的代幣。

Balancer還引入了智慧訂單路由器(SOR⁹)演算法。

https://docs.balancer.fi/v/v1/smart-contracts/sor/

該演算法的一般思路是將訂單分成幾個小塊在不同的平衡池中進行交易,以獲得更好的交換結果。假設我們想在池 1 和池 2 中進行交易。如果我們想要交易的總金額 N 低於上圖中的 A ,我們將只在池 1 中交易,因為池 1 中的價格總是優於池 2 中的價格。如果總金額超過 A,我們將交易池1中的部分訂單和池2中的部分訂單。每個池中的交易金額將使每個池中的價格相等(B + C = N)。

很容易證明最優策略始終是使每個池中的價格相等的策略(如果價格不相等,我們總能找到價格更好的池來改善我們的掉期結果)。

一般來說,價格函數相對於交易金額是一個非線性函數。平衡器將價格函數簡化為線性函數。如果有 n 個池,最優策略可以表示為:

如果存在一個價格函數,使得當交換其相應池中的所有代幣時,無法在交換之前使價格等於所有其他價格函數的初始值,那麼簡單的最佳策略將是交換該池中的所有代幣。在進行更複雜的計算之前,我們需要首先確定是否滿足此條件。如果只有某些價格函數的初始值無法匹配,則僅應從計算中刪除這些價格函數。

在此計算中,不考慮汽油費。實際上,最佳策略應該在路線收益和汽油費損失之間保持平衡。

我們認為,SOR演算法可以在更廣泛的背景下使用。例如,價格函數可以是其他AMM協定池的函數。由於我們目前知識的局限性,我們不確定實際的AMM聚合器是否使用相同的邏輯來實現更好的價格。本文稍後將討論一種沒有任何價格函數近似的更通用的解決方案。

優點: Balancer 將 2 令牌池推廣到多令牌池,並引入 SOR 演算法為其用戶實現更好的價格。

缺點: “流動性池的強度取決於其最弱的資產。一個池中的代幣類型越多,風險就越高。

Balancer是一種多代幣投資組合管理工具,允許靈活的代幣價值分配,並具有價格優化演算法。

曲線

曲線將恆和做市商(CSMM)和恆積做市商(CPMM)合併在一起,以實現較低的價格滑點。我們可以將此演算法視為向 Uniswap/Balancer 模型添加一個恆定價格部分,以使生成的函數與特定價格挂鉤。

Curve¹⁰ V1,被稱為StableSwap,設計其穩定幣交易演算法。它將CSMM乘以權重並添加CPMM:

首先,我們考慮一種特殊情況,其中流動性池中每個代幣的數量是相同的。在平衡保持時顯示方程是微不足道的(χ是權重,Dⁿ⁻¹乘以CSMM和CPMM具有相同的數量級)。但是,當流動性池失衡時,如果χ是一個常數,則方程將不再成立。因此,我們需要使χ動態化。曲線 V1 選擇χ的泛函形式,當處於極端不平衡時,該函數變為零,這意味著方程由CPMM主導。在平衡時,χ 等於 AA 是一個常數,通過類比歷史數據進行優化。代入χ得到一個一直成立的方程。

接下來,讓我們推導出 StableSwap 如何實際計算掉期結果。根據池中當前的代幣數量,我們可以計算 D。例如,如果我們想交換為令牌j,我們可以分離xj並求解xj的方程:

方程可以簡化為二次形式。可悲的是,Vyper中現在沒有數學庫可以解決二次方程。因此,StableSwap實現了牛頓求解 xj的方法。反覆運算公式每次反覆運算都會使其精度加倍。因此,可以在設定的氣體限制內計算可接受的 xj 。最後,交換后和交換前 xj 之間的差異將是購買的代幣 j 的數量。

來自 StableSwap 白皮書
來自 StableSwap 白皮書

與CPMM相比,StableSwap做市商被壓平,相對於x + y = const。這確保了掉期價格接近或等於 1,在均衡點附近滑點非常小(當池中的一個代幣不接近幾乎售罄時)。當池中的一個代幣幾乎售罄時,價格開始急劇下跌。這很容易理解:函數的曲率/滑移集中在其他地方,以確保平衡附近的小滑點。

該模型中的CPMM和動態權重用於懲罰知情的極大訂單,防止池中的代幣完全售罄。

優點: 通過將CSMM和CPMM與動態權重一起添加,Curve的StableSwap實現了非常小的滑點,非常適合穩定幣。

缺點: 價格始終固定在 1。如果市場價格與池價格顯著不同,則池將被買斷。因此,穩定交換僅適用於穩定幣。

為了確保更平穩的價格過渡和可自定義的價格挂鉤, Curve¹¹ V2 將動態權重 χ 修改為 K,如下所示:

K0 在 0(不平衡)和 1(平衡)、 χ K (由 A 歸一化)之間變化,因為 K0 的函數如下圖所示:

我們可以從上圖中瞭解曲線 V2 如何平滑價格過渡。基本上,當遠離平衡時,它使動態權重迅速下降。 γ 越低,下降越快。使動態權重快速下降到零本質上等同於強制函數的行為更像 CPMM,即使池也只是一點點不平衡。

DW在推特¹²上有一條很棒的推文,解釋了同樣的概念。

價格轉換問題解決了。現在我們討論曲線 V2 如何實現其他價格挂鉤而不是 1。具有價格挂鉤(他們在白皮書中稱之為價格規模)意味著做市商曲線上存在一個均衡點,其中縮放的代幣數量相等:

縮放后的代幣數量滿足與StableSwap類似的等式。以最簡單的 2 代幣池為例,做市商函數可以用 AγpDxy 來表示。該函數可以簡化為關於 xy 的三次函數(相對於 D的性函數)。

該函數的典型值圖如下所示:

還可以繪製代幣 x 相對於代幣 y 的價格。曲線 V2 價格函數在均衡點 (1000, 1000) 附近有一個常數部分。曲線V2略微延遲了價格變動,而不是完全與StableSwap進行比較。隨著交易量的增加,與CPMM相比,價格開始以較小的滑點做出反應。總而言之,曲線V2在平衡點附近實現了非常小的滑點,並且在其他地區實現了比CPMM更好的滑點。至於其他價格挂鉤而不是 1,我們只需更改上述立方/性方程中的 p 。因此,價格挂鉤問題也得到了解決。

我們可以在 StableSwap 中使用類似的牛頓方法來計算掉期結果。首先,我們根據池中的當前代幣數字計算 D (這次使用牛頓方法,因為方程要複雜得多)。其次,如果我們想交換令牌 i,我們再次使用牛頓方法求解 xi。同樣,差異(按其價格規模歸一化)將是 購買的代幣數量(所有 xi 都是按比例計算的代幣編號)。

為了確保多項式函數的根可以在設定的氣體限制內求解,曲線白皮書討論了他們選擇的起始猜測,以及函數中的參數。他們使用一種稱為模糊測試(假設框架)的方法來確定這些最佳值。目前,我們不知道有關此方法的任何詳細資訊,並希望瞭解更多資訊。

為了確保小滑點(在均衡點附近交易),曲線V2通過改變價格尺度不斷重新挂鉤做市商功能。然而,重新挂鉤可能導致流動性提供者遭受價值損失。曲線 V2 引入了一個名為 Xcp 的變數來緩解此問題:

如果一次重持后的損失大於累積 Xcp 的一半(原始 Xcp 的價值收益),演算法將保持做市商功能相同。關於這個問題,我們以後想回答幾個問題,因為白皮書只簡要討論了 Xcp。看看它的原始程式碼可能會有所説明。

  1. Xcp 值是否與使用池中當前令牌編號計算的值成比例?
  2. 存入或提取流動性是否計入 Xcp
  3. 如果提取流動性計入Xcp 如果 Xcp 的降幅過大,是否會停止?

對於重複,曲線 V2 使用 EMA(指數移動平均線)價格預言機來確定預言機價格。新的預言機價格向量由上一個掉期價格向量和上一個預言機價格向量的線性組合確定。新的價格尺度向量的變化方向與預言機價格相似,但不完全等於新的預言機價格。它們通過引入相對價格變化步長 s 來滯後於預言機價格的價格尺度向量 該方程可以使用歐幾里得幾何輕鬆推導出來。EMA價格預言機和價格規模延遲在這裡是為了減少近期價格波動的影響,並更好地代表長期市場價格。

關於相對價格變化步長s,根據我們的“刷新曲線金融網頁”經驗,對於某些池 s的變化至少為幾十分鐘。曲線V2如何更新是一個有趣的問題,超出了我們目前的知識範圍。查看其原始程式碼也會有所説明。

演示單個重釘子過程的圖如下所示:

假設我們在 x = 1000 開始掉期,在 x = 1400 結束掉期。最初,價格固定在 1。掉期后,價格移至0.6。為了簡化且僅用於演示目的,我們將新的價格尺度設置為等於現貨價格(價格現在固定在 0.6),並求解性方程得到 D。現在做市商函數固定在 0.6,如上所示。

重挂鉤本質上等同於找到一個新的做市商函數,該函數通過當前的代幣數位點(在 2 代幣池的情況下為 (x, y)),平衡點在 (x0, y0) 使得 y0/x0 等於衍生品在 (x0, y0) 的絕對值。 一個有趣的專案是獲取真實的曲線融資池參數,以更好地演示(可能是動畫)重新挂鉤過程。

由於上面討論的曲線 V2 的做市商特徵,明智的做法是將交易費用作為 2 層交易費用與動態權重的線性組合,衡量我們離均衡點有多遠(當前價格走勢更像 StableSwap 還是 CPMM)。曲線 V2 選擇的 fmidfout 值分別為 0.04% 和 0.4%。下圖顯示了 2 代幣池中費用的變化情況(假設沒有重新挂鉤或流動性變化):

優點: 做市商功能可以與任何價格挂鉤,適合所有代幣,而不僅僅是穩定幣。價格轉換比穩定掉期更平滑。曲線V2還根據其內部價格預言機不斷更新價格尺度,以更好地代表市場價格,並確保交易接近均衡點。動態費用確保在此基礎上獲得更優惠的價格。

缺點: 由於求解立方方程和性方程,汽油費可能會更高。僅基於其內部價格預言機的重新挂鉤可能會有風險。我們想知道是否存在價格規模與市場價格明顯不同的情況,同時通過 Xcp 標準。如果是這種情況,與其他預言機交叉檢查價格可能會有所説明。

Curve的StableSwap和動態挂鉤V2在這裡使交易滑點盡可能小。StableSwap 始終以 1 挂鉤,而 V2 使挂鉤跟隨市場價格。

下面將討論 AMM 演算法的一些最新進展和可能的改進。

DEX 聚合器

DEX 聚合器是聚合現有 AMM 協議以實現更好的交換結果的協定。如上所述,Balancer的SOR演算法也適用於DEX聚合器,確保數學上最佳的交換策略。

Balancer的SOR演算法的一般解決方案,沒有任何價格函數近似,可以表示如下:

因為價格函數可以是任何形式,具體取決於它們產生的AMM演算法。這意味著滿足代幣總數守恆和最終價格相等條件的方程可能沒有解析解。

因此,我們介紹了一種通常用於機器學習等領域的技術,稱為梯度下降。我們將損失函數定義為不同價格函數值的方差。在選擇了一個起始猜測(一個微不足道的、不知情的猜測將是每個池中相等的掉期金額 N/n )之後,我們可以反覆運算(將每個掉期金額更改為損失函數相對於該變數的偏導數,乘以學習率 l)以獲得最佳結果,並設定容錯能力。

由於總交易金額作為最終等價的函數是單調的,因此此方法應該能夠找到全域最小值(方差 = 0)。同樣,上面的計算假設沒有微不足道的解決方案(不存在價格函數,因此當交換其相應池中的所有代幣時,無法使價格等於交換前所有其他價格函數的初始值)。

透視演算法

樞軸演算法試圖通過使做市商函數通過一個固定點(x0y0)來樞軸化做市商函數。

x0y0) 處的價格將始終是設計上的當前市場價格 Pt 。從概念上講,這確保了套利將始終將池帶回點(x0y0)。由於此功能,無常損失將為零。但是,實際上,該演算法沒有足夠的參數來擬合當前儲備(xy)和(x0y0)。這意味著我們必須等待池回到 (x0y0),然後更改做市商函數。

從上圖可以看出,掉期後點不在新的做市商函數上(藍色和藍色虛線曲線)。如果當前市場價格小於當前儲備的現貨價格,則池可能也沒有任何動力回到(x0y0)。

我們想知道是否存在這樣的函數,它同時通過 (xy) 和 (x0, y0),在 (x0, y0) 處使用可調導數來擬合市場價格。如果我們假設函數是凸的,那麼市場價格不能小於這兩點之間的線性段斜率。因此,如果做市商函數必須是凸的,則可能沒有完整的解決方案。

單面流動性

流動性提供者在存入流動性時存入所有類型的資產可能不方便。我想知道是否存在其他機制與Bancor採取的彈性供應方法不同。憑直覺,有兩種解決方案:1.首先使用相同的協議交換部分代幣 2.不管不顧地存入單邊流動性,讓套利將價格帶回市場價格。

例如,我們希望將流動性存入具有相同價值的 2 代幣池中。

我們只有令牌 x。不難計算出我們需要交換多少,以便交換后每個代幣的價值相等。也很容易證明 β 總是在 0 到 1 之間,這意味著一個合理的結果。但是,掉期后的價格可能與存入流動性時的價格不同。因此,我想知道協定是否真的將掉期和流動性沉積作為一個原子操作。進行掉期時也有價格滑點。到目前為止,像平衡器和曲線這樣的協定如何處理單側流動性沉積仍然是我們的一個問題。如果滑點很小,則執行上述操作是有意義的。

平衡器和曲線白皮書中描述的第二種方法是無論如何都要存款。這可能會改變價格。由此產生的套利也可能使無常損失變得重大。我們個人在 Balancer 白皮書和文檔中沒有看到任何計數器度量。另一方面,Curve引入了一種稱為不平衡費用的東西,在存入單側流動性時,其範圍從0%到0.02%。實際上,由於套利和無常損失,在第二種方法下存入單邊流動性並沒有真正的動機。

瞭解更多關於與單邊流動性相關的其他創新將是有趣的。

γ價值

在曲線 V2 中,有一個常數稱為 γ。如果我們也讓它動態化會發生什麼?例如,我們可以使其成為 K0 的函數。最簡單的情況是使其等於 K0。這裏的動機是使函數在接近平衡時表現得更像 StableSwap,當它遠離時更像 CPMM。

紫色虛線曲線位於 StableSwap 和小 γ 曲線之間,應該在 StableSwap 和曲線 V2 之間為我們提供做市商函數。但是,當我們繪製做市商函數時,它的行為與 StableSwap 完全相同:

此問題有兩種解決方案:1.使A變小2。選擇更高的功率數 K0 來表示γ。然而,兩者似乎都是可行的,1.破壞了A成為大數的目的:使做市商功能與價格挂鉤。我們所做的進一步測試似乎表明,更改 A 不會對功能行為產生影響(更改 A 後,做市商函數仍然看起來像 StableSwap)。

第二種解決方案將使汽油費更高。 K0 的較高冪數對應於我們需要求解的高階多項式方程。事實上,曲線 V2 選擇特定形式的動態權重 K 的原因是將 K0 函數的行為類比到一個大的冪,同時不使多項式的階數更高。

這裡有趣的問題是:我們能否找到更好的動態權重來簡化我們需要求解的方程,同時保持曲線 V2 的相同或更好的功能?在設計這樣的動態權重時,我們還必須記住,我們需要在小滑點和做市商函數對知情的大訂單做出反應的能力之間保持平衡。顯然,只有價格挂鉤的StableSwap在這方面是行不通的,因為如果挂鉤價格與市場價格不同,幾乎所有的代幣都會被買斷。只有保持平衡,重新挂鉤才可行。

價格範圍

我們可以將價格範圍概念應用於曲線 V2。由於沒有關於池中代幣數量的價格分析表達式,我們需要插入價格和代幣數量之間的關係。應用於做市商功能的偏移量由價格範圍決定。編寫這樣的程式可以使資本效率更高。

Clipper¹³ 使用最適合小額交易需求的 AMM 演算法。它將恆定產品做市商(CPMM)和不變和做市商(CSMM)概括為兩種極端情況(k = 1和k = 0)。

當只有 2 種類型的代幣(X 和 Y)時,不變性可以簡化為更簡單的形式,其中 x0y0 是初始流動性提供者設置的代幣編號。以下是池在不同 k value 下的行為。x 和 y 軸按 x0y0 歸一化。

較小的 k 值對應於 (1, 1) 附近的較低滑點(函數凸度較小)。當 k 介於 0 和 1 之間時,不變函數可以與 x 軸和 y 軸相交。這意味著池中的代幣可能會售罄。這種交叉點的價格為零,這意味著價格優於CPMM價格,直到轉捩點。過了拐點后,CPMM價格更好。這可以用下圖來說明:

x 軸再次歸一化。X 代幣相對於 Y 的價格隨著我們遠離初始點 (1, 1) 而下降。我們可以精確計算出交叉點發生的位置:

優點: 通過引入 k,Clipper在交易量較小時實現了更低的滑點(更好的價格)。Clipper白皮書中的下圖進一步證明瞭這一點。

來自快船白皮書

缺點: 當交易量超過一定閾值時,價格將明顯低於CPMM。

為了保證更好的價格,演算法必須不斷重新挂鉤(改變x0和y0),以保持當前池儲備接近(1,1)點。它可以使用與 Curve 相同的機制。該演算法通過遵循其內部價格預言機來重新挂鉤,該預言機跟蹤市場價格。本質上,這相當於求解以下公式,但這次 xy 是已知的。P 由價格預言機給出。最後求解x0的這個方程給了我們新的平衡點。

這確保了我們始終以較小的滑點接近市場價格進行交易。目前我們還沒有調查Clipper是否實現了這一點,因為Clipper白皮書中沒有對此進行解釋。需要進一步查看其原始程式碼。

價格區間概念也可以應用於快船:

特瓦姆

在上面討論的所有 AMM 中,我們只能在一個實例上向一個方向進行交易。如果我告訴你最近出現了一種允許同時進行雙向交易的演演算法怎麼辦?

TWAMM¹⁴(時間加權自動做市商,發音為“tee-wham”)演算法將一段時間內的長期訂單轉換為無限小的虛擬訂單的積分。訂單可以同時雙向進行。此外,在相同時間範圍內、同一交易方向執行的訂單彙集在一起以簡化計算。因此,一段時間內的長期訂單以等於該時間段的時間加權市場價格的價格執行。

截至目前,只有兩種類型的AMM,CPMM和LMSR(對數市場評分規則)的封閉式TWAMM解決方案。

讓我們考慮一般情況,在一段時間內,代幣 X 的總銷售量是 xin,Y 的總銷售額是。X 的銷售率是 f(t),Y 的銷售率是 g(t)。從時間 t 到 t + dt 的代幣 X 數量的凈變化可以計算為代幣 X 的銷售數量減去在此期間購買的代幣 X 的數量,匯率為 dy/dx由於在此期間代幣Y的賣出數量無限小,因此現貨價格可以作為實際匯率。

因此,我們得出了一個非線性的一階微分方程。根據dy/dx、f(t)和g(t)的形式,方程可能有也可能沒有閉式解。

當應用於CPMM時,如果f(t)/g(t)是一個常數,則方程可以積分,這意味著代幣X和Y的銷售策略是相同的。我們可以進一步簡化表示式:

有一個積分的分析表達式。利用雙曲函數的屬性,我們可以得到一個好看的最終解(交易後池中的代幣X數),它只取決於池的原始位置(x0,y0)和xinyin最終的代幣 Y 數也可以通過切換 xend 最終表示式中 xin 和 yin 的位置、x0 y0 來表示,因為 CPMM 的做市商功能相對於 x y 是完全對稱的。令牌 X 數和令牌 Y 數的乘積按預期等於 k

這種形式的微分方程源自CPMM,實際上有一個技術名稱,稱為“里卡蒂方程”。里卡蒂方程的一般形式如下:

里卡蒂方程沒有一般的閉式解。但是,在特殊情況下,可以求解里卡蒂方程。有一篇 論文¹⁵討論了這些案例。如果里卡蒂方程的係數滿足此條件:

然後里卡蒂方程可以轉換為伯努利型方程。伯努利型方程可以很容易地求解。這應該給我們帶來與以前相同的結果。從上面我們可以看到,滿足這個條件與保持f(t)/g(t)恆定相同,我們在求解微分方程的第一種方法中假設了這一點。

當f(t)/g(t)不是一個常數時,我們可以選擇什麼形式的f(t)和g(t)使微分方程具有閉式解仍然是一個懸而未決的問題。找到這樣的解決方案將為我們提供更多選擇(代幣 X 和 Y 的銷售策略不必相同)。

現在讓我們將 TWAMM 應用於 LMSR:

同樣,我們假設銷售策略是相同的。然後可以對微分方程進行積分。我們可以進一步簡化最終的標記 X 和 Y 數字運算式為:

同樣,當銷售策略不同時,微分方程不能保證具有閉式解。

一旦我們獲得了 xendyend,我們就可以計算出每一方將收到多少代幣 X 和代幣 Y:

由於在此期間,同一交易方向的所有訂單都彙集在一起。每個交易者將根據他對 xinyin 的貢獻百分比獲得他公平份額的代幣。

優點: TWAMM通過允許交易對手同時與這些大訂單進行交易,使大訂單的價格滑點更小。在最理想的情況下(xin/yin = x0/y0),可以實現零滑點交易。在這種情況下, xend = x0yend = y0,TWAMM 基本上充當訂單簿,在雙方之間交換代幣而不提供流動性。長期訂單被分解成無限小的訂單,這些訂單在區塊之間虛擬執行。由於這種性質,它不太容易受到三明治攻擊,因為攻擊者必須在一個塊的末尾下訂單,在下一個塊的開頭下另一個訂單。

缺點: 如果我們允許訂單隨時到期,汽油費可能會非常高。這是因為我們必須多次計算積分結果(在論文中他們稱之為“惰性評估”)。在最壞的情況下,我們必須計算每個塊的結果。因此,在實踐中,我們必須使訂單在某些區塊到期以簡化計算。此外,TWAMM使用的流動性池必須與現有的流動性池不同,因為沒有虛擬訂單和惰性評估的概念。普通交易者不想支付與TWAMM交互時懶惰評估產生的額外gas費用(每當有人與之交互時,池就會更新)。

我們還可以將TWAMM應用於與時間相關的AMM,例如 YieldSpace¹⁶:

做市函數有兩種形式,這兩種形式都會導致微分方程,目前我們不知道如何求解。在第二種形式中,微分方程可以簡化為單個微分方程。

結論和今後的工作

我們希望這篇全面的、介紹性的、學習筆記風格的論文可以為對AMM演算法一無所知的人和更有經驗的人提供一些見解。

總而言之,AMM演算法的核心基本上是關於做市商函數的設計及其曲率分佈的操作。顯然,我們需要閱讀 吉列爾莫·安吉裡斯(Guillermo Angeris)和塔倫·奇特拉¹⁷的另一篇論文,其中詳細討論了這個問題。除此之外,還有有效的價格解決方案,如DEX聚合器和有效的流動性提供解決方案,如價格範圍。最近的TWAMM演算法闡明瞭我們如何使用AMM演算法來實現集中式交易所中常見的訂單簿類型的匹配。我們相信AMM演算法的未來將更接近訂單簿風格。

至於未來的工作,我們計劃對本文提到的一些問題進行更深入的挖掘。這包括閱讀論文 [4]、[5]、[7]、[16]、[17],推導其他 AMM 的無常損失公式,推導其他 AMM 的流動性分佈,瞭解模糊測試的工作原理,回答我們提出的關於 Xcp 的 3 個問題,瞭解更多關於如何選擇最有效的價格預言機和 s 值的資訊,製作曲線重挂鉤過程的動畫, 瞭解更多關於單側流動性的創新,嘗試設計更好的動態權重 K,將價格範圍應用於其他AMM,將TWAMM應用於其他AMM並尋找更多封閉式解決方案。

確認

作者感謝趙方圓、彭秀文、DW對本文主題的有益討論。作者還要感謝火幣研究的李連軒。作者特別感謝Paradigm的Dave White和Dan Robinson邀請他們參加TWAMM討論組以及他們富有洞察力的討論。

引用

[1] Bancor協議通過智慧合約為加密代幣提供持續流動性

https://storage.googleapis.com/website-bancor/2018/04/01ba8253-bancor_protocol_whitepaper_en.pdf

[2] 班科系統的公式

https://drive.google.com/file/d/0B3HPNP-GDn7aRkVaV3dkVl9NS2M/view?resourcekey=0-mbIgrdd0B9H8dPNRaeB_TA

[3] Uniswap V2 Core

https://uniswap.org/whitepaper.pdf

[4] Uniswap的金融煉金術

https://research.paradigm.xyz/uniswaps-alchemy

[5] SoK:具有自動做市商(AMM)協定的去中心化交易所(DEX)

https://arxiv.org/abs/2103.12732

[6] Uniswap V3 Core

https://uniswap.org/whitepaper-v3.pdf

[7] Uniswap V3: The Universal AMM

https://www.paradigm.xyz/2021/06/uniswap-v3-the-universal-amm/

[8] 非託管投資組合經理、流動性提供者和價格感測器

https://balancer.fi/whitepaper.pdf

[9] 智慧訂單路由器 V2

https://docs.balancer.fi/developers/smart-order-router

[10] 穩定 掉期 — 穩定幣流動性的有效機制

https://curve.fi/files/stableswap-paper.pdf

[11] 使用動態挂鉤的自動做市

https://curve.fi/files/crypto-pools-paper.pdf

[12] https://twitter.com/dken_w/status/1422623679150649345

[13] 自動化做市的新不變量

https://github.com/shipyard-software/market-making-whitepaper/blob/main/paper.pdf

[14] 特瓦姆

https://www.paradigm.xyz/2021/07/twamm/

[15] 係數滿足任意函數積分或微分條件的里卡蒂方程的解析解

https://arxiv.org/abs/1311.1150

[16] YieldSpace:固定收益代幣的自動流動性提供者

https://yield.is/YieldSpace.pdf

[17] 改進的價格預言機:常數函數做市商

https://arxiv.org/abs/2003.10001

免責聲明:本文僅供一般參考之用。它不構成投資建議或購買或出售任何投資的建議或招攬,也不應用於評估做出任何投資決策的優點。不應依賴它來提供會計、法律或稅務建議或投資建議。本文僅代表作者當前的觀點,不代表AnchorDAO Lab或其關聯公司,也不一定反映AnchorDAO Lab、其關聯公司或與AnchorDAO Lab相關的個人的觀點。此處反映的意見如有更改,恕不另行更新。