量化交易之tushare使用入门

一、介绍

        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)

其他接口的调用和上述接口类似,参照修改即可。


 

你可能感兴趣的:(量化交易)