$Uniswap$ $V2$ 组LP的原理是把交易对平均分配到所有的价格区间中,比如说交易对是$USDC$ 和 $ETH$, 组建LP的区间对应的 $ETH$ 的价格就是$(0, +\infty)$。这样的操作是最简单的,但对于资金利用效率而言,却不是最优的——如果 $ETH$ 的价格只在$(2,000, 4,000)$ 之间波动的话,那么其他区间的资金都是闲置的。
为了优化这个问题,$Uniswap$ $V3$ 就引用了在有限区间内提供流动性的设置,即用户可以在自己选择的区间内提供流动性,超过区间后,不再提供流动性,且资产持中价格高的那类资产的数量会变为$0$.
$Uniswap$ $V2$ 流动性池中的资产 $X$ 和 $Y$,遵循以下数量关系: $$ x \cdot y = k \tag{1} $$
其中 $x$ 和 $y$,代表资产 $X$ 和 $Y$ 的数量。
$Uniswap$ $V3$ 的模型同样也遵循上面的公式,只不过表示形式不同。为了让其更好理解,项目白皮书中引入了虚拟储备($virtual \ reserves$)和实际储备($real \ reserves$)的概念,其中实际储备是实际投入的$LP$中的资金,虚拟储备则是为了满足公式(1)的数量关系而“凑”出来的数。
在图像上,就是把公式(1)所示的图像(下图蓝色曲线)向左向下平移一段距离后,得到一条新的图像(下图黄色曲线),新的图像就是在资产$X$的价格在区间 $[P_a,P_b]$ 时LP中的资产分布图。
![[Pasted image 20251108214853.png]]
为例便于表示,$Uniswap\ V3$ 引入了表示流动性的 $L$ ,它满足下面的数量关系: $$ L= \sqrt{k} \tag{2} $$ 那么代入公式(1),可以得到: $$ x \cdot y = L^2 \tag{3} $$ 关于资产 $X$ 的价格(以资产 $Y$ 表示),有以下数量关系: $$
\frac{y}{x} = P \tag{4}
$$ 根据公式(3)和公式(4),可知 $x$ 、 $y$ 和 $P$ 之间的关系是:
$$ \begin{align} x &= \frac{L}{\sqrt{P}} \tag{5} \ \ y &= L \cdot \sqrt{P} \tag{6} \end{align} $$ 接下来求解资产 $X$ 和 $Y$ 虚拟储备的值,分别用 $x_{virtual}$ 和 $y_{virtual}$ 表示,真实储备则分别用 $x_{real}$ 和 $y_{real}$ 表示。
假设设定的提供流动性的资产$X$的价格区间是 $[P_a,P_b]$ 。
那么当价格 $P$ $\ge$ $P_b$ 时,$x_{real}=0$ ,此时根据公式(3),有: $$ x_{virtual} \cdot y = L^2 \tag{7} $$
联系公式(6),可以得到, $$ x_{virtual}=\frac{L}{\sqrt{P_b}} \tag{8} $$
同理,当$P$ $\le$ $P_a$ 时, $$ y_{virtual} = L\sqrt{P_a} \tag{9} $$
那么 $Uniswap$ $V3$ 的模型为: $$ (x+\frac{L}{\sqrt{P_b}})(y+L\sqrt{P_a} )=L^2 \tag{10} $$
根据公式(10)和公式(4),就可以测算出资产$X$的价格$P\in[P_a,P_b]$ 时,需要的资产 $X$ 和 $Y$ 的数量各是多少。
根据白皮书,价格区间并非可以随意设置的,而是遵循下面的规则: $$ P_i = 1.0001^i \tag{11} $$ 其中,$i$ 是整数,英文名称是$tick$ ,中文名我不知道怎么翻译。这样设置的原因,是可以让每个价格都比上一个价格多0.01%。
另外$i$ 的取值也不是所有的整数,会根据资产持的不同费率有不同的间隔。比如,0.05%费率的间隔是10,0.3%费率的间隔是60,1%费率的间隔是200。举个例子,间隔是10,只有 $i$ 是10的倍数时,所代表的价格才是可被接受的价格。
因此,当你想要在相应区间提供流动性组件$LP$时,价格区间的端点值会先被标准化,标准化计算过程如下:
$$i_c = \left\lfloor \log_{\sqrt{1.0001}} \sqrt{P} \right\rfloor \tag{13}$$ $$\text{lowTick} = \left( \left\lfloor \frac{i_c}{\text{tickSpacing}} \right\rfloor \right) \times \text{tickSpacing}\tag{14}$$ $$\text{highTick} = \left( \left\lceil \frac{i_c}{\text{tickSpacing}} \right\rceil \right) \times \text{tickSpacing}\tag{15}$$
其中,$i_c$ 代表区间端点值价格对应的 $tick$,$\text{tickSpacing}$ 代表 $tick$ 之间的间隔。
如果是区间左端点,就依据公式14向下取整;如果是右端点,就依据公司15,向上取整。
以上就是自己测算资产 $X$ 和 $Y$ 在区间 $[P_a,P_b]$ 上提供流动性时,资产变动的所有数学公式,由此也可以测算,组 $LP$ 的无常损失,我做了一个Excel表格,可以自己测算。需要的可以点击阅读原文自取,因为网页版是使用的Google Sheet,没有途径学习上网的朋友在公众号后台回复“Uniswap”获取链接。