自动做市商介绍

最近区块链上DeFi很火,我就去了解一下,和以前玩法有什么不一样。看下来发现除了以前就有的借贷和交易所,还有四个比较有趣的东西是以前没有的。

  1. 自动做市商(Uniswap)
  2. 智能合约理财 (yearn)
  3. 闪电贷 (Aave)
  4. 有抵押稳定币 (MakerDao)

自动做市商和闪电贷这两个技术让我惊叹。今天先介绍一下自动做市商的机制。

传统的交易所会维护一个订单簿,记录了所有买的价格和卖的价格。交易所会撮合同一价格的买卖双方成交。我之前在eos上写过一个这样的交易所。但是撮合的逻辑非常重,经常在撮合大单的时候跑完cpu。本来打算写第二个版本,把撮合交给别人来做,并且支付手续费作为奖励(如果做成了现在就是撮合挖矿了。。。)。结果eos价格一落千丈我也没有信心继续完成这个版本。

而自动做市商没有订单簿,取而代之的是一个包含交易对双方币种的资金池,这两个币种的总价值是1:1。比如总价值1000美元的ETH-DAI交易对的资金池中有1个ETH和500个DAI(DAI是一种等价美元的稳定币,1 usd = 1 dai)。这时候就可以得出一个ETH的价格就是500美元。任何时候我们都可以向资金池中以1:1的价值放入两种代币,而我们就会一定比例的占有这个资金池,合约会给我们LP token作为拥有部分资金池的证明。当交易发生的时候,合约会收取一定的手续费,存入资金池。资金池的价值就会升高,我们拥有的价值也会升高。

当我想要进行交易的时候合约又是如何判断价格的呢?Uniswap用了一种开创式的算法:设资金池中有Y个ETH,X个DAI。合约保证 $XY$ 在交易前后不变(称为恒定乘积公式)。也就是当我们需要用x个DAI购买ETH的时候,合约会给我们y个ETH使得

\[XY = (X + x)(Y - y)\]

为什么是乘积保持不变,而不是某种类似 $X/Y$ 之类的公式来代表价格?这就要从价格说起。

在Uniswap中价格是由资金池中两种货币的数量比例决定的。我们定义边际价格为:用1个DAI能换到的ETH数量,即 $Y/X$(或者反过来说,1个ETH值 $X/Y$ 个DAI)。当交易发生的时候,必定会导致比例变化并且造成价格变动。交易需要一个价格,而价格又被交易改变。我们可以用一个微分方程来表示一笔交易:

假设我们用x个DAI能够购买ETH的数量为 $y(x)$,资金池初始状态有Y个ETH和X个DAI。

首先考虑极小量交易:当 $dx$ 趋向于无穷小的时候,可以假定这笔极小交易不会显著改变资金池的比例,因此成交价格就是当前的边际价格。在还没有进行任何交易时($x=0$),用 $dx$ 个DAI可以换到 $dy = \frac{Y}{X} dx$ 个ETH,即:

\[\frac{dy}{dx}\bigg|_{x=0} = \frac{Y}{X}\]

更一般地,当已经交易了x个DAI(获得了 $y(x)$ 个ETH)之后,资金池中剩余 $X + x$ 个DAI和 $Y - y(x)$ 个ETH。此时的边际价格变为 $\frac{Y - y(x)}{X + x}$,因此:

\[\frac{dy}{dx} = \frac{Y - y(x)}{X + x}\] \[\Rightarrow dy = \frac{(Y - y(x)) \cdot dx}{X + x}\]

这是一个关于 $y(x)$ 的一阶线性微分方程,初始条件为 $y(0) = 0$(没有花费DAI时,获得的ETH为0)。

求解过程:将方程改写为标准形式:

\[\frac{dy}{dx} + \frac{y}{X + x} = \frac{Y}{X + x}\]

这是一阶线性微分方程 $y’ + P(x)y = Q(x)$,其中 $P(x) = \frac{1}{X+x}$,$Q(x) = \frac{Y}{X+x}$。

积分因子为 $\mu(x) = e^{\int \frac{1}{X+x}dx} = X + x$

两边乘以积分因子:$(X+x)y’ + y = Y$

即:$\frac{d}{dx}[(X+x)y] = Y$

积分得:$(X+x)y = Yx + C$

由初始条件 $y(0) = 0$,代入得 $C = 0$,因此:

\[y(x) = \frac{xY}{X + x}\]

验证这个解满足恒定乘积公式:

\[\Rightarrow XY = (X + x)(Y - y(x))\]

这个简单的规则完美的计算出了价格。

无常损失分析

资金池中的价值并不是一直不变的,它会随着币价的变化而变化。这里我们仅考虑一边为稳定币的情况。如果我们持有ETH-DAI的LP Token,当ETH价格变动时,LP Token的价值变动幅度是单纯持有ETH价值变动幅度的平方根。这种现象称为无常损失(Impermanent Loss)。(当然手续费收入会部分补偿这个损失)

为了公平比较,我们假设三种策略的初始投资金额相同,都是价值 $2X$ DAI的资产。

假设资金池初始状态有Y个ETH,X个DAI。当前的ETH价格为 $X/Y$ DAI/ETH(即1个ETH值 $X/Y$ 个DAI)。

现在假设外部市场ETH价格发生变化。套利者会通过交易使资金池价格与外部市场一致。设价格变化后,资金池中DAI数量变为 $aX$,ETH数量变为 $Y/a$(其中 $a > 0$)。可以验证恒定乘积不变:$aX \cdot \frac{Y}{a} = XY = k$。

此时新的ETH价格为 $\frac{aX}{Y/a} = \frac{a^2X}{Y}$ DAI/ETH,即价格变为原来的 $a^2$ 倍。

我们分别对比三种策略在价格变动前后的价值(以DAI计价):

  全部持有DAI 全部持有ETH 资金池(LP Token)
初始持仓 $2X$ DAI $2Y$ ETH $X$ DAI + $Y$ ETH
初始价值 $2X$ DAI $2Y \cdot \frac{X}{Y} = 2X$ DAI $X + Y \cdot \frac{X}{Y} = 2X$ DAI
价格变动后持仓 $2X$ DAI $2Y$ ETH $aX$ DAI + $\frac{Y}{a}$ ETH
价格变动后价值 $2X$ DAI $2Y \cdot \frac{a^2X}{Y} = 2a^2X$ DAI $aX + \frac{Y}{a} \cdot \frac{a^2X}{Y} = 2aX$ DAI
价值变化倍数 $1$ $a^2$ $a$

结论:当ETH价格变为原来的 $a^2$ 倍时:

提供流动性也需要承担一定的ETH价格变动的风险,但价值波动幅度是单纯持有ETH的平方根。例如,如果ETH价格翻4倍($a^2=4, a=2$),持有ETH的人资产翻4倍,而LP持有者资产只翻2倍。反过来,如果ETH价格跌到1/4($a^2=1/4, a=1/2$),持有ETH的人资产缩水到1/4,而LP持有者资产缩水到1/2。这就是自动做市商的巧妙设计。