美文网首页Python新世界
我感觉我可以到网贷公司做一名大佬了!用Python搞定期货数据!

我感觉我可以到网贷公司做一名大佬了!用Python搞定期货数据!

作者: 919b0c54458f | 来源:发表于2018-11-28 14:10 被阅读16次

    很早之前,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。

    相关文章

      网友评论

        本文标题:我感觉我可以到网贷公司做一名大佬了!用Python搞定期货数据!

        本文链接:https://www.haomeiwen.com/subject/abiaqqtx.html