博客:https://www.cnblogs.com/DreamRJF/p/8660630.html
以前不知道怎么从网上直接获取数据,都是从交易软件上下载数据,也只有个别的软件才能下载,例如通达信可以导出数据,现在学到了一种新的方法,利用tushare可以获取金融数据,这里就简单的分享一下股票数据的获取方法。
Tushare是一个免费、开源的python财经数据接口包。主要实现对股票等金融数据从数据采集、清洗加工 到 数据存储的过程,能够为金融分析人员提供快速、整洁、和多样的便于分析的数据,为他们在数据获取方面极大地减轻工作量,使他们更加专注于策略和模型的研究与实现上。考虑到Python pandas包在金融量化分析中体现出的优势,Tushare返回的绝大部分的数据格式都是pandas DataFrame类型,非常便于用pandas/NumPy/Matplotlib进行数据分析和可视化。当然,如果您习惯了用Excel或者关系型数据库做分析,您也可以通过Tushare的数据存储功能,将数据全部保存到本地后进行分析。应一些用户的请求,从0.2.5版本开始,Tushare同时兼容Python 2.x和Python 3.x,对部分代码进行了重构,并优化了一些算法,确保数据获取的高效和稳定。
不管你是量化投资分析师,还是正在学习Python进行数据分析的学习者,这种方法获取的数据都可以适用。
一、获取前的准备
1、安装Python,这个不再赘述,Python官网下载安装适合自己计算机的版本。
2、安装pandas,我是直接安装的Anaconda,包含有pandas,很实用,建议安装Anaconda,下载地址:https://www.anaconda.com/download/ ,选择适合的版本安装。
3、Tushare的下载安装,下载地址:https://pypi.python.org/pypi/tushare ,下载完之后解压即可,无需安装。
二、获取数据
1、获取历史行情数据 get_hist_data()
获取个股历史交易数据(包括均线数据),可以通过参数设置获取日k线、周k线、月k线,以及5分钟、15分钟、30分钟和60分钟k线数据。本接口只能获取近3年的日线数据,适合搭配均线数据进行选股和分析。
参数说明:
- 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('300274') print(data)
需要注意的是路径要在tushare文件下,否则会报错。
执行结果:
View Code
获取某一时间段的历史数据
import tushare as ts data=ts.get_hist_data('300274',start='2017-01-01',end='2018-03-27') print(data)
执行结果:
View Code
另外一个获取历史数据的函数get_h_data()。
import tushare as ts data=ts.get_h_data('300274') print(data)
执行结果:
View Code
在不指定开始时间和结束时间时,该函数默认返回最近一年的日线数据,返回的数据与get_hist_data不同的是,该函数只返回开盘价(open)、最高价(high)、收盘价(close)、最低价(low)、成交量(volume)、成交金额(amount)六列 ,同样加上时间段也可以获取相应数据。
第三个获取历史数据的函数get_k_data()。
import tushare as ts data=ts.get_k_data('300274') print(data)
执行结果:
View Code
与前两个函数相比,这个函数获取数据的速度很明显要快很多,而且可以返回每一只股票从上市开始到当前交易日的所有日线数据,这个有点是前两个函数都不具备的,更重要的是,如果批量3000多只股票的数据,前两个都不如get_k_data()稳定。
其他:
ts.get_hist_data('600848', ktype='W') #获取周k线数据 ts.get_hist_data('600848', ktype='M') #获取月k线数据 ts.get_hist_data('600848', ktype='5') #获取5分钟k线数据 ts.get_hist_data('600848', ktype='15') #获取15分钟k线数据 ts.get_hist_data('600848', ktype='30') #获取30分钟k线数据 ts.get_hist_data('600848', ktype='60') #获取60分钟k线数据 ts.get_hist_data('sh')#获取上证指数k线数据,其它参数与个股一致,下同 ts.get_hist_data('sz')#获取深圳成指k线数据 ts.get_hist_data('hs300')#获取沪深300指数k线数据 ts.get_hist_data('sz50')#获取上证50指数k线数据 ts.get_hist_data('zxb')#获取中小板指数k线数据 ts.get_hist_data('cyb')#获取创业板指数k线数据
2、获取实时行情数据get_today_all()
返回值说明:
- code:代码
- name:名称
- changepercent:涨跌幅
- trade:现价
- open:开盘价
- high:最高价
- low:最低价
- settlement:昨日收盘价
- volume:成交量
- turnoverratio:换手率
- amount:成交量
- per:市盈率
- pb:市净率
- mktcap:总市值
- nmc:流通市值
import tushare as ts ts.get_today_all()
执行结果:
View Code
一次性获取当前交易所有股票的行情数据(如果是节假日,即为上一交易日)
3、获取历史分笔数据之:get_tick_data()
获取个股以往交易历史的分笔数据明细,通过分析分笔数据,可以大致判断资金的进出情况。在使用过程中,对于获取股票某一阶段的历史分笔数据,需要通过加入交易日参数并append到一个DataFrame或者直接append到本地同一个文件里。历史分笔接口只能获取当前交易日之前的数据,当日分笔历史数据请调用get_today_ticks()接口或者在当日18点后通过本接口获取。
参数说明:
- code:股票代码,即6位数字代码
- date:日期,格式YYYY-MM-DD
- retry_count : int, 默认3,如遇网络等问题重复执行的次数
- pause : int, 默认 0,重复请求数据过程中暂停的秒数,防止请求间隔时间太短出现的问题
使用方法:
import tushare as ts df=ts.get_tick_data('300274',date='2018-03-27') df.head(10) #距离执行时间最近的十笔交易
执行结果:
time price change volume amount type 0 15:00:03 18.46 -- 2373 4380761 卖盘 1 14:57:03 18.46 -0.01 188 347048 卖盘 2 14:57:00 18.47 -0.01 42 77574 卖盘 3 14:56:57 18.48 -- 644 1190112 买盘 4 14:56:54 18.48 0.01 80 147840 买盘 5 14:56:51 18.47 0.01 9 16623 中性盘 6 14:56:48 18.46 -0.02 38 70148 卖盘 7 14:56:45 18.48 0.01 25 46200 买盘 8 14:56:42 18.47 -- 87 160689 买盘 9 14:56:36 18.47 -- 82 151454 买盘
获取当日历史分笔数据:get_today_ticks()
获取当前交易日(交易进行中使用)已经产生的分笔明细数据。
参数说明:
- code:股票代码,即6位数字代码
- retry_count : int, 默认3,如遇网络等问题重复执行的次数
- pause : int, 默认 0,重复请求数据过程中暂停的秒数,防止请求间隔时间太短出现的问题
返回值说明:
- time:时间
- price:当前价格
- pchange:涨跌幅
- change:价格变动
- volume:成交手
- amount:成交金额(元)
- type:买卖类型【买盘、卖盘、中性盘】
使用方法:
import tushare as ts df = ts.get_today_ticks('300274') #当日的历史分笔数据 df.head(10) #距离执行时间最近的10笔
执行结果:
[Getting data:]###########################################Out[6]: time price pchange change volume amount type 0 13:32:15 18.68 +1.19 -0.01 1 1868 买盘 1 13:32:12 18.69 +1.25 0.00 8 14952 买盘 2 13:32:06 18.69 +1.25 0.01 1 1869 买盘 3 13:32:03 18.68 +1.19 0.00 19 35492 卖盘 4 13:31:51 18.68 +1.19 0.00 8 14944 买盘 5 13:31:48 18.68 +1.19 0.01 14 26152 买盘 6 13:31:45 18.67 +1.14 -0.01 30 56010 卖盘 7 13:31:42 18.68 +1.19 0.01 8 14944 买盘 8 13:31:36 18.67 +1.14 0.00 14 26138 卖盘 9 13:31:33 18.67 +1.14 -0.01 10 18670 卖盘
4、获取实时分笔数据之:get_realtime_quotes()
获取实时分笔数据,可以实时取得股票当前报价和成交信息,其中一种场景是,写一个python定时程序来调用本接口(可两三秒执行一次,性能与行情软件基本一致),然后通过DataFrame的矩阵计算实现交易监控,可实时监测交易量和价格的变化。
参数说明:
- symbols:6位数字股票代码,或者指数代码(sh=上证指数 sz=深圳成指 hs300=沪深300指数 sz50=上证50 zxb=中小板 cyb=创业板) 可输入的类型:str、list、set或者pandas的Series对象
返回值说明:
0:name,股票名字 1:open,今日开盘价 2:pre_close,昨日收盘价 3:price,当前价格 4:high,今日最高价 5:low,今日最低价 6:bid,竞买价,即“买一”报价 7:ask,竞卖价,即“卖一”报价 8:volume,成交量 maybe you need do volume/100 9:amount,成交金额(元 CNY) 10:b1_v,委买一(笔数 bid volume) 11:b1_p,委买一(价格 bid price) 12:b2_v,“买二” 13:b2_p,“买二” 14:b3_v,“买三” 15:b3_p,“买三” 16:b4_v,“买四” 17:b4_p,“买四” 18:b5_v,“买五” 19:b5_p,“买五” 20:a1_v,委卖一(笔数 ask volume) 21:a1_p,委卖一(价格 ask price) ... 30:date,日期; 31:time,时间;
使用方法:
import tushare as ts df = ts.get_realtime_quotes('300274') #单个股票实时行情 df[['code','name','price','bid','ask','volume','amount','time']] #需要显示的属性
执行结果:
code name price bid ask volume amount time 0 300274 阳光电源 18.780 18.750 18.770 17003279 318581216.230 13:16:06
多只股票的实时分笔数据(最好不要超过30):
import tushare as ts df = ts.get_realtime_quotes(['600460','000762','000725']) df[['code','name','price','bid','ask','volume','amount','time']]
获取实时指数:
ts.get_realtime_quotes('sh') #上证指数ts.get_realtime_quotes(['sh','sz','hs300','sz50','zxb','cyb']) #上证指数 深圳成指 沪深300指数 上证50 中小板 创业板ts.get_realtime_quotes(['sh','600848']) #或者混搭
大盘指数行情列表:
获取大盘指数实时行情列表,以表格的形式展示大盘指数实时行情。
返回值说明:
- code:指数代码
- name:指数名称
- change:涨跌幅
- open:开盘点位
- preclose:昨日收盘点位
- close:收盘点位
- high:最高点位
- low:最低点位
- volume:成交量(手)
- amount:成交金额(亿元)
使用方法:
import tushare as ts df = ts.get_index() print(df)
执行结果:
View Code
5、获取大单交易数据
获取大单交易数据,默认为大于等于400手,数据来源于新浪财经。
参数说明:
- code:股票代码,即6位数字代码
- date:日期,格式YYYY-MM-DD
- vol:手数,默认为400手,输入数值型参数
- retry_count : int, 默认3,如遇网络等问题重复执行的次数
- pause : int, 默认 0,重复请求数据过程中暂停的秒数,防止请求间隔时间太短出现的问题
返回值说明:
- code:代码
- name:名称
- time:时间
- price:当前价格
- volume:成交手
- preprice :上一笔价格
- type:买卖类型【买盘、卖盘、中性盘】
使用方法:
import tushare as ts df = ts.get_sina_dd('300274', date='2018-03-28') #默认400手 #df = ts.get_sina_dd('300274', date='2018-03-28', vol=500) #指定大于等于500手的数据 print(df)
执行结果:
View Code
6、数据的存储
数据存储模块主要是引导用户将数据保存在本地磁盘或数据库服务器上,便于后期的量化分析和回测使用,在以文件格式保存在电脑磁盘的方式上,调用的是pandas本身自带的方法,此处会罗列常用的参数和说明。
保存为CSV格式文件
pandas的DataFrame和Series对象提供了直接保存csv文件格式的方法,通过参数设定,轻松将数据内容保存在本地磁盘。
常用参数说明:
- path_or_buf: csv文件存放路径或者StringIO对象
- sep : 文件内容分隔符,默认为,逗号
- na_rep: 在遇到NaN值时保存为某字符,默认为’‘空字符
- float_format: float类型的格式
- columns: 需要保存的列,默认为None
- header: 是否保存columns名,默认为True
- index: 是否保存index,默认为True
- mode : 创建新文件还是追加到现有文件,默认为新建
- encoding: 文件编码格式
- date_format: 日期格式
注:在设定path时,如果目录不存在,程序会提示IOError,请先确保目录已经存在于磁盘中。
使用方法:
import tushare as ts df = ts.get_hist_data('300274') #直接保存 df.to_csv('C:/Users/07010018/Desktop/tushare-1.1.6/exportdata/300274.csv') #选择保存 #df.to_csv('C:/Users/07010018/Desktop/tushare-1.1.6/exportdata/300274.csv',columns=['open','high','low','close'])
追加数据的方式:
某些时候,可能需要将一些同类数据保存在一个大文件中,这时候就需要将数据追加在同一个文件里,简单举例如下:
import tushare as ts import osfilename = 'c:/day/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进去】
保存为Excel格式文件
pandas将数据保存为MicroSoft Excel文件格式。
常用参数说明:
- 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列空列
使用方法:
import tushare as ts df = ts.get_hist_data('300274') #直接保存 df.to_excel('C:/Users/07010018/Desktop/tushare-1.1.6/exportdata/300274.xlsx')#设定数据位置(从第3行,第6列开始插入数据) #df.to_excel('C:/Users/07010018/Desktop/tushare-1.1.6/exportdata/300274.xlsx', startrow=2,startcol=5)
保存为MySQL数据库
pandas提供了将数据便捷存入关系型数据库的方法,在新版的pandas中,主要是已sqlalchemy方式与数据建立连接,支持MySQL、Postgresql、Oracle、MS SQLServer、SQLite等主流数据库。本例以MySQL数据库为代表,展示将获取到的股票数据存入数据库的方法,其他类型数据库请参考sqlalchemy官网文档的create_engine部分。
常用参数说明:
- name:表名,pandas会自动创建表结构
- con:数据库连接,最好是用sqlalchemy创建engine的方式来替代con
- flavor:数据库类型 {‘sqlite’, ‘mysql’}, 默认‘sqlite’,如果是engine此项可忽略
- schema:指定数据库的schema,默认即可
- if_exists:如果表名已存在的处理方式 {‘fail’, ‘replace’, ‘append’},默认‘fail’
- index:将pandas的Index作为一列存入数据库,默认是True
- index_label:Index的列名
- chunksize:分批存入数据库,默认是None,即一次性全部写人数据库
- dtype:设定columns在数据库里的数据类型,默认是None
使用方法:
from sqlalchemy import create_engine import tushare as tsdf = ts.get_tick_data('300274', date='2018-03-27') engine = create_engine('mysql://user:passwd@127.0.0.1/db_name?charset=utf8')#存入数据库 df.to_sql('tick_data',engine)#追加数据到现有表 #df.to_sql('tick_data',engine,if_exists='append')
另外,数据也可以保存为HDF5格式,JSON格式,存入NoSQL数据库,这里就不在一一赘述,就简单介绍几种常用的。
所有内容,仅作参考,可能有不足或错误之处,欢迎留言批评指正