返回博客列表

Uniswap 恒定乘积做市商原理笔记

web3
UniswapDeFiAMM智能合约

⚠️ 免责声明:本文内容仅供技术学习与研究参考,不构成任何投资建议。请读者独立思考,谨慎决策。

Uniswap 恒定乘积做市商原理笔记

第一次接触 Uniswap 的时候,最让我好奇的就是:没有订单簿,没有做市商,价格到底是怎么定出来的?

后来才知道,答案出奇地简单——就一个公式:xy=kx \cdot y = k

但这个看起来朴素的公式,背后有一整套精妙的金融逻辑。这篇笔记试着把其中的数学和直觉都理清楚。


AMM 到底是什么

传统的交易所用的是订单簿模式——买方挂买单,卖方挂卖单,价格匹配了才能成交。但 AMM 不一样,它用数学公式代替了订单簿,你不需要等对手方,直接跟池子做交易就行。

Uniswap 用的模型叫恒定乘积做市商,核心就是这个公式:

xy=kx \cdot y = k
  • xx:池子里代币 A 的数量
  • yy:池子里代币 B 的数量
  • kk:乘积常数

交易前后,kk 值保持不变(暂时不考虑手续费)。也就是说,你往池子里塞进一些 A,就得拿走一些 B,但两者的乘积始终不变。


从几何角度看这个公式

把公式变形一下:y=kxy = \frac{k}{x}。这是一条双曲线

曲线上的每个点都代表池子的一个可能状态。交易发生时,池子的状态沿着这条曲线滑动,但始终不离开曲线。

这个几何视角很重要,因为它帮你直观理解一件事:池子里某种代币越少,它就越贵。你看曲线左边,xx 很小的时候 yy 会急剧上升——这意味着要想从已经很稀少的 A 池子里再买走一些,你得付出大量的 B。


交易价格是怎么算出来的

假设你用 Δx\Delta x 个代币 A 去买代币 B。交易后池子里 A 变成 x+Δxx + \Delta x,根据 kk 不变,B 就变成:

y1=kx+Δx=xyx+Δxy_1 = \frac{k}{x + \Delta x} = \frac{x \cdot y}{x + \Delta x}

那你实际拿到的 B 就是原来的 yy 减去剩下的 y1y_1

Δy=yxyx+Δx\Delta y = y - \frac{x \cdot y}{x + \Delta x}

滑点的本质

AMM 的价格不是固定的,它取决于你交易的规模。你买的越多,平均价格就越差——这就是滑点

看这个图,曲线越来越平。这意味着什么?大额交易的边际收益在递减。你投入第一个 10 个 A 可能拿到 9 个 B,但再投入 10 个 A,可能就只拿到 7 个 B 了。

这就是为什么大额交易要拆分成多笔做,或者为什么要用聚合器走多个池子。


无常损失是怎么回事

提供流动性听起来不错——赚手续费嘛。但有个隐藏风险叫无常损失(Impermanent Loss)。

简单来说:如果你提供流动性时的代币价格和现在不一样了,那你池子里的资产价值可能还不如你当初直接拿着不动。

算个具体例子

假设你一开始往池子里放了等值的两种代币:

  • x1=100x_1 = 100 个 A
  • y1=100y_1 = 100 个 B
  • 初始价格比率 P1=1P_1 = 1(1 个 A = 1 个 B)

后来 A 的价格涨到了原来的 4 倍,也就是 P2=4P_2 = 4。根据 AMM 的机制:

y2x2=4,x2y2=10000\frac{y_2}{x_2} = 4, \quad x_2 \cdot y_2 = 10000

解出来 x2=50x_2 = 50y2=200y_2 = 200

对比一下两种策略的最终价值(以 A 计价):

策略代币 A代币 B总价值(以 A 计)
一直拿着不动100100(值 400 个 A)500
提供流动性50200(值 50 个 A)100

等一下,我重新算一下。持有策略的总价值应该是 100 个 A + 100 个 B(现在值 400 个 A 的购买力)。不对,让我换个方式理解。

以 A 为计价单位:

  • 持有:100 个 A + 100 个 B。B 的价格涨到 4 倍,所以 100 个 B 值 400 个 A。总计 100 + 400 = 500 个 A 的购买力。不对,初始价格是 1:1,A 涨了 4 倍意味着 A 相对 B 涨了 4 倍。

让我换个更清晰的思路——假设初始价格 A = B = 1 美元。你放 100 个 A(100 美元)和 100 个 B(100 美元),总共 200 美元。

后来 A 的价格涨到 4 美元(B 还是 1 美元):

  • 拿着不动:100 × 4 + 100 × 1 = 500 美元
  • 提供流动性:池子里剩 50 个 A + 200 个 B = 50 × 4 + 200 × 1 = 400 美元

无常损失 = 4005001=20%\frac{400}{500} - 1 = -20\%

也就是说,你亏了 20%。当然,400 美元还是比你一开始的 200 美元多,只是少赚了。

无常损失曲线

横轴是价格比率(新价格除以初始价格),纵轴是亏损百分比。价格偏离初始值越远,损失越大。当价格比率是 1 的时候(没变),损失为零。

所以无常损失这个名字起得挺准确——只要价格还在变,损失就是"无常"的。只有在你撤出流动性的那一刻,损失才真正兑现。


集中流动性(Uniswap V3 的改进)

到了 V3,Unswap 想了个办法提高资金效率:集中流动性

普通的 LP 需要在 0 到无穷大的全价格区间都提供流动性,但大部分价格可能根本不会去到那些区域。V3 允许你指定一个价格区间,只在区间内做市。

对应的公式也复杂了不少:

(x+LPb)(y+LPa)=L2(x + \frac{L}{\sqrt{P_b}})(y + L \cdot \sqrt{P_a}) = L^2

这里 LL 是流动性单位,PaP_aPbP_b 是价格区间的上下界。

这么改的好处是资金效率大幅提升——同样的钱,在窄区间里能提供更深的流动性。但代价是无常损失风险也更高了,因为价格一旦跑出你设定的区间,你的流动性就失效了。


为什么这个设计很精妙

xy=kx \cdot y = k 看起来简单,但它同时解决了好几个问题:

  1. 自动定价——不需要预言机,价格由池子里的资产比例自然决定
  2. 永远有流动性——任何价格点都有报价,只是深度不同而已
  3. 套利自动修正——价格偏离外部市场时,套利者会把它拉回来

这个设计的优雅之处在于:它不需要任何人来做市,不需要任何人挂单,只要池子里有钱,交易就能发生。而做市商(LP)通过赚手续费获得回报,形成了一套自运转的生态。

理解了这个模型,再看 DeFi 里的各种创新——集中流动性、稳定币池、Ragequitable 池——其实都是在这个基础公式上做变体。


理解了 x·y=k,你就拿到了理解整个 AMM 世界的钥匙。