Uniswap V3 集中流动性
本文阐述了 Uniswap V3 如何实现集中流动性。我们假设读者已经了解 Uniswap V2。

一键发币: SUI | SOL | BNB | ETH | BASE | ARB | OP | POLYGON | 跨链桥/跨链兑换
本文阐述了 Uniswap V3 如何实现集中流动性。我们假设读者已经了解 Uniswap V2。
要理解集中流动性,我们首先需要准确定义流动性,而这本身取决于对储备库的理解。
1、储备库
代币的储备库是指自动做市商 (AMM) 持有的特定可交易代币的余额。我们使用
reserve(x)或简称x来指代池子持有的可交易代币x的数量,reserve(y)或简称y指代池子持有的可交易代币y的数量。
2、流动性
在 AMM 的语境中,流动性衡量的是代币对x和y的总储备库。
流动性提供者 (LP) 将代币存入池子,希望在掉期交易中赚取手续费,从而提供流动性。他们的存款增加了储备库,进而增加了流动性。
流动性是储备库的函数。它通常是储备的乘积、乘积的平方或其他单调增函数(单调增函数是指输入增加时也总是增加的函数)。
在 Uniswap V2 中,流动性以 (储备的乘积)来衡量。
储备可以有不同的组合,但流动性保持不变。例如,如果有 1 个 ETH 和 1000 个 USDC,则流动性为 1000(1 ETH × 1000 USDC = 1000,忽略小数)。
如果有 900 个 USDC 和 1.1111 个 ETH,则流动性保持在 1000,因为 900 × 1.1111 = 1000。
以下动画绘制了不同k值对应的曲线xy=k 。请注意,随着 k的增大,曲线会进一步远离原点。

储备越多,曲线与原点的距离就越大,流动性就越强。
由于交易者支付的费用会被吸收到 Uniswap V2 的储备中,因此 Uniswap V2 使用xy>=k,而不是xy=k。为了简化计算,我们在本文中忽略了费用。
3、流动性与价格影响
高流动性是可取的,因为交易者可以“换出”更多代币。如果一个池子只持有 1000 USDC,交易者不可能换出超过 1000 USDC。但即使他们不需要用完某个代币的所有储备,交易者仍然更喜欢更高的流动性,因为更高的流动性可以降低价格影响。
为了准确定义“价格影响”,我们首先需要准确定义 AMM 中的“价格”。
4、AMM 中资产的价格
Uniswap V2 中 token0 的价格使用以下公式计算:

在 Uniswap v3 中,代币 X 和 Y 也称为 token0 和 token1。在本章中,我们将交替使用这两种符号。
下图展示了一条常规的价格曲线。曲线上的绿点代表 token0 和 token1 的当前储备量。回想一下,我们用 token0 和 token X 来指代同一个事物(token1 和 token Y 也一样)。随着绿点向上和向左移动,token0 的价格上涨,因为这对应于 token0 的储备量减少:

如上图和公式所示:

减少 token0 的储备量会导致其价格上涨。这符合供求规律,因为 token0 越稀缺,其价格就越高。
5、价格作为与原点的夹角
我们可以将“价格”可视化为一条从原点出发的射线(一条有起点但没有终点的线)。这条射线代表一个固定的储备比率,与流动性无关。
假设任何与下方黄色射线相交的储备量组合都具有相同的比率。因此,无论流动性如何,这条射线与价格曲线的交点代表的价格都相同:

动画展示了沿着射线,储备比率如何保持不变
设θ为射线从原点到价格曲线上当前价格的夹角。 夹角越大,价格越高:

现在我们对价格有了严格的定义和可视化,我们可以定义并说明价格影响。之后,我们会将价格影响与流动性联系起来。
6、价格影响
自动做市商 (AMM) 中的任何交易都会导致价格朝着不利于交易者的方向波动。
如果交易者试图将代币 1 放入池子以换出代币 0,那么代币 0 的价格就会上涨。
如前所述,AMM 根据池子中代币的供应量(储备)调整价格。这确保了价格始终根据买入或卖出订单而波动。价格的上涨反映了需求的增加。
现在我们可以分析价格如何随着交易而变化。
7、小额订单对价格的影响
假设您下了一个尽可能小的订单,通过向池子支付代币1来购买代币0。这会导致代币0的储备略有下降,而代币1的储备略有上升。因此,代币0的价格必然会上涨(幅度很小)。
换句话说,假设交易前的价格为

交易后的价格为:

其中ϵ是交易者支付给池子的token1的数量,δ是交易者从资金池获得的代币token0的数量。
数量ϵ和δ,及其对价格的影响如下图所示:

无论ϵ和δ有多小(只要它们不为零),必然存在:

因此,AMM 上的任何交易,无论大小,都会改变价格。
我们将交易导致的价格变化称为价格影响。
较大的价格影响表示价格变化显著,较小的价格影响表示价格变化微小。
8、不同流动性水平下的价格影响示例
对于一笔固定规模的交易,流动性越大,价格影响越小。
本节展示了同一笔交易(使用 USDT 购买 1 USDC)在流动性水平不断提高的资金池中的三个示例。
示例 1:xy = 100
假设一个资金池持有 10 USDC(代币 0)和 10 USDT(代币 1)。由于xy=k,k=100。因此,流动性为 100。
如果交易者希望获得 1 USDC,他们必须将 USDC 储备从 10 USDC 减少到 9 USDC。
然后,他们必须投入足够的 USDT,使得 9 * new_reserve_usdt = 100(忽略手续费)。解 new_reserve_usdt 后,我们得到 11.11。由于 USDT 的原始储备为 10,因此交易者必须投入 1.11 USDT 才能获得 1 USDC。如果我们查看交易后的 USDC 价格,我们会得到:

由于购买 1 USDC,USDC 的价格从 1 USDT 上涨至 1.234 USDT。
我们将 1USDT : 1USDC 的初始价格称为起始价格。
最终价格为 1.234USDT : 1USDC。价格影响为 0.234,即原始价格上涨 23.4%。
我们将此交易的价格影响可视化如下。
价格起始于绿色虚线与蓝色价格曲线的交点。由于资产的起始价格相同,绿色虚线标有 。最终价格是红色虚线与蓝色价格曲线的交点。价格影响在此处非常明显(图表按比例绘制):

(我们假设两种代币的小数位数相同,因此小数可以忽略)。
示例 2:xy = 10,000
现在,假设资金池持有 100 USDC 和 100 USDT。由于xy=k ,k=10000 ,流动性比上一个示例增加了 100倍。
如果交易者希望获得 1 USDC,他们必须将 USDC 的储备从 100 USDC 减少到 99 USDC。然后,他们必须投入足够的 USDT,使得 99 * new_reserve_usdt = 10_000。解 new_reserve_usdt 后,我们得到 101.01。由于 USDT 的原始储备为 100,因此交易者必须投入 1.01 USDT 才能获得 1 USDC。如果我们查看交易后的 USDC 价格,我们会发现:

由于购买了 1 USDC(储备最初为 100 USDC 和 100 USDT),USDC 的价格从 1 USDT 上涨至 1.02 USDT,导致价格上涨 2%。
在此示例和上一个示例中,交易者都获得了 1 USDC。但是,此示例中的价格影响要小得多(之前为 23 美分,而此处为 2 美分)。由此产生的副作用是,交易者为 1 USDC 支付的价格较小,为 1.01 USDT,而第一个例子中的价格为 1.11 USDT。
当 AMM 的流动性增加时,价格影响会减小。
此示例中的价格影响明显较小:

示例 3:xy = 1 千万亿
为了更清楚地说明这一点,假设储备金为 10 亿美元 USDC 和 10 亿美元 USDT,流动性为 1 千万亿。
我们建议读者在阅读以下计算之前,先尝试计算价格影响。
如果交易者希望获得 1 USDC,则必须将 USDC 储备金从 10 亿美元减少到 999,999,999 USDC。然后,他们必须投入足够的 USDT,使得 999,999,999 * new_reserve_usdt = 1 千万亿(10 亿)。解 new_reserve_usdt 后,我们得到 1,000,000,001.000000001。由于 USDT 的原始储备为 10 亿,因此交易者必须投入 1.000000001 USDT 才能获得 1 USDC。如果我们查看交易后的 USDC 价格,我们会发现:

UDSC 以 USDT 计价的价格上涨了,但涨幅很小。
因此,当流动性相对于交易规模而言非常大时,价格影响几乎不可察觉。
9、资本高效的流动性
交易者希望价格影响较小,但流动性提供者并不想为此提供 20 亿美元的巨额资金。
我们希望在不增加如此高资本需求的情况下实现高流动性。
我们希望我们的流动性能够实现资本效率。
为了提高流动性的资本效率,我们利用了交易“预期”价格这一事实。具体来说,USDC 和 USDT 都与美元挂钩,因此预计它们的交易价格为 1:1。
然而,由于价格影响,USDC 和 USDT 的交易价格并非 1:1——这正是我们努力最小化的问题。但我们希望在提供远低于 20 亿美元的储备金的同时,最大限度地降低价格影响。
由于我们预期交易价格为 1:1 或接近 1:1,我们预计大多数交易将发生在储备金价格相等的区域,如下图所示。

如上图所示,Uniswap V2 支持从 0 到无穷大的价格区间交易。将流动性分散到如此宽的价格区间会浪费流动性,因为大部分流动性都将被闲置,尤其是在稳定币交易对的情况下。
更好的做法是取消允许以极端价格交易的功能,以便在我们预期交易发生的区域获得更好的流动性。
10、集中流动性
如果我们可以从我们预期不会发生交易的区域“移除”流动性,并将流动性添加到预期区域,会怎么样?
举个具体的例子,假设我们希望我们的AMM在价格高于0.99:1(99美分Tether兑换1 USDC)和低于1.01:1(1.01 Tether兑换1 USDC)时拥有较高的流动性。回想一下,价格会随着我们在曲线上的位置向上和向左移动而上涨。
如果我们在这些价格边界处放置一个if语句,我们的AMM曲线可以看起来像下面的分段函数:

如果我们绘制上面的分段方程,我们将得到以下结果:

由于我们预期稳定币交易的价格区间流动性更大,我们预计该区间的价格会大幅下降。我们在不增加资金的情况下降低了大多数交易的价格影响。
当然,没有什么是免费的。如果价格在[0.99, 1.01]边界之外徘徊,那么流动性就会急剧下降。为了创建一个具有竞争力的资金池,我们需要以最佳方式设置边界。 0.99 和 1.01 是否是最佳边界也并不明显。将流动性乘以或除以 10 是否是合适的比例也并不明显。
11、Uniswap V3 如何实现集中流动性
为了让流动性提供者能够灵活地决定理想的流动性边界和数量,Uniswap V3 完全不使用比例因子。在特定的价格边界内,k将是流动性提供者在该边界提供的流动性。也就是说,流动性提供者可以从多个价格区域中选择他们可以提供流动性的区域。
我们在本文开头指出,流动性与价格曲线与原点的距离成正比。
因此,由于不同价格区间的流动性各不相同,Uniswap V3 池的价格曲线可能如下图所示。

即使曲线看起来不连续,价格(用橙色射线表示)也可以在每个“迷你 Uniswap V2 曲线”之间平滑过渡。每条“子曲线”的形式为xy=k,但k对于每条子曲线而言都不同。子曲线的k值完全取决于流动性提供者(LP)在该段投入的流动性。随着该段流动性的增加,其与原点的距离也会增加。由于曲线的流动性不同,它们与原点的距离也不同。
增加k表示流动性提供者提供了正确的代币x和代币y的组合,从而将曲线向外推。实际上,LP 指定流动性,然后 Uniswap V3 计算 LP 需要提供的x和y的数量。该段持有的x和y的数量将根据该区域发生的互换而变化。目前,我们不必担心每条子曲线的x和y的数量,只需担心它们的乘积是k即可。这将在后续章节中进一步讨论。
为了简化计算,LP 不能以任意价格边界提供流动性,而是以预先定义的价格(称为“滴答”)提供流动性。回想一下,价格与从原点到曲线上价格点的射线角度成正比。因此,我们可以将“报价”可视化为价格曲线与从原点出发的预定义射线相交的位置:

如何选择和间隔这些“报价”将在后续章节中讨论。
12、Uniswap V3 不变量
Uniswap V3 可以概念化为使用以下不变量:

该不变量使流动性提供者能够在不同的“报价”之间提供不同的流动性。因此,
值在曲线的不同点会有所不同。
以下交互式工具展示了如何更改不同段的k来改变该段与原点的距离。尽管曲线没有“相互接触”,但价格仍然可以在子曲线之间平滑移动(除非特定段的k=0,在这种情况下会跳过该段)。实际上,这些片段比以下工具中显示的要小得多:

实际上,像上面的公式那样,根据如此多的潜在情况检查价格并不节省 gas。同样,跟踪如此多的数值也很昂贵。
因此,Uniswap V3 提出一种替代机制实现了上述分段公式,该机制非常复杂,本书大约用了一半的篇幅来讨论它。该机制将在后续章节中重新讨论。
但是,如果我们将 Uniswap V3 的曲线可视化,它看起来就像上面显示的曲线。
13、流动性在实践中如何分配
不同部分的一些k值可能相同。例如,可能是k5=k6。如果在该价格范围内没有流动性,则某些k值也可能为零。
每种情况k都完全取决于流动性提供者选择在何处添加流动性。
然而,流动性提供者 (LP) 倾向于将流动性放置在他们预期交易发生的位置附近,因为 Uniswap V3 仅在流动性实际被使用时才会向 LP 奖励掉期费(如何计算将在后面的章节中讨论)。
在下面的屏幕录像中,我们看到了 Uniswap V3 流动性提供者 (LP) 在 Base 平台上 ETH/USDC V3 池的用户界面。灰色垂直线是当前价格,两条蓝线分别是 Uniswap V3 允许 LP 添加流动性的预设下限和上限价格。请注意,蓝线不能设置在任意位置,只能设置在预设价格。

下图展示了 Uniswap V3 中两种稳定币池的曲线可能是什么样子。

我们预期稳定币对的价格为 1:1,这对应于储备比率为 1 的 45 度射线。因此,流动性最终集中在储备比率为 1:1 的中心区域:
以下是 Uniswap V3 可视化集中流动性的屏幕截图。在下图的 USDC / USDT 池中,我们看到价格在 1.000 附近流动性较高,流动性提供者 (LP) 预计交易将在此价格附近发生:

(上图可通过访问主网上的 USDC / USDT 池,然后点击“添加流动性”查看)
如果 token0 的价格高于 token1,则流动性往往会更集中在该价格附近:

如果市场价格发生大幅波动,流动性提供者会将流动性移除,并将其转移到新的价格附近,以赚取掉期费。
14、跨越 tick 不会造成中断
即使曲线不连续,交易者仍然可以在 tick 之间无缝交易。一旦价格超过某个价格点,Uniswap V3 就会重新计算剩余交易的可用流动性量,如下图动画所示:

当价格超过该价格点时,储备金会突然大幅上涨,因为掉期交易进入了流动性更高的区域,因此储备金也更高。储备金的大幅上涨反映了流动性提供者 (LP) 之前在该价格范围内增加的储备金数量。
15、结束语
尽管 Uniswap V3 的代码库看起来令人望而生畏,但最终的机制在高层级上非常简单。
Uniswap V3 的基本机制与 Uniswap V2 相同:
- 流动性提供者可以添加和移除流动性,但在 V3 中,他们可以更好地选择提供流动性的平台。
- 交换者可以将一种代币兑换成另一种代币。
- 这两个协议都提供了一个预言机,用于跟踪和检索历史价格。
Uniswap V3 的曲线是 Uniswap V2 曲线的组合,其中流动性可能会根据预设价格(每个价格点)的变化而变化,具体取决于流动性提供者如何配置其流动性。
这样的设计使流动性提供者能够将流动性集中在他们认为的资产市场价格附近。流动性越高,交易者受到的价格影响就越小,这使得该资金池成为交易者更具竞争力的选择。
原文链接:How Concentrated Liquidity in Uniswap V3 Works
DefiPlot翻译整理,转载请标明出处
免责声明:本站资源仅用于学习目的,也不应被视为投资建议,读者在采取任何行动之前应自行研究并对自己的决定承担全部责任。