自动做市商协议基础 #
交易对定义 #
交易对包括两种不同的可以相互交换的数字资产,这里分别用 TokenA 和 TokenB 表示。在创建交易对时,用户需要按照实际市场价格存入一定数量的价值相等的 TokenA 和 TokenB 。如果创建交易对的价格偏离市场价格,交易对创建者会被套利,从而蒙受损失。
假设 PA 、PB 分别为 TokenA 、TokenB 以任一法币计价的价格,定义 PA→B 为 TokenA 兑换为 TokenB 的价格,即与 1 TokenA 等值的 TokenB 的数量:
PA→B=PBPA(1.1.1) 同样,定义 PB→A ,即 TokenB 兑换为 TokenA 的价格:
PB→A=PAPB(1.1.2) 理论上,不考虑市场交易成本,则存在下列关系:
PA→B∗PB→A=1(1.1.3) 假设 NA 、NB 分别为交易对内部任一时刻两种数字资产 TokenA、 TokenB 的数量,该交易对可表示为:
(NA ∣ NB)(1.1.4) 交易对总是认为两种内部资产一直保持相等的市场价值,即存在下列相互等价的关系:
NA∗PA=NB∗PB(1.1.5) NA=NB∗PB→A(1.1.6) NB=NA∗PA→B(1.1.7) PA→B=NANB(1.1.8) PB→A=NBNA(1.1.9) 恒定资产乘积 #
在交易对中进行资产兑换时,由于无法取得外部 TokenA 和 TokenB 的市场价格,需要设计一个兑换机制,确定 TokenA 和 TokenB 兑换比例关系。自动做市商 (Automated Market Maker,AMM) 类型的去中心化交易所 (DEX),采用 “资产恒定乘积” 公式[1] 确定兑换交易发生前后交易对中资产数量的变化,也即用户兑入、兑出资产的数量;
对于交易对 (NA ∣ NB) ,"恒定资产乘积" 公式可表示为:
NA∗NB=K(1.2.1) 其中,K 值只在用户向交易对中存入流动性资产,或者从交易对中取回流动性资产时才会发生变化,在用户兑换资产的交易过程中保持恒定不变。
假设有一笔兑换交易,用户用 TokenA 兑换 TokenB ,兑入的 TokenA 的数量为 ΔA ,兑出的 TokenB 的数量为 ΔB 。(为表述方便,这里的 “兑入”、“兑出” 是相对交易对而言的,如果相对用户而言,“兑入”、“兑出” 关系则完全相反)。依据 "恒定资产乘积" 公式,有:
(NA+ΔA)∗(NB−ΔB)=(NA∗NB)(1.2.2) ΔB=NA+ΔAΔA∗NB(1.2.3) 可以看到,兑换交易发生前、兑换交易发生后、以及兑换交易实际发生的价格是3个不同的价格。
兑换交易发生前,交易对内的资产价格(表示为 PA→B0)为:
PA→B0=NANB(1.2.4) 兑换交易实际发生的资产价格(表示为 PA→B1)为:
PA→B1=ΔAΔB=NA+ΔANB(1.2.5) 兑换交易发生后,交易对内的资产价格(表示为 PA→B2)为:
PA→B2=NA+ΔANB−ΔB(1.2.6) 显而易见:
PA→B0>PA→B1>PA→B2(1.2.7) 即兑入资产 TokenA 相对于兑出资产 TokenB 的价格,在兑换交易发生后,发生了滑动。兑换交易发生前交易对内 TokenA 的价格,高于用户兑换交易实际发生的价格,而用户兑换交易实际发生的价格,又高于兑换完成后交易对内 TokenA 的价格。即兑换交易完成后,交易对内 TokenA 相对于 TokenB 的价格发生了下跌,相应地,TokenB 的相对价格产生了上涨。
交易套利 #
兑换交易是在交易区块确认的瞬间发生的,兑换交易发生前后,TokenA 和 TokenB 的外部市场价格不会发生变化。由于 "恒定资产乘积" 约束,导致交易价格产生滑动,会使用户蒙受一定的兑换交易损失,以 TokenB 计价的兑换损失计算如下:
LostA→B=ΔA∗NANB−ΔA∗NA+ΔANB=ΔA∗NANB/(1+ΔANA)(1.3.1) 可见用户兑入Token A的比列 (ΔA/NA) 越大,蒙受的兑换损失也会越大。
该交易完成后,如果另一用户进行逆向兑换,不考虑交易费用,根据 "恒定资产乘积" 公式,他只要兑入数量为 ΔB 的 TokenB ,即可获得数量为 ΔA 的 TokenA ,交易完成后,交易对内资产价格恢复为初始价格 PA→B=NB/NA 。即该用户以相对于 TokenA 较高的 TokenB 的价格完成交易,实现了对前一用户兑换损失的套利,套利金额等于前一用户的兑换损失。
无常损失 #
流动性资金提供者在提供流动性时,需要向交易对中注入两种总价值相等的相应数量的代币,随着交易的发生,用户提供流动性获得的权益所对应的代币数量会发生变动。假设用户初始投入 TokenA 的数量为 XA ,当用户退出流动性时,如果 TokenA 的市场价格相对于 TokenB 发生了上涨,则用户得到的 TokenA 的数量 X′A 可能会小于 XA,如果提供流动性获得的交易手续费等收入不足以弥补 TokenA 数量减少造成的损失,则流动性提供者相对于一直持有 TokenA 、TokenB,而不是为交易对提供流动性资金服务,会蒙受一定的损失。实际上,无论 TokenA、TokenB的价格是上涨还是下跌,只要他们的价格比相对于用户提供流动性时发生了偏离,用户都会蒙受损失。该损失大小完全由市场价格变化决定,用户无法控制,也被称为 "无常损失"[5]。
下面以 TokenB 作为价格基准,在不考虑交易手续费收入的情况下,对无常损失进行定量分析。
假设用户初期投入交易对的代币数量为 (XA∣YB) ,TokenA 相对于 TokenB 的价格为 P1,期末用户撤出交易对的代币数量为 (XA′∣YB′),TokenA 相对于 TokenB 的价格为 P2,如果用户没有为交易池提供流动性,而是简单持有 (XA∣YB) 代币,期末价值为:
V1=XA∗P2+YB(1.4.1) 由于用户为交易池提供流动性,实际拥有 (XA′∣YB′) 代币的价值为:
V2=XA′∗P2+YB′(1.4.2) 考虑到:
⎩⎪⎪⎨⎪⎪⎧XA∗YBP1P2=XA′∗YB′=YB/XA=YB′/XA′(1.4.3) 则有[6]:
V1V2=P1+P2 2P1∗P2 =(P1−P2)2+4P1P24P1P2≤1(1.4.4) 可见只要 P1=P2,V2 就总是小于 V1,即用户以 TokenB 计价的总资产价值相对于简单持有两种代币,一定是减少的。同理用户以 TokenA 计价的总资产价值相对于简单持有两种代币也一定是减少的。
所以所谓的无常损失(Impermanent Loss)实际上是一定会发生的永久损失(Permanent Loss),只是该损失金额会随着价格的变动而变动。