在论文中 Automated Market Making and Loss-Versus-Rebalancing[1] 中给出了一个 uniswap v3 流动性提供者的 instantaneous LVR 公式
从该公式出发,我们会继续发掘一些非常深刻结论。在引入更多数学之前,我们先要讨论一个概念,速度。
我们其实有两种方式评价我们的投资。一种是资产,例如两年后的我们的盈亏。另一种则是考量我们的现金流,或者说,我们营收的速度。
使用现金流这个视角,在流动性提供的建模中能非常好处理一些棘手问题。原因是价格到达边界,退出流动性的时间和相关贴现是难以计算的。
对于我们的 uniswap v3 来说,我们与其评估最终收益,也可以筛选现金流最多的策略,两者是等价的。
从这个角度看,LVR 就是流动性提供者面对的成本。我们为了方便计算,我们做了一个简单的归一化
对于做市范围,我们有那么归一化的流动性则为
再由于 ,我们在流动性提供时,我们把归一化价格视为 1,因此我们获得了归一化的 LVR
接下来,我们需要讨论我们的手续费的速度了。
该部分的数学虽然细节较多,但是思路非常简单,手续费其实是由两个部分决定的。一个是由做市范围决定的流动性 。另一个则是市场状况,也就是 pool 中手续费收入和当前的总流动性。
那么 C 可以简单理解为是每日手续费 / 总流动性。当我们将乘以我们的头寸的流动性 ,即可得到每日手续费与其收入。我们需要将 智能合约中的 current liq 转换成我们使用的归一化的流动性,得到转换公式为
最终,我们的公式只剩下了当前价格 P,做市范围 H/L,加上我们之前设定的前提 ( 总量为 1u,见公式 3),也就是说,我们可以通过这三个变量,得到每 u 所对应的流动性。
如果你需要看数据验证,可以看这里的测试用例[2]
现在我们用这个 mint 交易[3]作为例子,在这个交易中:
通过下面的代码计算:
def calc():
d1 = 18
d2 = 6
P = 2593.3600098582625130328709277125184
Pl = 2591.5453837743766973404370539291089
Ph = 2594.1380956646136475445140255310184
L = Pl / P
H = Ph / P
liq_of_1_u = 1 / math.sqrt(P) * (10 ** ((d1 + d2) / 2) / (2 - math.sqrt(L) - 1 / math.sqrt(H)))
print("liq_of_1_u", liq_of_1_u)
a0 = 54.841388574261905587
a1 = 425610.612094
V = a0 * P + a1 # 567834.0761075886
print("calc: ", int(V * liq_of_1_u)) # 22305128181531983872
print("actual:", 22305100799877840896) # 22305100799877840896
可见二者结果很相近。
如果我们换一下,将 token0 作为 quote token,推导的结果是一样的。
最后,回到一开始的问题。
LP 手续费收益 = 投入资金的价值 * 单位 LP 流动性 / 总流动性 * 总手续费
现在对于我们来说,其中投入资金的价值和单位 LP 流动性是已知条件,总流动性和总手续费可以通过统计获得。由此,LP 的手续费收益就可以计算出来了。
为了便于统计每单位的 fee,我们设置 V=1,再将其中的变量 H 和 L 提取出来,就得到
我们将其定义为 ,它代表每单位投入所产生的手续费收益。
现在我们可以将正负现金流整合了。我们有下面的公式
即
这个公式非常简洁且有效,对于流动性提供者来说,能通过做市范围控制的是倍数 ,而这个池子是否值得投入,则取决于 。那我们可以绘制出这个值时间序列如下:
不难发现,整个市场也是根据这个值在动态调整的。我们假设波动率不变。如果 非常大,那么用户会进一步参与到这个市场中,导致总流动性变大,,也就是 1 单位资产的回报率会开始下降。直到这个池子不再有超额的收益率,反之亦然,期望收益是负数,则用户退出流动性提供,会导致 回归到 0 附近。我们统计的时间序列也证明了这一点。总是在 0 上下波动。这个简单的模型非常好地总结了流动性提供者如何权衡手续费收入和波动率。
我们应该如何找到 最有利可图的 pool 去参与流动性提供呢,我们绘制了简单的频率图 和散点图。频率图就是流动性提供者每天面对的收益分布概率。如何进一步筛选就要看每个人不同的风险偏好了。
那么这个公式能帮助我们选择 pool,能帮助我们选择最佳做市范围嘛?公式上看,是不能的。
很显然,如果最大化盈利,该公式暗示我们应该尽可能集中流动性。也就是 H 和 L 趋近于 1,价格会很快穿出边界。这是个非常不现实的策略。
我们可以粗糙的修正这个问题,我们在另一篇文章[5] 中讨论过这个问题。预期退出时间为
因此,我们要求预期退出时间必须为 T,则最大化 ,我们有如下公式:
我们将 T 设为 2week,在有限的几个 pool 中选择最好的 pool 进行流动性提供。
我们对这个简单策略放到我们的回测工具进行回测,得到:
Benchmark 为 ETH。我们获得了 8% 的 alpha。
我们另一项对独立的分析内容是 gas price 和不同 chain 对我们的收益的影响。我们分别整理 op,matic 和 ether 三个主网的收益速率和 gas 的散点图。
不难得到一些有趣的结论。
我们首先观察到在 ETH 主网,实际上流动性提供者的收益对 gas 并不敏感,gas 的变化几乎不影响收益的分布。这可能是因为 Eth 市场参与者可能已经适应了较高的 gas 费用,或者 Eth 上的高价值交易能够抵消较高的交易成本。在 Eth 上,LP 可能更关注长期收益而非短期 gas 费用波动。
而在 Matic 上,可以观察到燃气价格上涨通常与更高的收益预期相关联。这可能是因为在较高的燃气价格下,由于 Poly 网络本身低成本和高吞吐量,流动性仍然保持较高的水平,从而为 LPs 提供了更好的手续费收入机会。在 Matic 上,整体而言较低的 gas 费用可以提高 LPs 的现金流速度。
在 OP 网络上的有些 pool 中,较高的 gas 费用可能会降低用户的收益,这可能是由于 OP 网络的交易成本较高,导致 LP 在进行交易时需要支付更多的费用,加上流动性的减少,从而减少了他们的净收益。在 OP 上,LPs 可能需要更谨慎地选择池子以优化收益。
gas price 确实是一个项目方和用户可以更好地优化他们的策略和选择重要的因素:在 gas 费用较低时可以增加交易活动,通过动态调整策略来应对市场变化;对于新项目或用户,若成本是一个重要因素,Matic 可能是一个更好的选择,选择 gas 费用较低的网络可以提高收益;在 OP 网络上运营的项目,可能需要考虑优化交易策略,以减少高 gas 费用对收益的负面影响,通过调整做市范围和流动性集中度来优化收益。
项目的数据和回测代码[6]
Automated Market Making and Loss-Versus-Rebalancing: https://arxiv.org/pdf/2208.06046
[2]测试用例: https://github.com/zelos-alpha/demeter/blob/master/tests/uni_lp_test_calc_liq.py
[3]mint 交易: https://etherscan.io/tx/0x2b34af567c4539bb62c0380190d4abcc3a490895742eae9a92f95e9b0dcef125#eventlog#15
[4]swap 交易: https://etherscan.io/tx/0x4fae3a8906ce4d3895e373cf705b54a9d703388926f79c13b0c490059edae800#eventlog#40
[5]另一篇文章: https://medium.com/zelos-research/pricing-uniswap-v3-with-stochastic-process-part1-7201f1a954b5
[6]项目的数据和回测代码: https://github.com/zelos-alpha/lvr_research_code/
Antalpha Labs 是一个非盈利的 Web3 开发者社区,致力于通过发起和支持开源软件推动 Web3 技术的创新和应用。
官网:https://labs.antalpha.com
Twitter:https://twitter.com/Antalpha_Labs
Youtube:https://www.youtube.com/channel/UCNFowsoGM9OI2NcEP2EFgrw
联系我们:hello.labs@antalpha.com
【免责声明】市场有风险,投资需谨慎。本文不构成投资建议,用户应考虑本文中的任何意见、观点或结论是否符合其特定状况。据此投资,责任自负。