专栏名称: 挖地兔
金融数据采集与挖掘,开启量化金融的第一扇大门。
目录
相关文章推荐
微观三农  ·  春耕 · ... ·  7 小时前  
CFC农产品研究  ·  【建投快评】玉米下跌 ·  2 天前  
中国水利  ·  水利部全面部署各地春灌保障工作 ·  2 天前  
51好读  ›  专栏  ›  挖地兔

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

挖地兔  · 公众号  ·  · 2018-11-20 00:01

正文


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






请到「今天看啥」查看全文