Tushare(金融數據接口包)


一、Tushare介紹

  Tushare是一個免費、開源的python財經數據接口包。主要實現對股票等金融數據從數據采集、清洗加工到數據存儲的過程,能夠為金融分析人員提供快速、整潔、多樣的便於分析的數據,使得數據獲取方面極大地減輕工作量,更加專注於策略和模型的研究和實現。

  Tushare從新浪財經、騰訊財經、上交所、深交所獲取數據。

  Tushare官方地址

1、Tushare使用和安裝

(1)使用前提

  安裝python、安裝pandas包、安裝lxml包、bs4包、requests包。環境如下所示:

  

(2)下載安裝

# 方法一:
pip install tushare

# 方法二:
訪問https://pypi.python.org/pypi/Tushare

(3)版本升級

# 版本更新
pip install tushare --update

# 檢查版本信息
print(tushare.__version__)

二、歷史行情(get_hist_data/get_h_data)接口

  get_hist_data接口:獲取個股歷史交易數據(包含均線數據),可以通過參數設置獲取日k線、周k線、月k線,以及5分鍾、15分鍾、30分鍾和60分鍾k線數據。本接口只能獲取近3年的日線數據,適合搭配均線數據進行選股和分析。

            start為空取API所提供最早日期數據,end為空取最近一個交易日數據。

import tushare as ts

print(ts.get_hist_data("601318"))

"""
             open   high  close    low  ...    ma20      v_ma5     v_ma10     v_ma20
date                                    ...                                         
2020-01-23  84.01  84.56  83.49  82.48  ...  85.610  807119.55  711352.85  634487.17
2020-01-22  85.00  85.48  85.22  83.83  ...  85.632  690831.24  663221.99  596297.65
2020-01-21  87.00  87.29  85.60  85.60  ...  85.594  648759.18  652369.61  574079.03
2020-01-20  88.30  88.70  87.60  87.35  ...  85.528  646579.65  624830.50  560559.15
2020-01-17  86.15  86.90  86.25  85.85  ...  85.425  621487.27  594870.25  531672.07
...           ...    ...    ...    ...  ...     ...        ...        ...        ...
2017-07-31  51.88  52.64  52.02  51.41  ...  52.094  587775.69  587775.69  587775.69
2017-07-28  52.20  52.46  51.89  51.80  ...  52.113  580718.35  580718.35  580718.35
2017-07-27  51.85  52.74  52.36  51.09  ...  52.187  610526.22  610526.22  610526.22
2017-07-26  52.10  52.50  51.89  51.28  ...  52.100  582222.86  582222.86  582222.86
2017-07-25  52.62  53.05  52.31  52.18  ...  52.310  506834.84  506834.84  506834.84
"""

  get_h_date接口:獲取個股全部歷史數據,其他同上。(已失效)

           start為空取當前日期,end為空取去年今日。

  get_k_data接口:獲取k線數據,融合了get_hist_data和get_h_data兩個接口的功能,即能方便獲取日周月的低頻數據,也可以獲取5、15、30和60分組相對高頻的數據。同時,上市以來的前后復權數據也能在一行代碼中輕松獲得。

           start為空取上市首日,end為空取最近一個交易日

import tushare as ts

# print(ts.get_hist_data("601318"))
print(ts.get_k_data("601318"))

"""
           date    open   close    high     low     volume    code
0    2017-06-15  44.946  43.984  45.212  43.727  1041983.0  601318
1    2017-06-16  43.908  44.479  44.936  43.908   807231.0  601318
2    2017-06-19  44.727  46.251  46.317  44.470   808481.0  601318
3    2017-06-20  46.451  45.812  46.603  45.403   616355.0  601318
4    2017-06-21  46.003  47.079  47.203  45.298   849757.0  601318
..          ...     ...     ...     ...     ...        ...     ...
635  2020-01-17  86.150  86.250  86.900  85.850   555370.0  601318
636  2020-01-20  88.300  87.600  88.700  87.350   936050.0  601318
637  2020-01-21  87.000  85.600  87.290  85.600   727579.0  601318
638  2020-01-22  85.000  85.220  85.480  83.830   736576.0  601318
639  2020-01-23  84.010  83.490  84.560  82.480  1080020.0  601318
"""

1、參數說明

  code:股票代碼,即六位數字代碼,或者指數代碼(sh:上證指數,sz:深圳指數,hs300:滬深300指數,sz50:上證50,zxb:中小板,cyb:創業板)

  start:開始日期,格式YYYY-MM-DD

  end:結束日期,格式YYYY-MM-DD

  ktype:數據類型,(D:日k線,W:周k線,M:月,5:5分鍾,15:15分鍾,30:30分鍾,60:60分鍾,默認為D)

  retry_count:當網絡異常后重試次數,默認為3

  pause:重復請求數據過程中暫停的秒數,防止請求間隔時間太短出現的問題,默認為0

  autype:復權類型,qfq-前復權,hfq-后復權,None-不復權,默認為qfq

  index:是否為指數,設置為True時認為code為指數代碼,默認為False

2、返回值說明

  data:日期

  volume:成交量    turnover:換手率(指數無此項)

  open:開盤價    close:收盤價

  high:最高價     low:最低價

  price_change:價格變動    p_change:漲跌幅

  ma5:5日均價    ma10:10日均價    ma20:20日均價

  v_ma5:5日均量    v_ma10:10日均量    v_ma20:20日均量

3、用index指定指數代碼

  設置為True時認定為指數代碼。

import tushare as ts

df = ts.get_k_data("000016", index=True)
print(df)

"""
           date     open    close     high      low      volume      code
0    2017-06-15  2474.26  2461.97  2481.80  2453.13  20702545.0  sh000016
1    2017-06-16  2454.84  2452.79  2466.69  2448.31  16518044.0  sh000016
2    2017-06-19  2455.03  2484.12  2486.31  2453.35  20594004.0  sh000016
3    2017-06-20  2489.20  2474.43  2492.22  2467.77  17771153.0  sh000016
4    2017-06-21  2487.85  2497.25  2498.19  2468.51  20354217.0  sh000016
..          ...      ...      ...      ...      ...         ...       ...
635  2020-01-17  3054.04  3053.17  3067.56  3042.59  23304514.0  sh000016
636  2020-01-20  3070.67  3065.99  3072.29  3054.45  27274849.0  sh000016
637  2020-01-21  3048.95  3012.11  3050.82  3011.18  32801291.0  sh000016
638  2020-01-22  2996.81  3017.88  3023.90  2965.66  33159760.0  sh000016
639  2020-01-23  2993.77  2932.49  2993.77  2910.39  42839352.0  sh000016
"""

三、復權數據

1、復權概念

  復權就是對股價和成交量進行權息修復,按照股票的實際漲跌繪制股價走勢圖,並把成交量調整為相同的股本口徑,然后用相同成本進行比較。復權可以消除由於除權除息造成的價格走勢畸變,保持股價走勢的連續性。

  不復權就是除權后,不人工填補股價走勢圖上的巨大空隙,任由斷層存在。

  前復權就是以目前股價為基准,保持現有價位不變,縮減以前價格,把除權前的 K 線向下平移,使圖形吻合,保持股價走勢的連續性。簡單說就是把除權前的價格按現在的價格換算過來,復權后現在價格不變,以前的價格減少。

    前復權公式:復權后價格 = ( 復權前價格 - 現金紅利 ) / ( 1+ 流通股份變動比例 )

  后復權是指在 K 線圖上以除權前的價格為基准來測算除權后股票的市場成本價。簡單說就是把除權后的價格按以前的價格換算過來,復權后以前的價格不變,現在的價格增加。通過后復權我們可以看出該股上市以來累計漲幅,如果當時買入,參與全部配送、分紅,一直持有到目前的價位。

    后復權公式:復權后價格 = 復權前價格 × ( 1+ 流通股份變動比例 ) + 現金紅利

2、查看個股上市日期

import tushare as ts

df = ts.get_stock_basics()
date = df.ix['600848']['timeToMarket']
print(date)   # 19940324

3、獲取個股復權數據

import tushare as ts

# 獲取個股復權數據
df1 = ts.get_k_data('002337')    # 前復權
print(df1)
"""
           date   open  close   high    low   volume    code
0    2017-06-15  5.884  5.953  5.973  5.834  38690.0  002337
1    2017-06-16  5.953  5.963  5.973  5.913  21518.0  002337
2    2017-06-19  5.933  5.983  5.993  5.933  23512.0  002337
3    2017-06-20  6.003  5.953  6.003  5.943  27808.0  002337
4    2017-06-21  5.953  5.953  6.023  5.884  25967.0  002337
..          ...    ...    ...    ...    ...      ...     ...
635  2020-01-17  3.730  3.660  3.730  3.660  29073.0  002337
636  2020-01-20  3.650  3.660  3.690  3.620  23381.0  002337
637  2020-01-21  3.660  3.610  3.670  3.610  23591.0  002337
638  2020-01-22  3.600  3.610  3.630  3.520  32295.0  002337
639  2020-01-23  3.610  3.500  3.650  3.400  42815.0  002337
"""

df2 = ts.get_k_data('002337', autype='hfq')    # 后復權
print(df2)
"""
           date    open   close    high     low   volume    code
0    2017-06-15  30.589  30.952  31.056  30.330  38690.0  002337
1    2017-06-16  30.952  31.004  31.056  30.745  21518.0  002337
2    2017-06-19  30.849  31.108  31.160  30.849  23512.0  002337
3    2017-06-20  31.211  30.952  31.211  30.900  27808.0  002337
4    2017-06-21  30.952  30.952  31.315  30.589  25967.0  002337
..          ...     ...     ...     ...     ...      ...     ...
635  2020-01-17  19.393  19.029  19.393  19.029  29073.0  002337
636  2020-01-20  18.977  19.029  19.185  18.821  23381.0  002337
637  2020-01-21  19.029  18.769  19.081  18.769  23591.0  002337
638  2020-01-22  18.717  18.769  18.873  18.301  32295.0  002337
639  2020-01-23  18.769  18.197  18.977  17.677  42815.0  002337
"""

df3 = ts.get_k_data('002337', autype=None)     # 不復權
print(df3)
"""
           date  open  close  high   low   volume    code
0    2017-06-15  5.90   5.97  5.99  5.85  38690.0  002337
1    2017-06-16  5.97   5.98  5.99  5.93  21518.0  002337
2    2017-06-19  5.95   6.00  6.01  5.95  23512.0  002337
3    2017-06-20  6.02   5.97  6.02  5.96  27808.0  002337
4    2017-06-21  5.97   5.97  6.04  5.90  25967.0  002337
..          ...   ...    ...   ...   ...      ...     ...
635  2020-01-17  3.73   3.66  3.73  3.66  29073.0  002337
636  2020-01-20  3.65   3.66  3.69  3.62  23381.0  002337
637  2020-01-21  3.66   3.61  3.67  3.61  23591.0  002337
638  2020-01-22  3.60   3.61  3.63  3.52  32295.0  002337
639  2020-01-23  3.61   3.50  3.65  3.40  42815.0  002337
"""

df4 = ts.get_k_data('002337', start='2015-01-01', end='2015-03-16')   # 兩個日期間前復權數據
print(df4)
"""
          date    open   close    high     low     volume    code
0   2015-01-05   8.677   8.744   9.475   8.644   117051.0  002337
1   2015-01-06   8.385   9.153   9.309   8.182   142634.0  002337
2   2015-01-07   9.060   9.718  10.067   8.711   235935.0  002337
3   2015-01-08   9.342   9.406   9.715   9.246   128256.0  002337
..         ...     ...     ...     ...     ...        ...     ...
41  2015-03-10  13.123  13.552  13.632  12.684  1057530.0  002337
42  2015-03-11  13.313  13.113  13.442  12.964   591102.0  002337
43  2015-03-12  13.253  13.243  13.911  12.924   715057.0  002337
44  2015-03-13  13.004  13.333  13.343  12.964   405488.0  002337
45  2015-03-16  13.233  13.353  13.412  12.964   812129.0  002337
"""

四、大盤指數行情列表

  獲取大盤指數實時行情列表,以表格的形式展示大盤指數實時行情。

1、調用方法

import tushare as ts

df = ts.get_index()
print(df)

2、返回值說明

  code:指數代碼

  name:指數名稱

  change:漲跌幅

  open:開盤點位

  preclose:昨天收盤點位

  close:收盤點位

  high:最高點位

  low:最低點位

  volume:成交量(手)

  amount:成教金額(億元)

3、調用結果顯示

      code    name  change  ...         low       volume     amount
0   000001    上證指數   -2.75  ...   2955.3460    272763234  3274.9036
1   000002    A股指數   -2.75  ...   3096.7191    272375143  3272.4163
2   000003    B股指數   -3.47  ...    246.4306       388091     2.4873
3   000008    綜合指數   -2.51  ...   2834.5232     61940755   716.1844
4   000009   上證380   -3.43  ...   4770.1956     57463666   700.2298
5   000010   上證180   -2.90  ...   8513.7663     97054465  1428.8354
..          ...             ...        ...  ...                ...                  ...           ...
16  399005    中小板指   -3.31  ...   6944.9460   4628035966   830.3480
17  399006    創業板指   -3.32  ...   1904.2750  11576635669  1710.6619
18  399008   中小300   -3.43  ...   1321.9150   9981028403  1409.6974
19  399100   新 指 數   -3.49  ...   7974.4380  39492412447  4787.0620
20  399101    中小板綜   -3.30  ...   9899.0470  17783593837  2065.2582
21  399106    深證綜指   -3.45  ...   1740.1390  40289425936  4815.4754
22  399107    深證A指   -3.45  ...   1820.2840  40248235084  4813.7496
23  399108    深證B指   -2.26  ...    963.9610     41190852     1.7258
24  399333    中小板R   -3.31  ...   7818.6200   4628035966   830.3480
25  399606    創業板R   -3.32  ...   2008.9970   3195889692   672.5783

五、數據存儲 

  數據存儲模塊主要是引導用戶將數據保存在本地磁盤或數據庫服務器中,便於后期量化分析和回測使用。

  在以文件格式保存在電腦磁盤的方式上,調用的是pandas本身自帶的方法。

1、CSV文件

  pandas的DataFrame和Series對象提供了直接保存csv文件格式的方法,通過參數設定,輕松將數據內容保存在本地磁盤。

(1)保存csv文件示例

import tushare as ts

# 保存為csv文件
df = ts.get_k_data("000875")

# 直接保存
df.to_csv('000875.csv')
# 選擇保存
df.to_csv('000875.csv', columns=['open', 'high', 'low', 'close'])

  直接保存,保存效果如下所示:

  

  選擇保存,覆蓋直接保存內容,保存效果如下所示:

  

(2)追加數據示例

  在需要將同類數據保存在一個大文件時,需要將數據追加到同一個文件內:

import tushare as ts
import os

filename = '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進去。

(3)參數說明

  path_or_buf:csv文件存放路徑或StringIO對象

  sep:文件內容分隔符,默認為逗號

  na_rep:在遇到NaN值時保存為某字符,默認為'   '空字符

  float_format:float類型的格式

  columns:需要保持的列,默認為None

  header:是否保存columns名,默認為True

  index:是否保存index,默認為True

  mode:創建新文件還是追加到現有文件,默認為新建

  encoding:文件編碼格式

  date_format:日期格式

2、Excel文件

  pandas將數據保存為MicroSoft Excel文件格式。

(1)調用示例

import tushare as ts

df = ts.get_hist_data('000875')
#直接保存
df.to_excel('000875.xlsx')

#設定數據位置(從第3行,第6列開始插入數據)
# df.to_excel('000875.xlsx', startrow=2,startcol=5)

(2)參數說明

  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列空列

3、其他存儲類型

  pandas利用PyTables包將數據保存為HDF5格式的文件。需要確認的是,運行時PyTables包的版本需要 >=3.0.0。

  pandas生成Json格式的文件或字符串。

  pandas提供了將數據便捷存入關系型數據庫的方法,在新版的pandas中,主要是已sqlalchemy方式與數據建立連接,支持MySQL、Postgresql、Oracle、MS SQLServer、SQLite等主流數據庫。

  參數和使用方法見:http://tushare.org/storing.html

六、股票分析練習

(1)獲取某股票的歷史行情數據

import tushare as ts
import pandas as pd

ts.get_k_data("600570", start="2004-01-30").to_csv('600570.csv')
# pandas讀取文件,date列作為索引和時間對象,且僅保留骨架四列
df = pd.read_csv('600570.csv', index_col="date", parse_dates=['date'])[['open', 'close', 'high', 'low']]

(2)輸出該股票所有收盤比開盤上漲3%以上的日期

res = df[(df['close']-df['open'])/df['open']>=0.03].index
print(res)
"""
DatetimeIndex(['2004-02-03', '2004-02-16', '2004-03-30', '2004-04-08',
               '2004-04-27', '2004-05-12', '2004-05-18', '2004-05-31',
               '2004-06-01', '2004-06-21',
               ...
               '2019-07-23', '2019-08-15', '2019-08-19', '2019-08-27',
               '2019-09-02', '2019-10-25', '2019-12-10', '2019-12-30',
               '2020-01-17', '2020-01-22'],
              dtype='datetime64[ns]', name='date', length=592, freq=None)
"""

(3)輸出該股票所有開盤比前日收盤跌幅超過2%的日期

# shift:對某一列進行向上或向下平移
res_2 = df[(df['open']-df['close'].shift(1))/df['close'].shift(1) <= -0.02].index
print(res_2)
"""
DatetimeIndex(['2004-04-12', '2004-04-27', '2004-07-05', '2004-07-06',
               '2004-10-29', '2004-12-13', '2004-12-15', '2005-04-27',
               '2005-04-28', '2005-07-12',
               ...
               '2019-03-08', '2019-03-25', '2019-04-09', '2019-05-06',
               '2019-05-08', '2019-05-15', '2019-08-02', '2019-08-06',
               '2019-08-15', '2019-08-26'],
              dtype='datetime64[ns]', name='date', length=197, freq=None)
"""

(4)假如我從2010年1月1日開始,每月第一個交易日買入1手股票,每年最后一個交易日賣出所有股票,到今天為止,我的收益如何?

df = df["2010-01-01":]    # 剔除無用數據
# Pandas中的resample,重新采樣,是對原樣本重新處理的一個方法,是一個對常規時間序列數據重新采樣和頻率轉換的便捷的方法。
df_monthly = df.resample('M').first()    # 每個月第一個交易日的行情
# print(df_monthly['2011'])              # 這樣可以切出2011年的數據
df_yearly = df.resample('A').last()      # 每年最后一個交易日的行情

cost_money = 0   #
hold = 0    # 股票
for year in range(2010, 2021):    # 2010年到2020年
    cost_money += df_monthly[str(year)]['open'].sum() * 100   # 對應年每個月首個交易日開盤價之和  乘以 100  得到當年消費的錢
    hold += len(df_monthly[str(year)]['open']) * 100       # 對應年購買的股票數量總和
    if year != 2020:    # 現在是2020年2月,需刨去2020年
        cost_money -= df_yearly[str(year)]['open'][0] * hold     # 每年最后一個交易日賣出得到的錢
        hold = 0    # 股票清零

price_last = df['open'][-1]        # 當前最后一日開盤價
cost_money -= hold * price_last    # 花掉的錢應刨去手里最后持有的股票價值
if cost_money >= 0:
    print("掙了", cost_money)
else:
    print("虧了", cost_money)
"""
虧了 -11591.099999999977
"""

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM