A bowl filled with floating coins, glowing charts

自动化做市商是如何工作的:通过链上库存定价交换

By Elliot Marsh阅读 11 分钟

自动化做市商(AMM)让交易者可以在智能合约流动性池中交换代币,而不是在订单簿上匹配。池的储备量机械性地暗示了现货价格,而你的交易会沿着一条曲线移动这些储备,随着交易规模的增长,平均成交价会变差。

关键要点

  • 一个自动化做市商 AMM 从其储备比例报价现货价格,因此价格是库存,而不是订单簿的“报价”。
  • 在恒定产品池中,交换会沿着 x*y=k 移动池,这保证了流动性,但使得执行价格比现货价格更差,随着交易规模的增长。
  • 套利者保持 AMM 价格与外部市场一致,而这种再平衡就是为流动性提供者(LP)创造无常损失的原因,与持有相比。
  • 集中流动性通过在选择的价格范围内放置流动性来提高资本效率,但这使得 LP 变成了主动的头寸管理。

AMM 是什么(以及为什么 DEX 使用它而不是订单簿)

“自动化做市商如何工作”归结为一个实际的想法:一个智能合约持有两个(或更多)代币储备,交易者以储备暗示的价格进行交换。无需寻找直接的交易对手。池就是交易对手。

这种设计是去中心化交易所的核心构建块,因为链上订单簿相对于中心化匹配引擎来说成本高且速度慢。现实世界的 DeFi 使用倾向于偏好能够持续报价、确定性清算交易并保持无权限的系统。这个解释是更广泛的指南的一部分,旨在提供一个实用的去中心化金融定义,其中 AMM 与借贷、稳定币和桥接作为核心原语并列。

关键的思维模型是将 AMM 视为一个实时风险引擎。每一次交换都是库存的转移。池的“价格”不是通过买卖报价发现的,而是由池当前持有的内容机械性地暗示的,外部市场只能通过套利影响它。

核心机制:流动性池、储备和基于公式的定价

一个流动性池是一个智能合约,持有代币 A 和代币 B 的储备。在最常见的设计中,池强制执行一个将两个储备联系起来的规则。对于Uniswap v2 风格的池,这个规则是恒定产品公式:x*y=k,其中 x 和 y 是储备,k 在交换过程中不应减少(忽略费用如何稍微改变你交易的路径)。

这就是“价格是库存”理论变得具体的地方。在恒定产品池中,瞬时现货价格由储备比例暗示。Paradigm 直接表达为 price_token_A = reserve_token_B / reserve_token_A。Speedrun Ethereum 也将现货价格框架化为曲线当前点的 y/x。因此,如果池中持有 10 ETH 和 20,000 USDC,现货价格在任何交易之前为每 ETH 2,000 USDC。

一次交换更新储备,并沿着 x*y=k 曲线移动池。较大的交易会将池推向曲线的更远处,从而产生更多的价格影响。这个价格影响不是 DEX 收取的费用,而是从有限池中提取库存的机械性后果。

什么是恒定产品公式

恒定产品公式是恒定产品做市商(CPMM)使用的规则 x*y=k。在这里,x 是一种代币的储备,y 是另一种代币的储备,k 是池在交换过程中试图保持不减少的乘积。这是最简单的广泛使用的 AMM 不变性,也是理解 Uniswap v2 风格池的基础。

在实践中,x*y=k 创建了一条流动性始终可用的曲线,但当池的一侧被耗尽时,边际价格会变得更差。当你想要的代币的储备接近零时,暗示价格接近无穷大,这就是为什么池不能以固定价格被“清空”。

MoonPay 的工作 CPMM 示例展示了没有微积分的机制。一个池从 10 BTC 和 250,000 USDT 开始,因此 k=2,500,000。如果一个交易者添加 50,000 USDT,池的 USDT 储备变为 300,000。为了保持 k 不变,BTC 储备变为大约 8.33,这意味着交易者获得大约 1.67 BTC(10 - 8.33)。关键在于,池每 USDT 支付的 BTC 少于初始比例,因为交易使池沿着曲线移动。

AMM 如何设定价格

AMM 通过从储备中报价来设定价格,而不是通过聚合限价订单的意见。对于恒定产品池,现货价格是那一刻的储备比例。Paradigm 的声明 price_token_A = reserve_token_B / reserve_token_A 是记住它的最简洁方式。

第二个重要的价格是执行价格,这是整个交换的平均价格。Speedrun Ethereum 将现货描述为切线斜率(y/x),将执行描述为起始和结束储备点之间的割线。交易者感受到的就是价格影响,随着交易规模相对于池深度的增长而非线性增加。

外部市场仍然重要,但间接。如果池的储备比例暗示的价格与中心化场所或其他 DEX 路径不同,套利者会对着池进行交易,直到链上价格被拉回到更广泛的市场。这个套利流动是保持 AMM 价格“诚实”的隐藏对手。

如何计算一次交换(带具体示例)

一次交换有简单的输入和输出:你将 amountIn 的 tokenIn 发送到池,合约使用池的不变性和费用规则计算出 amountOut 的 tokenOut,然后储备更新为新的余额。

Speedrun Ethereum 提供了许多 CPMM 中使用的 Uniswap 风格的费用调整输出公式:amountOut = (reserveOut amountInWithFee) / (reserveIn + amountInWithFee),其中 amountInWithFee = amountIn 0.997 适用于 0.3% 的费用示例。实际要点是,费用不仅仅增加了一项单独的成本。它们稍微改变了你交易的曲线,通过减少移动储备的有效输入。

这个工作示例使现货与执行之间的差距变得具体。储备为 10 ETH 和 20,000 USDC,交换 1 ETH 的 0.3% 费用给出 amountInWithFee = 0.997。代入公式得出大约 1,814.6 USDC 的输出。储备暗示的现货价格为每 ETH 2,000 USDC,但执行价格约为 1,814.6,因为交易沿着曲线行走。

AMM 为什么需要流动性提供者

AMM 需要流动性提供者,因为池的库存必须来自某个地方。流动性提供者(LP)将代币存入池,智能合约使用这些储备来报价和结算交换。没有 LP 资本,AMM 无法在没有极端价格影响的情况下提供有意义的规模。

流动性提供者收到代表他们在池中份额的 LP 代币。Speedrun Ethereum 描述了首次流动性数学(LP 代币铸造为 sqrt(amount0 * amount1)),并指出后来的 LP 必须按照当前池比例存入,以避免扭曲定价。当 LP 移除流动性时,他们会销毁 LP 代币并提取两种储备的相应份额。

“那么呢”是流动性提供者(LP)并不是被动的借贷者。他们在承保池的再平衡。当价格发生外部变动时,套利者会对池进行交易以重新对齐,池的库存组合也会发生变化。LP的收益是费用收入与被套利再平衡成本之间的竞争。

关键权衡和风险:滑点、价格影响、暂时性损失和MEV

对于交易者来说,主要风险是滑点,Speedrun Ethereum将其定义为提交交易时预期价格与执行价格之间的差异。其中一部分是由于移动储备造成的自身价格影响。另一部分来自于在你的交易之前被挖掘的其他待处理交易、网络延迟以及像前跑和夹击攻击这样的MEV行为。

去中心化交易所(DEX)用户界面通常允许用户设置滑点容忍度,Speedrun Ethereum指出,如果执行超过该阈值,交易可能会回滚。在实践中,滑点容忍度不仅仅是一个“波动性旋钮”。它也是对交易排序风险和MEV的保护。紧密的容忍度降低了糟糕成交的机会,但在快速移动的区块中增加了回滚的可能性。

对于LP来说,核心风险是暂时性损失,即相对于简单持有这两种代币的表现不足,当它们的相对价格发生偏离时。Speedrun Ethereum给出了50/50池的IL公式,并举了一个例子:如果ETH相对于USDC翻倍,IL约为5.7%,而持有则没有损失。机制比标签更重要。套利是迫使池在外部价格变动时卖出赢家并买入输家的原因,这就是为什么LP常常被描述为相对价格上的“短期波动”。

Speedrun Ethereum还警告不要将AMM现货价格用作预言机,并建议使用TWAP或Chainlink风格的参考。实际的含义很简单:AMM现货价格容易受到交易的影响,因此将其视为真实来源可能会使交换场所变成攻击面。

DeFi中最大的AMM是什么

DeFi中最大的AMM通常是集中最多流动性和路由流量的场所,因为深度减少了特定交易规模的价格影响。Speedrun Ethereum将Uniswap、SushiSwap和Balancer列为核心的基于AMM的DEX示例。

MoonPay强调Uniswap、Curve和Balancer作为突出的基于AMM的DEX。它还将Curve框架为专注于稳定币的低滑点交换,而Balancer则使用多代币池。对用户而言,AMM设计和池深度与品牌名称同样重要。一个较小场所的深池可以胜过一个知名场所的浅池,因为执行价格是由储备决定的。

AMM也是一系列设计。Speedrun Ethereum比较了恒定乘积(一般交换)、恒定总和(x+y=k)、恒定均值(用于多资产池)和混合稳定交换设计,后者针对相关资产的低滑点,并在资产脱钩时回归CPMM行为。

什么是集中流动性

集中流动性是Uniswap v3风格的理念,即LP不必在整个价格曲线上提供流动性。相反,他们在选择的价格范围内分配流动性。Speedrun Ethereum将其描述为提高资本效率和费用潜力,因为更多的流动性被放置在实际交易发生的地方。

权衡是集中流动性将LP变成了头寸管理。当价格移动到所选范围之外时,头寸变得单边,停止赚取费用,并有效地作为单一资产的库存。Speedrun Ethereum指出,与v2风格的全范围流动性相比,这可能会增加暂时性损失的风险。

在实践中,集中流动性改变了“成为LP”的含义。它不再像是存入一个被动池,而更像是选择在哪里成为市场做市商。范围选择是赌注,费用收入必须补偿被推离范围的风险。

AMM如何处理大额交易

AMM通过让交易者在定价曲线上移动得更远来处理大额交易,这正是大额交易平均执行变差的原因。Speedrun Ethereum和Paradigm都强调,大额交易会进一步推动x*y=k,增加价格影响。池仍然会报价,但随着输出侧储备的减少,报价会逐渐变差。

这也是为什么“滑点”不仅仅是市场条件。它通常是由于交易的规模相对于池的深度而自我造成的。MoonPay指出,相对于池大小的大额交易可能导致最终执行价格偏离提交时的市场价格,这就是交易者实际感受到的滑点的实际定义。

AMM设计变体主要是为了改善特定资产类型的大额交易行为。Speedrun Ethereum将混合稳定交换设计(如Curve的方法)描述为旨在为紧密相关的资产提供低滑点,同时在资产脱钩时回归CPMM行为。最后一条是关键风险控制。池在接近平价时表现“平坦”,但在平价破裂时无法保证固定价格。

AMM设计变体和演变(当使用不同的数学时)

“AMM”是一个总称。恒定乘积池主导一般用途的交换,但由于不同市场具有不同的失败模式,其他不变性也存在。Speedrun Ethereum将恒定总和(x+y=k)列为一种对稳定对看起来有吸引力的设计,但它有一个关键弱点:如果价格偏离1:1,一侧可能会被抽干。MoonPay还描述了恒定总和,并认为滑点风险较低,因为交易规模不会影响池的交换价格,同时仍然指出大额交易的流动性问题。这两种说法在各自的框架中都可以成立。恒定总和在接近平价时可能感觉像低滑点,但在远离平价时也可能崩溃。

恒定均值设计支持多资产池和灵活权重,这就是为什么Balancer风格的池可以像链上投资组合一样运作。混合设计通过融合行为来针对稳定币用例,以保持在平价附近的紧密执行。

在所有变体中,相同的主线依然成立。价格是库存,交换是库存转移,套利是将池价格与外部市场联系起来的执行机制。这是回到DeFi的主要实用定义的实际桥梁,因为AMM不仅仅是“DEX管道”。它们是将流动性、执行和风险打包成智能合约的特定方式。

来源

常见问题

AMM中的现货价格和执行价格有什么区别?

现货价格是池子根据其储备比例(通常表示为y/x)所隐含的瞬时价格。执行价格是您在整个交换过程中获得的平均价格,因为您的交易沿曲线移动储备。它们之间的差距是价格影响,随着交易规模相对于池子流动性变大而增加。

为什么在Uniswap风格的AMM上会发生滑点?

滑点是您提交交换时预期价格与执行时收到的价格之间的差异。它可能来自您自己的价格影响、在您之前被挖掘的其他交易、网络延迟,以及像前跑和三明治攻击这样的MEV行为。许多DEX允许用户设置滑点容忍度,如果执行情况比阈值更糟,则可以撤销交易。

流动性提供者的无常损失是什么原因造成的?

无常损失是指相对于持有代币时的表现不佳,当它们的相对价格发生偏离时。随着外部价格的波动,套利者会对池子进行交易,以使其隐含价格回归一致,这会改变池子的库存组合。这种再平衡是无常损失的结构性来源,而费用是主要的抵消。

AMM价格是可靠的预言机价格吗?

AMM现货价格并不是为了作为预言机而设计的,并且可能会被交易操纵。Speedrun Ethereum明确警告不要将现货价格用作预言机,而是指向TWAP或Chainlink风格的参考。对于构建者来说,实际的收获是将交换执行与价格数据分开。

集中流动性如何改变LP风险?

集中流动性允许LP在选择的价格区间内分配流动性,提高资本效率。当价格超出范围时,头寸变得单边,并停止赚取费用。这使得LP变成了主动的头寸管理,而不是一个设定后就忘记的存款。