原文標題:《Uni V3的數學原理》
作者:比原鏈研究院
前言——Uniswap V3(如下簡稱 Uni V3)放出了很多 feature,然而其最為本質的迭代依然是對 AMM 數學曲線的再思考。在過去的兩年中,我們也躬身入局 AMM 領域,認為 AMM 最基本的曲線形態已經定型,后續的創新應該會在 AMM 基本曲線形態的基礎上實現“策略化”,于是我們創造了 MOV 超導 V2。而如今我們看到了 V3,突然有一種“久別重逢”的感覺,在尋找這種感覺之余,我們也希望為大家呈現 AMM 最為深刻的思考路程。因為 AMM 的時代將會比想象得更為恢弘壯闊。
讓我們直切正題,Uniswap V3 最耀眼的創新——在 AMM 上實現集中流動性,
V3 給出了一個虛擬儲備金(virtual reserves)的概念,舉例講解:
在傳統 V2 中,Alice 一次性將 500,000 DAI 和 333.33 ETH 注入儲備池,總價值 $1m,提供全區間(0,\infty)的流動性,但實際上 ETH 的價格波動范圍在很長一段時間內是有局部范圍的,這種為全區間無私提供流動性的行為大大浪費了資本利用效率。
(注:在一個逐步走向成熟化的金融市場中,無套利原理和提升資本利用效率永遠是兩大核心訴求,也是后續 DeFi 產品向先驅 DeFi 發起挑戰的出發點。)
所謂的集中流動性便是讓 LP 自主選擇波動范圍,只為該范圍提供局部流動性,例如 Bob 認為未來一段時間內 ETH 的價格區間在(1000,2250),并且如果未來真的是在這個區間波動,Bob 希望自己獲得的收益能夠跟百萬富豪 Alice 一樣多,于是 Bob 一開始只需要投入 91,751 DAI 和 61.17 ETH,總價值 $183,500,遠遠小于 Alice 實際投入的資金。我們對照下圖來解釋其中的道理。
其中,X 是 ETH,Y 是 DAI,點 a 對應價格 1000,點 b 對應價格 2250,點 c 是當前市場價格 1500,x_{real}是 Bob 投入的 61.17 ETH,y_{real}是 91751 DAI。
在數學實現上——
假設圖中曲線表達式為 xy=D,其中 D 便是我們要確定的值,即這條“虛擬的”曲線。
存在如下客觀事實:
進一步,由于
則
解方程得
最后我們發現
即 Bob 所獲得的虛擬曲線(D 值)幾乎跟 Alice 一樣。
上述計算過程是一種反證法,實際上用戶 Bob 會向系統算法提出自己的需求輸入,包括預測價格區間范圍、當前價格點、最終想要獲得的一個 virtual reserves 規模(即虛擬曲線 D 值)。有了虛擬曲線表達式的確定,可以輕松算出 a、b、c 三個確定的點坐標,進而便算出 x_{real}=61.17 以及 y_{real}=91751,
同時,也可以看到,一旦未來價格越出了區間,Bob 其中一種資產將徹底消失,
虛擬儲備金(virtual reserve)是 Uni V3 實現集中流動性的基礎原理,也是 Uni V3 將多樣化的倉位區間統一成一條(大的全區間的虛擬)曲線的巧妙之處。然而看似簡單的原理背后缺需要復雜的工程實現和算法模型的支撐,尤其是解決手續費(fee)的統計計算和 LP 的加入/退出計算,
對于 AMM 來說,最復雜的莫過于 LP 的存取行為和收益統計,在以 V2 為代表的經典 AMM 模型中,會通過一種“份額模式”從始至終為 LP 確定下各自可提取的數量比例(也包括手續費),但在 V3 中,將會對 LP 可提取比例以及所獲 fee 比例進行一種“非常統計風格”的計算方法,
在具體實現上,Uni V3 將價格全區間以 ticks 的模式均勻分段,變成離散的空間:
如何根據當前價格,判斷所處 ticks——
全局狀態中有 feeGrowthGlobal0(f_{g},0) 和 feeGrowthGlobal1 (f_{g},1)—f_{g},用來從全局角度統計總的手續費收益。例如,當在一個 tick 內發生了一筆交易,系統會計算出該筆交易產生的手續費:
其中 y_{in}為該筆交易的輸入數量,其余部分是手續費的比例,系統會不斷累計出每個 tick 內產生的所有手續費總和。
再引入一個“稍微低一個級別的”全局狀態變量 feeGrowthOutside\{0,1\}—f_{o},用于計算在給定區間(range,由很多連續的 ticks 組成的空間)內的手續費總和,我們想查詢某個價格 range(即在下界 tick i_{l}和上界 tick i_{u}之間)產生了多少累計手續費,總公式為:
其中,
f_{a}變量是對所有高于 i tick 的區間的 fee 統計,f_{b}是對所有低于 i tick 的區間的 fee 統計,因此在上述總公式中,我們從全局總累計手續費 f_{g}中減去所有低于下界 i_{l}的累計手續費,再減去所有高于上界 i_{u}的累計手續費,便是 (i_{l},i_{u}) 之間的累計手續費,
f_{o} 可以理解為一個計算單元,用于累積截止到 i tick 的手續費,在它的初始化過程中,我們約定如下:
再來看 f_{a}的計算,分成了兩段,可以理解為——
- 如果當前 tick 等于 i 或者高于 i,此時從全局總手續費 f_{g} 中減去“累積到 i tick”的手續費 f_{o}(i),剩下的便是對所有高于 i tick 的區間的 fee 統計;
- 但如果當前 tick 還未抵達 i,此時根據對 f_{o} 的初始化定義為 0,則所有高于 i tick 的區間的 fee 統計尚未產生,為 0,
同樣對于 f_{b}——
- 如果當前 tick 抵達或者超過了 i,f_{o}(i)表示累計到 i 的手續費,也即對所有低于 i tick 的區間的 fee 統計;
- 如果當前 tick 還未抵達 i,對所有低于 i tick 的區間的 fee 統計值即為當前的全局變量 f_{g}(當前總手續費)。
通俗來概括,系統算法要統計某一個 range 內累計的手續費,
- 如果當前 tick 已經處于 range 內部,即 i_{l}\leq i_{c} < i_{u},只需要從全局手續費 f_{g}減去所有低于 i_{l}組成的 range 累計的手續費;
- 如果當前 tick 不處于 range 內部,且低于下界 i_{l},說明尚未在(i_{l},i_{u})區間內產生交易,也就未產生手續費,因此該 range 內累計量為 0;
- 如果當前 tick 不處于 range 內部,且高于上界 i_{u},需要從全局總量中分別去除“兩頭”各自的累計量,即從全局f_{g}中減去所有低于 i_{l}區間累計量,再減去“從i_{u}到當前 tick 區間累計量”。
Uni V3 計算手續費的過程是一種從微觀走向宏觀的思想,它將空間劃分成離散的,每一個時間刻度只會在一個離散空間上產生交易,從而產生手續費,每一個微觀 tick 都在各自記錄著自己從最低 tick 到自身這段區間內的累計手續費總和,然后供上述公式不斷調用,以計算各種宏觀結果。
Uni V3 已經改變了傳統 AMM 對 LP 行為的設定,也不再基于全局流動性(Global Liquidity)和份額(Share)來為每一個 LP 計算手續費收益,對 V3 來講,它只關注在每一個 tick 里存在多少“虛擬”流動性,以及這些虛擬流動性產生了多少手續費,算得單位虛擬流動性對應的手續費值;在這個時空之下,我們再把視角切到具體每一個 LP 上,對于任何 LP,都會存在一個“開倉”(Position)的區間設定,他在自己設定的區間提供了虛擬流動性,可能是一個 tick,也可能是連續多個 tick,從最簡單的“一個 tick”角度解釋,系統會記得同一時空下每一個 LP 在此 tick 注入的虛擬流動性值,并為他們確定出一個比例(注意這個比例只與最開始注入的虛擬流動性大小有關,并不涉及手續費轉流動性,這與 V2 是不同的),以此分得該 tick 內所有手續費累計。
在實際情況中, LP 們還會存在復雜的行為,比如注入/退出的時間紛雜、選擇的 range/tick 紛雜,但 Uni V3 的大道至簡之處正是利用全局計算來屏蔽掉單個 LP 視角,只關心 ticks 視角和 Position 視角,在確定好上述所述的一系列全局狀態變量的定義后,認真記錄好每一筆 swap 交易在 ticks 中發生的情況(包括只在一個 tick 內完成該筆 swap 交易,和需要跨多個 tick 才能完成該筆 swap 交易),同時只記錄每個 tick 內虛擬流動性的大小,以此為根本去提供 swap 交易公式以及 swap 后手續費如何分配給參與該 tick 的所有 LP 們。LP 的復雜行為體現在空間的不連續性和時間的不統一性兩方面,對于時間不統一性(即會出現很多 LP 不斷加入和退出流動性),Uni V3 還會引入 Position 這一級別的全局變量為每一個身份(address)記錄下其對 range/tick 加入/退出(“setPosition”)時手續費的統計(uncollected fee/feeGrowthInside),確保后來的 LP 不會參與到前序 LP 們已經累計的收益分配。
如果總結來講 ,tick-level 是對空間上發生的統計,確保起點一致的 LP 們 fee 分配,而 Position-level 是對時間上發生的統計,確保不同起點的 LP 們 fee 累計起點不一樣。建議實現者深入 V3 代碼,才能真正獲得安全計算法。
最后,Uni V3 過于復雜,但大道至簡,即便去模仿,模仿者依然需要下功夫深刻了解其“微積分”思維。這篇文章只選擇了 fee 這一個角度呈現 Uni V3 的“數學原理”,也是其實現集中流動性的核心邏輯。而在數學之外,我們有更多驚喜的“哲學意義”發現與大家分享,例如 LP token 的進化、NFT 其實并不只屬于藝術領域(更有助于金融)、V3 會存在一個策略博弈、V3 對基金池/合成資產的啟示等等,當然也包括與 MOV 超導 V2 的“心有靈犀”——AMM 的本質是連續性的無限網格,Uni V3 是在這個無限網格基礎之上再實現了微觀無限網格,是“無數網格機器人的疊加”,MOV 超導 V2 則是在無限網格基礎之上進行了更為宏觀的無限網格,是超級網格,請期待下一篇《Uni V3 的自然哲學》。