Uniswap V3中的流动性数学:(一)

460 阅读3分钟

概述

Uniswap 是最大的去中心化交易所(DEX),也是去中心化的基石之一 金融(DeFi)。 Uniswap 使用流动性池提供自动做市(AMM)功能。 Uniswap v3 是该协议的最新版本,引入了许多新功能特征,特别是流动性集中特征,允许流动性提供者将其流动性集中在特定的价格范围内,从而提高资本效率。 但是头寸的流动性与该头寸的资产数量之间的数学关系以及和价格范围变得有些复杂。 本技术说明展示了如何得出一些Uniswap v3 白皮书的结果。以及提出了其他几个白皮书未讨论的方程,并展示如何应用这些方程。

1.介绍

流动性数学的核心概念在Uniswap v3白皮书中有明确定义,该白皮书已经引起了研究界的广泛关注。然而,这份白皮书相当简洁,许多方面尚未详细阐述。白皮书提供的信息与Uniswap用户和开发者提出的问题之间存在差距,例如:

  • 在某一特定价格P下,考虑一个仓位的总流动性和价格范围,该仓位持有多少资产X和资产Y?
  • 在给定价格范围、当前价格P以及资产X的数量x的情况下,为了覆盖该价格范围,应该提供多少资产Y?
  • 考虑要存入流动性池的资产X和资产Y数量x和y,以及当前价格P和预期价格范围的下限,应该使用什么值作为上限?

本技术说明旨在填补这一差距,并提供关于Uniswap v3流动性数学的基本知识

2.计算

2.1 计算流动性和资产金额

白皮书中似乎提供了一种计算L、x和y的简单方法:

L=xvirtualP=yvirtualPL=x_{virtual}\cdot\sqrt P= \frac {y_{virtual}}{\sqrt P}

Table 1: 词汇说明

Symbol NameWhitepaperUniswap codeNotes
PicePsqrtRatioX96Code tracks P\sqrt P for efficiency reasons
Lower bound of a price rangepap_asqrtRatioAX96Code tracks pa\sqrt{p_a}
Upper bound of a price rangepbp_bsqrtRatioBX96Code tracks pb\sqrt{p_b}
The first assetXtoken0
The second assetYtoken1
Amount of the first assetxxamount0
Amount of the second assetyyamount1
Virtual liquidityLliquidity amount

然而,这里的x和y是虚拟代币数量,而不是真实数量!计算x和y的真实数量的数学公式在白皮书的最后给出,具体是在公式6.29和6.30中。这些数学公式的实现可以在文件LiquidityAmounts.sol中找到。

这些方程可以从白皮书中的关键方程2.2中推导出:

(xreal+LPb)(yreal+Lpa)=L2(x_{real}+ \frac L{\sqrt{P_b}})(y_{real} + L\sqrt{p_a})=L^2

尝试直接解方程2.2以得到L会得到一个非常混乱的结果。相反,我们可以注意到,在价格范围之外,流动性完全由单个资产提供,要么是X,要么是Y,具体取决于当前价格在价格范围的哪一侧。我们有三个选择:

  1. 假设P≤pa,则头寸完全在X中,因此y=0:
(x+Lpb)Lpa=L2(1)(x + \frac L{\sqrt{p_b}})L\sqrt{p_a}=L^2 \tag1
xpa+Lpapb=L(2)x\sqrt{p_a}+L\frac {\sqrt{p_a}}{\sqrt{p_b}}=L \tag2
x=LpaLpb(3)x = \frac L{\sqrt{p_a}}-\frac L{\sqrt{p_b}} \tag3
x=Lpbpapapb(4)x = L\frac{\sqrt{p_b}-\sqrt{p_a}}{\sqrt{p_a}\cdot\sqrt{p_b}} \tag4

该头寸的流动性为:

L=xpapbpbpa(5) L= x \frac{\sqrt{p_a}\cdot \sqrt{p_b}}{\sqrt{p_b}-\sqrt{p_a}} \tag5
  1. 假设P≥pb,则头寸完全在Y中,因此x=0:
Lpb(y+Lpa)=L2(6)\frac L{\sqrt{p_b}}(y+L\sqrt{p_a})=L^2 \tag6
ypb+Lpapb=L(7)\frac y{\sqrt{p_b}} + L\frac{\sqrt{p_a}}{\sqrt{p_b}}=L \tag7
y=L(pbpa)(8) y=L(\sqrt{p_b}-\sqrt{p_a}) \tag8

该头寸的流动性为:

L=ypbpa(9)L = \frac y{\sqrt{p_b}-\sqrt{p_a}} \tag9

3.当前价格在范围内:pa < P < pb。我认为应该这样考虑,即在最佳头寸,两种资产将平等地为流动性做出贡献。也就是说,在价格范围(P,pb)的一侧,资产x提供的流动性Lx必须等于在价格范围(pa,P)的另一侧资产y提供的流动性Ly。根据方程5和9,我们知道如何计算单资产范围的流动性。当P位于范围(pa,pb)内时,我们可以将(P,pb)视为X提供流动性的子范围,将(pa,P)视为Y提供流动性的子范围。将这些代入方程5和9,并要求Lx(P, pb) = Ly(pa, P),我们得到:

xPpbpbP=yPpa(10)x\frac{\sqrt P\cdot\sqrt{p_b}}{\sqrt{p_b}-\sqrt{P}} = \frac {y}{\sqrt{P} - \sqrt{p_a}} \tag{10}

方程(第10式)很重要,因为它可以解出五个变量中的任意一个,包括x、y、P、pa、pb,而不需要涉及到流动性。然而,对于x和y,这是不必要的;等式4和8的简单修改就足够了:

x=LpbPPpb(11)x = L\frac{\sqrt{p_b}-\sqrt{P}}{\sqrt{P}\cdot\sqrt{p_b}} \tag{11}
y=L(Ppa)(12)y=L(\sqrt{P}-\sqrt{p_a}) \tag{12}

综上所述:

  • 如果P≤pa,y=0,x可通过等式4计算。
  • 如果P≥pb,则x=0,y可通过公式8计算。
  • 否则,pa<P<pb,x和y可分别通过等式11和12计算。

从概念上讲,这一结果只是以略微不同的形式重述了白皮书中的等式6.29和6.30。然而,白皮书中∆的使用可能会让新用户感到困惑——确切地说,Δ是什么?如果是全新的头寸怎么办?出于这个原因,上面的方程4-12避免提及delta,目的是为了简单。当然,从更深入的角度来看,白皮书方程6.29和6.30仍然可以应用于新头寸:在这种情况下,我们只需要取∆L=L。