交易小苑25:免费获取期货的行情数据


(astroman) #1

对于刚刚从事量化交易的朋友来说,有一个免费的稳定的历史数据和行情数据来源,是十分重要的。有历史数据,你才可以进行回测检验;有行情数据,你才可以更新数据,喂给你的交易策略,从而产生交易目标持仓。

对于历史数据,你可以在淘宝上买,或者管有数据的朋友要,但是毕竟不能每天都做一次,来更新你的数据库,这样太麻烦了;而最新行情数据,我之前提供了一个解决方案,只要有期货实盘或者模拟账号,就可以下载数据。

岑秋苑:交易小苑24:量化交易从零到一​zhuanlan.zhihu.com图标

感兴趣的可以加我的微信longdd504(注明知乎,量化解决方案)。

但是在这个解决方案中,你用自己的计算机跑自己的程序,数据来源于单一的期货公司,那么数据难免不稳定,比如网络中断,或者程序操作错误,那么你就丢了一部分数据,而这部分数据光靠自己的程序是没办法补全的。这很可能就导致因为数据不全,交易没法进行了。

如果有另一个数据来源,可以及时更新数据,作为补充,那么本地数据暂时中断,也就没什么问题了。本文,就介绍一个从新浪财经数据接口,获取比较及时的期货数据的方法。

数据接口

新浪的数据接口是很简单的,本质上你只需要输入一个网址,你就会收到一个以文本形式发送的历史数据。

网址案例如下,读取m1905五分钟级别行情数据。

http://stock2.finance.sina.com.cn/futures/api/json.php/IndexService.getInnerFuturesMiniKLine5m?symbol=M1905

其他的内容不用改,只需要改两个网址参数,一个是5m(KLine5m),代表五分钟级别数据,这是最低频率,目前还没有1m数据。其他可选的诸如15m,30m,60m等等。第二个是M1905(symbol=M1905),即合约名称,需要大写。另外郑州的名称需要加一位年份,即获取TA905合约,要输入TA1905。

如果在浏览器中输入这个地址,你会得到一个文本信息如下。

![](data:image/svg+xml;utf8,)

文本由中括号和逗号分隔,放大看如下。

![](data:image/svg+xml;utf8,)

依次是行情时间,开盘价、最高价、最低价、收盘价、成交量。这是我在14:08分查询的结果的第一个数据,这里需要注意的是,这个数据标记的时间却是14:10。实际上,这个数据还在更新中,就和大家的行情软件看到的最新行情一样,行情发生变化,这个数据也会变化。除了最近的一个数据之外,其他的14:05,以及之前的数据,都已经确定,都不会再发生变化了。因此使用这个数据要小心,如果你把这个数据保存到本地,但是下次没有更新,这个数据就是错误的。

使用python读取新浪行情

用python读取新浪免费行情信息是比较简单的,只需要几行代码就可以实现了。

首先需要使用python的工具包requests,来访问网络信息。

import requests
data = requests.get("http://stock2.finance.sina.com.cn/futures/api/json.php/IndexService.getInnerFuturesMiniKLine5m?symbol=M1905").content

这样,你就获得了一个文本数据,数据的内容和你在浏览器上看到的是一模一样的。实际上,你获得的数据的格式是json,具体是怎么回事不重要,感兴趣可以自己了解。在python里面,只需要一个现成的工具包,就可以解析。

import json
data = json.loads(data)

这样你就将一个不好处理的文本数据,转变成了python好处理的数据形式。目前data的格式是由每个分钟行情list组成的一个大list。当然,我们更习惯用表格的形式来看行情,我们可以使用python的一个数据分析包来进一步处理。

import pandas as pd
data = pd.DataFrame(data)

然后,你就在程序中有自己的数据了。数据按时间降序排列,最前面的是最近的行情。

![](data:image/svg+xml;utf8,)

尾部是比较远的行情。

![](data:image/svg+xml;utf8,)

可以看到,数据一直到3个交易日之前,长度还是不错的,想获得3天前的数据,也是可以的。那么再早的数据怎么办呢?一个好的办法,就是自己保存,建立自己的数据库。因为新浪数据长度还可以,你每天两三天下载一次就够了,当然记得别忘了,中间中断了,也是没办法补全的。

我个人习惯将数据升序排列,同时列名称也想改一下,然后把index改成时间格式,方便时间检索,所以对数据再操作一下,具体代码如下,仅供参考,根据不同需求可以更改。

data = data.sort_values(0)
data.columns = "datetime open high low close volume".split()
data = data.set_index('datetime')
data.index = pd.to_datetime(data.index)

行情数据接口评价

新浪财经提供数据服务很多年,数据整体来说质量还是比较高的,因此按照我之前说的办法,每两三天下载一下,作为历史回测之用,是足够的。当然从现在积累数据还是太少了,可以买或者要到过去的,然后自己积累增量的。另外新浪最高的频率是5分钟,这个对于比较高频的策略可能就比较无能为力了,但是大家不要高估期货的1分钟波动性,其实一分钟级别上,很多期货品种都是不太动的,5分钟得观看频率,也是足够用的。

对于行情补全,新浪数据也是可以的。如果你的策略5分钟交易一次(对于期货来说,5分钟这种频率真的不少;很多人听了高频交易的兴起,觉得每个tick进行交易决策才是必要的,但是你能不能预测好tick级别的价格走势也是你需要考虑的,你要知道预测tick的竞争是非常激烈的;所以预测不好大可以不预测,术业有专攻,没必要什么都参与,听说什么学什么,最终反而邯郸学步了),你使用新浪的数据直接驱动交易也是可以的,网络数据和本地比肯定会有几秒的延迟,但是对于大部分人,你真的不差这几秒,省时省力,开发速度快,反而是更有意义的(至少新浪作为行情源,几行代码就搞定了)。