为了账号安全,请及时绑定邮箱和手机立即绑定

Python进阶量化交易场外篇6——Tushare Pro接口介绍

新年伊始,很荣幸笔者的《教你用 Python 进阶量化交易》专栏在慕课专栏板块上线了,欢迎大家订阅!为了能够提供给大家更轻松的学习过程,笔者在专栏内容之外会陆续推出一些手记来辅助同学们学习本专栏内容,因此同学们无需担心专栏内容在学习上的困难,更多的是明确自己学习的目的即可。当然笔者也欢迎同学们踊跃留言,说出自己想扩展的知识点,笔者会根据同学们的意愿选择性的推出一些内容。

在第一篇《管理概率==理性交易》中笔者结合一个简单的市场模型介绍了为什么在没有概率优势的前提下参与交易会亏钱,其实股票交易和玩一个游戏、做一个项目理念是相通的,需要章法、需要制定策略,否则就和抛硬币赌博一样一样的,用量化交易可以帮助我们管理好概率,更理性的去下单。

在第二篇《线性回归拟合股价沉浮》中笔者在专栏《股票交易策略开发:走势线性回归选股策略》小节的基础上对线性回归方法的策略应用做进一步的扩展介绍。由于线性回归作用于股票收盘价的整个周期,前后两段完全相反的周期会彼此作用,最终影响拟合的角度值,于是笔者设定窗口期用移动窗口的方式拟合股价的走势,寻找角度曲线的拐点以预示新一轮的反转走势,给大家提供一个衍生的策略思路。

在第三篇《最大回撤评价策略风险》中笔者在专栏《股票交易数据可视化:买卖区间下策略收益绘制》的基础上对策略的最大回撤指标做一定的扩展介绍。投资是有风险的,那么如何去衡量这个风险呢?最大回撤率就是一种直观的将风险切实量化的指标,它描述了买入股票后,在策略出现最糟糕的情况下会损失多少钱,这也直接关系到了风险策略中止损因子的设定。

在第四篇《寻找最优化策略参数》中笔者在专栏《股票交易策略开发:趋势突破择时策略》的基础上对寻找最优化策略参数的方法做一些扩展介绍。对于寻找最优化参数的方法可以选择枚举法或者蒙特卡洛法。枚举法适用于解决效率要求不高,样本规模小的问题。蒙特卡洛法得到的结果并不一定是最优的,但是在大规模样品的场合下可以更快地找到近似最优结果。

在第五篇《标记A股市场涨跌周期》中笔者在专栏《股票交易数据的自动下载》的基础上对matplotlib绘图工具的使用方法做一些扩展介绍,在A股历史走势图中标记出市场涨跌周期。


本次场外篇笔者在《股票交易数据的自动下载》的基础上扩展介绍使用Tushare Pro版本获取财经和股票交易数据的方法。

Tushare库在数据获取方面一直受到金融分析人员的青睐,极大地减轻了他们在金融数据采集、清洗加工、存储过程的工作量,更加专注于策略和模型的研究与实现上。由于Tushare旧版运行了有3年之久,因此目前网上很多涉及财经和股票交易数据获取的文章使用的是旧版Tushare。Tushare社区现在主要维护新版本tushare pro,它的数据更稳定质量更高,而且从广度和深度上相对旧版本都做了更大的改进,可获取的数据内容扩大到了包括沪深股票行情、财务、市场参考、指数(含国外股指)、基金、期货、期权、宏观经济、行业经济、新闻资讯等财经数据,以及数字货币行情等区块链数据,为金融量化人员节省了大量宝贵时间。

pro版本的总体来说使用是免费的,使用前需要登陆官网注册账号以获取token,注册地址:https://tushare.pro/register?reg=243738 。不过部分接口设置了权限,需要达到一定的积分才能使用。下面以获取常用的股票行情数据为例,展示下tushare pro获取数据的方法。

先介绍下stock_basic()接口,该接口获取上市的所有股票基础信息数据,包括股票代码、名称、上市日期、退市日期等。输入参数说明如下:
is_hs:是否沪深港通标的,N否、H沪股通、S深股通;
list_status:上市状态,L上市、D退市、P暂停上市;
exchange:交易所 SSE上交所,SZSE深交所,HKEX港交所。
注:关于输出参数大家可参照官网的介绍,此处不在赘述。

pro = ts.pro_api(token)
data = pro.stock_basic(exchange='', list_status='L', fields='ts_code,symbol,name,area,industry,list_date')
print(data.head())
"""
     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
"""
print(data.tail())
"""

        ts_code  symbol  name area industry list_date
3585  603993.SH  603993  洛阳钼业   河南      小金属  20121009
3586  603996.SH  603996  中新科技   浙江     家用电器  20151222
3587  603997.SH  603997  继峰股份   浙江     汽车配件  20150302
3588  603998.SH  603998  方盛制药   湖南      中成药  20141205
3589  603999.SH  603999  读者传媒   甘肃      出版业  20151210
"""

再介绍下daily()接口,该接口获取股票行情数据,也是最常用的接口。输入参数包括股票代码ts_code、开始日期start_date、结束日期end_date。
#获取平安银行日行情数据

pa=pro.daily(ts_code='000001.SZ', start_date='20180101',
               end_date='20190106')

print(pa.head())
"""
     ts_code trade_date  open     ...       pct_chg         vol       amount
0  000001.SZ   20190104  9.24     ...        5.0647  1481159.06  1422149.888
1  000001.SZ   20190103  9.18     ...        0.9793   415537.95   384457.707
2  000001.SZ   20190102  9.39     ...       -2.0256   539386.32   498695.109
3  000001.SZ   20181228  9.31     ...        1.0776   576604.00   541571.004
4  000001.SZ   20181227  9.45     ...       -0.2151   624593.27   586343.755

[5 rows x 11 columns]
"""
print(pa.tail())
"""
       ts_code trade_date   open     ...       pct_chg         vol       amount
241  000001.SZ   20180108  13.25     ...         -2.56  2158620.81  2806099.169
242  000001.SZ   20180105  13.21     ...          0.38  1210312.72  1603289.517
243  000001.SZ   20180104  13.32     ...         -0.60  1854509.48  2454543.516
244  000001.SZ   20180103  13.73     ...         -2.70  2962498.38  4006220.766
245  000001.SZ   20180102  13.35     ...          3.01  2081592.55  2856543.822

[5 rows x 11 columns]
"""

我们发现此处返回的DataFrame格式数据的行索引为序号,而不是交易日期,并且数据按日期的排列顺序是从20190104到20180102,与专栏例程中的标准数据格式不稳和,我们需要调整下返回的数据格式。

pa.index = pd.to_datetime(pa.trade_date)
pa.sort_index(inplace=True)
pa.drop(axis=1, columns='trade_date', inplace=True)
print(pa.head())
"""
              ts_code  open  high     ...       pct_chg         vol       amount
trade_date                            ...                                       
2019-01-04  000001.SZ  9.24  9.82     ...        5.0647  1481159.06  1422149.888
2019-01-03  000001.SZ  9.18  9.33     ...        0.9793   415537.95   384457.707
2019-01-02  000001.SZ  9.39  9.42     ...       -2.0256   539386.32   498695.109
2018-12-28  000001.SZ  9.31  9.46     ...        1.0776   576604.00   541571.004
2018-12-27  000001.SZ  9.45  9.49     ...       -0.2151   624593.27   586343.755

[5 rows x 10 columns]
"""
print(pa.tail())
"""
              ts_code   open     ...              vol       amount
trade_date                       ...                              
2018-01-08  000001.SZ  13.25     ...       2158620.81  2806099.169
2018-01-05  000001.SZ  13.21     ...       1210312.72  1603289.517
2018-01-04  000001.SZ  13.32     ...       1854509.48  2454543.516
2018-01-03  000001.SZ  13.73     ...       2962498.38  4006220.766
2018-01-02  000001.SZ  13.35     ...       2081592.55  2856543.822

[5 rows x 10 columns]
"""

关于使用index_daily接口获取指数每日行情,该接口设置了使用权限,用户需要累积200积分才可以调取,积分积累的办法可以参照官网的介绍。如果未达到积分,也可以通过旧版接口获取指数行情。这里我们通过旧版本获取并可视化国内上证综指、深证成指、沪深300、创业板指、上证50、中小板指数据。

#获取常见股票指数行情
indexs={'上证综指': 'sh','深证成指': 'sz',
         '沪深300': 'hs300','创业板指': 'cyb',
          '上证50': 'sz50', '中小板指': 'zxb'}

index_data = {}
for name, code in indexs.items():
    #df = pro.index_daily(ts_code=code)#需要200积分
    df = ts.get_hist_data(code,start='2019-01-01',end=datetime.datetime.now().strftime('%Y-%m-%d'))
    df.index = pd.to_datetime(df.index)
    index_data[name] = df.sort_index()

图片描述
关于完整代码可以加入专栏交流群获取。更多的量化交易内容欢迎大家订阅专栏阅读!!

点击查看更多内容
7人点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消