1. 程式人生 > >我感覺我可以到網貸公司做一名大佬了!用Python搞定期貨資料!

我感覺我可以到網貸公司做一名大佬了!用Python搞定期貨資料!

很早之前,Tushare就提供過期貨行情等資料API,這要感謝東北證券小夥伴的努力,在最需要的時候貢獻了期貨資料的程式碼。

但由於是直接接抓取轉發,而且部分交易所網站偶爾發生變化,API後來變得不太穩定。各個交易所資料格式和標準也不一樣,所以後來我們就想索性提供一箇中心伺服器,Tushare先自己抓取、清洗整理,然後集中提供資料服務。

本篇主要介紹Tushare如何實現期貨行情等市場參考資料的抓取和清洗處理,以及實現資料標準化的過程。為使用者理解資料,更好的使用資料,同時也為Tushare的使用者提供一個學習如何利用Python來抓取期貨資料提供一個學習範例。

這也是Tushare社群一直以來在推動和踐行的事情:為使用者直接提供資料,降低資料採集和處理的成本,也為使用者提供資料實現的技術案例,幫助使用者提高自身能力。

資料標準制定

我們知道,加上開業不久的上海國際能源交易中心,我們需要採集的資料一共來自5大交易所。我們需要給各個交易所指定一個程式碼標準,以便資料的規範,也更利於資料的查詢。

進群:548377875   即可獲取小編精心準備的大禮包哦!都是對應的教程呢!

本篇我們主要從行情資料出發,來說明資料實現過程。

交易所標準

根據交易所的簡稱,我們制定以下標準:

我感覺我可以到網貸公司做一名大佬了!用Python搞定期貨資料!

 

合約規則

由於一些交易所定義或者公佈的合約程式碼不一致,比如上期所習慣用品種和月份分開來公示資料,比如只用數字表示某期貨合約;比如鄭商所用程式碼+年份最後一個數字+月份表示合約,如ZC812表示動力煤18年12月合約等等。

要想統一格式,我們必須定義統一的規範,借鑑前輩們的經驗,也符合使用者的習慣,我們定義的標準如下:

 

我感覺我可以到網貸公司做一名大佬了!用Python搞定期貨資料!

 

 

定義好了規則以後,我們就可以在獲取資料後進行處理,尤其是主力與連續合約,交易所是不直接提供資料的,需要我們根據規則來自行生產。

行情指標定義

在獲取資料之前,我們需要定義行情的指標,以便在採集資料的時候一一對應或者加工處理。通常來說,行情有高開低收等價格資訊,但是期貨有結算價格等,我們這裡做了一個列表,供大家參考。

 

我感覺我可以到網貸公司做一名大佬了!用Python搞定期貨資料!

 

 

除此以外,我們還可以加入交易所欄位,更有利於資料的查詢。

資料來源收集

Tushare收集了5個交易所的資料,主要來源是交易所網站。當然,Tushare的資料不僅僅是來自網站,也有其他資訊服務網站,也包括了CTP系統等。

我感覺我可以到網貸公司做一名大佬了!用Python搞定期貨資料!

 

正如前面已經介紹,交易所各自的標準和規範不一樣,我們在做資料採集的時候會碰到很多問題。

所以,務必要自己定義一套標準來統一格式。除此以外,有些交易所可能由於歷史的原因,採集資料的地址和資料輸出內容也不同,需要我們自行衍生計算才能達到資料的完整和準確性。

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臺高效能伺服器來支援期貨資料處理和服務,資料的穩定性和可靠性逐步得到驗證。

我感覺我可以到網貸公司做一名大佬了!用Python搞定期貨資料!

 

資料的基本用法

1、獲取行情資料

pro = ts.pro_api()
df= pro.fut_daily(ts_code='IFL.CFX', start_date='20180101', end_date='20181116')

我們把資料儲存起來,美化一下效果如下:

我感覺我可以到網貸公司做一名大佬了!用Python搞定期貨資料!

 

2、獲取會員持倉排名

pro= ts.pro_api()
df = pro.fut_holding(trade_date='20181116', symbol='C', exchange='DCE')

我感覺我可以到網貸公司做一名大佬了!用Python搞定期貨資料!

 

3、獲取倉單日報資料

pro= ts.pro_api()
df = pro.fut_wsr(trade_date='20181116', symbol='ZN')

我感覺我可以到網貸公司做一名大佬了!用Python搞定期貨資料!

 

4、獲取結算引數資料

pro= ts.pro_api()
df = pro.fut_settle(trade_date='20181116', exchange='SHFE')

我感覺我可以到網貸公司做一名大佬了!用Python搞定期貨資料!

 

5、更多資料

Tushare Pro網站提供了詳細的使用者使用手冊,即使是Python的初學者,也可以根據教程輕鬆獲得資料。

 

我感覺我可以到網貸公司做一名大佬了!用Python搞定期貨資料!

 

 

總結

總的來說,資料現在越來越開放,所能獲取的資料也越來越多。但,是不是所有資料都要自己去抓取採集、清洗加工,以及提供API化的服務,哪怕是公司內部使用? 需要謹慎對待。

我們需要考慮在資料方面各種精力的投入和時間成本,正如前面已經講過多次,資料採集和處理過程中的坑太多,如果資料都需要自己採集加工,必定要安排特定的人員來監控和維護,人員和管理成本會增加不少。最關鍵的問題是,如果本身的業務和技術不熟練,反而影響了資料的使用,耽誤了策略研發和實盤交易。

所以,如果有經驗豐富的資料團隊來服務大家,提供專業的資料支援,必然會大大提高效率,保證投研和交易過程的順利進行。

最後福利

Tushare社群正是為使用者減少資料上的困擾,提高資料使用效率而存在的一個組織,可以提供專業的資料規劃、採集、清洗處理和API化的資料服務和支援。

最重要的是,我們免費提供包括了以上期貨資料在內的其他所有金融交易資料,為大家提供便捷的資料API。