一、Tushare介绍
Tushare是一个免费、开源的python财经数据接口包。主要实现对股票等金融数据从数据采集、清洗加工到数据存储的过程,能够为金融分析人员提供快速、整洁、多样的便于分析的数据,使得数据获取方面极大地减轻工作量,更加专注于策略和模型的研究和实现。
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 """