我感覺我可以到網貸公司做一名大佬了!用Python搞定期貨資料!
很早之前,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。