一、介绍
tushare是一个金融大数据开放社区,现已升级到tushare pro版本,新版本在数据稳定性和获取速率上大幅提升。与wind、东财等收费数据源相比,tushare pro算是金融数据界的良心之作,其为从事金融工程、量化研究等方向的同学们提供了便利。tushare pro还有一点突出的特色就是已经将股票、期货、数字货币、行业大数据,外汇等金融市场全部纳入到一个接口中,大有一统江湖的感觉。
二、注册与安装
使用之前参照如下文档进行注册:
https://tushare.pro/document/1?doc_id=38
安装Anaconda,如何安装的说明网上有很多,自行查找,python IDE我用的pycharm。
安装tushare参照如下文档:https://tushare.pro/document/1?doc_id=7
三、使用入门
tushare接口调用时需要设置token,登录tushare,通过如下URL:https://tushare.pro/user/token 获取自己的token,tushare接口一般都有积分和调用频次限制,使用时注意查看文档。
对于规避调用频次限制的方法如下:
1)可以通过获取更多积分来降低或取消限制;
2)可以在程序上增加延迟来避免发生超限访问的异常;
3)三将数据下载到本地日后使用本地数据即可规避频次限制。
积分获取可以通过如下途径:
1)参加线上的讲座/培训;
2)发一些博客或文章,来向更多的人介绍tushare,让更多的人能够更容易的使用tushare,相当于帮社区宣传推广;
3)推荐身边的人注册使用tushare;
4) 向社区捐赠。
下面以获取股票日线数据并入库Mysql为例介绍如何使用tushare,代码如下:
import tushare as ts
import datetime
import time
import sqlalchemy
from sqlalchemy import create_engine, MetaData
#设置tushare pro的token并获取连接
ts.set_token('放置你自己token')
pro = ts.pro_api()
# 设定获取日线行情的初始日期和终止日期,其中终止日期设定为昨天。
start_dt = '20190101'
end_dt = (datetime.datetime.now() - datetime.timedelta(days=1)).strftime('%Y%m%d')
# 建立数据库连接,
engine = create_engine('mysql+mysqlconnector://你的数据库用户名:你的密码@数据库的IP/数据库名?charset=utf8')
table_nm = "daily"
#获取所有营业日
cal_df = pro.trade_cal(exchange='SZSE', start_date=start_dt, end_date=end_dt, is_open='1');
total_cnt = 0
# 通过循环所有营业日获取每个营业日的所有股票的日线行情
for i in range(cal_df.shape[0]):
trade_dt = cal_df.loc[i, "cal_date"]
t1 = int(round(time.time() * 1000))
try:
#调用daily接口,指定trade_date日期,获取一天的所有股票数据,
#也可以通过指定ts_code,获取特定股票的数据,也可以指定返回的数据列,具体参数参见接口说明
df = pro.daily(trade_date=trade_dt)
#print(df)
#获取记录行数
c_len = df.shape[0]
total_cnt += c_len
#更加个人需要修改数据日期格式: yyyyMMdd ->yyyy-MM-dd
for j in range(c_len):
trade_date = (datetime.datetime.strptime(df.iloc[j][1], "%Y%m%d")).strftime('%Y-%m-%d')
df.loc[j:j, ('trade_date')] = trade_date
#print(df)
#将一天的所有股票数据批量入库
#自动创建数据表,表中字段的类型定义通过dtype指定,if_exists指定如果存在时的处理方式:插入、替换等
df.to_sql(table_nm, engine, index=False, if_exists='append',
dtype = {'ts_code': sqlalchemy.types.String(length=9),
'trade_date': sqlalchemy.types.String(length=10),
'open': sqlalchemy.types.DECIMAL(15,4),
'close': sqlalchemy.types.DECIMAL(15, 4),
'high': sqlalchemy.types.DECIMAL(15,4),
'low': sqlalchemy.types.DECIMAL(15,4),
'vol': sqlalchemy.DECIMAL(15, 4),
'amount': sqlalchemy.DECIMAL(15, 4),
'pre_close': sqlalchemy.DECIMAL(15, 4),
'change':sqlalchemy.DECIMAL(15, 4),
'pct_chg': sqlalchemy.types.DECIMAL(15,4)
})
except Exception as aa:
print(aa)
continue
t2 = int(round(time.time() * 1000))
t = (t2 - t1)
print(trade_dt + ": %d条记录处理完毕!用时%d" %(c_len, t))
if t <= 300:
#time.sleep可以为小数,310比300多10毫秒,是为了多睡一会儿避免每分钟200次的临界点
secs = (310 - t ) / 1000
print("休眠%s ..." % str(secs))
time.sleep(secs)
#没有主键创建主键
metadata = MetaData(engine)
metadata.reflect(bind=engine, only=[table_nm])
# 获取主键的列数,为零表示没有主键
pk_len = len(metadata.tables[table_nm].primary_key.columns)
if pk_len == 0:
with engine.connect() as con:
con.execute('ALTER TABLE ' + table_nm + ' ADD PRIMARY KEY (`ts_code`, `trade_date`);')
print('All (%d) Finished!'%total_cnt)
其他接口的调用和上述接口类似,参照修改即可。