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
"""

 

posted @ 2020-01-26 00:02  休耕  阅读(2320)  评论(0编辑  收藏  举报