分类
外汇基本面分析学习

深入分析AMM恒定乘积模型的滑点与无常损失

为验证这一点,来到Uniswap界面断点调试,以ETH兑换AAVE为例

可以看到midPrice实际采用的确实就是前面猜测的x对y的价格,并且是不同于界面中Price所显示实际兑换价的理论价

深入分析AMM恒定乘积模型的滑点与无常损失-爱代码爱编程

  • Returns the percent difference between the mid price and the execution price, i.e. price impact.
  • @param midPrice mid price before the trade
  • @param inputAmount the input amount of the trade
  • @param outputAmount the output amount of the trade
    */
    function computePriceImpact(midPrice: Price, inputAmount: CurrencyAmount, outputAmount: CurrencyAmount): Percent const exactQuote = midPrice.raw.multiply(inputAmount.raw) 深入分析AMM恒定乘积模型的滑点与无常损失
    // calculate slippage := (exactQuote - outputAmount) / exactQuote
    const slippage = exactQuote.subtract(outputAmount.raw).divide(exactQuote)
    return new Percent(slippage.numerator, slippage.denominator)
    >
    按照函数中的逻辑,滑点百分比计算公式如下:

    这里的midPrice从代码上看不出是x对y的价格还是y对x的价格,但按照公式的计算逻辑,当midPrice代表x对y的价格时,midPrice·dx就代表理论应得y的数量,那么这个公式就是按照滑点差值/理论应得量的方式计算的

为验证这一点,来到Uniswap界面断点调试,以ETH兑换AAVE为例

可以看到midPrice实际采用的确实就是前面猜测的x对y的价格,并且是不同于界面中Price所显示实际兑换价的理论价

那么化简公式(2):

将前面推导的公式(1),带入上式可得:

那么滑点百分比即是兑换量占用于兑换的资产储备量的百分比

则有:

解得:

即用89.6DAI兑换1.84ETH进行套利后,池中ETH:DAI=8.16:489.6≈1:60

深入分析AMM恒定乘积模型的滑点与无常损失

公式分析

根据恒定乘积,当用dx个x兑换dy个y时(忽略手续费),有:

可得,兑换量:

则在实际兑换中,y相对x的单价为:

而兑换前,池中的y单价为x/y,那么y单价的滑点就产生了:

交易量dx越大,产生的滑点就越大,偏离实际价位就越大,而池中的资金储备越多、交易深度越大,则能尽量减少滑点的溢价,使用户的交易损耗降低。

实际计算

在这里插入图片描述

Uniswap在实际计算交易滑点时,是通过百分比来显示的:

Uniswap源码中对滑点的计算是在uniswap-v2-sdk/src/entities/trade.ts文件中的computePriceImpact函数中实现的

在这里插入图片描述

  • Returns the percent difference between the mid price and 深入分析AMM恒定乘积模型的滑点与无常损失 the execution price, i.e. price impact.
  • 深入分析AMM恒定乘积模型的滑点与无常损失
  • @param midPrice mid price before the trade
  • @param inputAmount the input amount of the trade
  • @param outputAmount the output amount of the trade
    */
    function computePriceImpact(midPrice: Price, inputAmount: CurrencyAmount, outputAmount: CurrencyAmount): Percent <
    const exactQuote = midPrice.raw.multiply(inputAmount.raw)
    // calculate slippage := (exactQuote - outputAmount) / exactQuote
    const slippage = exactQuote.subtract(outputAmount.raw).divide(exactQuote)
    return new Percent(slippage.numerator, slippage.denominator)
    >
    按照函数中的逻辑,滑点百分比计算公式如下:

    这里的midPrice从代码上看不出是x对y的价格还是y对x的价格,但按照公式的计算逻辑,当midPrice代表x对y的价格时,midPrice·dx就代表理论应得y的数量,那么这个公式就是按照滑点差值/理论应得量的方式计算的

在这里插入图片描述

为验证这一点,来到Uniswap界面断点调试,以ETH兑换AAVE为例

可以看到midPrice实际采用的确实就是前面猜测的x对y的价格,并且是不同于界面中Price所显示实际兑换价的理论价

那么化简公式(2):

将前面推导的公式(1),带入上式可得:

那么滑点百分比即是兑换量占用于兑换的资产储备量的百分比

则有:

解得:

即用89.深入分析AMM恒定乘积模型的滑点与无常损失 6DAI兑换1.84ETH进行套利后,池中ETH:DAI=8.16:深入分析AMM恒定乘积模型的滑点与无常损失 489.6≈1:60

深入分析AMM恒定乘积模型的滑点与无常损失

* Returns the percent difference between the mid price and the execution price, i.e. price impact.

* @param midPrice mid price before the trade

* @param inputAmount the input 深入分析AMM恒定乘积模型的滑点与无常损失 amount of the trade

* @param outputAmount the output amount of the trade

function computePriceImpact(midPrice: Price, inputAmount: CurrencyAmount, outputAmount: CurrencyAmount): Percent

const exactQuote = midPrice.raw.multiply(inputAmount.raw)

// calculate slippage := (exactQuote - outputAmount) / exactQuote

const slippage = exactQuote.subtract(outputAmount.raw).divide(exactQuote)

return new Percent(slippage.numerator, slippage.denominator)

这里的 midPrice 从代码上看不出是x对y的价格还是y对x的价格,但按照公式的计算逻辑,当 midPrice 代表x对y的价格时, midPrice·dx 就代表理论应得y的数量,那么这个公式就是按照 滑点差值/理论应得量 的方式计算的

深入分析AMM恒定乘积模型的滑点与无常损失

* Returns the percent difference between the mid price and the execution price, i.e. price impact.

* @param midPrice mid price before the trade

* @param inputAmount the input amount 深入分析AMM恒定乘积模型的滑点与无常损失 of the trade

* @param outputAmount the output amount of the trade

function computePriceImpact(midPrice: Price, inputAmount: CurrencyAmount, outputAmount: CurrencyAmount): Percent

const exactQuote = midPrice.raw.multiply(inputAmount.raw)

// calculate slippage := (exactQuote - outputAmount) / exactQuote

const slippage = exactQuote.subtract(outputAmount.raw).divide(exactQuote)

return new Percent(slippage.numerator, slippage.denominator)

这里的 midPrice 从代码上看不出是x对y的价格还是y对x的价格,但按照公式的计算逻辑,当 midPrice 代表x对y的价格时, midPrice·dx 就代表理论应得y的数量,那么这个公式就是按照 滑点差值/理论应得量 的方式计算的