注:非投资建议,纯属技术研究。
AMM,英文全称:Automated Market Maker,翻译成中文就是自动化做市商。
在此之前,我们要介绍一些名词概念:
- Liquidity: 流动性,指各项资产的数量分布情况
- Liquidity Pool: 流动性池,指各种资产所对应的资金池
- LP(Liquidity Provider): 流动性提供者,指向流动性池内添加对应资产的用户
- Order Book: 订单簿,中心化交易所的做市方式
- Slippage: 滑点,指下单价格和最后成交价的差额比例
一、从中心化交易所的做市方式说起
在传统中的交易所中做市,无论是股市还是币市,采用的都是Order Book(订单簿)模式。订单簿记录着买卖双方对资产的报价情况。在订单簿中有两个角色:
- 挂单者 Maker
- 吃单者 Taker
其中挂单者就是做市商。专业的做市商(Maker)会同时在交易所的买卖两个方向挂单,并且根据市场的波动调整报价,为交易所提供流动性,吸引更多的交易者来进行交易。所以简单来说,做市商就是提供报价与流动性的人。
以某交易所的BTC/USDT交易对为例:
通常情况下,流动性与价格的提供者都是同一个人,也就是做市商(意指做市的商人)。
如果一个交易所没有或者只有很少的做市商进行做市的情况下,交易者想要进行交易就会出现没有流动性的情况,缺乏流动性也就意味着会造成高滑点交易——即交易者最终成交的价格与看到的价格有很大的差距,这也就会造成市场交易的积极性不高。专业的做市商,会在当前价格附近提供尽可能多的流动性,以供交易者进行交易,然后以非常高的频率进行撤单与挂单的操作,避免产生损失。做市商的最终目的是为了获利,与此同时他们的交易活动也为交易者创造了流动性,降低了交易的滑点。这些做市商,往往来自于专业化的机构。
早期的去中心化交易所,也沿用了中心化交易所的订单簿模式,但都没能发展起来。因为没进行一个操作,都需要在链上进行交互,而事实上目前最火的公链以太坊的TPS低和gas费高昂的问题都没有办法保证这种做市商活动的交易频率。
为了解决dex上难以采用传统做市商的模型的问题,一种新的做市模型——AMM出现了。
二、AMM——去中心化交易所的做市商模型
在去中心化交易所中,AMM模式是由LP来提供流动性。
LP将自有资产按比例存入池子中为交易提供流动性,这个池子就被称作流动性池。
在交易者进行交易时,实际上是与流动性池进行交易,而交易的价格则由AMM模型根据参数自动生成。
流动性池的种类主要分为三种
- 恒定资产比例池:两种资产比例 50/50
- 混合资产池:支持3种及以上资产
- 加权池:多种资产比例
这里我们主要讲的第一种恒定资产比例池。
LP根据提供的资金占池子的比例,将获得相应的LP token,相当于一种存款凭证。用户根据自己的资金比例所分得的交易手续费会累积到LP token的价值中,有些平台如Curve还提供平台原生代币的奖励。用户提供流动性后从中获得收益的这一行为称为流动性挖矿。有了流动性还不够,为了完成做市操作,还需要提供报价。
AMM是如何生成报价的呢?不同的AMM模型,有不同的价格计算公式,
有恒定乘积做市商(CPMM)模型,恒定和做市商(CSMM)模型,恒定平均值做市商(CMMM)模型,混合常数函数做市商(CFMM)模型。
1.恒定乘积做市商
早期的比如uniswap就是采用的恒定乘积做市商模型,它基于函数
x和y分别代表流动池中两种资产的数量,它们的乘积是一个恒定的常熟k。可以很容易看出,当x的供给增加时,y的代币供给必须减少;反之亦然。x和y的函数关系图像如下:x * y = k
这是目前普及度最高的一种AMM机制。
举个例子来深入了解这种AMM:
假设现实中1BTC=100USDT,已知现有一个BTC/USDT池子。由于两种资产比例要保持在50:50,也就以为着LP要存入的BTC和USDT的数量比例必须是1:100才会被池子接收。所以如果用户A想存入10BTC来提供流动性,那他就必须存入10BTC+1000USDT。通过CPMM的公式可得k = 1000 * 10 = 10000,A的k值就保持在10000不变。交易过程中,由交易者触发AMM模型,AMM模型通过计算应该发送的资产数量:
假设交易者想花300USDT购买BTC,那么根据公式:
(1000+300)*(10-y)=10000, 解得y≈2.31
即通过AMM模型,算得交易者可以拿300USDT换取2.31个BTC。但是按我们实际汇率来看300个USDT可以换3个BTC,这中间就产生了很大的误差。
我们只需要假定流动池初始情况里,BTC的数量为100,USDT的数量为10000,那么再通过CPMM公式计算:
比较接近实际汇率中的3。从图像中能更直观地看出,起始点和交易点的切线斜率是很相近的,即意味着实际汇率和理想汇率差得不大了。(10000+300)*(100-y) = 10000000
可求得y=2.913
那么我们再提高一个数量级,即假定BTC的数量为1000,USDT的数量为100000,那么再通过CPMM公式计算:
(100000+300)*(1000-y) = 100000000
可求得y=2.9911
这个数相比之前的2.913,更为接近实际的3了。
从上面的推导就可以看出,只要池子里的金额够大,滑点就可以变得很低。
这种方式任何用户都可以以任何资金量进行参与,而流动性挖矿也激励了用户提供流动性,形成了良好的闭环。
2.恒定和做市商
机制基于函数
函数图像如下:x + y = k
可以看到图像是一根直线,这也就意味着,如果代币之间的链外参考价格不是1:1的话,这会允许套利者耗尽其中一种储备资产,这种情况将摧毁流动性池的一方,迫使LP承受损失,并使得交易不具有流动性。因此这种方案并未被广泛采用。
3.恒定平均值做市商
它可以创建两个以上的代币的AMM,并在标准的50/50分布之外进行加权,在这个模型中,流动池的类型就采用了混合资产池或加权池,每个代币的加权几何平均值几乎保持不变。
这就允许池子内不同资产的风险敞口可变,并可在池内任何资产之间进行互换。比如balancer可允许用户在资产组合中加入8种资产:对于一个有三种资产的流动性池,则有:
(x * y * z) ^ (1/3) = k
4.混合常数函数做市商
它结合了多种功能和参数,以实现特定的行为。如调整流动性提供者的风险敞口或减少交易者的价格滑点,例如curve的CFMM就结合了CPMM和CSMM的特点,以创造更好的流动性。
三、无常损失(Impermanent Loss)
从我们上述对AMM机制的描述可以看出,AMM是不具备场外价格感知功能的,也就是说BTC/USDT这个池子是不能感知外面BTC的涨跌的。那么要维持这个机制的运行,就需要一个角色的帮忙:套利者。
试想一下市场中有这么一个精明的套利者,当外界BTC价格下跌时,池子里BTC还是原来的价格,套利者看到这样的情况,就会想要将BTC换成USDT,这样一来池子里的USDT的数量就会减少,BTC的数量在增多。由于BTC和USDT资产比例是相等的,即:
BTC数量*BTC价格 = USDT数量*USDT价格
由于USDT价格是稳定的,而USDT数量减少了,所以等式右边在减小;那么想维持等式的平衡,就得减小BTC的价格。
同样另一种情况——即外界BTC价格上涨了,那么市场上这个精明的套利者就会在用USDT去买池子里的BTC,这样一来池子里的BTC数量就减少了,USDT的数量就增多了,为了维持等式两边的平衡,等式左边的BTC价格也必须得上升。
AMM就是这样通过套利者这个角色来维持池内外汇率的动态统一的。
我们上面讲了市场上这个精明的套利者的套利过程,毫无疑问,在只有套利者和池子两个对象的系统中,套利者在整个过程中套取的利润一定来自于矿池。矿池总量下跌,LP持有的资产也会下跌。这部分损失就是无常损失。而且可以知道,无论币价的上涨还是下跌,套利者都有套利空间,也就是说,无常损失几乎是不可避免的。一种极端情况下,即只有在你
入场时BTC/USDT交易对的币价比=出场时BTC/USDT交易对的币价比
的情况下,才能避免无常损失。虽然有无常损失,但是用户还是可以通过提供流动性来赚取手续费,一定程度上可以弥补币价波动带来的无常损失。
所以总的来说,参加这种LP挖矿,需要考虑的因素要比dapp上面写的年化数字要复杂的多。我总结了一些规则:
- 为了避免无常损失,退场时机最好选在当前交易对币价比回归到你入场时交易对币价比的时候;
- 如果币价上涨,那么作为LP,币本身涨幅带来的收益比不上现货,综合来讲还要加上你的手续费奖励这一部分;
- 如果币价下跌,那么作为LP,币本身下跌带来的亏损要高过现货,综合来讲也要加上你的手续费奖励这一部分。