很早之前,Tushare就提供过期货行情等数据API,这要感谢东北证券小伙伴的努力,在最需要的时候贡献了期货数据的代码。
但由于是直接接抓取转发,而且部分交易所网站偶尔发生变化,API后来变得不太稳定。各个交易所数据格式和标准也不一样,所以后来我们就想索性提供一个中心服务器,Tushare先自己抓取、清洗整理,然后集中提供数据服务。
本篇主要介绍Tushare如何实现期货行情等市场参考数据的抓取和清洗处理,以及实现数据标准化的过程。为用户理解数据,更好的使用数据,同时也为Tushare的用户提供一个学习如何利用Python来抓取期货数据提供一个学习范例。
这也是Tushare社区一直以来在推动和践行的事情:为用户直接提供数据,降低数据采集和处理的成本,也为用户提供数据实现的技术案例,帮助用户提高自身能力。
数据标准制定
我们知道,加上开业不久的上海国际能源交易中心,我们需要采集的数据一共来自5大交易所。我们需要给各个交易所指定一个代码标准,以便数据的规范,也更利于数据的查询。
进群:548377875 即可获取小编精心准备的大礼包哦!都是对应的教程呢!
本篇我们主要从行情数据出发,来说明数据实现过程。
交易所标准
根据交易所的简称,我们制定以下标准:
合约规则
由于一些交易所定义或者公布的合约代码不一致,比如上期所习惯用品种和月份分开来公示数据,比如只用数字表示某期货合约;比如郑商所用代码+年份最后一个数字+月份表示合约,如ZC812表示动力煤18年12月合约等等。
要想统一格式,我们必须定义统一的规范,借鉴前辈们的经验,也符合用户的习惯,我们定义的标准如下:
定义好了规则以后,我们就可以在获取数据后进行处理,尤其是主力与连续合约,交易所是不直接提供数据的,需要我们根据规则来自行生产。
行情指标定义
在获取数据之前,我们需要定义行情的指标,以便在采集数据的时候一一对应或者加工处理。通常来说,行情有高开低收等价格信息,但是期货有结算价格等,我们这里做了一个列表,供大家参考。
除此以外,我们还可以加入交易所字段,更有利于数据的查询。
数据源收集
Tushare收集了5个交易所的数据,主要来源是交易所网站。当然,Tushare的数据不仅仅是来自网站,也有其他信息服务网站,也包括了CTP系统等。
正如前面已经介绍,交易所各自的标准和规范不一样,我们在做数据采集的时候会碰到很多问题。
所以,务必要自己定义一套标准来统一格式。除此以外,有些交易所可能由于历史的原因,采集数据的地址和数据输出内容也不同,需要我们自行衍生计算才能达到数据的完整和准确性。
Python抓取数据
由于篇幅有限,我们只拿上海期货交易所的行情数据作为抓取的例子,希望对想通过Python来抓取数据的朋友有所帮助。
定义采集函数
我们可以写一个专门的函数,来获取数据原始内容。这里可能返回的是HTML,也可能是csv或excel数据格式的内容。然后再返回到数据处理函数里完成数据的清洗加工。
def get_content(url, retry_count=3, pause=0.001):
for _ in range(retry_count):
time.sleep(pause)
try:
request = Request(url)
request.add_header("User-Agent", 'Mozilla/5.0 (Windows NT 6.1; rv:37.0) Gecko/20100101 Firefox/37.0')
request.add_header("Connection", "keep-alive")
request.add_header("Accept-Language","zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3")
request.add_header("Accept-Encoding","gzip, deflate")
request.add_header("Referer", url)
text = urlopen(request, timeout=10).read()
except Exception as e:
print(e)
else:
return text
我们定义了重试次数,目的是为了避免因网络或者其他问题造成数据抓取中断丢失数据,大家可以自行更改次数,以及中断后是否设置暂停时间。
数据处理
上期所的数据格式,应该说是几大交易所中比较简单的一个,我们通过它返回的JSON数据,利用pandas的功能,很快就能完成数据清洗整理。
def _shfe_daily(date=''):
url = shfe_url%(date)
try:
js = get_content(url)
js = js.replace(' ', '')
js = json.loads(js)
df = pd.DataFrame(js['o_curinstrument'])
df = df[~(df.DELIVERYMONTH.str.contains(u'小计')) & ~(df.DELIVERYMONTH.str.contains(u'合计'))]
df = df[~df.PRODUCTID.str.contains(u'总计')]
df['TRADE_DATE'] = date
df['TS_CODE'] = df['PRODUCTID']+df['DELIVERYMONTH']+'.SHF'
df['TS_CODE'] = df['TS_CODE'].map(lambda x: x.replace('_f', '').upper())
df['EXCHANGE'] = 'SHFE'
df = df[['TS_CODE', 'TRADE_DATE', 'OPENPRICE', 'HIGHESTPRICE', 'LOWESTPRICE', 'CLOSEPRICE', 'SETTLEMENTPRICE',
'ZD1_CHG', 'ZD2_CHG', 'VOLUME', 'OPENINTEREST', 'OPENINTERESTCHG']]
df.columns = ['TS_CODE', 'TRADE_DATE', 'OPEN', 'HIGH', 'LOW', 'CLOSE', 'SETTLE',
'CHANGE1', 'CHANGE2', 'VOL', 'OI', 'OI_CHG']
df = df.fillna(0)
except Exception as e:
print(e)
else:
for col in ['OPEN', 'LOW', 'CLOSE', 'SETTLE', 'VOL', 'CHANGE1', 'CHANGE2', 'OI', 'OI_CHG']:
df[col] = df[col].astype(float)
return df
在做数据入库之前,我们需要看清数据是否有噪音,比如一些小计/合计/总计的数据,这类数据不在我们采集的范围之内,需要清洗干净。
类似的小问题很多,在采集过程中我们需要擦亮眼睛,只要细心,相信会做出完美的数据。
Tushare Pro的期货数据
我们深知数据采集、清洗、加工的繁琐和无趣,如果您只是为了用数据,相信不太想每天去为了抓取数据费尽心思,最后可能还四处碰壁。
所以,Tushare社区帮大家承担了数据采集和处理的工作。只有您注册了Tushare Pro的账号,就可以通过数据接口免费获取数据,不用再操心数据的问题,把精力和时间都集中在策略的研究上。
Pro目前可以提供的期货数据
目前已经收集整理了包括行情在内的市场交易和参考数据,从历史跨度来看,足够用户进行数据分析。
未来我们将提供更多的数据来充实大家的需求,但最重的是数据的质量和稳定性的保证。Tushare社区已经为此投入了3台高性能服务器来支持期货数据处理和服务,数据的稳定性和可靠性逐步得到验证。
数据的基本用法
1、获取行情数据
pro = ts.pro_api()
df= pro.fut_daily(ts_code='IFL.CFX', start_date='20180101', end_date='20181116')
我们把数据保存起来,美化一下效果如下:
2、获取会员持仓排名
pro= ts.pro_api()
df = pro.fut_holding(trade_date='20181116', symbol='C', exchange='DCE')
3、获取仓单日报数据
pro= ts.pro_api()
df = pro.fut_wsr(trade_date='20181116', symbol='ZN')
4、获取结算参数数据
pro= ts.pro_api()
df = pro.fut_settle(trade_date='20181116', exchange='SHFE')
5、更多资料
Tushare Pro网站提供了详细的用户使用手册,即使是Python的初学者,也可以根据教程轻松获得数据。
总结
总的来说,数据现在越来越开放,所能获取的数据也越来越多。但,是不是所有数据都要自己去抓取采集、清洗加工,以及提供API化的服务,哪怕是公司内部使用? 需要谨慎对待。
我们需要考虑在数据方面各种精力的投入和时间成本,正如前面已经讲过多次,数据采集和处理过程中的坑太多,如果数据都需要自己采集加工,必定要安排特定的人员来监控和维护,人员和管理成本会增加不少。最关键的问题是,如果本身的业务和技术不熟练,反而影响了数据的使用,耽误了策略研发和实盘交易。
所以,如果有经验丰富的数据团队来服务大家,提供专业的数据支持,必然会大大提高效率,保证投研和交易过程的顺利进行。
最后福利
Tushare社区正是为用户减少数据上的困扰,提高数据使用效率而存在的一个组织,可以提供专业的数据规划、采集、清洗处理和API化的数据服务和支持。
最重要的是,我们免费提供包括了以上期货数据在内的其他所有金融交易数据,为大家提供便捷的数据API。
网友评论