欢迎大家订阅《教你用 Python 进阶量化交易》专栏!为了能够提供给大家更轻松的学习过程,笔者在专栏内容之外已陆续推出一些手记来辅助同学们学习本专栏内容,目前推出的扩展篇链接如下:
为了将专栏中分散的知识点贯穿起来,笔者在专栏的末尾小节《制作自己的量化交易工具》中分享了早期制作的一个简易版量化交易小工具,希望大家能够通过调试代码的方式掌握相关的知识。
目前在场外篇第9篇中已经移植到了Python3.7x版本上,接下来我们在这个版本的基础上逐步完善这个工具,使专栏的读者不仅能够通过小工具掌握专栏的相关知识点,也能够把工具用到自己的股票量化交易中去。
当我们开发了一个交易策略,需要对策略进行回测,那么我们就需要一个回测框架。目前已存在很多成熟的回测框架,也有各种平台。这些框架或平台各有优劣,并不能满足每个人的需求。为了将之前学习的量化交易的知识点贯穿起来,更好地巩固学习内容,也为了今后能够搭建适合自己的框架,本篇手记我们就来了解下如何自定义量化交易回测框架。
完成一个策略的回测总体来说包括以下几步:
获取行情数据。我们以股票行情数据为例,至少需要获取到收盘价、开盘价、最高价、最低价、成交量。通常我们将数据按时间先后分为两份:一份作为策略训练集数据;一份作为策略测试集数据。
产生择时策略信号。我们以专栏中的择时策略为例,在训练集数据上产生包含交易信号的序列。全面一些的策略,是应该在择时策略中可以融入止盈止损机制、参数优化措施等等。
输出策略回测报告。首先设置回测初始资金,然后根据交易信号买卖股票。我们可以选择全仓买入/卖出,也可以使用仓位管理功能。最后以回测指标来评估策略的效果。回测指标包含资金收益率、与基准收益的对比、资金最大回撤、涨跌幅最大回撤等。当然,在实际交易中是有交易手续费和滑点情况的,更贴近实际的话是需要考虑这些因素。
可视化策略回测效果。可视化在各个领域的数据分析过程中都是很重要的,可以最为直观的展示数据背后的含义,此处我们可以可视化收益曲线、最大回撤曲线来更加直观地评估策略运行情况。
获取股票交易数据接口GetStockDatApi。接口介绍如下:
# 数据获取接口,可参考《股票交易数据的自动下载》
# 输入参数
# :param data: code 股票代码
# :param data: start 起始日期,默认为2010年1月1日
# :param data: start 起始日期,默认为2010年1月1日
# 输出参数
# :return data: df_recon 规整化后的DataFrame格式股票数据
# 注意:该接口为股票除权数据
接口使用例程如下,调用后会返回收盘价、开盘价、最高价、最低价、成交量:
df_stock = GetStockDatApi("000876.SZ", '20170101', '20200101')
"""
High Low Open Close Volume
trade_date
2017-01-03 8.12 8.07 8.07 8.12 179801.01
2017-01-04 8.16 8.09 8.13 8.15 166242.35
2017-01-05 8.23 8.13 8.15 8.17 222902.53
2017-01-06 8.19 8.12 8.18 8.13 128549.96
2017-01-09 8.15 8.08 8.13 8.13 136700.04
... ... ... ... ... ...
2019-12-25 18.79 18.44 18.59 18.60 207776.34
2019-12-26 18.76 18.46 18.69 18.60 189935.42
2019-12-27 19.43 18.58 18.74 19.28 504214.70
2019-12-30 19.50 18.92 19.24 19.38 379296.95
2019-12-31 20.31 19.55 19.55 19.95 562873.40
[731 rows x 5 columns]
"""
择时策略信号生成接口,此处为计算N日突破信号CalNdaysSignal。接口介绍如下:
# 计算N日突破信号接口,可参考《趋势突破择时策略》
# 输入参数
# :param data: stockdata 个股行情数据
# :param data: N1 策略参数,默认为15
# :param data: N2 策略参数,默认为5
# 输出参数
# :return data: 添加交易信号的DataFrame格式股票数据
接口使用例程如下:
df_stock = CalNdaysSignal(df_stock, N1=15, N2=5)
调用接口后返回的股票数据如下所示:
"""
High Low Open Close Volume N1_High N2_Low signal
trade_date
2017-01-03 8.12 8.07 8.07 8.12 179801.01 8.12 8.12 1.0
2017-01-04 8.16 8.09 8.13 8.15 166242.35 8.15 8.12 1.0
2017-01-05 8.23 8.13 8.15 8.17 222902.53 8.17 8.12 1.0
2017-01-06 8.19 8.12 8.18 8.13 128549.96 8.17 8.12 1.0
2017-01-09 8.15 8.08 8.13 8.13 136700.04 8.17 8.07 1.0
... ... ... ... ... ... ... ... ...
2019-12-25 18.79 18.44 18.59 18.60 207776.34 21.53 18.36 0.0
2019-12-26 18.76 18.46 18.69 18.60 189935.42 21.53 18.36 0.0
2019-12-27 19.43 18.58 18.74 19.28 504214.70 21.03 18.36 0.0
2019-12-30 19.50 18.92 19.24 19.38 379296.95 20.71 18.36 0.0
2019-12-31 20.31 19.55 19.55 19.95 562873.40 20.31 18.44 0.0
[731 rows x 8 columns]
"""
择时策略融入风险管理因子生成交易信号接口,接口介绍如下:
# N日突破择时策略基础上引入风险管理因子,可参考《ATR止赢止损风险策略》
# 输入参数
# :param data: stockdata 个股行情数据
# :param data: N1 策略参数,默认为15
# :param data: N2 策略参数,默认为5
# :param data: n_loss 止损策略参数,默认为0.8
# :param data: n_win 止盈策略参数,默认为2
# 输出参数
# :return data: 规整化后 添加交易信号的DataFrame格式股票数据
# 注意:该接口为股票除权数据
接口使用例程如下:
df_stock = CalNdaysStopSignal(df_stock, N1=15, N2=5, n_loss=0.8, n_win=2)
调用接口后产生的止盈止损信号如下:
"""
17-03-09 买入价格:8.16 止损卖出价格:8.06
17-03-28 买入价格:8.24 止损卖出价格:8.16
17-06-16 买入价格:8.07 止损卖出价格:7.98
17-07-04 买入价格:8.31 止损卖出价格:8.17
17-11-14 买入价格:7.74 止损卖出价格:7.62
17-11-23 买入价格:7.95 止损卖出价格:7.77
18-02-01 买入价格:8.32 止损卖出价格:8.04
18-05-30 买入价格:7.34 止损卖出价格:7.02
18-07-19 买入价格:6.53 止损卖出价格:6.33
18-11-20 买入价格:6.83 止损卖出价格:6.64
18-12-06 买入价格:7.52 止损卖出价格:7.27
19-01-08 买入价格:7.82 止损卖出价格:7.6
19-02-28 买入价格:11.18 止损卖出价格:10.6
19-03-13 买入价格:14.22 止损卖出价格:12.8
19-04-11 买入价格:14.84 止损卖出价格:14.03
19-05-07 买入价格:17.31 止损卖出价格:16.15
19-06-06 买入价格:20.6 止损卖出价格:18.67
19-07-18 买入价格:20.25 止损卖出价格:19.1
19-09-06 买入价格:19.51 止损卖出价格:18.48
19-10-17 买入价格:18.85 止损卖出价格:18.25
19-10-31 买入价格:23.13 止损卖出价格:22.06
"""
调用接口后返回的股票数据如下所示:
"""
High Low Open Close ... N1_High N2_Low atr14 signal
trade_date ...
2017-01-03 8.12 8.07 8.07 8.12 ... 8.12 8.12 0.10 0.0
2017-01-04 8.16 8.09 8.13 8.15 ... 8.15 8.12 0.10 0.0
2017-01-05 8.23 8.13 8.15 8.17 ... 8.17 8.12 0.10 0.0
2017-01-06 8.19 8.12 8.18 8.13 ... 8.17 8.12 0.10 0.0
2017-01-09 8.15 8.08 8.13 8.13 ... 8.17 8.12 0.10 0.0
... ... ... ... ... ... ... ... ... ...
2019-12-25 18.79 18.44 18.59 18.60 ... 21.60 18.36 0.72 0.0
2019-12-26 18.76 18.46 18.69 18.60 ... 21.53 18.36 0.69 0.0
2019-12-27 19.43 18.58 18.74 19.28 ... 21.53 18.36 0.70 0.0
2019-12-30 19.50 18.92 19.24 19.38 ... 21.03 18.36 0.69 0.0
2019-12-31 20.31 19.55 19.55 19.95 ... 20.71 18.36 0.71 0.0
[731 rows x 9 columns]
"""
输出策略回测报告接口,接口介绍如下:
# 执行简易策略回测接口,可参考《买卖区间下策略收益绘制》
# 输入参数
# :param data: stockdata 股票数据及交易信号
# :param data: code_name 股票名称
# :param data: cash_hold 回测资金
# 输出参数
# :return data: 添加回测结果的DataFrame格式股票数据
接口使用例程如下:
df_stock = SimpleBackTest(df_stock, "新希望", 100000)
调用接口后可打印输出最终资金、基准收益率、股票买卖记录等回测结果。
"""
新希望 回测结果
最终资金:132180.0
基准收益率:0.8988989891622865
策略收益率:0.046179711142093044
最大回撤点:trade_date 2019-10-18 0.58
"""
"""
17-01-03 买入新希望 12300股
17-01-13 卖出新希望 12300股
17-02-10 买入新希望 12100股
17-03-10 卖出新希望 12100股
17-03-24 买入新希望 11700股
17-03-31 卖出新希望 11700股
17-06-13 买入新希望 11600股
17-07-18 卖出新希望 11600股
17-11-03 买入新希望 12500股
17-12-01 卖出新希望 12500股
18-01-08 买入新希望 12000股
18-02-02 卖出新希望 12000股
18-05-17 买入新希望 13300股
18-05-31 卖出新希望 13300股
18-07-16 买入新希望 14500股
18-08-02 卖出新希望 14500股
18-11-05 买入新希望 14600股
18-11-28 卖出新希望 14600股
18-11-29 买入新希望 14500股
18-12-18 卖出新希望 14500股
19-01-07 买入新希望 13400股
19-03-15 卖出新希望 13400股
19-04-03 买入新希望 11100股
19-04-12 卖出新希望 11100股
19-05-06 买入新希望 9400股
19-05-09 卖出新希望 9400股
19-05-31 买入新希望 7300股
19-06-24 卖出新希望 7300股
19-07-16 买入新希望 6500股
19-07-23 卖出新希望 6500股
19-09-02 买入新希望 6200股
19-09-09 卖出新希望 6200股
19-10-11 买入新希望 6100股
19-10-21 卖出新希望 6100股
19-10-22 买入新希望 6000股
19-11-18 卖出新希望 6000股
"""
另外,接口的返回值在DataFrame格式股票数据的基础上添加了每个交易日的动态回测数据。
"""
total per_total max_total Close max_close trend_profit benchmark_profit
trade_date
2017-01-03 99997.0 1.00 99997.0 8.12 8.12 NaN NaN
2017-01-04 100367.0 1.00 100367.0 8.15 8.15 3.69e-03 3.69e-03
2017-01-05 100613.0 1.00 100613.0 8.17 8.17 2.45e-03 2.45e-03
2017-01-06 100120.0 1.00 100613.0 8.13 8.17 -4.91e-03 -4.91e-03
2017-01-09 100120.0 1.00 100613.0 8.13 8.17 0.00e+00 0.00e+00
... ... ... ... ... ... ... ...
2019-12-25 146829.0 0.74 198468.0 18.60 23.20 0.00e+00 3.77e-03
2019-12-26 146829.0 0.74 198468.0 18.60 23.20 0.00e+00 0.00e+00
2019-12-27 146829.0 0.74 198468.0 19.28 23.20 0.00e+00 3.59e-02
2019-12-30 146829.0 0.74 198468.0 19.38 23.20 0.00e+00 5.17e-03
2019-12-31 146829.0 0.74 198468.0 19.95 23.20 0.00e+00 2.90e-02
[731 rows x 7 columns]
"""
策略回测效果可视化接口,该接口以图表形式输出回测结果,接口介绍如下:
# 执行简易策略回测接口,可参考《买卖区间下策略收益绘制》
# 输入参数
# :param data: df_stockload股票数据/交易信号/回测结果数据
# :param data: code_name 股票名称
接口使用例程如下:
DrawBackTest(df_stock, "新希望")
调用接口后以图表形式输出回测结果。
以上这些知识点都涵盖在专栏中,此处我们把知识点和所在专栏中的位置相匹配起来,希望通过这部分内容使大家能够对量化交易的回测方面有更整体的掌握。
关于以上内容更多的探讨欢迎大家加入专栏交流群。更多的量化交易内容欢迎大家订阅专栏阅读!!