方法论

LPSignal 如何回测集中流动性

净 APR = 手续费 APR − 无常损失:某个价格区间里一单位流动性实际赚到的手续费,减去它相对于直接持有两种代币所损失的价值。LPSignal 每小时都会对每个覆盖的池子和一组区间计算它,只用链上数据。

要点

  • 精确手续费。每小时最后一个区块读取池子的手续费增长计数器,包含动态费率——触发信号时从不用成交量估算。
  • 计入无常损失。在每个窗口结束时,把仓位与持有开仓时的代币进行比较。
  • 具体区间。每种池子类型测试三到四个区间宽度,按池子的 tick 间距对齐,覆盖最近 1 小时、24 小时、7 天和 30 天。
  • 公开计分。每条机会信号在 7 天后按它推荐的确切 tick 重新回测;亏损的信号也保留在战绩里。
  • 覆盖范围。Ethereum、BNB Chain、Base、Arbitrum、Optimism 和 Polygon 上的 Uniswap v3 与 v4、PancakeSwap v3、Aerodrome 和 Velodrome Slipstream;只收录成熟代币的池子。

为什么 DEX 网站上的 APR 不是 LP 实际赚到的

DEX 和数据网站通常展示的是池子级的手续费 APR:最近一天的手续费除以池子里的全部流动性,再年化。对集中流动性池来说,这个数字回答不了 LP 关心的任何问题:

  • 它是所有仓位的平均值,包括那些已经出区间、一分钱都不赚的仓位。一直在区间内的窄区间能赚到平均值的数倍;价格离开的区间则为零。
  • 它忽略了无常损失。在波动大的交易对上,一个区间可能手续费 APR 很高,价值却仍然低于直接持币。
  • 它不会告诉你该用哪个区间。

LPSignal 直接回答这个问题:在这个池子、这个区间,扣除无常损失后,过去一周一个仓位能有多少回报?

第一步:用手续费增长计算精确手续费

每个 Uniswap v3 类的池子都维护着每单位流动性累计手续费的计数器(feeGrowthGlobal0X128 和 feeGrowthGlobal1X128)。LPSignal 在每小时最后一个区块读取它们;两个小时之间的差值除以 2128,就是一单位区间内流动性在这一小时里精确赚到的手续费——已扣除协议分成,包含动态费率。

用 Swap 事件估算手续费(成交量 × 费率)在普通的 Uniswap 和 PancakeSwap 池子上很接近——我们在 Base 上实测误差约 1%——但在 Aerodrome Slipstream 上最多偏差 1.8 倍,因为那里的费率是动态的、部分流动性被质押、交易会跨越 tick。所以只有拥有精确手续费数据的时间窗口才能触发信号。

第二步:区间和时间窗口

每个池子按其类型测试合适的区间宽度。±5% 的区间覆盖入场价格下方 5% 到上方 5%,并向外取整到池子的 tick 间距;信号会给出确切的 tick。

池子类型示例测试的区间
稳定币对USDT/USDC±0.05% · ±0.1% · ±0.5%
相关资产对wstETH/WETH, cbBTC/WETH±0.5% · ±1% · ±3%
波动资产对WETH/USDC, WBNB/USDT±5% · ±10% · ±20% · 全区间

每个区间都在最近 1 小时、24 小时、7 天和 30 天上回测,每小时重新计算。

第三步:无常损失和在区间时间

回测按窗口开始时的价格,在区间内开一单位流动性。价格整个小时都在区间内的,记入这一小时的精确手续费;在区间外的小时不赚手续费,但仍计入平均值;价格穿过区间边界的那个小时不记入手续费(这类小时占手续费的比例过高时,结果会标为估算)。窗口结束时,按收盘价给仓位估值,并与持有开仓时的代币比较:差额就是无常损失。两者都按窗口年化:净 APR = 手续费 APR − 无常损失。

第四步:从回测到信号

在整点时,如果某个池子的某个区间同时满足以下全部条件(只用精确数据),就会触发一条机会信号:

条件稳定币对相关资产对波动资产对
最近 7 天净 APR≥ 8%≥ 10%≥ 30%
最近 24 小时净 APR≥ 8%≥ 10%≥ 30%
7 天内在区间时间占比≥ 80%

发出信号后,同一个池子 72 小时内保持静默,除非它的 7 天净 APR 涨到上次信号时的 1.5 倍。落后超过 2 小时的链不会触发任何信号,所以信号永远不会基于过时的数据。

第五步:每条信号都公开计分

机会信号触发 7 天后,LPSignal 会把它推荐的确切 tick 在这 7 天上回测,并把实现的净 APR 公布在信号当时的数字旁边——每条信号都是如此,包括亏损的。如果那一周缺少精确手续费数据,信号会显示为未计分,并且不计入平均值,所以战绩从不用估算值充数。参见战绩。

回测不包含什么

  • 未来。上周收益很好的区间,如果价格突破出去,下周也可能亏钱。
  • Gas,以及为建仓兑换代币的成本。
  • Aerodrome 和 Velodrome 的 gauge 排放奖励:数字针对未质押的流动性;质押收益率仅供参考。
  • 带 hook 或动态费率的 Uniswap v4 池子(不覆盖)。

常见问题

流动性提供者的净 APR 是什么?

扣除无常损失后的流动性仓位年化收益:赚到的手续费,减去相对于直接持有两种代币损失的价值。LPSignal 通过逐小时回测,按池子、按价格区间计算它。

如何回测一个 Uniswap v3 仓位?

取池子的逐小时历史,按窗口开始时的价格在选定区间开一单位流动性,对价格整个小时都在区间内的每个小时,按池子手续费增长计数器记入精确手续费,最后把它的价值与持有开仓时的代币比较。LPSignal 每小时对每个覆盖的池子都这样做。

为什么手续费 APR 对集中流动性有误导性?

池子级手续费 APR 把手续费除以池子里的全部流动性,不管是否在区间内,而且忽略无常损失。一个具体区间可能赚得多得多,也可能什么都赚不到;在波动大的交易对上,损失还可能超过手续费。

净 APR 会是负数吗?

会。价格波动足够大时,无常损失会超过赚到的手续费,仓位价值低于直接持币。LPSignal 也会展示这些区间,并把亏损的信号保留在战绩里。