Estimated APR for CLMM
How Raydium estimates APR for concentrated liquidity pools
Overview
In a CLMM pool, fees are distributed proportionally to in-range liquidity at each tick. Calculating an accurate APR across all ticks and LPs is extremely complex—traditional constant product APR formulas don't apply.
Projected returns for CLMMs should be considered estimates at best.
Raydium displays three APR estimation methods:
Overall pool estimated APR — pool-wide average
Delta method — based on your position's share of liquidity
Multiplier method — based on historical price range overlap
Overall pool estimated APR
Assumes trading fees and emissions are distributed across all liquidity in the pool, including out-of-range positions.
Delta method
Calculates estimated APR based on your position's implied change (delta) in pool liquidity, determined by your price range and size.
Condition
Where:
i_l
lowerTickId
i_c
currentTickId
i_u
upperTickId
Token amounts in a position
Calculating ΔL
For estimation of tokenA (ΔX) and tokenB (ΔY) we need to know ΔL:
So we take:
Then:
After calculating for ΔL, we can calculate ΔX and ΔY using:
Estimated daily fee
Where:
volume24H
Average of 24h volume
L
Total liquidity (cumulative of liquidityNet from all ticks that i≤i_c)
ΔL
Delta liquidity
Liquidity amounts
And can be calculated from:
Condition
ΔL
If i_c<i_l
ΔL=liquidityAmount0
If i_c>i_u
ΔL=liquidityAmount1
If i_c≥i_l && i_c≤i_u
ΔL=min(liquidityAmount0,liquidityAmount1)
Multiplier method
Calculates estimated APR based on how much your price range overlaps with historical trading activity.
Assumptions
Historical price data is used to extrapolate future price data (not the best indicator of future performance, but provides a decent estimate)
Price fluctuation within the historical range is assumed to be consistent across the time interval, resembling a periodic function with amplitude equal to the upper and lower price boundaries
Variables
u_lower
Lower bound of user's concentrated liquidity price range
u_upper
Upper bound of user's concentrated liquidity price range
h_lower
Lower bound of historical price range across a specific time period
h_upper
Upper bound of historical price range across a specific time period
Retroactive range intersection
Range definitions
Where retroRange is the retroactive intersection between userRange and histRange.
Multiplier calculation
Let m = multiplier of rewards or fees that user will receive.
retroRange≤0
m=0
userRange=retroRange
m=retroRangehistRange
histRange=retroRange
m=userRangeretroRange
Otherwise
m=tradeRangeretroRange×userRangeretroRange
Important notes
These are estimates, not guaranteed returns
Actual returns depend on trading volume, price movements, and competition from other LPs
Narrower ranges earn more fees when in range, but risk going out of range more often
Out-of-range positions earn zero fees
Last updated
Was this helpful?