客至汲泉烹茶, 抚琴听者知音

金融大数据平台Tushare介绍与入门教程

Tushare介绍

金融学专业的学生,或者将来有志于从事金融行业的人,必不可少的一项技能就是获取和分析数据。一般的选择是wind,但是万德是真的贵,穷学生是真的用不起。前几天我发现了Tushare,它是一个免费开放的金融数据平台,通过api接口可以方便地调用各类金融数据,再利用pythonmatlab等工具进行处理和分析。最重要的是免费开源,而且提供的数据种类也足够多!列一下数据接口:

[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发行版本。

Anaconda下载地址

下载后调出cmdpip直接安装。

如果网速过慢安装失败,可以下载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

后记

在数据库这块折腾了好久,只能做到这种程度了,如果您有更简单的保存数据方法,请留言评论,大家一起交流学习。

添加新评论