Python中国社区  »  Python

利用Python搞定期货数据,获得免费API

挖地兔 • 2 周前 • 50 次点击  


很早之前,Tushare就提供过期货行情等数据API,这要感谢东北证券小伙伴的努力,在最需要的时候贡献了期货数据的代码。


但由于是直接接抓取转发,而且部分交易所网站偶尔发生变化,API后来变得不太稳定。各个交易所数据格式和标准也不一样,所以后来我们就想索性提供一个中心服务器,Tushare先自己抓取、清洗整理,然后集中提供数据服务。


本篇主要介绍Tushare如何实现期货行情等市场参考数据的抓取和清洗处理,以及实现数据标准化的过程。为用户理解数据,更好的使用数据,同时也为Tushare的用户提供一个学习如何利用Python来抓取期货数据提供一个学习范例。


这也是Tushare社区一直以来在推动和践行的事情:为用户直接提供数据,降低数据采集和处理的成本,也为用户提供数据实现的技术案例,帮助用户提高自身能力。


数据标准制定


我们知道,加上开业不久的上海国际能源交易中心,我们需要采集的数据一共来自5大交易所。我们需要给各个交易所指定一个代码标准,以便数据的规范,也更利于数据的查询。


本篇我们主要从行情数据出发,来说明数据实现过程。


交易所标准


根据交易所的简称,我们制定以下标准:


合约规则


由于一些交易所定义或者公布的合约代码不一致,比如上期所习惯用品种和月份分开来公示数据,比如只用数字表示某期货合约;比如郑商所用代码+年份最后一个数字+月份表示合约,如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。


如果您觉得本文对你有所帮助,可以随手转发到朋友圈,在本公众号私信您的Tushare ID 和 邮箱 ,我们会把数据抓取的源代码发送给您作为参考,可以了解数据采集和清洗整个过程。


关于Tushare Pro金融数据免费获取方式及相关教程,请访问Pro官方网站: https://tushare.pro 。


如有疑问,请在文章后留言,我们会及时回复处理,也请关注“挖地兔”公众号,更多精彩内容定期呈现。






今天看啥 - 高品质阅读平台
本文地址:http://www.jintiankansha.me/t/M6K2Yufi2r
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/26562
 
50 次点击  
分享到微博
文章 [ 1 ]  |  最新文章 2 周前
Python社区小辛
Reply   •   1 楼
Python社区小辛    2 周前

Python社区专属学习交流群:454380743 严禁任何广告