数字货币现货做市交易
如果进行数字货币现货做市交易?我们以币安的币币交易为例
任务分解
- 了解币安上的ETH/USDT交易规则和特点
- 选择可能做市策略
- 开发自动做市程序
币安ETH/USDT货币对
- ETH/USDT是以用USDT来计价,进行ETH交易。由于USDT与USD是1比1,因此ETH/USDT的交易价格可以认为就是ETH的美元价格
- 币安的货币对交易没有杠杆,也不能做空
- 币安的VIP1级别用户的交易手续费为买卖方各0.1%
- ETH/USDT买一卖一差大约在万分之五,买五卖五差大约在千分之二,买十卖十差大约在千分之三,买十五买十五差大约在千分之五;**15档买卖委托量大约在10万美元左右,单边每档平均大约3000美元,买一卖一量在1000美元以下
做市策略
这里不考虑跨期、跨品种或跨市场套利策略,只讨论最基本的做市策略,就是在市场上同时报出买卖委托,如果买卖委托都成交的情况下,利用买卖的差价来盈利,因此如何确定合理的买卖价格是做市的关键。确定一对买卖价格主要由两个数据,一是当前市场合理价格,二是买卖价格宽度,所以问题转化为如何确定市场合理价格和买卖价格宽度。
市场合理价格(Fair Value)
通常有两种模式:
+ BBO: FV = ([best bid price] + [best ask price])/2.0
+ wBBO: FV = ([best bid price]*[best ask size] + [best ask price]*[best bid size])/([best ask size] + [best bid size])
买卖价格宽度
考虑到必要的交易费用,买卖价格宽度需要有一个最小值,这个最小值应该能够覆盖交易成本,小于最小值的买卖报价是不应该出现的。例如,币安上ETH/USDT的交易手续费是买卖方各0.1%,那么做市买卖价格宽度最好不应小于0.2%
在确定了宽度最小值width后,可以有一些基本方法来确定买卖价格宽度:
+ 不考虑BBO宽度,永远报买价为FV - width / 2
,卖价为FV + width / 2
+ 当BBO宽于width时,按BBO报价;当BBO窄于width时,买价为FV - width / 2
,卖价为FV + width / 2
,从而确保宽度不小于width
+ 当BBO宽于width时,按优于BBO一个价格变动单位的价格报价,优于BBO的买卖价格宽度也不能小于width;当BBO窄于width时,买价为FV - width / 2
,卖价为FV + width / 2
,从而确保宽度不小于width
+ 买价为最近一个卖出成交价-width,卖价为最近一个买入成交价+width
其它因素
- 现货不能做空,因此为了能同时在买卖双方交易,需要有一个基本仓位。在做市的过程中,保持仓位在这个基本仓位上下一定范围内浮动,可以设置最大浮动范围,如果在某一方向超过了浮动范围,可以停止该方向的交易,以保持仓位稳定
- 市场可能会出现明显的方向性,可以适当加入趋势指标判断市场走向,并相应调整报价方法
做市程序
需求
开发一个满足以上描述的做市算法要求的自动化做市程序,有以下一些功能基本需求:
- 能通过API连接币安交易所,能实现获取行情数据、下单交易与撤单、成交与持仓查询
- 一个简单的计算引擎,根据上述做市算法,通过行情数据计算出合理的买卖报价
- 一个简单的操作界面,可以修改报价方式和关键参数
- 操作界面上显示市场情况和做市成果:包括**、市场成交、做市委托、做市成交、实时盈亏等
- 充分模块化,以能方便地扩展到其它交易所和货币对
设计
该程序总体上分为四个模块:ExchangeWrapper,Engine,DataCache和UserConsole。
- Exchange Adapter: 封装与Exchange的通信,每个Exchange对应一个Exchange Adapter。每个ExchangeAdapter处理四类数据,每类数据对应一个模块:Product,Market,Order,Position。Exchange Adapter触发Engine给出做市报价。
- Data Cache:系统进行的做市交易的数据快照,包括**、成交、做市委托、做市成交、实时持仓、实时盈亏等数据,为User Console展示提供数据。
- Engine:报价引擎,只负责根据设定的参数和获得的价格与持仓信息来计算做市报价
- User Console:用户操作界面,可以设置做市报价参数,和查看做市交易情况