更多精彩内容,欢迎关注公众号:数量技术宅。想要获取本期分享的完整策略代码,请加技术宅微信:sljsz01
数字货币历史数据的重要性
我们研究量化策略,拿到历史数据进行回测,是第一步。然而,主流的金融平台、三方回测平台,几乎都不提供数字货币的历史数据,例如万德并不提供OKEX、火币、币安等大交易所的数字货币历史数据。
此外,数字货币的数据,特别是高频数据,数据量极大,数字货币Tick数据,最高推送频率可达到每秒10笔,每笔150档买卖盘口,相比较股票市场3秒/笔,以及期货市场的0.5秒/笔的推送频率,可谓是快了很多。第三方平台也很难支持如此大规模、大容量历史数据的读取。因此,我们研究数字货币量化投资策略,第一步也是最关键的一步,需要自行收集数字货币的历史数据,如果收集的是Tick数据,则还要配备大容量的数据存储设备。
大周期(日线、小时)K线数据的获取
如果策略仅仅需要相对大周期的数字货币历史数据进行测试,幸运的是,我们可以从一个www.cryptodatadownload.com的地址免费的下载到大周期的历史K线数据。该网站提供了免费的日线、小时线的数字货币K线数据的下载,数据格式是很友好的csv格式,可以直接用Python的Pandas库读入进行下一步的处理。
网站覆盖了主流的欧美、亚太的数字货币交易所,例如CoinBase、Bitfinex、币安、OKEX等等。我们以Bitfinex为例,提供了BTC/USD、ETH/USD、LTC/USD、LTC/BTC、XRP/BTC这5个主流货币对的日线以及小时线的K线数据。
我们从Bitfinex交易所提供的数字货币品种中,随机选择一个BTC/USD的小时线数据下载,打开下载好的csv文件可以看到,数据包含了我们进行量化策略研究所需要的完整K线数据字段:时间、开盘价、最高价、最低价、收盘价以及成交量,我们再将该数据读入Pandas,就能进入下一步策略研发阶段了。
利用Python第三方API获取任意周期K线、Tick历史数据
如果在我们的策略中,要用到比小时K线更精确的数据颗粒,我们就需要调用API来开发数据接收程序了。我们先来看一个强大的Python第三方API:CCXT。CCXT是一个支持全球120余家主流数字货币交易所的jsp、python、php的三方库。在github搜索CCXT,即可查看、下载该三方库的源代码以及说明文档。
CCXT的安装,我们以技术宅大部分粉丝熟悉的Python为例,只需要在控制台或Anaconda中输入pip install ccxt(必要时更换更快速的安装源)即可完成安装。
安装后import ccxt,并print(ccxt.exchanges),如果控制台打印出了一系列ccxt支持的交易所的名称,说明此时ccxt已经成功安装。
我们使用ccxt,能够获取到三种类型的行情数据:OrderBook、PriceTicker、KLine。ccxt接口对于这三类数据,都采用Rest的获取方式,即请求1次、返回1条最新数据信息。
首先来看OrderBook(订单簿)的数据获取。通过CCXT的帮助文档,我们可以查到应该调用API中的哪个方法,来获取OrderBook,而OrderBook获取方法所返回的数据结构,是怎么样的。
通过API的帮助文档,我们知道应该使用fetch_order_book的方法,传入我们相要获取的数字货币币种symbol作为参数,而返回的是带有'bids'、‘asks’、'datatime'等关键数据字段的dict格式的数据。我们自行编写Python代码并print验证。
我们在测试代码时,获取huobipro(火币网)所有数字货币币种Orderbook数据并打印,从打印结果来看,我们成功取到了所有的Orderbook数据,并且返回的数据结构也与说明文档中一致。
接着来看PriceTicker (逐笔数据)的获取方式,同样先找到帮助文档对应的API函数、并阅读返回结构。
同样以火币pro为例,我们调用API文档所提示的函数(方法),获取BTC/USDT的Ticker数据。
对于Tick数据,由于包含的字段较多,返回的数据内容也相应较长,我们同样将其print出来以验证数据结构。
最后一种ccxt支持的数据获取类型是k线数据的获取,我们同样查询API文档,其对应的方法是fetch_ohlcv的方法。该方法传入两个参数,分别是所要获取数据的数字货币品种,以及获取数据所对应的K线周期。在获取到K线数据后,我们将其转换为pandas的DataFrame标准数据格式,并将最终的结果存入csv文件。后续的回测模块只需要读取该数据即可。
如果不存储csv文件,我们同样可以将所返回的数据打印出来,以此来验证我们使用接口的方法,是正确的。
利用交易所API,直接获取交易所推送数据
由于ccxt免费获取数据,只支持Rest的模式,即请求1次、返回1次对应的数据。如果我们请求数据的频率低于数据发送的频率,或是请求由于网络问题未送达ccxt,就可能造成行情数据的缺失,特别是收集高频数据的时候,数字货币最高0.1秒/笔的合约高频数据,该问题将无限放大。
因此,收集中、高频数据的最佳途径,是数字货币交易所提供的API。数字货币交易所的直连API,提供除Rest以外的另一种订阅模式:Websocket。Websocket模式只需要一次订阅,数据更新即推送,接收到的数据质量相比较Rest更高。
本文技术宅以OKEX交易所的Python API接口为例,OKEX的API说明可以参考交易所在github发布的帮助文档。
OKEX交易所的Websocket demo程序已经为我们定义好了基础的功能函数。我们对接API开发,只需要调用功能函数,确定需要订阅的行情内容,就可以立即用python接收到交易所推送的Websocket行情数据。我们以OKEX交易所Websocket接口,获取ETH-USDT的Tick数据为例,一次订阅,实现数据的不断推送,为检查数据推送功能是否正确,我们将接收到的Tick数据打印在控制台,当然有兴趣使用该数据做回测的同学,也可以将接收到的数据,落地到本地的数据库。
以上,就是我们本文分享的所有内容。总结一下,对于数字货币大周期的K线,我们可以采用三方网站直接下载获取,而对于小周期的K线、甚至是Tick数据,更推荐大家使用ccxt、或交易所API获取。
如果你对于自动获取数字货币历史数据的Python代码感兴趣,欢迎添加技术宅微信:sljsz01,与我交流
往期干货分享推荐阅读
【数量技术宅|量化投资策略系列分享】多周期共振交易策略
【数量技术宅|金融数据分析系列分享】为什么中证500(IC)是最适合长期做多的指数
商品现货数据不好拿?商品季节性难跟踪?一键解决没烦恼的Python爬虫分享
【数量技术宅|金融数据分析系列分享】如何正确抄底商品期货、大宗商品
【数量技术宅|量化投资策略系列分享】股指期货IF分钟波动率统计策略
【数量技术宅 | Python爬虫系列分享】实时监控股市重大公告的Python爬虫