小白搭建比特币搬砖套利系统

源代码地址:wequant-org/liveStrategyEngine

—–以下是正文,欢迎转载—–

一、比特币搬砖的基本原理

比特币搬砖是一种跨市场套利策略。其基本原理是在币值低的交易所买入比特币,同时在币值高的交易所卖出同等数量的比特币,从而实现稳定盈利。

假设我们在火币网放置如下初始仓位:

BTC:4

CNY:10,000

在另一个交易所(比如OKCoin)放置完全相同的初始仓位。当火币网的比特币买一价格(huobi_buy_1)高于OKCoin的卖一价格(okcoin_sell_1)时,计算机程序从OKCoin市价买入一定数量(记为quantity)的比特币,然后立刻在火币网上用市价卖出同等数量的比特币,这个过程完成后,我们持有的总比特币数量不变,但是现金增加了(huobi_buy_1- okcoin_sell_1)*quantity。

img

当然,实际的搬砖套利过程中,还要处理以下问题:

  1. 怎么对接实盘
  2. 怎么确定每次搬砖套利的quantity
  3. 套利的quantity小于交易所要求的最低交易数量时怎么处理
  4. 先处理买单,还是先处理卖单,还是有其他订单处理机制
  5. 如何保证两个单子的成交数量是一样的
  6. 币价出现波动(比如大幅下跌),怎么办
  7. 什么时候触发交易所之间的比特币转移和资金转移
  8. 想套其他币种(比如莱特币),怎么搞

这篇小文章将会手把手地告诉您我们是怎么处理这一系列的问题的。

二、模块介绍

我们的本地系统是基于Python编写的。Python是目前最流行的量化策略编写和原型系统开发语言,基于Python的各种金融工具、数据处理以及机器学习包都非常丰富,它们极大地提升了量化策略开发者的效率。我们采用Python3作为Python语言的版本。

\1. 怎么对接实盘

火币的Python实盘API Demo在这里可以找到:

GitHub - huobiapi/demo_python_v3

OKCoin的Python实盘API Demon在这里可以找到:

rest/python at master · OKCoin/rest · GitHub

为了方便起见,新建了一个叫做“WeQuantStrategy”的项目,并在该项目下新建了huobi和okcoin两个package,将上面的API Demon中的代码分别导入这两个package。

img

(1). 基于配置的便捷性考虑,将ACCESS_KEY,SECRET_KEY以及HUOBI_SERVICE_API放入一个特定的Config.py文件。

Okcoin的目录文件按类似办法处理。 调试执行huobi目录下的HuobiMain.py以及okcoin目录下的Client.py,确保实盘已经接通。

(2). 新建两个目录:log和data,分别用来存储日志和持仓记录。

(3). 新建package:liveStrategyEngine,并将BanZhuan.py拷贝至该目录下。

(4). 搬砖核心代码BanZhuan.py的执行逻辑如下:

img

核心逻辑的代码如下:

img

可以看到,套利的quantity小于交易所要求的最低交易数量时,程序是不会执行接下来的搬砖逻辑的。

另外,程序是先处理卖单,再处理买单,理由是,比特币是浮动资产,先变现再购入浮动资产是一种最优的短时期仓位控制方法。

为了保证两个单子的成交数量是一样的,搬砖逻辑在执行买单前,需要拿到前面卖单的执行结果,然后根据该结果来设置需要买的数量。

执行结果展示:

/anaconda/bin/python/Users/janes/PycharmProjects/wequantstrategy/liveStrategyEngine/BanZhuan.py

2021-11-0216:11:23,600 - timeLog - INFO - log started at 2016-11-02 16:11:23.598727

2021-11-0216:11:27,349 - timeLog - INFO - waiting for 1.000000 seconds for next cycle…

2021-11-0216:11:31,954 - timeLog - INFO - Found signal

2021-11-0216:11:31,954 - timeLog - INFO - huobiDepth:{‘bids’: [[4952.8, 0.335]],’symbol’: ‘btccny’, ‘asks’: [[4953.61, 1.001]]}

2021-11-0216:11:31,954 - timeLog - INFO - okcoinDepth:{‘bids’: [[4948.36, 0.319]],’asks’: [[4948.37, 2.29]]}

2021-11-0216:11:31,955 - timeLog - INFO - Qty:0.000000 is smaller than exchange minimumquantity(huobi min:0.000100, okcoin min:0.010200),so ignore this signal

2021-11-0216:11:31,955 - timeLog - INFO - waiting for 1.000000 seconds for next cycle…

2021-11-0216:11:35,036 - timeLog - INFO - Found signal

2021-11-0216:11:35,036 - timeLog - INFO - huobiDepth:{‘bids’: [[4954.15, 0.844]],’symbol’: ‘btccny’, ‘asks’: [[4954.29, 0.046]]}

2021-11-0216:11:35,036 - timeLog - INFO - okcoinDepth:{‘bids’: [[4949.18, 0.002]],’asks’: [[4949.32, 0.03]]}

2021-11-0216:11:35,036 - timeLog - INFO - Qty:0.000000 is smaller than exchange minimumquantity(huobi min:0.000100, okcoin min:0.010200),so ignore this signal

以上没有执行搬砖逻辑,是因为本帐号在火币的比特币数量为零。为了调试该程序,我们到火币平台(比特币交易平台)上去购买一些比特币,再次启动该搬砖程序后,效果如下:

搬砖策略执行结果如下:

/anaconda/bin/python/Users/janes/PycharmProjects/wequantstrategy/liveStrategyEngine/BanZhuan.py

2021-11-0216:30:08,056 - timeLog - INFO - log started at 2016-11-02 16:30:08.055331

2021-11-0216:30:12,142 - timeLog - INFO - waiting for 1.000000 seconds for next cycle…

2021-11-0216:30:14,024 - timeLog - INFO - Found signal

2021-11-0216:30:14,024 - timeLog - INFO - huobiDepth:{‘asks’: [[4972.22, 0.0711]],’bids’: [[4972, 6.7193]], ‘symbol’: ‘btccny’}

2021-11-0216:30:14,024 - timeLog - INFO - okcoinDepth:{‘asks’: [[4961.74, 0.085]],’bids’: [[4961.54, 4.086]]}

2021-11-0216:30:18,937 - timeLog - INFO - placed below market sell order into huobi withquantity: 0.060000, cash amount:298.32

2021-11-0216:30:18,937 - timeLog - INFO - {‘order_amount’: ‘0.0600’, ‘total’: ‘298.32’,’processed_amount’: ‘0.0600’, ‘fee’: ‘0.00’, ‘status’: 2, ‘type’: 4, ‘id’:2522097966, ‘vot’: ‘298.32’, ‘order_price’: ‘0.00’, ‘processed_price’:’4972.06’}

2021-11-0216:30:18,937 - timeLog - INFO - the market sell orderin huobi has been executed with filled quantity: 0.060000, received cash:298.32**

2021-11-0216:30:21,509 - timeLog - INFO - placed below market buy order into okcoin withquantity: 0.060000, cash amount: 297.70

2021-11-0216:30:21,509 - timeLog - INFO - {‘orders’: [{‘amount’: 0, ‘orders_id’:6260001033, ‘order_id’: 6260001033, ‘symbol’: ‘btc_cny’, ‘create_date’:1478075421000, ‘price’: 297.7, ‘avg_price’: 4961.36, ‘deal_amount’: 0.06,’type’: ‘buy_market’, ‘status’: 2}], ‘result’: True}

2021-11-0216:30:21,509 - timeLog - INFO - the market buy order inokcoin has been executed with filled quantity: 0.060000, spent cash: 297.68**

可以看到,就在短短的时间内,我们通过在火币网上卖0.06个比特币,在okcoin上买0.06个比特币,就盈利298.32-297.68 = 0.54元

实际上,这个策略可以全天候开启,目前火币网和okcoin的价差还是稳定存在着的,也就意味着这个策略可以全天候帮我们挣钱!

三、币值出现波动,如何对冲

采用在BitVC(http://bitvc.com)上做空比特币期货的方式,对冲掉了底仓BTC的头寸。也就是说,如果币值大幅下跌,我们还可以从BitVC上的空单交易中获取相应的补偿,从而保护了整个投资组合的收益。

当然,我们还可以火币网上申请BTC杠杆来作为底仓,如果币值大幅下跌,我们可以以非常低的价格买回BTC归还这部分杠杆,从而也能保护整个投资组合的收益。

四、什么时候触发交易所之间的比特币转移

方案是为两个交易所设置BTC最低仓位线,如果任一交易所的BTC仓位触及该最低线,就触发了一次交易所之间的比特币转移和资金转账。转移的结果是两边交易所的币值相等,人民币相等。

五、想要套其他币种(比如莱特币),怎么做?

1
2
3
4
5
6
7
8
9
10
11
12
#本交易策略支持多币种,如果要进行莱特币搬砖套利,直接修改Banzhuan.py
#最底下的代码如下:
if __name__ == "__main__":
'''
# btc
strat =BanzhuanStrategy(datetime.datetime.now(), 0.8, 1, 0.1,
30,helper.COIN_TYPE_BTC_CNY, dailyExitTime="23:30:00")
strat.go()
'''
ltcstrat =BanzhuanStrategy(datetime.datetime.now(), 0.8, 1, 0.1,
30, helper.COIN_TYPE_LTC_CNY,dailyExitTime="23:30:00")
strat.go()