简介
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 最终得到
![](https://img.haomeiwen.com/i13716232/65409cd1187d4709.png)
最终 P=(S/S0)*αP0,假设我们需要买T个s,这个时候只需要对上述函数进行从S0~S0+X积分即可以算需要花费多少R,同理也可以知道花费R可以获得多少s
![](https://img.haomeiwen.com/i13716232/ee54ecc14269f5f6.png)
其实上述你要真正明白的是P=(S/S0)*αP0这个公式的含义,初始给定R,F,S之后上述公式就定了,当前S的价格只跟当前S的余量以及S的初始价格P0有关,我们知道α=1/F - 1,而F的范围为 (0,1],F这个系数决定每一笔交易之后价格变化的敏感度,F越小价格变化越敏感,F越接近1变化越不敏感
,下图给出不同F下的S的价格曲线P
![](https://img.haomeiwen.com/i13716232/03fd438b40de6cb7.png)
例如:
假设初始R=100,S=1000,F=0.1,由公式R=FPS可以知道P = 1,给定初始R,S,F之后P函数就定了,它的图像如下:
![](https://img.haomeiwen.com/i13716232/672213d54ef64af4.png)
横坐标为子币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()
网友评论