Tushare介绍
金融学专业的学生,或者将来有志于从事金融行业的人,必不可少的一项技能就是获取和分析数据。一般的选择是wind
,但是万德是真的贵,穷学生是真的用不起。前几天我发现了Tushare
,它是一个免费开放的金融数据平台,通过api接口可以方便地调用各类金融数据,再利用python
、matlab
等工具进行处理和分析。最重要的是免费开源,而且提供的数据种类也足够多!列一下数据接口:
[collapse title="数据种类" status="false"]
[/collapse]
除此之外,Tushare
还提供了区块链相关数据接口,在此不列了,有兴趣可以自己去网站查看。
为了避免接口被滥用,调用api是有积分限制的,但是可以通过各种方式免费获得,比如注册就送100积分,推荐有效新用户50积分(无上限),写文章推荐Tushare送100-1000积分,回答其他用户问题送50~200分……如果你是高校学生或机构人员,还可以加高校和机构用户群:885229735
,私聊群主认证后送积分。如果你懒得做任务或者加群,可以直接捐赠获得相应积分,一般来说足够获取绝大部分提供的数据了。除此之外,旧版没有任何限制,你也可以尝试旧版。
旧版与新版有什么区别呢?旧版基于爬虫,很多时候受到网速限制,如果原网页封了爬虫的ip,那么你获得的数据很有可能会缺失。新版数据都存在自己的服务器上,稳定性大幅提升。
惯例先放一个我的邀请链接:https://tushare.pro/register?reg=306588 ,大家走链接注册可以帮我获得50积分。
使用
下载安装
我用的是python3.6.5
,所以接下来的教程均是基于python,建议下载Anaconda
,这是一个集成了多个科学计算包,同时可以很方便地进行包管理和环境管理的python发行版本。
下载后调出cmd
用pip
直接安装。
如果网速过慢安装失败,可以下载whl离线包,切换到下载目录然后pip install XXX.whl
(即离线包的文件名)即可。
pip install tushare # 安装
pip install tushare --upgrade # 升级
如果你非要装原版,也可以,但是一定要装pandas
包,它是处理dataframes
格式数据必备工具,Tushare
的数据类型就是dataframes
。如果你想要了解更多处理数据的方法,可以参考官方文档
获取token
token
是调用api的必不可少的参数,放个官方教程说明如何获取token
1、登录成功后,点击右上角->个人主页
2、 在“用户中心”中点击“接口TOKEN”
3、 可以点击右侧复制按钮复制token
[scode type="yellow"]注意:token是调取数据的唯一凭证,请妥善保管,如发现别人盗用,可在本页面点击“刷新”操作,之前的token将失效。[/scode]
获取数据
import tushare as ts # 导入tushare,版本需大于1.2.10
ts.set_token('your token here') # 设置token
pro = ts.pro_api() # 初始化pro接口,可以传入参数token,就可省略上一句代码
data = pro.stock_basic(exchange='', list_status='L', fields='ts_code,symbol,name,area,industry,list_date') # 列出所有上市公司股票
# 等价于data = pro.query('stock_basic', exchange='', list_status='L', fields='ts_code,symbol,name,area,industry,list_date')
其中,参数fields
是显示模式,也即列出多少指标,这里列出了ts_code
(TS代码),symbol
(股票代码),name
(股票名称),area
(股票地域),industry
(行业),list_date
(上市时间)六项指标。
更多参数参见文档
输出效果如下:
ts_code symbol name area industry list_date
0 000001.SZ 000001 平安银行 深圳 银行 19910403
1 000002.SZ 000002 万科A 深圳 全国地产 19910129
2 000004.SZ 000004 国农科技 深圳 生物制药 19910114
3 000005.SZ 000005 世纪星源 深圳 环境保护 19901210
4 000006.SZ 000006 深振业A 深圳 区域地产 19920427
5 000007.SZ 000007 全新好 深圳 酒店餐饮 19920413
6 000008.SZ 000008 神州高铁 北京 运输设备 19920507
7 000009.SZ 000009 中国宝安 深圳 综合类 19910625
8 000010.SZ 000010 *ST美丽 深圳 建筑工程 19951027
9 000011.SZ 000011 深物业A 深圳 区域地产 19920330
10 000012.SZ 000012 南玻A 深圳 玻璃 19920228
11 000014.SZ 000014 沙河股份 深圳 全国地产 19920602
12 000016.SZ 000016 深康佳A 深圳 家用电器 19920327
13 000017.SZ 000017 深中华A 深圳 文教休闲 19920331
14 000018.SZ 000018 *ST神城 深圳 装修装饰 19920616
15 000019.SZ 000019 深粮控股 深圳 其他商业 19921012
16 000020.SZ 000020 深华发A 深圳 元器件 19920428
17 000021.SZ 000021 深科技 深圳 IT设备 19940202
18 000023.SZ 000023 深天地A 深圳 其他建材 19930429
19 000025.SZ 000025 特力A 深圳 汽车服务 19930621
20 000026.SZ 000026 飞亚达A 深圳 其他商业 19930603
21 000027.SZ 000027 深圳能源 深圳 火力发电 19930903
22 000028.SZ 000028 国药一致 深圳 医药商业 19930809
23 000029.SZ 000029 深深房A 深圳 区域地产 19930915
24 000030.SZ 000030 富奥股份 吉林 汽车配件 19930929
25 000031.SZ 000031 大悦城 深圳 全国地产 19931008
26 000032.SZ 000032 深桑达A 深圳 元器件 19931028
27 000034.SZ 000034 神州数码 深圳 综合类 19940509
28 000035.SZ 000035 中国天楹 江苏 环境保护 19940408
29 000036.SZ 000036 华联控股 深圳 全国地产 19940617
... ... ... ... ... ... ...
3652 688006.SH 688006 杭可科技 浙江 电气设备 20190722
3653 688007.SH 688007 光峰科技 深圳 元器件 20190722
3654 688008.SH 688008 澜起科技 上海 半导体 20190722
3655 688009.SH 688009 中国通号 北京 运输设备 20190722
3656 688010.SH 688010 福光股份 福建 电器仪表 20190722
3657 688011.SH 688011 新光光电 黑龙江 元器件 20190722
3658 688012.SH 688012 中微公司 上海 专用机械 20190722
3659 688015.SH 688015 交控科技 北京 运输设备 20190722
3660 688016.SH 688016 心脉医疗 上海 医疗保健 20190722
3661 688018.SH 688018 乐鑫科技 上海 半导体 20190722
3662 688019.SH 688019 安集科技 上海 半导体 20190722
3663 688020.SH 688020 方邦股份 广东 元器件 20190722
3664 688022.SH 688022 瀚川智能 江苏 专用机械 20190722
3665 688028.SH 688028 沃尔德 北京 专用机械 20190722
3666 688029.SH 688029 南微医学 江苏 医疗保健 20190722
3667 688030.SH 688030 山石网科 江苏 软件服务 20190930
3668 688033.SH 688033 天宜上佳 北京 运输设备 20190722
3669 688036.SH 688036 传音控股 深圳 通信设备 20190930
3670 688066.SH 688066 航天宏图 北京 软件服务 20190722
3671 688068.SH 688068 热景生物 北京 医疗保健 20190930
3672 688088.SH 688088 虹软科技 浙江 软件服务 20190722
3673 688099.SH 688099 晶晨股份 上海 半导体 20190808
3674 688116.SH 688116 天奈科技 江苏 化工原料 20190925
3675 688122.SH 688122 西部超导 陕西 小金属 20190722
3676 688168.SH 688168 安博通 北京 软件服务 20190906
3677 688188.SH 688188 柏楚电子 上海 软件服务 20190808
3678 688321.SH 688321 微芯生物 深圳 化学制药 20190812
3679 688333.SH 688333 铂力特 陕西 机械基件 20190722
3680 688368.SH 688368 晶丰明源 上海 半导体 20191014
3681 688388.SH 688388 嘉元科技 广东 元器件 20190722
如果你需要看全部数据,可以导入到文件中(见数据保存
),或者设置pandas
的显示。
import pandas as pd
pd.set_option('display.max_columns', None) #显示所有列
pd.set_option('display.max_rows', None) #显示所有行
pd.set_option('display.max_rows', 10) # 总共显示10行,中间的省略
数据接口补充
我发现一些数据接口老版有,但新版的文档中却没有,大概有些数据不再更新,所以新版也维护了?总之把这些新版没有的接口列在这儿,方便我进行查阅。
货币市场
存款利率(1989.2-2015.10)
ts.get_deposit_rate()
返回值说明:
- date :变动日期
- deposit_type :存款种类
- rate:利率(%)
贷款利率(1990.8-2015.10)
ts.get_loan_rate()
返回值说明:
- date :执行日期
- loan_type :存款种类
- rate:利率(%)
存款准备金率
ts.get_rrr()
返回值说明:
- date :变动日期
- before :调整前存款准备金率(%)
- now:调整后存款准备金率(%)
- changed:调整幅度(%)
货币供应量
ts.get_money_supply()
返回值说明:
- month :统计时间
- m2 :货币和准货币(广义货币M2)(亿元)
- m2_yoy:货币和准货币(广义货币M2)同比增长(%)
- m1:货币(狭义货币M1)(亿元)
- m1_yoy:货币(狭义货币M1)同比增长(%)
- m0:流通中现金(M0)(亿元)
- m0_yoy:流通中现金(M0)同比增长(%)
- cd:活期存款(亿元)
- cd_yoy:活期存款同比增长(%)
- qm:准货币(亿元)
- qm_yoy:准货币同比增长(%)
- ftd:定期存款(亿元)
- ftd_yoy:定期存款同比增长(%)
- sd:储蓄存款(亿元)
- sd_yoy:储蓄存款同比增长(%)
- rests:其他存款(亿元)
- rests_yoy:其他存款同比增长(%)
货币供应量(年底余额)
ts.get_money_supply_bal()
返回值说明:
- year :统计年度
- m2 :货币和准货币(亿元)
- m1:货币(亿元)
- m0:流通中现金(亿元)
- cd:活期存款(亿元)
- qm:准货币(亿元)
- ftd:定期存款(亿元)
- sd:储蓄存款(亿元)
- rests:其他存款(亿元)
GDP
国内生产总值(年度)
ts.get_gdp_year()
返回值说明:
- year :统计年度
- gdp :国内生产总值(亿元)
- pc_gdp :人均国内生产总值(元)
- gnp :国民生产总值(亿元)
- pi :第一产业(亿元)
- si :第二产业(亿元)
- industry :工业(亿元)
- cons_industry :建筑业(亿元)
- ti :第三产业(亿元)
- trans_industry :交通运输仓储邮电通信业(亿元)
- lbdy :批发零售贸易及餐饮业(亿元)
国内生产总值(季度)(1952-2018.1)
ts.get_gdp_year()
返回值说明:
- year :统计年度
- gdp :国内生产总值(亿元)
- pc_gdp :人均国内生产总值(元)
- gnp :国民生产总值(亿元)
- pi :第一产业(亿元)
- si :第二产业(亿元)
- industry :工业(亿元)
- cons_industry :建筑业(亿元)
- ti :第三产业(亿元)
- trans_industry :交通运输仓储邮电通信业(亿元)
- lbdy :批发零售贸易及餐饮业(亿元)
三大需求对GDP贡献
ts.get_gdp_for()
返回值说明:
- year :统计年度
- end_for :最终消费支出贡献率(%)
- for_rate :最终消费支出拉动(百分点)
- asset_for :资本形成总额贡献率(%)
- asset_rate:资本形成总额拉动(百分点)
- goods_for :货物和服务净出口贡献率(%)
- goods_rate :货物和服务净出口拉动(百分点)
三大产业对GDP拉动
ts.get_gdp_pull()
返回值说明:
- year :统计年度
- gdp_yoy :国内生产总值同比增长(%)
- pi :第一产业拉动率(%)
- si :第二产业拉动率(%)
- industry:其中工业拉动(%)
- ti :第三产业拉动率(%)
三大产业贡献率
ts.get_gdp_contrib()
返回值说明:
- year :统计年度
- gdp_yoy :国内生产总值
- pi :第一产业献率(%)
- si :第二产业献率(%)
- industry:其中工业献率(%)
- ti :第三产业献率(%)
价格指数
居民消费价格指数
ts.get_cpi()
返回值说明:
- month :统计月份
- cpi :价格指数
工业品出厂价格指数
ts.get_ppi()
返回值说明:
- month :统计月份
- ppiip :工业品出厂价格指数
- ppi :生产资料价格指数
- qm:采掘工业价格指数
- rmi:原材料工业价格指数
- pi:加工工业价格指数
- cg:生活资料价格指数
- food:食品类价格指数
- clothing:衣着类价格指数
- roeu:一般日用品价格指数
- dcg:耐用消费品价格指数
实时票房
获取实时电影票房数据,30分钟更新一次票房数据,可随时调用。
df = ts.realtime_boxoffice()
返回值说明:
- BoxOffice 实时票房(万)
- Irank 排名
- MovieName 影片名
- boxPer 票房占比 (%)
- movieDay 上映天数
- sumBoxOffice 累计票房(万)
- time 数据获取时间
数据保存
前面提到过Tushare
的数据是由pandas
处理的,自然也可以利用这个包进行保存,下面简单列一下各种方式的保存。(直接搬旧版的代码了,HDF5和JSON我觉得我用不到,所以不列了)
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,请先确保目录已经存在于磁盘中。
调用方法:
pro = ts.pro_api()
df = pro.daily(ts_code='000001.SZ', start_date='20190701', end_date='20191014')
#直接保存
df.to_csv('c:/day/000001_SZ.csv')
#选择保存
df.to_csv('c:/day/000001_SZ.csv',columns=['open','high','low','close'])
EXCEL(xlsx)文件
常用参数说明:
- 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列空列
pro = ts.pro_api()
df = pro.daily(ts_code='000001.SZ', start_date='20190701', end_date='20191014')
#直接保存
df.to_excel('c:/day/000001_sz.xlsx')
#设定数据位置(从第3行,第6列开始插入数据)
df.to_excel('c:/day/000001_sz.xlsx', startrow=2,startcol=5)
数据库
数据库(Mysql,MongoDB,Redis等等)对于一个没有接触过相关知识的人有点难以入门(光是下载安装就要费一番功夫),不过好在python提供了相关的包来连接数据库,而且还有许多可视化软件辅助我们操纵数据库。
python2.5以上,内置了SQLite3
,它比上述三者要轻量(小于400k)、简单得多,也无需配置,所以我们以SQLITE
为例。
在使用之前,推荐先下载一个sqlite的可视化软件,SQLiteStudio,方便我们查看数据,当然不下也可以。
import tushare as ts
import sqlite3
conn = sqlite3.connect('stock.db') # 连接数据库,若数据库不存在则会被创建
# 上面创建的数据库默认在'C:\Users\admin'下,你可以指定路径
conn = sqlite3.connect(r'E:\Finance\stock.db')
pro = ts.pro_api()
df = pro.daily(ts_code='000001.SZ', start_date='20170101', end_date='20191014')
df_index = df.set_index('ts_code') # 设定数据的索引是ts_code
df_index.to_sql('daily_data',conn) # 保存到daily_data表中,若没有该表自动创建
如果想要替换数据,或者补充数据,可以添加'replace'或者'append'参数,如
df.to_sql('daily_data',conn,if_exists='replace') # 替换表中数据
不过,新版的pandas中,主要是以sqlalchemy方式与数据建立连接,所以最好使用create_engine
替代connect
from sqlalchemy import create_engine
import tushare as ts
engine = create_engine('sqlite:///E:/Finance/stock.db') # 连接数据库
pro = ts.pro_api()
df = pro.daily(ts_code='000001.SZ', start_date='20190701', end_date='20191014')
df_index = df.set_index('ts_code') # 设定数据的索引是ts_code
df_index.to_sql('daily_data2',engine)
但是似乎这种方式有个问题,就是不能保存超过999items的数据,会报错,所以大数据保存还是用上一种方式
常用参数说明:
- 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
然后可以在该路径下找到此数据库,打开SQLiteStudio
,将这个数据库拖到SQLiteStudio
中,右键点击连接,或者点上面的按钮Connect to the database
双击刚刚创建的表,切换到数据
就能看到保存的数据了
我原本想实现的效果是插入数据,如果重复就自动替换,但是现在append只能把所有数据包括已经存在的全部插进去,很容易重复,replace的话就更不行了……不知道怎么解决,查来查去,只能用pandas的数据清洗功能间接解决了。
import tushare as ts
import sqlite3
import pandas as pd
pro = ts.pro_api()
conn = sqlite3.connect(r'E:\Finance\stock.db')
df = pro.daily(ts_code='000001.SZ', start_date='20160101', end_date='20180114')
# 已有的数据是从17年开始的,很明显这里重复了
df_index = df.set_index('ts_code') # 设定数据的索引是ts_code
df_index.to_sql('daily_data',conn,if_exists='append') # 添加到daily_data表中
data = pd.read_sql("select * from daily_data",conn) # 读取daily_data表中所有数据
data.drop_duplicates(subset=['ts_code','trade_date'],keep="last",inplace=True)
# 数据清洗,去掉重复数据
data_index = data.set_index('ts_code') # 设定数据的索引是ts_code
data_index.to_sql("daily_data",conn,if_exists='replace') # 保存数据到原表中并替换
为什么要用索引,因为不这样的话每次清洗出来数据会多出一列“level”,下次插入数据的时候因为结构不一样会报错。
建议用的时候再清洗,因为数据量大的时候运行速度可能会比较慢。
另外你在SQLiteStudio
中可能只能看到1000个数据,因为它一页最多只能显示1000个,上面会有翻页按钮的。
drop_duplicates的参数有
- subset 根据指定的列名进行去重,默认整个数据集
- keep 可选{‘first’, ‘last’, False},默认first,即默认保留第一次出现的重复值,并删去其他重复的数据,False是指删去所有重复数据。
- inplace 是否对数据集本身进行修改,默认False
后记
在数据库这块折腾了好久,只能做到这种程度了,如果您有更简单的保存数据方法,请留言评论,大家一起交流学习。
版权属于:作者名称
本文链接:https://www.sitstars.com/archives/37/
转载时须注明出处及本声明
写得好好哟!::funny:04::
EclipseJ 2020-10-30