TWAMM 做市商的数学原理
======================
最近,Paradigm 研究合伙人 Dave White、Dan Robinson 与 Uniswap 创始人 Hayden Adams 一起合作设计了一个全新的做市模型「时间加权平均做市商 **TWAMM**」(Time-Weighted Average Market Maker)。根据其发表文章介绍,**TWAMM** 可以在以太坊上有效地交易大额订单,工作原理是将长期大额订单分解为无限多个无限小的虚拟订单,在一定时间内使用嵌入式 **AMM** 平滑地执行这些交易。
关于 **TWAMM** 的虚拟交易所涉及的数学,Dave White 在文中并没有多费笔墨,只在最后给出了非常简单的数学结论,这对于理解 **TWAMM** 的数学原理非常不利。本文将重点对 **TWAMM** 的数学原理进行严格的论证和解释,至于 **TWAMM** 模型详细的设计原理,可以前往 Paradigm 官网查看:[https://www.paradigm.xyz/2021/07/twamm/](https://www.paradigm.xyz/2021/07/twamm/),本文不再做详述。
### 定义
假设 **TWAMM** 执行大额虚拟交易需要 $N$ 个区块,出售 $X$ 的池子以每区块 $x_{rate}$ 的速率出售,而出售 $Y$ 的池子以每个区块 $y_{rate}$ 的速率出售。因此,在整个期间售出的 $X$ 总量为 $x_{in}=Nx_{rate}$,售出的 $Y$ 总量为 $y_{in}=Ny_{rate}$。
同时,我们将此时间段嵌入 **AMM** 的初始储备 $x_{reserve}$ 和 $y_{reserve}$ 分别表示为 $x_{0}=x_{ammStart}$ 以及 $y_{0}=y_{ammStart}$。
按照 **TWAMM** 的设计,大额订单是随着区块进行交易的,每个区块出售 $x_{rate}$ 得到 $y_{out}$,或者出售 $y_{rate}$ 得到 $x_{out}$,同时 **AMM** 会更新 $x_{reserve}$ 和 $y_{reserve}$ 的值,整个过程总共交易 $N$ 次。
值得注意的是,**AMM** 的每个区块交易总是遵循恒定乘积做市。
![](https://i.imgur.com/29fFenu.png)
### 公式
首先,在执行第 $n-1$ 区块的交易后,我们假设此时 **AMM** 的 $x_{reserve}$ 和 $y_{reserve}$ 值分别为 $x_{n-1}$ 和 $y_{n-1}$。
接下来执行第 $n$ 区块的交易,$X-Pool$ 和 $Y-Pool$ 分别向 **AMM** 输入 $x_{rate}$ 和 $y_{rate}$,命:
$$\overline{x}_{n}=x_{n-1} + x_{rate}$$
$$\overline{y}_{n}=y_{n-1} + y_{rate}$$
因为 $x_{rate}$ 和 $y_{rate}$ 非常微小,且区块的交易 **AMM** 遵循恒定乘积做市商,我们可以得到,
$$\dfrac{x_{out,n}}{y_{rate}}=\dfrac{\overline{x}_{n}}{\overline{y}_{n}}=\dfrac{x_{n-1} + x_{rate}}{y_{n-1} + y_{rate}}$$
$$\dfrac{y_{out,n}}{x_{rate}}=\dfrac{\overline{y}_{n}}{\overline{x}_{n}}=\dfrac{y_{n-1} + y_{rate}}{x_{n-1} + x_{rate}}$$
化简,
$$x_{out,n}= y_{rate}*\dfrac{\overline{x}_{n}}{\overline{y}_{n}}=y_{rate}*\dfrac{x_{n-1} + x_{rate}}{y_{n-1} + y_{rate}}$$
$$y_{out,n}= x_{rate}* \dfrac{\overline{y}_{n}}{\overline{x}_{n}}=x_{rate}*\dfrac{y_{n-1} + y_{rate}}{x_{n-1} + x_{rate}}$$
在得到 $x_{out,n}$ 和 $y_{out,n}$ 的值后,我们进一步可以获得 $n$ 区块的交易后 **AMM** 的 $x_{reserve}$ 和 $y_{reserve}$ 值 $x_{n}$ 和 $y_{n}$,
$$x_{n}=\overline{x}_{n}-x_{out,n}=\overline{x}_{n}- y_{rate}*\dfrac{\overline{x}_{n}}{\overline{y}_{n}}= y_{n-1}*\dfrac{\overline{x}_{n}}{\overline{y}_{n}}=y_{n-1}*\dfrac{x_{n-1} + x_{rate}}{y_{n-1} + y_{rate}}$$
$$y_{n}=\overline{y}_{n}-y_{out,n}=\overline{y}_{n}- x_{rate}*\dfrac{\overline{y}_{n}}{\overline{x}_{n}}= x_{n-1}*\dfrac{\overline{y}_{n}}{\overline{x}_{n}}=x_{n-1}*\dfrac{y_{n-1} + y_{rate}}{x_{n-1} + x_{rate}}$$
通过观察,我们发现 $x_{n}*y_{n}=x_{n-1}*y_{n-1}$,这正好符合 **AMM** 的循恒定乘积做市的前提要求。
令,$x_{n}*y_{n}=x_{n-1}*y_{n-1}=...= x_{1}*y_{1}=x_{0}*y_{0}=k$,这是一个常数。
### 分式线性递归
先对 $x_{n}$ 求得一般公式,并获得 $x_{ammEnd}=x_{N}$ 的值,$y_{n}$ 同理。
$$x_{n}=y_{n-1}*\dfrac{x_{n-1} + x_{rate}}{y_{n-1} + y_{rate}}=\dfrac{k}{x_{n-1}}*\dfrac{x_{n-1} + \dfrac{x_{in}}{N}}{\dfrac{k}{x_{n-1}} + \dfrac{y_{in}}{N}}=k*\dfrac{x_{n-1} + \dfrac{x_{in}}{N}}{\dfrac{y_{in}}{N}*x_{n-1} + k}$$
设 $a=\sqrt{\dfrac{k*x_{in}}{y_{in}}}, \overline{a}=\sqrt{\dfrac{k*y_{in}}{x_{in}}},b=\sqrt{\dfrac{x_{in}*y_{in}}{k}}$,则
$$x_{n}=\dfrac{x_{n-1} + \dfrac{ab}{N}}{ \dfrac{b}{aN}*x_{n-1}+1}$$
$y_{n}$ 的分式线性递归表达式如下:
$$y_{n}=k*\dfrac{y_{n-1} + \dfrac{y_{in}}{N}}{\dfrac{x_{in}}{N}*y_{n-1} + k}=\dfrac{y_{n-1} + \dfrac{\overline{a}b}{N}}{ \dfrac{b}{\overline{a}N}*y_{n-1}+1}$$
### 解
首先,若 $y_{in}$ 等于 0,$x_{in}$ 不等于 0,则 $x_{n}=x_{0} +\dfrac{ab}{N}*n,x_{ammEnd}=x_{N}=x_{0}+x_{in},x_{out}=x_{0}+x_{in}-x_{ammEnd}=0$。
而 $y_{n}=k*\dfrac{y_{n-1}}{\dfrac{x_{in}}{N}*y_{n-1} + k},\dfrac{1}{y_{n}}=\dfrac{1}{y_{n-1}}+\dfrac{x_{in}}{kN}$。
计算得到,$y_{n}=\dfrac{1}{\dfrac{1}{y_{0}}+\dfrac{x_{in}}{kN}*n},y_{ammEnd}=y_{N}=\dfrac{1}{\dfrac{1}{y_{0}}+\dfrac{x_{in}}{k}}$。
而 $y_{out}=y_{0}+y_{in}-y_{ammEnd}=\dfrac{x_{in}y_{0}}{x_{in}y_{0}+k}*y_{0}$。
---
$x_{in}$ 等于 0,$y_{in}$ 不等于 0 时,讨论同上。
---
若 $x_{in}$ 和 $y_{in}$ 都不等于 0,对于一般的分式线性递归,我们可以采用**不动点**的方法求解。
根据 $x_{n}=\dfrac{x_{n-1} + \dfrac{ab}{N}}{ \dfrac{b}{aN}*x_{n-1}+1}$,命 $\lambda=\dfrac{\lambda + \dfrac{ab}{N}}{ \dfrac{b}{aN}*\lambda+1}$,解得 $\lambda=\pm{a}$。$\pm{a}$ 正是上述分式线性递归表达式的两个不动点。
进一步计算,
$$x_{n}-a=\dfrac{a(\dfrac{N}{b}-1)(x_{n-1}-a)}{x_{n-1}+\dfrac{aN}{b}},x_{n}+a=\dfrac{a(\dfrac{N}{b}+1)(x_{n-1}+a)}{x_{n-1}+\dfrac{aN}{b}}$$
将上面两个表达式相除,
$$\dfrac{x_{n}-a}{x_{n}+a}=\dfrac{N-b}{N+b}*\dfrac{x_{n-1}-a}{x_{n-1}+a}=(1-\dfrac{2b}{N+b})*\dfrac{x_{n-1}-a}{x_{n-1}+a}$$
根据等比数列求得,
$$\dfrac{x_{n}-a}{x_{n}+a}=(1-\dfrac{2b}{N+b})^{n}*\dfrac{x_{0}-a}{x_{0}+a},\dfrac{x_{N}-a}{x_{N}+a}=(1-\dfrac{2b}{N+b})^{N}*\dfrac{x_{0}-a}{x_{0}+a}$$
同理,
$$\dfrac{y_{n}-\overline{a}}{y_{n}+\overline{a}}=(1-\dfrac{2b}{N+b})^{n}*\dfrac{y_{0}-\overline{a}}{y_{0}+\overline{a}},\dfrac{y_{N}-\overline{a}}{y_{N}+\overline{a}}=(1-\dfrac{2b}{N+b})^{N}*\dfrac{y_{0}-\overline{a}}{y_{0}+\overline{a}}$$
### 极限值
**TWAMM** 的基本假设是将长期大额订单分解为无限多个无限小的虚拟订单,也即是 $N$ 可以取无穷大,这时候可以获得 $x_{N}$ 的极限值。
$$\dfrac{x_{ammEnd}-a}{x_{ammEnd}+a}=\lim _{N\rightarrow \infty }\dfrac{x_{N}-a}{x_{N}+a}=\lim _{N\rightarrow \infty }(1-\dfrac{2b}{N+b})^{N}*\dfrac{x_{0}-a}{x_{0}+a}=e^{-2b}*\dfrac{x_{0}-a}{x_{0}+a}$$
$$x_{ammEnd}=a*\dfrac{e^{2b}+c}{e^{2b}-c}=\sqrt{\dfrac{kx_{in}}{y_{in}}}*\dfrac{e^{2\sqrt{\dfrac{x_{in}y_{in}}{k}}}+c}{e^{2\sqrt{\dfrac{x_{in}y_{in}}{k}}}-c}$$
其中,
$$c=\dfrac{x_{0}-a}{x_{0}+a}=\dfrac{\sqrt{x_{ammStart}*y_{in}}-\sqrt{y_{ammStart}*x_{in}}}{\sqrt{x_{ammStart}*y_{in}}+\sqrt{y_{ammStart}*x_{in}}}$$
$$x_{out}=x_{ammStart}+x_{in}-x_{ammEnd}$$
相似的,
$$y_{ammEnd}=\sqrt{\dfrac{ky_{in}}{x_{in}}}*\dfrac{e^{2\sqrt{\dfrac{x_{in}y_{in}}{k}}}+\overline{c}}{e^{2\sqrt{\dfrac{x_{in}y_{in}}{k}}}-\overline{c}}$$
$$\overline{c}=\dfrac{\sqrt{y_{ammStart}*x_{in}}-\sqrt{x_{ammStart}*y_{in}}}{\sqrt{x_{ammStart}*y_{in}}+\sqrt{y_{ammStart}*x_{in}}}=-c$$
$$y_{out}=y_{ammStart}+y_{in}-y_{ammEnd}$$
最后,经过简单的验证 $x_{ammEnd}*y_{ammEnd}=x_{ammStart}*y_{ammStart}=k$,依然满足 **AMM** 的恒定乘积。
至此,我们完成了**TWAMM** 的数学原理严格的论证和解释,并得到了与[「时间加权平均做市商 **TWAMM**」](https://www.paradigm.xyz/2021/07/twamm/)一文完全相同的结论。