Bancor算法(python版)

简介

bancor算法是以货币R作为存储货币然后发行另一种子币S,子币S的价格P用R计价即r/s,P的价格的变化由bancor算法决定,P价格的变化与经济学上的价格弹性曲线的概念相通,Bancor协议的最大创新在于,数字货币在传统交易所的价格发现基于买单和卖单的实时同步匹配(交易所的集合竞价),然而基于Bancor算法的数字货币的价格发现的过程是异步的(提高了流动性),买卖双方不需要匹配同步。

公式推导

假设一种货币R,我们称为母币,另一种货币S,我们称为子币,connector weight 连接器系数,我们称为F系数它的范围为 (0,1],当前S的价格我们称为P(以R计价),则有下面公式,这是一个任意时刻的恒等式

R=FPS

R:当前母币余量
F:F系数 (0,1]
P:当前S价格
S:当前子币余量

我们假设上述价格P是变化的,那么在某一时刻价格p,买入无穷小的s,则有dr = p ds(微积分)

dr = p ds

上述R=FPS我们可以得到P=R/FS,但是这里的价格P仅仅代表某一时刻的价格,P本身是变化的所以我们不能直接用这个价格去计算例如我们购买x个s需要的r,我们必须推导出可以假设购买s的价格公式,下面所有的推导都是基于上述2个公式

1)R=FPS
2)dR = PdS

把1)代入2)得到dR = d(FSP) = F d(SP) = F(S dP + P dS) =PdS =====》P dS(1 − F) = FS dP 最终得到

Bancor算法(python版)_第1张图片
来自Bancor Conversion Function

最终 P=(S/S0)*αP0,假设我们需要买T个s,这个时候只需要对上述函数进行从S0~S0+X积分即可以算需要花费多少R,同理也可以知道花费R可以获得多少s

Bancor算法(python版)_第2张图片
来自Bancor Conversion Function

其实上述你要真正明白的是P=(S/S0)*αP0这个公式的含义,初始给定R,F,S之后上述公式就定了,当前S的价格只跟当前S的余量以及S的初始价格P0有关,我们知道α=1/F - 1,而F的范围为 (0,1],F这个系数决定每一笔交易之后价格变化的敏感度,F越小价格变化越敏感,F越接近1变化越不敏感,下图给出不同F下的S的价格曲线P

Bancor算法(python版)_第3张图片
不同F下P函数

例如:
假设初始R=100,S=1000,F=0.1,由公式R=FPS可以知道P = 1,给定初始R,S,F之后P函数就定了,它的图像如下:
Bancor算法(python版)_第4张图片
P函数

横坐标为子币S余量,纵坐标为母币R余量,曲线为S价格P变化轨迹,价格P就在这条曲线上变化,其实给定初始之后,曲线就定了,我们也看到了为什么不能直接用P=R/FS来计算购买T个S需要的R,因为从下图可以看到S0~S0+T,P的变化是非线性的,需要积分, 上图阴影面积表示购买T个S需要的R,事实上曲线内的面积就是当前R余量

python实现

#-*- coding: UTF-8 -*-

import os
import sys


"""
R:当前母币余量
S:当前子币余量
F:(1,1]价格变化敏感系数 这个值越小价格变化越敏感 值越大变化越不敏感 当为1的时候 价格不会变化
"""
def Bancor(R, S, F):
    # buy 参数r如果是正表示购买,如果为负其实卖出多少s可以获得r 
    # s = buy(-r)  等价于  r = sell(s)
    def buy(r):
        nonlocal R
        nonlocal S

        out = ((1 + r/R)**F - 1) * S
        R += r
        S += out

        return out

    # sell 参数s如果是正表示卖出,如果为负表示花费多少r可以获得s
    # r = sell(-s) 等价于 s = buy(r)
    def sell(s):
        nonlocal R
        nonlocal S

        out = (1 - (1 - s/S)**(1/F)) * R
        R -= out
        S -= s

        return out

    #当前价格P = R/SF
    def price():
        print(R, S, R/(S*F))

    return buy, sell, price


# F敏感值测试
def func():
    #F = 0.1
    F = 0.01
    buy, sell, price = Bancor(100., 1000., F)

    price()
    buy(100)
    price()
    buy(100)
    price()
    buy(100)
    price()


if __name__ == '__main__':
    func()

你可能感兴趣的:(Bancor算法(python版))