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/)一文完全相同的结论。