囧芝麻 2020-01-25
Tushare是一个免费、开源的python财经数据接口包。主要实现对股票等金融数据从数据采集、清洗加工到数据存储的过程,能够为金融分析人员提供快速、整洁、多样的便于分析的数据,使得数据获取方面极大地减轻工作量,更加专注于策略和模型的研究和实现。
Tushare从新浪财经、腾讯财经、上交所、深交所获取数据。
安装python、安装pandas包、安装lxml包、bs4包、requests包。环境如下所示:

# 方法一: pip install tushare # 方法二: 访问https://pypi.python.org/pypi/Tushare
# 版本更新 pip install tushare --update # 检查版本信息 print(tushare.__version__)
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
"""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
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日均量
设置为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
"""复权就是对股价和成交量进行权息修复,按照股票的实际涨跌绘制股价走势图,并把成交量调整为相同的股本口径,然后用相同成本进行比较。复权可以消除由于除权除息造成的价格走势畸变,保持股价走势的连续性。
不复权就是除权后,不人工填补股价走势图上的巨大空隙,任由断层存在。
前复权就是以目前股价为基准,保持现有价位不变,缩减以前价格,把除权前的 K 线向下平移,使图形吻合,保持股价走势的连续性。简单说就是把除权前的价格按现在的价格换算过来,复权后现在价格不变,以前的价格减少。
前复权公式:复权后价格 = ( 复权前价格 - 现金红利 ) / ( 1+ 流通股份变动比例 )
后复权是指在 K 线图上以除权前的价格为基准来测算除权后股票的市场成本价。简单说就是把除权后的价格按以前的价格换算过来,复权后以前的价格不变,现在的价格增加。通过后复权我们可以看出该股上市以来累计涨幅,如果当时买入,参与全部配送、分红,一直持有到目前的价位。
后复权公式:复权后价格 = 复权前价格 × ( 1+ 流通股份变动比例 ) + 现金红利
import tushare as ts df = ts.get_stock_basics() date = df.ix[‘600848‘][‘timeToMarket‘] print(date) # 19940324
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
"""获取大盘指数实时行情列表,以表格的形式展示大盘指数实时行情。
import tushare as ts df = ts.get_index() print(df)
code:指数代码
name:指数名称
change:涨跌幅
open:开盘点位
preclose:昨天收盘点位
close:收盘点位
high:最高点位
low:最低点位
volume:成交量(手)
amount:成教金额(亿元)
code name change ... low volume amount 上证指数 -2.75 ... 2955.3460 272763234 3274.9036 A股指数 -2.75 ... 3096.7191 272375143 3272.4163 B股指数 -3.47 ... 246.4306 388091 2.4873 综合指数 -2.51 ... 2834.5232 61940755 716.1844 上证380 -3.43 ... 4770.1956 57463666 700.2298 上证180 -2.90 ... 8513.7663 97054465 1428.8354 .. ... ... ... ... ... ... ... 中小板指 -3.31 ... 6944.9460 4628035966 830.3480 创业板指 -3.32 ... 1904.2750 11576635669 1710.6619 中小300 -3.43 ... 1321.9150 9981028403 1409.6974 新 指 数 -3.49 ... 7974.4380 39492412447 4787.0620 中小板综 -3.30 ... 9899.0470 17783593837 2065.2582 深证综指 -3.45 ... 1740.1390 40289425936 4815.4754 深证A指 -3.45 ... 1820.2840 40248235084 4813.7496 深证B指 -2.26 ... 963.9610 41190852 1.7258 中小板R -3.31 ... 7818.6200 4628035966 830.3480 创业板R -3.32 ... 2008.9970 3195889692 672.5783
数据存储模块主要是引导用户将数据保存在本地磁盘或数据库服务器中,便于后期量化分析和回测使用。
在以文件格式保存在电脑磁盘的方式上,调用的是pandas本身自带的方法。
pandas的DataFrame和Series对象提供了直接保存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‘])直接保存,保存效果如下所示:

选择保存,覆盖直接保存内容,保存效果如下所示:

在需要将同类数据保存在一个大文件时,需要将数据追加到同一个文件内:
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进去。
path_or_buf:csv文件存放路径或StringIO对象
sep:文件内容分隔符,默认为逗号
na_rep:在遇到NaN值时保存为某字符,默认为‘ ‘空字符
float_format:float类型的格式
columns:需要保持的列,默认为None
header:是否保存columns名,默认为True
index:是否保存index,默认为True
mode:创建新文件还是追加到现有文件,默认为新建
encoding:文件编码格式
date_format:日期格式
pandas将数据保存为MicroSoft Excel文件格式。
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)
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列空列
pandas利用PyTables包将数据保存为HDF5格式的文件。需要确认的是,运行时PyTables包的版本需要 >=3.0.0。
pandas生成Json格式的文件或字符串。
pandas提供了将数据便捷存入关系型数据库的方法,在新版的pandas中,主要是已sqlalchemy方式与数据建立连接,支持MySQL、Postgresql、Oracle、MS SQLServer、SQLite等主流数据库。
参数和使用方法见:http://tushare.org/storing.html