新年伊始,很荣幸笔者的《教你用 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()
关于完整代码可以加入专栏交流群获取。更多的量化交易内容欢迎大家订阅专栏阅读!!