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 Conversion Function

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

来自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

不同F下P函数

例如:
假设初始R=100,S=1000,F=0.1,由公式R=FPS可以知道P = 1,给定初始R,S,F之后P函数就定了,它的图像如下:
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()
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 200,667评论 5 472
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,361评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 147,700评论 0 333
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,027评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,988评论 5 361
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,230评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,705评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,366评论 0 255
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,496评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,405评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,453评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,126评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,725评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,803评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,015评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,514评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,111评论 2 341

推荐阅读更多精彩内容