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