python3 量化交易 tushare庫 需要注意的是路徑要在tushare檔案下,否則會報錯。
生命不息,學習不止
以前不知道怎麼從網上直接獲取資料,都是從交易軟體上下載資料,也只有個別的軟體才能下載,例如通達信可以匯出資料,現在學到了一種新的方法,利用tushare可以獲取金融資料,這裡就簡單的分享一下股票資料的獲取方法。
Tushare是一個免費、開源的python財經資料介面包。主要實現對股票等金融資料從資料採集、清洗加工 到 資料儲存的過程,能夠為金融分析人員提供快速、整潔、和多樣的便於分析的資料,為他們在資料獲取方面極大地減輕工作量,使他們更加專注於策略和模型的研究與實現上。考慮到Python pandas包在金融量化分析中體現出的優勢,Tushare返回的絕大部分的資料格式都是pandas DataFrame型別,非常便於用pandas/NumPy/Matplotlib進行資料分析和視覺化。當然,如果您習慣了用Excel或者關係型資料庫做分析,您也可以通過Tushare的資料儲存功能,將資料全部儲存到本地後進行分析。應一些使用者的請求,從0.2.5版本開始,Tushare同時相容Python 2.x和Python 3.x,對部分程式碼進行了重構,並優化了一些演算法,確保資料獲取的高效和穩定。
不管你是量化投資分析師,還是正在學習Python進行資料分析的學習者,這種方法獲取的資料都可以適用。
一、獲取前的準備
1、安裝Python,這個不再贅述,Python官網下載安裝適合自己計算機的版本。
2、安裝pandas,我是直接安裝的Anaconda,包含有pandas,很實用,建議安裝Anaconda,下載地址:https://www.anaconda.com/download/ ,選擇適合的版本安裝。
二、獲取資料
1、獲取歷史行情資料 get_hist_data()
獲取個股歷史交易資料(包括均線資料),可以通過引數設定獲取日k線、周k線、月k線,以及5分鐘、15分鐘、30分鐘和60分鐘k線資料。本介面只能獲取近3年的日線資料,適合搭配均線資料進行選股和分析。
引數說明:
- code:股票程式碼,即6位數字程式碼,或者指數程式碼(sh=上證指數 sz=深圳成指 hs300=滬深300指數 sz50=上證50 zxb=中小板 cyb=創業板)
- start:開始日期,格式YYYY-MM-DD
- end:結束日期,格式YYYY-MM-DD
- ktype:資料型別,D=日k線 W=周 M=月 5=5分鐘 15=15分鐘 30=30分鐘 60=60分鐘,預設為D
- retry_count:當網路異常後重試次數,預設為3
- pause:重試時停頓秒數,預設為0
返回值說明:
- date:日期
- open:開盤價
- high:最高價
- close:收盤價
- low:最低價
- volume
- price_change:價格變動
- p_change:漲跌幅
- ma5:5日均價
- ma10:10日均價
- ma20:20日均價
- v_ma5:5日均量
- v_ma10:10日均量
- v_ma20:20日均量
- turnover:換手率[注:指數無此項]
使用方法:
import tushare as ts data=ts.get_hist_data('300274') print(data)
需要注意的是路徑要在tushare檔案下,否則會報錯。
執行結果:
View Code
獲取某一時間段的歷史資料
import tushare as ts data=ts.get_hist_data('300274',start='2017-01-01',end='2018-03-27') print(data)
執行結果:
View Code
另外一個獲取歷史資料的函式get_h_data()。
import tushare as ts data=ts.get_h_data('300274') print(data)
執行結果:
View Code
在不指定開始時間和結束時間時,該函式預設返回最近一年的日線資料,返回的資料與get_hist_data不同的是,該函式只返回開盤價(open)、最高價(high)、收盤價(close)、最低價(low)、成交量(volume)、成交金額(amount)六列 ,同樣加上時間段也可以獲取相應資料。
第三個獲取歷史資料的函式get_k_data()。
import tushare as ts data=ts.get_k_data('300274') print(data)
執行結果:
View Code
與前兩個函式相比,這個函式獲取資料的速度很明顯要快很多,而且可以返回每一隻股票從上市開始到當前交易日的所有日線資料,這個有點是前兩個函式都不具備的,更重要的是,如果批量3000多隻股票的資料,前兩個都不如get_k_data()穩定。
其他:
ts.get_hist_data('600848', ktype='W') #獲取周k線資料 ts.get_hist_data('600848', ktype='M') #獲取月k線資料 ts.get_hist_data('600848', ktype='5') #獲取5分鐘k線資料 ts.get_hist_data('600848', ktype='15') #獲取15分鐘k線資料 ts.get_hist_data('600848', ktype='30') #獲取30分鐘k線資料 ts.get_hist_data('600848', ktype='60') #獲取60分鐘k線資料 ts.get_hist_data('sh')#獲取上證指數k線資料,其它引數與個股一致,下同 ts.get_hist_data('sz')#獲取深圳成指k線資料 ts.get_hist_data('hs300')#獲取滬深300指數k線資料 ts.get_hist_data('sz50')#獲取上證50指數k線資料 ts.get_hist_data('zxb')#獲取中小板指數k線資料 ts.get_hist_data('cyb')#獲取創業板指數k線資料
2、獲取實時行情資料get_today_all()
返回值說明:
- code:程式碼
- name:名稱
- changepercent:漲跌幅
- trade:現價
- open:開盤價
- high:最高價
- low:最低價
- settlement:昨日收盤價
- volume:成交量
- turnoverratio:換手率
- amount:成交量
- per:市盈率
- pb:市淨率
- mktcap:總市值
- nmc:流通市值
import tushare as ts ts.get_today_all()
執行結果:
View Code
一次性獲取當前交易所有股票的行情資料(如果是節假日,即為上一交易日)
3、獲取歷史分筆資料之:get_tick_data()
獲取個股以往交易歷史的分筆資料明細,通過分析分筆資料,可以大致判斷資金的進出情況。在使用過程中,對於獲取股票某一階段的歷史分筆資料,需要通過加入交易日引數並append到一個DataFrame或者直接append到本地同一個檔案裡。歷史分筆介面只能獲取當前交易日之前的資料,當日分筆歷史資料請呼叫get_today_ticks()介面或者在當日18點後通過本介面獲取。
引數說明:
- code:股票程式碼,即6位數字程式碼
- date:日期,格式YYYY-MM-DD
- retry_count : int, 預設3,如遇網路等問題重複執行的次數
- pause : int, 預設 0,重複請求資料過程中暫停的秒數,防止請求間隔時間太短出現的問題
使用方法:
import tushare as ts df=ts.get_tick_data('300274',date='2018-03-27') df.head(10) #距離執行時間最近的十筆交易
執行結果:
time price change volume amount type 0 15:00:03 18.46 -- 2373 4380761 賣盤 1 14:57:03 18.46 -0.01 188 347048 賣盤 2 14:57:00 18.47 -0.01 42 77574 賣盤 3 14:56:57 18.48 -- 644 1190112 買盤 4 14:56:54 18.48 0.01 80 147840 買盤 5 14:56:51 18.47 0.01 9 16623 中性盤 6 14:56:48 18.46 -0.02 38 70148 賣盤 7 14:56:45 18.48 0.01 25 46200 買盤 8 14:56:42 18.47 -- 87 160689 買盤 9 14:56:36 18.47 -- 82 151454 買盤
獲取當日歷史分筆資料:get_today_ticks()
獲取當前交易日(交易進行中使用)已經產生的分筆明細資料。
引數說明:
- code:股票程式碼,即6位數字程式碼
- retry_count : int, 預設3,如遇網路等問題重複執行的次數
- pause : int, 預設 0,重複請求資料過程中暫停的秒數,防止請求間隔時間太短出現的問題
返回值說明:
- time:時間
- price:當前價格
- pchange:漲跌幅
- change:價格變動
- volume:成交手
- amount:成交金額(元)
- type:買賣型別【買盤、賣盤、中性盤】
使用方法:
import tushare as ts df = ts.get_today_ticks('300274') #當日的歷史分筆資料 df.head(10) #距離執行時間最近的10筆
執行結果:
[Getting data:]###########################################Out[6]: time price pchange change volume amount type 0 13:32:15 18.68 +1.19 -0.01 1 1868 買盤 1 13:32:12 18.69 +1.25 0.00 8 14952 買盤 2 13:32:06 18.69 +1.25 0.01 1 1869 買盤 3 13:32:03 18.68 +1.19 0.00 19 35492 賣盤 4 13:31:51 18.68 +1.19 0.00 8 14944 買盤 5 13:31:48 18.68 +1.19 0.01 14 26152 買盤 6 13:31:45 18.67 +1.14 -0.01 30 56010 賣盤 7 13:31:42 18.68 +1.19 0.01 8 14944 買盤 8 13:31:36 18.67 +1.14 0.00 14 26138 賣盤 9 13:31:33 18.67 +1.14 -0.01 10 18670 賣盤
4、獲取實時分筆資料之:get_realtime_quotes()
獲取實時分筆資料,可以實時取得股票當前報價和成交資訊,其中一種場景是,寫一個python定時程式來呼叫本介面(可兩三秒執行一次,效能與行情軟體基本一致),然後通過DataFrame的矩陣計算實現交易監控,可實時監測交易量和價格的變化。
引數說明:
- symbols:6位數字股票程式碼,或者指數程式碼(sh=上證指數 sz=深圳成指 hs300=滬深300指數 sz50=上證50 zxb=中小板 cyb=創業板) 可輸入的型別:str、list、set或者pandas的Series物件
返回值說明:
0:name,股票名字 1:open,今日開盤價 2:pre_close,昨日收盤價 3:price,當前價格 4:high,今日最高價 5:low,今日最低價 6:bid,競買價,即“買一”報價 7:ask,競賣價,即“賣一”報價 8:volume,成交量 maybe you need do volume/100 9:amount,成交金額(元 CNY) 10:b1_v,委買一(筆數 bid volume) 11:b1_p,委買一(價格 bid price) 12:b2_v,“買二” 13:b2_p,“買二” 14:b3_v,“買三” 15:b3_p,“買三” 16:b4_v,“買四” 17:b4_p,“買四” 18:b5_v,“買五” 19:b5_p,“買五” 20:a1_v,委賣一(筆數 ask volume) 21:a1_p,委賣一(價格 ask price) ... 30:date,日期; 31:time,時間;
使用方法:
import tushare as ts df = ts.get_realtime_quotes('300274') #單個股票實時行情 df[['code','name','price','bid','ask','volume','amount','time']] #需要顯示的屬性
執行結果:
code name price bid ask volume amount time 0 300274 陽光電源 18.780 18.750 18.770 17003279 318581216.230 13:16:06
多隻股票的實時分筆資料(最好不要超過30):
import tushare as ts df = ts.get_realtime_quotes(['600460','000762','000725']) df[['code','name','price','bid','ask','volume','amount','time']]
獲取實時指數:
ts.get_realtime_quotes('sh') #上證指數 ts.get_realtime_quotes(['sh','sz','hs300','sz50','zxb','cyb']) #上證指數 深圳成指 滬深300指數 上證50 中小板 創業板 ts.get_realtime_quotes(['sh','600848']) #或者混搭
大盤指數行情列表:
獲取大盤指數實時行情列表,以表格的形式展示大盤指數實時行情。
返回值說明:
- code:指數程式碼
- name:指數名稱
- change:漲跌幅
- open:開盤點位
- preclose:昨日收盤點位
- close:收盤點位
- high:最高點位
- low:最低點位
- volume:成交量(手)
- amount:成交金額(億元)
使用方法:
import tushare as ts df = ts.get_index() print(df)
執行結果:
View Code
5、獲取大單交易資料
獲取大單交易資料,預設為大於等於400手,資料來源於新浪財經。
引數說明:
- code:股票程式碼,即6位數字程式碼
- date:日期,格式YYYY-MM-DD
- vol:手數,預設為400手,輸入數值型引數
- retry_count : int, 預設3,如遇網路等問題重複執行的次數
- pause : int, 預設 0,重複請求資料過程中暫停的秒數,防止請求間隔時間太短出現的問題
返回值說明:
- code:程式碼
- name:名稱
- time:時間
- price:當前價格
- volume:成交手
- preprice :上一筆價格
- type:買賣型別【買盤、賣盤、中性盤】
使用方法:
import tushare as ts df = ts.get_sina_dd('300274', date='2018-03-28') #預設400手 #df = ts.get_sina_dd('300274', date='2018-03-28', vol=500) #指定大於等於500手的資料 print(df)
執行結果:
View Code
6、資料的儲存
資料儲存模組主要是引導使用者將資料儲存在本地磁碟或資料庫伺服器上,便於後期的量化分析和回測使用,在以檔案格式儲存在電腦磁碟的方式上,呼叫的是pandas本身自帶的方法,此處會羅列常用的引數和說明。
儲存為CSV格式檔案
pandas的DataFrame和Series物件提供了直接儲存csv檔案格式的方法,通過引數設定,輕鬆將資料內容儲存在本地磁碟。
常用引數說明:
- path_or_buf: csv檔案存放路徑或者StringIO物件
- sep : 檔案內容分隔符,預設為,逗號
- na_rep: 在遇到NaN值時儲存為某字元,預設為’‘空字元
- float_format: float型別的格式
- columns: 需要儲存的列,預設為None
- header: 是否儲存columns名,預設為True
- index: 是否儲存index,預設為True
- mode : 建立新檔案還是追加到現有檔案,預設為新建
- encoding: 檔案編碼格式
- date_format: 日期格式
注:在設定path時,如果目錄不存在,程式會提示IOError,請先確保目錄已經存在於磁碟中。
使用方法:
import tushare as ts df = ts.get_hist_data('300274') #直接儲存 df.to_csv('C:/Users/07010018/Desktop/tushare-1.1.6/exportdata/300274.csv') #選擇儲存 #df.to_csv('C:/Users/07010018/Desktop/tushare-1.1.6/exportdata/300274.csv',columns=['open','high','low','close'])
追加資料的方式:
某些時候,可能需要將一些同類資料儲存在一個大檔案中,這時候就需要將資料追加在同一個檔案裡,簡單舉例如下:
import tushare as ts import os filename = 'c:/day/bigfile.csv' for code in ['000875', '600848', '000981']: df = ts.get_hist_data(code) if os.path.exists(filename): df.to_csv(filename, mode='a', header=None) else: df.to_csv(filename)
【注:如果是不考慮header,直接df.to_csv(filename, mode=’a’)即可,否則,每次迴圈都會把columns名稱也append進去】
儲存為Excel格式檔案
pandas將資料儲存為MicroSoft Excel檔案格式。
常用引數說明:
- excel_writer: 檔案路徑或者ExcelWriter物件
- sheet_name:sheet名稱,預設為Sheet1
- sep : 檔案內容分隔符,預設為,逗號
- na_rep: 在遇到NaN值時儲存為某字元,預設為’‘空字元
- float_format: float型別的格式
- columns: 需要儲存的列,預設為None
- header: 是否儲存columns名,預設為True
- index: 是否儲存index,預設為True
- encoding: 檔案編碼格式
- startrow: 在資料的頭部留出startrow行空行
- startcol :在資料的左邊留出startcol列空列
使用方法:
import tushare as ts df = ts.get_hist_data('300274') #直接儲存 df.to_excel('C:/Users/07010018/Desktop/tushare-1.1.6/exportdata/300274.xlsx') #設定資料位置(從第3行,第6列開始插入資料) #df.to_excel('C:/Users/07010018/Desktop/tushare-1.1.6/exportdata/300274.xlsx', startrow=2,startcol=5)
儲存為MySQL資料庫
pandas提供了將資料便捷存入關係型資料庫的方法,在新版的pandas中,主要是已sqlalchemy方式與資料建立連線,支援MySQL、Postgresql、Oracle、MS SQLServer、SQLite等主流資料庫。本例以MySQL資料庫為代表,展示將獲取到的股票資料存入資料庫的方法,其他型別資料庫請參考sqlalchemy官網文件的create_engine部分。
常用引數說明:
- name:表名,pandas會自動建立表結構
- con:資料庫連線,最好是用sqlalchemy建立engine的方式來替代con
- flavor:資料庫型別 {‘sqlite’, ‘mysql’}, 預設‘sqlite’,如果是engine此項可忽略
- schema:指定資料庫的schema,預設即可
- if_exists:如果表名已存在的處理方式 {‘fail’, ‘replace’, ‘append’},預設‘fail’
- index:將pandas的Index作為一列存入資料庫,預設是True
- index_label:Index的列名
- chunksize:分批存入資料庫,預設是None,即一次性全部寫人資料庫
- dtype:設定columns在資料庫裡的資料型別,預設是None
使用方法:
from sqlalchemy import create_engine import tushare as ts df = ts.get_tick_data('300274', date='2018-03-27') engine = create_engine('mysql://user:[email protected]/db_name?charset=utf8') #存入資料庫 df.to_sql('tick_data',engine) #追加資料到現有表 #df.to_sql('tick_data',engine,if_exists='append')
另外,資料也可以儲存為HDF5格式,JSON格式,存入NoSQL資料庫,這裡就不在一一贅述,就簡單介紹幾種常用的。
所有內容,僅作參考,可能有不足或錯誤之處,歡迎留言批評指正