社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

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

挖地兔 • 6 年前 • 5711 次点击  


很早之前,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
 
5711 次点击  
文章 [ 1 ]  |  最新文章 6 年前