# CLMM 的预估 APR

## 概览

在 CLMM 池中，手续费会按比例分配给每个 tick 上处于区间内的流动性。要跨所有 ticks 和 LP 计算准确的 APR 极其复杂——传统的恒定乘积 APR 公式并不适用。

**CLMM 的预期收益最好仅视为估算值。**

Raydium 显示三种 APR 估算方法：

1. **整体池子预计 APR** — 全池平均值
2. **Delta 方法** — 基于你的仓位所占流动性份额
3. **乘数方法** — 基于历史价格区间重叠

***

### 整体池子预计 APR

假设交易手续费和 emissions 会分配到池中的所有流动性上，包括区间外仓位。

$$
APR = \sum(d\_{365}, h\_{24}, s\_{3600}, b\_{0.5}) \times \frac{(perBlockReward \times rewardPrice) + totalTradingFee}{totalLiquidityValue}
$$

***

### Delta 方法

根据你的仓位在池中流动性的隐含变化（delta）来计算预计 APR，该变化由你的价格区间和仓位大小决定。

**条件**

$$
i\_l \leq i\_c < i\_u
$$

其中：

| 变量       | 描述            |
| -------- | ------------- |
| $$i\_l$$ | lowerTickId   |
| $$i\_c$$ | currentTickId |
| $$i\_u$$ | upperTickId   |

**仓位中的代币数量**

$$
\Delta Y = \Delta L \times (\sqrt{P} - \sqrt{P\_l})
$$

$$
\Delta X = \Delta L \times \left(\frac{1}{\sqrt{P}} - \frac{1}{\sqrt{P\_u}}\right)
$$

**计算 ΔL**

对于 tokenA（$$\Delta X$$）和 tokenB（$$\Delta Y$$）的估算，我们需要知道 $$\Delta L$$:

$$
(\Delta Y \times pUSDY) + (\Delta X \times pUSDX) = targetAmount
$$

因此我们取：

$$
(\Delta L \times (\sqrt{P} - \sqrt{P\_l}) \times pUSDY) + (\Delta L \times \left(\frac{1}{\sqrt{P}} - \frac{1}{\sqrt{P\_u}}\right) \times pUSDX) = targetAmount
$$

然后：

$$
\Delta L = \frac{targetAmount}{(\sqrt{P} - \sqrt{P\_l}) \times pUSDY + \left(\frac{1}{\sqrt{P}} - \frac{1}{\sqrt{P\_u}}\right) \times pUSDX}
$$

在计算出 $$\Delta L$$之后，我们可以计算 $$\Delta X$$ 和 $$\Delta Y$$ 使用：

$$
\Delta Y = \Delta L \times (\sqrt{P} - \sqrt{P\_l})
$$

$$
\Delta X = \Delta L \times \left(\frac{1}{\sqrt{P}} - \frac{1}{\sqrt{P\_u}}\right)
$$

**预计每日手续费**

$$
Fee = feeTier \times volume24H \times \frac{\Delta L}{L + \Delta L}
$$

其中：

| 变量            | 描述                                                 |
| ------------- | -------------------------------------------------- |
| $$volume24H$$ | 24 小时成交量的平均值                                       |
| $$L$$         | 总流动性（所有 tick 的 liquidityNet 累加，其中 $$i \leq i\_c$$) |
| $$\Delta L$$  | Delta 流动性                                          |

**流动性数量**

并且可以通过以下方式计算：

$$
liquidityAmount0 = amount0 \times \frac{\sqrt{P\_u} \times \sqrt{P\_l}}{\sqrt{P\_u} - \sqrt{P\_l}}
$$

$$
liquidityAmount1 = \frac{amount1}{\sqrt{P\_u} - \sqrt{P\_l}}
$$

| 条件                                          | $$\Delta L$$                                            |
| ------------------------------------------- | ------------------------------------------------------- |
| 如果 $$i\_c < i\_l$$                          | $$\Delta L = liquidityAmount0$$                         |
| 如果 $$i\_c > i\_u$$                          | $$\Delta L = liquidityAmount1$$                         |
| 如果 $$i\_c \geq i\_l$$ && $$i\_c \leq i\_u$$ | $$\Delta L = \min(liquidityAmount0, liquidityAmount1)$$ |

***

### 乘数方法

根据你的价格区间与历史交易活动的重叠程度来计算预计 APR。

**假设**

* 使用历史价格数据来外推未来价格数据（这并不是未来表现的最佳指标，但能提供一个相当不错的估算）
* 假设历史区间内的价格波动在整个时间区间内保持一致，类似于一个周期函数，其振幅等于价格上限和下限

**变量**

| 变量             | 描述              |
| -------------- | --------------- |
| $$u\_{lower}$$ | 用户集中流动性价格区间的下限  |
| $$u\_{upper}$$ | 用户集中流动性价格区间的上限  |
| $$h\_{lower}$$ | 特定时间段内历史价格区间的下限 |
| $$h\_{upper}$$ | 特定时间段内历史价格区间的上限 |

**回溯区间交集**

$$
r\_{lower} = \max(u\_{lower}, h\_{lower})
$$

$$
r\_{upper} = \min(u\_{upper}, h\_{upper})
$$

**区间定义**

$$
userRange = u\_{upper} - u\_{lower}
$$

$$
histRange = h\_{upper} - h\_{lower}
$$

$$
retroRange = r\_{upper} - r\_{lower}
$$

其中 $$retroRange$$ 是与以下范围的回溯交集： $$userRange$$ 和 $$histRange$$.

**乘数计算**

设 $$m$$ = 用户将获得的奖励或手续费乘数。

| 条件                         | 乘数                                                                        |
| -------------------------- | ------------------------------------------------------------------------- |
| $$retroRange \leq 0$$      | $$m = 0$$                                                                 |
| $$userRange = retroRange$$ | $$m = \frac{histRange}{retroRange}$$                                      |
| $$histRange = retroRange$$ | $$m = \frac{retroRange}{userRange}$$                                      |
| 否则                         | $$m = \frac{retroRange}{tradeRange} \times \frac{retroRange}{userRange}$$ |

***

### 重要说明

* 这些是 **估算值**，不是保证收益
* 实际收益取决于交易量、价格变动以及其他 LP 的竞争
* 区间更窄时，在处于区间内时可赚取更多手续费，但也更容易变为区间外
* 区间外仓位不产生手续费
