关于 lp-math
面向交易者和流动性提供者的自动做市商数学参考与计算技能,用于评估交易和流动性头寸。涵盖恒定乘积与集中流动性公式、价格冲击、LP 份额及费用累计。
主要功能
- 01恒定乘积兑换与储备计算
- 02集中流动性头寸估值
- 03价格冲击与多跳估算
- 04LP 份额和费用计算
- 05Solana 池机制参考
适用场景
- 01兑换前估算价格冲击
- 02比较流动性区间与资金效率
- 03评估费用与无常损失风险
- 04计算 LP 存入份额及价值
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ agiprolabs/ claude-trading-skills --skill lp-math安装后在 Claude Code 中输入/lp-math确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
references/amm_formulas.mdpool_mechanics.mdscripts/amm_calculator.pyclmm_calculator.py详细介绍
LP Math — AMM 流动性提供数学
自动做市商(AMM)用流动性池取代传统订单簿。AMM 不撮合买卖双方,而是通过数学公式根据储备比例确定价格。流动性提供者(LP)将两种资产存入池中,并从每笔交易中赚取手续费。
了解 AMM 背后的数学原理对于以下事项至关重要:
- 评估扣除无常损失后,提供流动性是否有利可图
- 在执行大额交易前估算价格影响
- 比较不同池类型(恒定乘积型与集中流动性型)的资本效率
- 计算给定池仓位的预期手续费收入
相关技能:无常损失计算请参阅 impermanent-loss,LP 收益建模请参阅 yield-analysis,池深度评估请参阅 liquidity-analysis。
1. 恒定乘积 AMM(xy = k)
Raydium V4 和大多数 Solana DEX 使用的基础 AMM 模型。
核心不变量
x * y = k
其中:
x= 代币 X 的储备量(例如 SOL)y= 代币 Y 的储备量(例如 USDC)k= 恒定乘积(会随时间因手续费而增加)
现货价格
P = x / y (price of Y in terms of X)
P = y / x (price of X in terms of Y)
对于一个有 100 SOL 和 10,000 USDC 的池:SOL 价格 = 10,000 / 100 = 100 USDC。
交易执行
当交易者将 Δx 个代币 X 兑换到池中时:
# Output amount (before fees)
delta_y = y * delta_x / (x + delta_x)
# With fee (e.g., 0.3%)
delta_y_after_fee = delta_y * (1 - fee_rate)
# New reserves
x_new = x + delta_x
y_new = y - delta_y_after_fee
关键在于:交易越大,价格越差,因为每个单位都会使比例偏移得更远。
反向计算
若要获得指定数量的输出 Δy,所需输入为:
delta_x = x * delta_y / (y - delta_y)
交易后的价格
price_new = y_new / x_new
示例
池:100 SOL / 10,000 USDC(k = 1,000,000),手续费 = 0.3%
买入价值 5 SOL 的 USDC:
- 毛输出:
10,000 * 5 / (100 + 5) = 476.19 USDC - 手续费:
476.19 * 0.003 = 1.43 USDC - 净输出:
474.76 USDC - 实际价格:
474.76 / 5 = 94.95 USDC/SOL(现货价格为 100) - 价格影响:
(100 - 94.95) / 100 = 5.05% - 新储备:105 SOL / 9,525.24 USDC
- 新 k:
105 * 9,525.24 = 1,000,150.2(k 因手续费而增加)
完整推导请参阅 references/amm_formulas.md。
2. 集中流动性(CLMM)
Orca Whirlpool、Raydium CLMM 和 Meteora DLMM 使用的模型。流动性仅在选定的价格区间 [P_lower, P_upper] 内生效。
核心概念
L = sqrt(x * y) # Liquidity within the active range
price_at_tick = 1.0001^tick # Tick-to-price conversion
资本效率
将流动性集中在较窄的区间内,每美元可提供更深的流动性:
# Capital efficiency ratio
efficiency = sqrt(P_upper / P_lower) / (sqrt(P_upper / P_lower) - 1)
# Example: ±5% range around $100 SOL
P_lower, P_upper = 95, 105
efficiency = sqrt(105/95) / (sqrt(105/95) - 1) # ≈ 20.5x
±5% 区间的资本效率约为全区间的 20 倍,但如果价格移出该区间,仓位将 100% 转为单一资产。
仓位价值
对于当前价格为 P、流动性为 L、区间为 [P_lower, P_upper] 的 CLMM 仓位:
if P <= P_lower:
# All in token X (below range)
value_x = L * (1/sqrt(P_lower) - 1/sqrt(P_upper))
value_y = 0
elif P >= P_upper:
# All in token Y (above range)
value_x = 0
value_y = L * (sqrt(P_upper) - sqrt(P_lower))
else:
# In range — holds both tokens
value_x = L * (1/sqrt(P) - 1/sqrt(P_upper))
value_y = L * (sqrt(P) - sqrt(P_lower))
区间策略比较
| 区间 | 效率 | 无常损失风险 | 手续费获取 | 适用场景 |
|---|---|---|---|---|
| ±2% | ~50x | Very high | 若处于区间内则较高 | 稳定币、紧密锚定 |
| ±5% | ~20x | High | 趋势行情中较好 | 主动管理 |
| ±25% | ~4x | Moderate | 稳定 | 半被动 |
| ±100% | ~2x | Low | 每美元收益较低 | 被动、波动较大的交易对 |
| 全区间 | 1x | 基准 | 始终赚取手续费 | 设置后无需管理 |
完整的 CLMM 推导请参阅 references/amm_formulas.md。
3. 价格影响
恒定乘积价格影响
# Price impact as a fraction
price_impact = delta_x / (x + delta_x)
# As percentage of pool
pool_fraction = trade_value / pool_tvl
# Rule of thumb: impact ≈ 2 * pool_fraction for constant product
多跳价格影响
对于经过多个池的路线,将各池影响复合计算:
def multi_hop_impact(hops: list[dict]) -> float:
"""Calculate total price impact across route legs.
Args:
hops: List of {reserve_in, trade_amount} for each leg.
Returns:
Total price impact as a fraction.
"""
remaining = 1.0
for hop in hops:
leg_impact = hop["trade_amount"] / (hop["reserve_in"] + hop["trade_amount"])
remaining *= (1 - leg_impact)
return 1 - remaining
影响阈值
| 影响 | 评估 | 操作 |
|---|---|---|
| < 0.1% | 可忽略 | 正常进行 |
| 0.1–0.5% | 低 | 适用于大多数交易 |
| 0.5–2% | 中等 | 考虑拆分到多个池中 |
| 2–5% | 高 | 拆分交易,使用 TWAP |
| > 5% | 严重 | 减少交易规模或寻找更深的池 |
4. LP 份额计算
初始存入(空池)
shares = sqrt(x_deposited * y_deposited)
首位存入者设定比例,并获得与几何平均数相等的份额。
后续存入
shares_minted = min(
x_added / x_reserve,
y_added / y_reserve
) * total_shares
存入资产必须与当前储备比例一致。多出的任何一种代币都不会被使用(具体实现可能会将其退回)。
提取
x_out = (shares_burned / total_shares) * x_reserve
y_out = (shares_burned / total_shares) * y_reserve
你始终会按当前比例收到两种代币。
份额价值
share_value = pool_tvl / total_shares
your_value = your_shares * share_value
5. 费用累积
费用会累积在池中,使 k 增大:
# Before trade: k = x * y
# After trade with fee:
# k_new = (x + delta_x) * (y - delta_y_net) > k
# The difference is the fee retained in the pool
# Fee APR estimation
daily_volume = 500_000 # USD
fee_rate = 0.003 # 0.3%
daily_fees = daily_volume * fee_rate # $1,500
tvl = 2_000_000 # $2M pool
fee_apr = (daily_fees * 365) / tvl # 27.4%
对于 CLMM 头寸,费用收益取决于:
- 价格是否保持在你的范围内(超出范围 = 无费用)
- 你在该范围内活跃流动性中所占的份额
- 通过该池路由的总交易量
# CLMM fee estimation
your_liquidity = 50_000 # Your L
total_liquidity = 1_000_000 # Total L in your tick range
your_share = your_liquidity / total_liquidity # 5%
your_daily_fees = daily_fees * your_share # $75
6. Solana 池类型
Raydium V4(恒定乘积)
- 模型:标准 xy = k
- 费用:0.25%(0.22% 给 LP,0.03% 用于回购 RAY)
- 最适合:新代币发行、高波动交易对
- 注意:集成了 OpenBook 限价订单流
Orca Whirlpool(集中流动性)
- 模型:带刻度间距的集中流动性
- 费率档位:0.01%、0.05%、0.3%、1%
- 头寸:以 NFT 表示(每个头寸都独一无二)
- 最适合:主流交易对(SOL/USDC)、稳定币交易对
Raydium CLMM
- 模型:集中流动性(类似 Uniswap V3)
- 刻度间距:1、10、60、200
- 费率档位:0.01%、0.05%、0.25%、1%
- 最适合:价格范围可预测的交易对
Meteora DLMM(动态做市商)
- 模型:使用离散区间代替连续刻度
- 策略:现货(均匀)、曲线(集中)、买卖价差(围绕当前价格)
- 费用:动态调整,随波动性变化
- 最适合:频繁再平衡的活跃 LP
详细机制和比较请参阅 references/pool_mechanics.md。
7. 实用决策框架
你应该提供流动性吗?
1. Calculate expected fee APR
2. Estimate impermanent loss for expected price movement
3. Net return = fee APR - IL
4. Compare to simply holding the assets
选择哪种池类型?
Stablecoin pair → CLMM with tight range (±0.5%)
Major pair (SOL/USDC) → CLMM with moderate range (±10-25%)
New/volatile token → Constant product (full range)
Active management → Meteora DLMM with dynamic rebalancing
LP 头寸规模
# Never LP more than you can afford to lose to IL
max_lp_allocation = portfolio_value * 0.20 # 20% max in any single pool
# For volatile pairs, reduce further
volatility_adjustment = 1 - (annualized_vol / 2) # Scale down for vol
adjusted_allocation = max_lp_allocation * max(0.1, volatility_adjustment)
文件
参考资料
references/amm_formulas.md— 恒定乘积和集中流动性 AMM 的完整数学推导references/pool_mechanics.md— Raydium、Orca 和 Meteora 的 Solana 特定池机制
脚本
scripts/amm_calculator.py— 恒定乘积 AMM 计算器,支持交易模拟、LP 份额和费用累积scripts/clmm_calculator.py— 集中流动性计算器,支持头寸估值、资本效率和范围比较
快速参考
| 公式 | 表达式 |
|---|---|
| 恒定乘积 | x * y = k |
| 现货价格 | P = y / x |
| 交易输出 | Δy = y * Δx / (x + Δx) |
| 所需输入 | Δx = x * Δy / (y - Δy) |
| 价格影响 | Δx / (x + Δx) |
| 初始 LP 份额 | sqrt(x * y) |
| 后续份额 | min(Δx/x, Δy/y) * total |
| 费用 APR | (daily_fees * 365) / TVL |
| CLMM 效率 | sqrt(P_u/P_l) / (sqrt(P_u/P_l) - 1) |
| 刻度转价格 | 1.0001^tick |