Jacky Gu

用NetLogo模拟Uniswap AMM机制下的价格形成机制

12 Sep 2023 Share to

本文用NetLogo来模拟Uniswap的AMM机制下的价格形成与变化。

1. Uniswap价格计算公式

这个在网上有大量文章,Uniswap官方也对此做了详细的介绍。为了方便,这里将不含交易手续费的价格计算公式列在下面:

1.1 买入

假设Uniswap的流动池中有A代币数量x,B代币数量y,如果某用户买入数量为$\delta x$的A,那么需要支付的B为:

\[\delta y = \frac{y*\delta x}{x-\delta x}\]

1.2 卖出

假设Uniswap的流动池中有A代币数量x,B代币数量y,如果某用户卖出数量为$\delta x$的A,那么需要支付的B为:

\[\delta y = \frac{y*\delta x}{x+\delta x}\]

1.3 买入/卖出的价格

\(p = \frac{\delta y}{\delta x}\)

结合上面两个公式,如果买入: \(p = \frac{\delta y}{\delta x} = \frac{y}{x/\delta x - 1}\)

结合上面两个公式,如果卖出: \(p = \frac{\delta y}{\delta x} = \frac{y}{x/\delta x + 1}\)

2. 建模

有了上述计算价格的公式,可以就可以使用NetLogo工具进行模拟价格运行了。

2.1 全局参数

一共设了7个全局变量,除了在globals中定义外,还有一个buy-possibility通过滑块实现。

globals [
  price             ;当前价格
  current-x-lp      ;当前A币的流动池数量
  current-y-lp      ;当前B币的流动池数量
  max-price         ;历史最高价
  min-price         ;历史最低价
  max-trade-amount  ;单次交易A币的最大数量,用于随机模拟交易数量
]

2.2 初始化

setup初始化过程中,除了常规的ca,reset-ticks等,还要初始化全局变量,见下:

to setup
  ca
  reset-ticks
  init
end

to init
  set current-x-lp 1000000
  set current-y-lp 1000000
  set max-trade-amount 10000
  set max-price 0
  set min-price 999999
  set price current-y-lp / current-x-lp
end

这里,初始化流动性中A币和B币都为100万个,即初始化价格为1。

2.3 价格更新

根据上面的Uniswap公式,使用以下代码计算每次交易后的价格,以及两个代币的流动性

to update-price [is-buy amount]
  ifelse is-buy [
    let y-amount current-y-lp * amount / (current-x-lp - amount)
    set current-x-lp current-x-lp - amount
    set current-y-lp current-y-lp + y-amount
    let _price y-amount / amount
    set price round (_price * 10 ^ 3) / 10 ^ 3 ;;价格保留小数点后3位数
  ] [
    let y-amount current-y-lp * amount / (current-x-lp + amount)
    set current-x-lp current-x-lp + amount
    set current-y-lp current-y-lp - y-amount
    let _price y-amount / amount
    set price round (_price * 10 ^ 3) / 10 ^ 3
  ]  
end

2.4 每步执行过程

to go
  if ticks > 5000 or current-x-lp <= 0 or current-y-lp <= 0 [stop] ;;如果流动性小于零,或者模拟的时间单位超过5000,则停止
  update-price (random 100 < buy-possibility) (random max-trade-amount + 100)                                                           ;;调用价格更新过程,其中是否买卖根据购买概率(buy-possibility)随机产生
  if price > max-price [set max-price price]                       ;;更新历史最高价
  if price < min-price [set min-price price]                       ;;更新历史最低价
  tick
end

3. 模拟

3.1 随机游走的价格走势

buy-possibility设置为50,即为随机游走状态,模拟后的价格走势没有规律,如下图:

3.2 买盘意愿强烈

buy-possibility调至51,即51%的人愿意买入,如下图:

或者下图:

3.3 卖盘意愿强烈

buy-possibility调制49,即49%得人愿意买入,如下图:

3.4 流动性不够

如果将上面3.2中的51%买入意愿改为53%,会发生什么呢?模拟如下图: 说明因为价格的快速上涨,导致流动性不够。

本文讨论了在完全随机情况下,通过uniswap的AMM的价格形成机制,产生的走势图。 接下去,我们将进一步讨论在加密货币市场中,因受媒体,情绪等影响,价格走势会呈现什么样的态势,仍旧是随机游走的无规律,还是会呈现出明显的规律和周期。

上述模型源码下载地址