天天看點

金融量化分析-python量化分析系列之---使用python擷取股票曆史資料和實時分筆資料

财經資料接口包tushare的使用(一)

Tushare是一款開源免費的金融資料接口包,可以用于擷取股票的曆史資料、年度季度報表資料、實時分筆資料、曆史分筆資料,本文對tushare的用法,已經存在的一些問題做一些介紹。

一:安裝tushare

為避免由于依賴包缺失導緻安裝失敗,請先安裝anaconda,百度網盤位址:

連結:http://pan.baidu.com/s/1qYDQUGs 密碼:6wq8

安裝直接一直下一步即可

安裝完成之後,anaconda會自動配置環境變量,直接就可以用了,cmd打開指令行視窗,使用指令

pip install tushare

即可安裝tushar

二:tushare的使用

1、擷取曆史資料之 get_hist_data

參數說明:

• 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(‘300032’) 
print(data)      

結果展示:

       open   high  close    low     volume  price_change  p_change  \
date                                                                        
2018-12-04  16.80  17.15  17.09  16.70   52382.91          0.25      1.49   
2018-12-03  17.00  17.22  16.84  16.62   53706.54          0.58      3.57   
2018-11-30  16.30  16.39  16.26  15.72   39473.33          0.04      0.25   
2018-11-29  17.05  17.09  16.22  16.20   43111.44         -0.68     -4.02   
2018-11-28  16.70  16.94  16.90  16.20   45034.68          0.23      1.38   
2018-11-27  16.77  16.88  16.67  16.52   34464.46          0.15      0.91   
2018-11-26  16.75  16.95  16.52  16.11   34463.00         -0.18     -1.08   
2018-11-23  18.01  18.02  16.70  16.60   77016.79         -1.20     -6.70   
2018-11-22  18.25  18.27  17.90  17.86   47241.00         -0.15     -0.83   
2018-11-21  18.00  18.17  18.05  17.77   68355.30         -0.33     -1.79         
ma5    ma10    ma20      v_ma5     v_ma10     v_ma20  
date                                                                 
2018-12-04  16.662  16.915  17.569   46741.78   49524.95   74213.35  
2018-12-03  16.578  17.044  17.603   43158.09   55527.30   76015.06  
2018-11-30  16.514  17.249  17.666   39309.38   59021.37   78567.25  
2018-11-29  16.602  17.503  17.748   46818.07   66538.81   82437.55  
2018-11-28  16.938  17.792  17.800   47643.99   78491.83   84790.15  
2018-11-27  17.168  17.943  17.812   52308.11   87770.77   86009.69  
2018-11-26  17.510  18.066  17.819   67896.51   93372.31   87098.74  
2018-11-23  17.984  18.203  17.831   78733.36   97700.81   87289.41  
2018-11-22  18.404  18.273  17.846   86259.55   94334.13   85500.81  
2018-11-21  18.646  18.239  17.799  109339.68   96096.54   85845.67  
2018-11-20  18.718  18.223  17.773  123233.42   98901.76   84578.53  
2018-11-19  18.622  18.162  17.736  118848.10   96502.82   82182.74       

請讀者注意,文檔中的注釋并不準确,使用該接口并不能擷取股票自上市以來的所有日線資料,例如這裡舉的例子,金龍機電這隻股票(2009年12月25日上市)。

請再看例子:

例二:

import tushare as ts 
data=ts.get_hist_data('603712',start='2018-11-28',end='2018-12-01') 
print(data)      

傳回結果是:

open   high  close    low    volume  price_change  p_change  \
date                                                                       
2018-11-30  16.30  16.39  16.26  15.72  39473.33          0.04      0.25   
2018-11-29  17.05  17.09  16.22  16.20  43111.44         -0.68     -4.02   
2018-11-28  16.70  16.94  16.90  16.20  45034.68          0.23      1.38   

               ma5    ma10    ma20     v_ma5    v_ma10    v_ma20  
date                                                              
2018-11-30  16.514  17.249  17.666  39309.38  59021.37  78567.25  
2018-11-29  16.602  17.503  17.748  46818.07  66538.81  82437.55  
2018-11-28  16.938  17.792  17.800  47643.99  78491.83  84790.15        

2、擷取曆史資料之 get_h_data

作者提供另外一個函數get_h_data用于擷取股票曆史資料,該函數的調用網頁文檔沒有給出例子,在這裡依然用上面的例子來作測試:

例三:

import tushare as ts 
data=ts.get_h_data(‘300032’) 
print(data)      

傳回結果:

[Getting data:]   open   high    close  low   volume     amount
date                                                         
2018-11-30       16.30  16.39  16.26  15.72  3947333.0  63721274.0
2018-11-29        17.05  17.09  16.22  16.20  4311144.0  72000288.0
2018-11-28        16.70  16.94  16.90  16.20  4503468.0  75076700.0      

在不指定開始時間和結束時間時,該函數預設傳回最近一年的日線資料,傳回的資料與get_hist_data不同的是,該函數隻傳回開盤價(open)、最高價(high)、收盤價(close)、最低價(low)、成交量(volume)、成交金額(amount)六列

同樣的,測試一下該接口能不能擷取更早一些的資料:

import tushare as ts 
data=ts.get_h_data('603712',start='2018-11-28',end='2018-12-01') 
print(data)      
[Getting data:]             open   high  close    low     volume      amount
date                                                         
2018-11-30  16.30  16.39  16.26  15.72  3947333.0  63721274.0
2018-11-29  17.05  17.09  16.22  16.20  4311144.0  72000288.0
2018-11-28  16.70  16.94  16.90  16.20  4503468.0  75076700.0      

可以看到,相比于get_hist_data,該函數能夠傳回較早一些的資料,但沒有換手率,均線資料這些名額,當然,我們可以擷取到資料之後,自己寫個腳本計算均線這些資訊,但是如果要自己計算換手率,就必須知道股票的市值是多少,這兩個函數都沒有傳回關于股票市值的資訊,是以如果要自己計算換手率,就得從其他地方擷取股票每個交易日的市值資訊。

3、擷取曆史資料之:get_k_data

作者提供了第三個擷取K線資料的函數,get_k_data,參數與get_hist_data相同。

例四:

import tushare as ts 
data=ts.get_k_data('603712') 
print(data)      
date    open   close    high     low    volume    code
0    2018-02-26   5.455   6.543   6.543   5.455     666.0  603712
1    2018-02-27   7.203   7.203   7.203   7.203     372.0  603712
2    2018-02-28   7.922   7.922   7.922   7.922     425.0  603712
3    2018-03-01   8.711   8.711   8.711   8.711     882.0  603712
4    2018-03-02   9.580   9.580   9.580   9.580    3754.0  603712      

與前兩個函數相比,這個函數擷取資料的速度很明顯要快很多,而且可以傳回每一隻股票從上市開始到目前交易日的所有日線資料,這個有點是前兩個函數都不具備的,讀者可以自己驗證一下,get_h_data可以傳回比get_hist_data更早一些的資料,但是對于有些股票依然不能擷取很早的資料,更重要的是,如果批量3000多隻股票的資料,前兩個都不如get_k_data穩定,我一開始搜集資料的時候,為了擷取更全面的資料,用的是get_hist_data,但是批量擷取,反反複複跑腳本,沒有一次是能夠将資料完整擷取完的,每一次都是中途就挂了,讀者可以自己測試一下,間隔時間長一些應該沒問題,不過我後來已經知道其他的解決辦法,既能夠擷取全面的資料,同時也不必擔心速度的問題,怎麼擷取一樣會在微信公衆号【資料之佳】介紹,這裡先介紹tushare

4、擷取實時行情資料 get_today_all()

• code:代碼

• name:名稱

• changepercent:漲跌幅

• trade:現價

• open:開盤價

• high:最高價

• low:最低價

• settlement:昨日收盤價

• volume:成交量

• turnoverratio:換手率

• amount:成交量

• per:市盈率

• pb:市淨率

• mktcap:總市值

• nmc:流通市值

該函數沒有參數,直接調用即可

測試:

例五:

import tushare as ts 
data=ts.get_today_all() 
print(data)      

傳回值:

[Getting data:]############################################################        
        code   name      changepercent  trade   open   high    low  settlement  \
0     603999   讀者傳媒          9.945   5.97   5.41   5.97   5.35        5.43   
1     603998   方盛制藥         -2.293   5.54   5.52   5.60   5.47        5.67   
2     603997   繼峰股份         -2.036   8.18   8.29   8.29   8.15        8.35     
...      
        volume  turnoverratio       amount       per        pb  \
0      17473309.0        7.58390  100935110.0    45.573     2.025   
1       5109486.0        1.20168   28242031.0    39.571     2.280   
2       1192200.0        0.18924    9790259.0    17.783     2.878   
...       
            mktcap           nmc  
0     3.438720e+05  1.375488e+05  
1     2.374237e+05  2.355590e+05  
2     5.232329e+05  5.153400e+05  
...
[3634 rows x 15 columns]      

限于篇幅,這裡隻貼出前三行資料,get_today_all()擷取了所有股票的目前行情資料,但是擷取一次資料的耗時比較長,讀者可以自己在實時行情和盤後自己測試一下,看看會不會挂,整體延時有多久等等

5、曆史分筆資料之:get_tick_data

code:股票代碼,即6位數字代碼

date:日期,格式YYYY-MM-DD

retry_count : int, 預設3,如遇網絡等問題重複執行的次數

pause : int, 預設 0,重複請求資料過程中暫停的秒數,防止請求間隔時間太短出現的問題

該函數傳回指定日期的曆史分筆資料,但由于曆史分筆資料很耗空間,是以一般伺服器都不會存儲很長時間的曆史分筆資料,該接口也一樣,并不能擷取從上市以來的所有日期的分筆資料。

例六:

import tushare as ts

data=ts.get_tick_data(‘300032’,’2017-11-01’)

print(data)

傳回結果:

time price change volume amount type

0 15:00:03 14.05 -0.01 371 521255 賣盤

1 14:57:03 14.06 0.01 1 1406 買盤

2 14:56:57 14.05 – 92 129260 賣盤

3 14:56:54 14.05 – 20 28100 賣盤

……

1526 09:30:36 14.10 -0.02 159 224190 中性盤

1527 09:30:06 14.12 14.12 7 9884 買盤

[1528 rows x 6 columns]

6、實時分筆資料之 get_realtime_quotes

• symbols:6位數字股票代碼,或者指數代碼(sh=上證指數 sz=深圳成指 hs300=滬深300指數 sz50=上證50 zxb=中小闆 cyb=創業闆) 可輸入的類型:str、list、set或者pandas的Series對象

例八:

import tushare as ts 
data=ts.get_realtime_quotes('603712') 
print(data)      
 name    open pre_close   price    high     low     bid     ask   volume  \
0  七一二  16.700    17.090  16.800  16.950  16.600  16.760  16.800  2561622   

         amount   ...      a2_p a3_v    a3_p a4_v    a4_p a5_v    a5_p  \
0  42952410.000   ...    16.810   88  16.820   63  16.830   10  16.840   

         date      time    code  
0  2018-12-05  13:48:15  603712  

[1 rows x 33 columns]      

該接口傳回的資料量較小,還是比較快的,讀者可以自己在實時行情中和盤後自己測試一下

7、當月曆史分筆之 get_today_ticks

例九

import tushare as ts 
data=ts.get_today_ticks('603712') 
print(data)      

傳回值

[Getting data:]##########################          
      time      price   pchange  change  volume  amount  type
0     13:49:35  16.77   -1.87    0.00       7    11739   買盤
1     13:49:32  16.77   -1.87   -0.01      30    50310   賣盤
2     13:49:11  16.78   -1.81    0.00       7    11746   買盤
3     13:49:08  16.78   -1.81    0.00       2     3356   買盤
4     13:49:02  16.78   -1.81    0.00       5     8390   買盤
5     13:48:47  16.78   -1.81   -0.02      10    16780   賣盤      

該接口傳回目前日期,目前時刻的所有粉筆成交資料,相比于上一個接口,速度慢很多,也請讀者自己測試

7、大單交易資料之 get_sina_dd

擷取大單交易資料,預設為大于等于400手,資料來源于新浪财經。

• code:股票代碼,即6位數字代碼

• date:日期,格式YYYY-MM-DD

• vol:手數,預設為400手,輸入數值型參數

• retry_count : int, 預設3,如遇網絡等問題重複執行的次數

• pause : int, 預設 0,重複請求資料過程中暫停的秒數,防止請求間隔時間太短出現的問題

• name:名稱

• time:時間

• price:目前價格

• volume:成交手

• preprice :上一筆價格

• type:買賣類型【買盤、賣盤、中性盤】

例10:

data=ts.get_sina_dd(‘300032’,’2017-11-1’)

傳回值

code name time price volume preprice type

0 300032 金龍機電 14:45:54 13.97 91900 14.00 賣盤

1 300032 金龍機電 10:51:36 14.10 57488 14.11 賣盤

2 300032 金龍機電 10:19:42 14.05 50000 14.06 賣盤

3 300032 金龍機電 09:38:36 14.03 42800 14.02 買盤

借助于tushare,其實我們已經可以做一些量化分析和政策了,但是tushare在實際使用中,有一些不經如人意的地方,我在使用中遇到的問題,同時也自己優化了一一些地方,實在不滿意的資料,從其他地方用自己想辦法擷取,對于tushare已經可以做得很好的就不洗自己再去做了,想要了解怎樣擷取更全面的資料,學習如何将機器學習算法和資料分析方法運用到自己的量化模型當中,請關注微信公衆号【資料之佳】,我們将不定期更新文章

---------------------