本文用NetLogo
来模拟Uniswap的AMM机制下的价格形成与变化。
1. Uniswap价格计算公式
这个在网上有大量文章,Uniswap官方也对此做了详细的介绍。为了方便,这里将不含交易手续费的价格计算公式列在下面:
1.1 买入
假设Uniswap的流动池中有A代币数量x,B代币数量y,如果某用户买入
数量为$\delta x$的A,那么需要支付的B为:
1.2 卖出
假设Uniswap的流动池中有A代币数量x,B代币数量y,如果某用户卖出
数量为$\delta x$的A,那么需要支付的B为:
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的价格形成机制,产生的走势图。 接下去,我们将进一步讨论在加密货币市场中,因受媒体,情绪等影响,价格走势会呈现什么样的态势,仍旧是随机游走的无规律,还是会呈现出明显的规律和周期。
上述模型源码下载地址