使用backtrader和ccxt搭建一套数字货币量化系统 (一)

随着数字货币市场的不断成熟,这一领域的量化项目也越来越多。因为数字货币交易的门槛比较低,交易也很灵活,越来越多的交易者或开发者开始尝试自己做量化交易,本篇博文将给大家介绍一个比较易于入门的组合backtrader和ccxt

backtrader、ccxt简介和安装

其实在量化领域,有大量可用框架,比如vnpy,就已经集成了很多数字货币的交易所,可以直接进行回测和在线交易。在这里之所以没有用vnpy,纯粹是因为vnpy对mac用户相当不友好,一个python的框架居然在mac上需要繁琐的安装步骤,甚至很难正常运行。backtrader和ccxt的组合能解决以下问题:

  • 对于bitmex(期货交易首选,无他)上无法提取历史数据的问题,ccxt能提供了从2017年开始的所有的ohlcv数据
  • ccxt直接支持python、php、javascript,在开发环境上给了我们更多的选择,更易于在UI上获得更好的用户体验。
  • backtrader则是直接集成了ccxt

因为这些用户体验的原因,我选择了backtrader+ccxt,但不代表这是最好的选择,如果有更好的方案,欢迎大家多交流,给我留言

ccxt

python官网对于ccxt的介绍是:

A library for cryptocurrency trading and e-commerce with support for many bitcoin/ether/altcoin exchange markets and merchant APIs

即一个封装了诸多数字货币交易平台的api的开源库。

支持python、php、javascript三种语言,github上可以下载源码。

ccxt结构明确,易于使用,所有api被封装成统一格式的接口,返回数据被封装成统一格式的字典,基本省去了api开发时间。

其安装很简单:

pip3 install ccxt

backtrader

backtrader是一个量化策略的回测分析平台,与其他的框架一样,事件响应机制,支持股票和各种期货交易。项目的地址:https://github.com/backtrader/backtrader
安装方式:

pip3 install backtrader

当然,我们说过选择backtrader的原因是它集成了ccxt。但官方版本是没有集成ccxt的。而是在分支上:https://github.com/bartosh/backtrader/tree/ccxt

因此,我们得通过以下方式安装:

pip install --upgrade git+https://github.com/bartosh/backtrader.git@ccxt

栗子

环境安装如此简单,趁热打铁就是赶紧跑以下:

from __future__ import(absolute_import, division, print_function, unicode_literals)
from datetime import datetime, timedelta
import backtrader as bt
from backtrader import cerebro
import time

def connect_broker():
    config = {'urls': {'api': 'https://api.sandbox.gemini.com'},
                         'apiKey': 'XXXXX',
                         'secret': 'XXXXX',
                         'nonce': lambda: str(int(time.time() * 1000))
                        }
    broker = bt.brokers.CCXTBroker(exchange='gemini',
                                   currency='USD', config=config)
    cerebro.setbroker(broker)

    # Create data feeds
    data_ticks = bt.feeds.CCXT(exchange='geminy', symbol='BTC/USD',
                              name="btc_usd_tick",
                              timeframe=bt.TimeFrame.Ticks,
                              compression=1, config=config)
    cerebro.adddata(data_ticks)


class TestStrategy(bt.Strategy):
    def next(self):
        print('*' * 5, 'NEXT:', bt.num2date(self.data.datetime[0]), self.data._name, self.data.open[0], self.data.high[0],
              self.data.low[0], self.data.close[0], self.data.volume[0],
              bt.TimeFrame.getname(self.data._timeframe), len(self.data))

if __name__ == '__main__':
    cerebro = bt.Cerebro()

    hist_start_date = datetime.utcnow() - timedelta(minutes=10)
    data_min = bt.feeds.CCXT(exchange='bitmex', symbol="BTC/USD", name="btc_usd_min", fromdate=hist_start_date,
                             timeframe=bt.TimeFrame.Minutes)
    cerebro.adddata(data_min)
    cerebro.addstrategy(TestStrategy)
    cerebro.run()

connect_broker 函数只是一个连接交易所的栗子,在上面的代码中没有调用。真正的展示只有几行代码:

    data_min = bt.feeds.CCXT(exchange='bitmex', symbol="BTC/USD", name="btc_usd_min", fromdate=hist_start_date,
                             timeframe=bt.TimeFrame.Minutes)
    cerebro.adddata(data_min)
    cerebro.addstrategy(TestStrategy)
    cerebro.run()

其中bt.feeds.CCXT代表着我们直接将CCXT上的数据喂到backtrader的实例当中,使得接下来的回测或者实盘可以直接通过CCXT进行。

backtrader社区

这里分享一个社区讨论:
https://community.backtrader.com/topic/623/anyone-use-backtrader-to-do-live-trading-on-bitcoin-exchange/226

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页