数字货币的价格算法浅析

像爬虫一样学习

最近在尝试一种新的学习方式:在了解/学习一项新事物的时候,把途中遇到的感兴趣的知识点记录下来,然后再逐个发散地去学习,不断拓宽知识面。

之前在了解区块链的相关知识时,对数字货币的价格算法颇有兴趣,便研究了一番,顺便做个记录。

买入价和卖出价

没有买卖,便没有价格一说。所以,价格通常需要分为买入价和卖出价。

我们作为现实生活中的普通消费者,在说一个商品的价格时,通常指的是它的买入价,对于数字货币而言也是如此。

而这个价格则要取决于卖家的挂牌价(卖出价),当买家出价和卖家出价不一致时,通常会发生博弈行为,讨价还价则是买家和卖家博弈的典型。

另外一个老生常谈的价格影响因素则是供求关系,供不应求时价格上涨,供大于求时则下跌。

价格算法

在对上述的价格基本原理所有了解之后,也就不难理解现有的数字货币价格主流算法:基于订单薄、基于流动性池恒定乘积算法。

订单薄

大部分中心化的交易所(如币安、欧易)采用的是订单薄的方式。

每对数字货币都各自有一个订单薄,订单薄分买方和卖方两个阵营,每个买家/卖家下单的时候,会在订单薄上产生相应的一笔订单。系统实时计算卖方最低价和买方最高价,当他们相等(或产生交叉)时发生交易。

上面仅是对订单薄的一种简化描述,实际上基于订单薄的原理,可以衍生出很多的玩法:限价单、市价单、冰山单、止盈止损单等等。

恒定乘积

像 UniSwap、PancakeSwap、ICPSwap 之类的去中心化交易所,通常采用的是恒定乘积算法来确定币价。

它的原理是一个非常简单的数学公式 x * y = kxy 是一个交易池中两种不同数字货币的数量,而 k 是它们的乘积,且每次交易后 k 值保持不变。

举个例子:假设在 ICP/USDT 交易池中,ICPUSDT 分别有 100 和 1000 枚,则它们的乘积 k 为 100000。当用户需要购买 1 枚 ICP 时,为了保证 k 值不变,他需要往池中放入的 USDT 数量为 100 * 1000 / (100 - 1) - 1000 ≈ 10.10,即 ICP 的购买价格为 10.10 USDT

这个例子足够简单,并且省略了手续费的计算等步骤,但足以反映出供求关系对价格的影响。

参考资料

  • Uniswap V3 Book 中文版