type
status
date
slug
summary
tags
category
icon
password
引言
DEX的存续很大程度上依赖以下因素
- 自动做市底层原理 → 有效的资金利用率
- 经济激励模型(Value flow) → 留住LP,足够的流动性
上一篇文章我们介绍了Uniswap V2的运行机制,本篇文章我们将一起学习Uniswap V2之后几个重要的AMM机制的设计思路。
目录
- Uniswap V2的问题
- Uniswap V3
- V2 vs V3
- Balancer
- Curve的Stableswap
- 其它机制
- iZiSwap:离散的AMM
- Trader Joe V2:流动性账本
- Maverick Protocol:自动调整流动性
1. Uniswap V2的问题
Uniswap认为,V2中的最核心问题是池子中的资金利用率太低。资金利用率是指一笔交易换出来的代币比上交易前池子中该代币的总量,即。因为大部分交易对的价格只是在一个区间波动,比如稳定币交易对USDT/USDC的波动区间一般不超过1%。
假设流动性池中有10000个USDT和10000个USDC,小V用10个USDT交换USDC,不考虑交易费,解得滑点为0.1%,资金利用率为0.1%,也就是说,这笔交易其实有10000*0.1%的USDT/USDC参与就能完成。
来看下面这个图,从蓝到绿流动性依次增大,用户用Y交换X。当流动性大(绿色)时,用户要花费个Y才能X的价格从1Y上升到2Y,而当流动性小(蓝色)时,用户仅需个Y就能让X价格翻倍。这说明了为产生相同价格变化,绿线要产生的交易量远大于蓝线;反过来说,对于相同的交易量,绿线(流动性大)的滑点远小于蓝线(流动性小)

如果把这10000个USDT和10000个USDC全部聚合在9.995和1.005这一段价格区间做流动性的话,图像大概是下面这样。滑点一定会小于0.1%,用户的损失会更小。

2. Uniswap V3
2.1 Virtual Reserves
为了更好的度量LP在一定价格区间提供的流动性,引入了Real Reserves和Virtual Reserves的概念


当前价格为c,用户在[a,b]价格区间交易,交易者的真实需求就是和(见左图)。为了保证交易按照xy=k的模式运行,可以创造虚拟代币,使得:
虚拟代币其实就等于V2中没有被利用到的资金,它不参与交易,且当价格离开[a,b]区间后,虚拟代币会被移除。
因为流动性池中含有虚拟币和真实币,我们把这条反比例函数曲线称为Virtual Reserves。
2.2 计算Real Reserves
Real Reserves不含有虚拟的代币,因此我们需要计算出这部分虚拟的流动性然后减掉。
根据最后的公式,得到关于和的图像(橙线),这个图像其实就是xy=k的图像向左和向下分别平移了和的结果。

2.3 Price-Liquidity
我们用任意正比例函数的斜率来表示价格,下图中为a,b,c,d四个点对应的
()坐标。处的流动性由其它LP来补足。

以上是在a点到b点对应的价格区间的图像,其他的价格区间也同样有流动性,但是大小不同。下图说明了该情况。

Uniswap V3中的实际情况比上图分段更多,为了更好的说明价格区间和流动性的关系,我们使用以Price为横轴Liquidity为纵轴的平面直角坐标系。

2.4 Tick
每个人都可以选择自己想要的价格区间添加流动性,这使得几乎每个价格对应的流动性都不同。在实际交易中,一笔交易会通过聚合多个LP提供的流动性:。为了保证交易者使用的流动性对应到正确的LP,系统需要记录并维护每个用户提供流动性的价格边界,然后分段计算各个价格区间的流动性。如果用户A在价格区间[1.00000001,2]提供流动性,用户B在价格区间[1.00000002,5]提供流动性,那么我们需要单独计算[1.00000001,1.00000002]之间的流动性,这样很占存储空间。
为了解决以上问题,Uniswap V3把一段连续的价格区间分成若干个离散的点(tick),用户只能选定其中的两个点做价格边界。这些离散的价格点的规律是:
每一个tick都有其对应的记号(索引):
这样,只需要记录两个i值,就能找到LP提供流动性的价格区间了。
- 因为不同LP提供流动性的价格区间不同,因此LP Token采用了ERC721标准(非同质化代币)
2.5 无常损失的计算
V3中引入了Virtual Reserves,LP提供的同样资金对流动性池的影响因而增加了,我们需要先计算Virtual Reserves然后反推Real Reserves。
- 设起始价为,提出流动性时价格为。我们要计算的是相比持有这两个币的现货(),做LP()到底赚(负数为亏损)了多少,即。
当池子中的价格偏离了LP提供流动性的价格区间时,LP赎回的是单边的代币,此时LP Token与外部价格的关系改变了,因此我们需要分类讨论。
当:
- 当,此时:
- 当,此时:
当价格偏离LP选择的价格范围,LP就将不会收到交易费用,这会使LP相比V2蒙受更大的无常损失。
2.6 流动性衍生品
V3有着流动性管理过程复杂、无常损失高昂(资产受价格波动影响大)的痛点,由此有了一些旨在帮助LP制定策略,获得更好收益的衍生品协议。由于篇幅所限,我们主要拆解一下iZUMi Finance的流动性管理服务。
iZUMi Finance的Liquidity box:
- V3 NFT挖矿:对于一些希望发行的代币价格稳定的项目方,可以用创建Liquidity box的方式激励用户在给定的价格区间内提供流动性。在Uniswap提供流动性的LP可以质押LP Token到izumi上,izumi会根据非同质化的LP Token判断该LP提供的流动性是否在项目方设定的价格区间内,如果是,则给予一定的代币奖励(izumi的治理代币IZI以及项目方代币)
该奖励遵循默认规则:
其中,表示流动性厚度,L表示用户提供的流动性,N反映了LP提供流动性的价格区间和项目方设定有奖励的价格区间的重合程度。在提供流动性(L)相同的情况下,获得一个大的N更有利于LP盈利,当LP选择的价格区间和项目方选定的价格区间完全重合,LP获得最大的代币奖励。
- 半流动性半质押模型:传统2池模式容易陷入死亡螺旋,让LP承受巨大无常损失。如果LP把流动性交给Liquidity Box(LB),比如100 USDC和300 IZI,假设当前IZI价格为,那LB会把100个USDC放进[]价格区间提供流动性,300个IZI用于质押挖矿。于是当IZI价格下降,池子里的100个USDC自动换成USDC+IZI,LP相当于买方;当IZI价格上涨,LP可以选择卖出(而不是跟随AMM曲线被迫兑换成USDC)。
这种模式的问题是如果通过LB做LP的只是少数人,那么他们在池子中的单边流动性并不能抵挡其它质押者强势的抛压,还是会出现死亡螺旋。
- 动态范围模型:用户可以选定当前价格的倍数范围来提供流动性,如[0.25,4],由iZUMi交给V3,iZUMi会自动把获得的V3 NFT用于挖矿,把Uniswap手续费收入和NFT挖矿收益一并给到用户。
3 V2 vs V3
V2的优势:
- LP Token为ERC20标准的同质化代币,可以参与更多的DeFi协议交互
- 不需要LP进行流动性策略管理,对LP来说操作简单
- 允许代币价格自由波动,范围从0到无穷,适合波动率大的长尾资产(Meme coin)
- 一般来说,无常损失低于V3
V3的优势:
- 集中了流动性,为交易者提供更低的滑点,资金使用效率更高,适合主流币种
- 可以有更灵活的流动性添加策略,比如可以通过埋伏单边流动性实现部分限价单的功能
4 Balancer V1
4.1 广义的Uniswap
在Uniswap中,一个池子只能有两个代币,这是由其xy=k的做市机制决定的,那么有没有一个机制能让池中有多于两个代币呢?我们来看Balancer。
Balancer的做市机制长这样: 。为了更好的说明,我们略加修改:
其中V是常数,t是池中代币种数(不大于8种),是第i种代币的数量,是第i种代币价值额占池中代币总价值的比例,
如果我们取t=3,假定,池中三种资产X,Y,Z的数量分别为x,y,z,那么带入公式就有:
把V换成我们熟悉的k,三维的Uniswap呼之欲出:
可是对于用户来说,他们一般只会用一种资产交易出另一种,比如用x换y。这时只需要令就满足了的恒定乘积


可以说Balancer中内嵌了一个UniswapV2,Balancer是广义的UniswapV2
4.2 Balancer交易成交价格的计算
现在我们让假设变的复杂一些:我们在流动性池中放入X,Y,Z,N四种Token,分配的权重分别为10%,30%,40%,20%。代入公式:
现在在xy=k的模式下,我用个X代币换到了个Y代币:
如果X,Y,Z,N四种Token,分配的权重分别为,同理得到:
4.3 Balancer现货价格的计算
首先我们要明确,现货价格不同于交易成交价格,这是因为交易本身会对代币供需产生影响。下面我们用两种不同的方法推导Balancer池中的现货价格
- 在上一篇文章中我们提到,之所以用y/x来计算流动性池中代币的价格,是因为我们把流动性池看作整个市场的投影,市场上可供交易的代币数量的比值反应了两种代币的相对价格。同样的思路,在Balancer中,我们用单位权重的代币数量的比值来衡量现货价格:
- 之前我们推导过,如果交易量趋于0,那么交易成交价格就等于现货价格:
这里我们要用到隐函数的求导公式(隐函数是无法将自变量和因变量分离的函数,用表示):
原公式中用表示代币数量,设代币x的数量为,y的数量为:
4.4 平衡者
我们延续上面的例子:X,Y,Z,N四种Token,分配的权重分别为
其中Y为稳定币,1Y=1USD
池中的X以USD计的价值为
池中所有资产以USD(Y)计的总价值为:
由此可见,无论代币的相对价格如何,池中某资产的价值=该资产权重 * 资产总价值
如果我们要求自己的投资组合价值权重保持稳定,就可以在Balancer自建一个流动性池,这样无论我们protfolio中各个资产的价格怎么变化,他们的价值权重始终不变。
4.5 权重对无常损失的影响
篇幅有限,直接上图:

比例越不均匀,无常损失越小。这里就存在一个滑点和无常损失的权衡:
低滑点,高无常损失 or 高滑点,低无常损失
4.6 权重对滑点的影响
在Uniswap V2池中两种代币价值权重是50/50,如果权重换成20/80,会对交易深度造成影响,同样一笔交易对池中流动性的影响变大了,滑点也会变高。根据计算,在50/50左右,滑点最低。

5 Curve的Stableswap
你被困沙漠5天,身上带了100$纸币,面前有个饮料售卖机,但是只收硬币,你愿不愿意用100$换1$硬币?同样道理,不同的稳定币价值相同,但是效用和脱锚风险不同。
Curve上线于2019年9月。彼时Uniswap V3还未出现,市面上的DEX主要采用Uniswap V2的恒定乘积做市机制。前面讲Uniswap V3时我们提到,对于价格相对稳定的交易对来说,恒定乘积做市商存在资金利用率不足,滑点高,LP无常损失大的缺点。Curve创始人Michael Egorov(一位物理学家)提出的StableSwap机制解决了上述问题。
Curve完美的融合了恒定乘积做市机制与恒定和做市机制:
- 恒定乘积保证了代币在任何一个价格都有流动性,不会有池中某个代币出售完的情况
- 恒定和保证了代币相对价格保持不变

上图中蓝色曲线即代表StableSwap。可以看到在相对价格在1左右时该曲线贴近恒定和曲线,在价格显著偏离1时更贴近恒定乘积曲线。
5.1 Curve = Balancer + Constant sum model
StableSwap做的事情说起来也简单:在融合了xy=k和x+y=k各自优点的情况下,像balancer一样扩展到了多代币池。
如何融合xy=k和x+y=k?我们使用加权平均的方法:
上图中,我们想得到那条蓝色曲线,首先我们需要计算xy=const和x+y=const的交点。
x+y=D与xy=相交于(),我们给(x+y)和xy分别配上权重D和,给x+y配D是因为x+y维数比xy低,需要平衡量纲。于是得到:
令系数越大,曲线越贴合x+y=D/2,反之越贴合xy=(D/2)^2:

上图取,D=4
这样的图像并没有让每个价格都有对应的流动性,我们还要继续改进。我们想达成的目标是当代币余额接近时最大,当代币余额失衡时变小,显然我们需要一个公式来动态的调节。
由均值不等式:,我们得到:如果x+y=D,那么当且仅当x=y,xy取最大值。
依照这个思路,我们令,其中A是一个系数,A越大,在(D/2,D/2)附近的曲线就越贴近x+y=D。
把这个代入原式,得到:
A=4.5时,D=4曲线图像如下:

类似于Balancer所做的,把上述推导推广到n维(n种代币的池子)得到:

下面的问题是:A怎么算?
结合曲线来看,如果代币价格的变化波动小,应该让曲线更平,即给一个比较大的A。这样价格区间内能获得更低的滑点,才能有更大的交易量(更多的手续费收入)
所以A应该与价格的波动呈负相关:定义A等于历史价格的标准差的倒数。
5.2 Curve的滑点&无常损失

上图是A=100时Uniswap V2和StableSwap的滑点比较,可以看到因为A的放大效应,Curve的滑点比Uniswap明显大,好在Curve池中代币价格一般比较稳定。
同样因为A的放大效应,Curve的无常损失也显著高于Uniswap,Curve中代币的价格是否稳定对于LP来说很重要。
5.3 Basepool & Metapool
如果Curve像Uniswap V2一样每对稳定币都开个池子,那流动性就分散了;如果换个思路把所有稳定币都丢进一个池子里,试想池子里如果有一种稳定币USDX脱锚,那将会有大量套利者前来Curve用USDX交易其它稳定币(一个池子里代币的现价只和他们的数量和权重有关,只依赖套利调控价格,在套利开始前USDX的价格还是1$),最后池子里剩下一堆接近归0的USDX和一点其它稳定币,那就废了,因为大部分用户是可能是去交易USDT和USDC的,但它们已经不剩多少在池子里了。
Curve提出了Basepool和Metapool概念,Basepool是一个很稳定的大池子,比如由(DAI,USDT,USDC)这三个体量最大的稳定币组成的3pool,Metapool是共享一部分Basepool流动性的小池子,比如(LUSD,[3pool]),做Metapool的LP会承担Metapool代币脱锚的风险,但是获得更高的收益,因为相当于同时做了LUSD和3pool的LP。
6 其它机制
Uniswap V2,Balancer,Curve,Uniswap V3提出的AMM模型筑牢了DEX的底层地基,在此基础上又有一些小的创新,试图改进现有机制的某一痛点。
6.1 iZi Swap
前面提到的iZUMi Finance提出了离散流动性自动做市商机制,以此为基础,在2022年上线了iZi Swap。LP可以在预设一个个离散的价格点上提供流动性,而不是在一段价格区间中。

在iZi Swap中交易者可以开出限价单,当现价滑到限价单的价格时,自动进行交易。以图(b)为例,假设该池为OP/USDT交易池,现价是,向左滑动,左边的限价买单成交,向右滑动则卖单成交。
优势:可以在链上挂限价单,没有滑点,离散的流动性让流动性管理更方便
劣势:提供流动性的灵活性受限;限价单成交后还需要手动把钱从池子里提出来;限价单无法满足先来先成交的原则,谁先从池子里提出来钱谁先成交;
6.2 Trader Joe V2
Trader Joe V2参考了iZi Swap的设计,把LP提供的流动性分成若干块,放到若干固定宽度(价格)的流动性盒子(bin)中,本质上还是把价格离散化了。

实际交易时,现价对应的流动性盒子称为active bin,其左边和右边的bin中只有单边资产。上图中的active bin中满足恒定和:,是active bin对应的价格,是该bin的流动性。如果该bin中的某个资产耗尽,active bin就会向左或向右移动。
6.3 Maverick Protocol
Uniswap V3中流动性管理比较麻烦,如果价格偏离了LP提供的流动性范围就会收不到手续费并蒙受无常损失。Maverick也通过bin来容纳流动性,与Trader Joe不同的是Maverick中的bin可以移动或者和其它bin融合,使LP提供的流动性可以跟随价格变化而移动,吃到更多的手续费的同时减少无常损失。LP可以在以下四种策略中选择:
- Mode Right:仅价格升高时,流动性跟着变动
- Mode Left:仅价格降低时,流动性跟着变动
- Mode Both:价格升高或降低,流动性都跟着变动
- Mode Static:无论价格怎么变,流动性都不动
参考资料
- Author:Norrent Yu
- URL:http://blog.transnature.top/post/auto-market-maker-optimization
- Copyright:All articles in this blog, except for special statements, adopt BY-NC-SA agreement. Please indicate the source!
Relate Posts