可以看到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的数量,那么这个公式就是按照 滑点差值/理论应得量 的方式计算的