2.1 期货分笔数据
国内商品期货有40多种,金融期货有5种,目前(2017年10月)由于股指期货受到限制,现在最活跃的大都是商品期货,特别是黑色系的商品期货,比如螺纹钢、铁矿石等。为统一讨论,本书一般以国内成交量最大的螺纹钢期货作为例子来研究。
螺纹钢在上海期货交易所交易,代码为rb,2009年上市至今已经超过8年。螺纹钢价格在1 500~5 000元波动,近期一般在3 000~4 000元,最小买卖价差是1,每手是10吨,因此合约价值大约是3万~4万元每手。
这里给出rb1710在交易日为2017年7月21日的数据,如图2-1所示。
图2-1 螺纹分笔数据
可以看出,虽然说交易日是7月21日,但它实际上是从7月20日晚上开始。一开始的18:30的价格可以看成是前一天的结算价,然后20:59:00的价格为集合竞价的价格,然后21:00:00之后的价格才是真正开始交易的价格。主要的信息包括:
时间——即那笔行情发布的时间,虽精确到500毫秒,但不一定每个500毫秒都有,存在更新信息的时候才会有;
最新——即最新的成交价,如果在非交易时间的这个价格,但它是前一天的结算价;
持仓——当前该合约的市场总持仓量,商品是买卖双倍计算;
增仓——当前时间新增加的持仓量,商品是买卖双倍计算;
成交额——当前时间的成交金额,即成交量乘以合约乘数,商品是买卖双倍计算;
成交量——当前时间的成交合约数量,商品是买卖双倍计算;
买一价——最高的买价;
卖一价——最低点卖价;
买一量——在买一价上的挂单量;
卖一量——在卖一价上的挂单量;
第一行的很多数字是零,那是因为它发布的是结算价和前一天的成交量,买价卖价等信息不存在,所以都是零。
螺纹钢有夜盘,因此集合竞价发生在夜盘,白天开始的时候是不存在集合竞价的,如图2-2所示。
图2-2 螺纹钢白天价格
2.1.1 获得数据的途径
很多人想收集历史行情信息,其实有很多途径。比如有些人只需要5分钟数据,或许就可以从第三方的程序化交易平台上下载。但有几点需要注意。
(1)信息完整性。第三方平台的5分钟数据往往只有高开低收等K线信息,没有挂单量和买一、卖一等微观结构的信息,而这些信息对精准回测而言比较重要。
(2)构造复杂因子。如果有微观信息,可以利用5分钟内的这些信息构造出更复杂的因子,虽然这些因子仍然是5分钟频率,但由于用到了更微观的信息,所以构建出来的因子会比单纯的5分钟高开低收更有效一些。
(3)换月数据。公开平台的连续合约在换月时没有新合约的历史数据,因此在计算因子的时候很不方便。比如最简单的20均线,新合约只能在出现20根K线之后才能准确算出,前面的均线多少都要用到旧合约的信息。但如果是自己构造的K线,则不会有这个问题。或许很多人认为这只是一个小部分,但很多时候机器学习模型就是由一个个模块叠加而成,如果每一个模块都引入一些误差,那么这些误差是逐渐叠加的,而不是误差越多越能互相抵消的,导致最终的结果跟设想的很不一样。
因此,最好从最基本的分笔数据开始,自己合成每个合约的5分钟K线,计算相应的因子,这样就不会有跨合约计算同一个因子的问题,在源头上减少误差。
获得分笔数据的几个途径有以下几种。
(1)自己用CTP下载。这个当然是免费的,而且最及时,可以得到一手的数据,也可以对比不同行情服务器地址的数据之间的差异,以本人经验来看,上海和大连的不同地方得到的数据基本一致,但郑州的数据不大一致,有细微的差别。
(2)万德资讯。这是国内最常用的金融信息软件,里面有商品的高频数据,而且支持R、Matlab、Python等接口,比较方便,但是需要收费,并且高频数据有流量的限制。
(3)国泰安。这是国内比较庞大的一个数据提供商,费用也比较高,数据需要落地,因此需要本地的服务器接收,一般通过sql导出。
(4)淘宝。本人购买的是淘宝大富翁提供的数据,盘后是100元/月,历史数据是60元/月,如果是5档行情会贵一些,180元/月。
如果是小私募或者个人,建议在自己下载数据的同时也购买淘宝数据作为对照,且经济实惠。
有了数据获得的途径,就可以写一个程序,每天定时下载,自动处理,这样可以节约人力资源。其实现在很多新的发明主要作用就是节约人力资源,据说著名的高盛公司原来主要依靠银行家和销售人员,做的都是看起来比较高端的工作,觥筹交错间畅谈世界经济金融局势,但现在招聘了越来越多的程序员,越来越像一家科技公司。摩根士丹利也一样,原来交易大厅有600人,现在只有两个人。后面会讲到如何盘后自动获取数据。
2.1.2 数据储存
数据下载到计算机后,如何存储数据也是一个问题。如果存储成csv格式,每次读取的速度是个大问题,我们可以来测试一下各种情况下数据读取的速度。
首先是用最简单的read.csv命令:
可见需要43.71秒,一共161个文件。但如果我们使用速度更快的fread命令,则有:
速度变成5.36秒,只有原来的12.26%,提高了许多,而且结果是一致的:
可以看出结果是一致的。
当然,csv文件还只是文本的格式,如果保存成R语言自己的二进制格式,理论上说读取速度还可以更快。为此,我们首先把csv文件存成二进制的RData文件:
然后就可以直接调用这些二进制文件了:
可见调用二进制文件可以比fread还要更快一些。但如果保存成RData格式,其实多占用了一份空间,因为csv文件方便人工查看,因此直接使用fread可以节省保存数据的空间。当然,如果只是希望在R语言里面使用数据,只保留RData文件也是可以的,也不会因为不小心失误修改了数据而导致意外发生。因此,实际工作中可以将RData和csv文件各保存一份,平时调用RData文件,需要增减数据也容易,如果不小心篡改了,再从csv文件中重新读取即可。
2.1.3 盘后自动获取
虽然说交易过程中也可以输出收到的分笔数据,但难免发生意外,专业的事情可以交给专业的机构做,费用也并不高。比如可以使用淘宝大富翁上的数据服务,每天盘后商品一档数据是100元/月。如果自己本身是有一定规模的私募,IT团队比较厉害,也可以自己做。但是事实上,现在程序员工资也挺高,如果仅仅做这种期货量化,确实不太需要专门的程序员。更何况很多程序员都是C++和Java厉害,对R语言也不大懂。
例如,每天下载数据的程序可以这么写:
关键点如下。比如我们需要下载的是某个日期之后的数据,毕竟一般是每天更新,上一交易日的日期保存在commodity.latest.date中:
由于国内是三个交易所,每次下载其中一个交易所的数据即可,比如下载上期所的数据,上期所sc是第二个交易所,可以用:
另外,数据格式可能是压缩的rar,需要运用unrar命令解压,在R语言里面可以直接运行windows命令行的命令,比如把命令写成字符串,然后用system()调用,这是以下部分:
这样就可以每天自动把数据下载到计算机了。如果使用万德等第三方平台,他们会整合其他很多功能,整体收费会比较高,因此只需要行情数据的话没必要使用太复杂的集成化信息系统。但如果需要其他基本面信息,或许那些平台更好一些。
下载完数据,接下来就可以用来分析日内策略或高频策略,如果想研究中低频的策略,可以使用5分钟K线,后面会有介绍。