欢迎大家订阅《Python实战-构建基于股票的量化交易系统》小册子,小册子会陆续推出与小册内容相关的专栏文章,对涉及到的知识点进行更全面的扩展介绍,并且会有选择地收录至小册中,更便于广大读者查阅知识点。本篇专栏为小册子内容的加推篇!!!

前言

当我们开发了一个交易策略,需要对策略进行回测。那么我们就需要一个回测框架。

目前已存在很多成熟的回测框架,也有各种平台。这些框架或平台各有优劣,并不能满足每个人的需求。为了将之前学习的量化交易的知识点贯穿起来,更好地巩固学习内容,也为了今后能够搭建适合自己的框架,本小节我们一起来搭建一个简单的回测框架。

策略回测流程

完成一个策略的回测总体来说包括以下几步:

获取行情数据。我们以股票行情数据为例,至少需要获取到收盘价、开盘价、最高价、最低价、成交量。通常我们将数据按时间先后分为两份:一份作为策略训练集数据;一份作为策略测试集数据。

产生择时策略信号。我们以课程中的择时策略为例,在训练集数据上产生包含交易信号的序列。全面一些的策略,是应该在择时策略中可以融入止盈止损机制、参数优化措施等等。

输出策略回测报告。首先设置回测初始资金,然后根据交易信号买卖股票。我们可以选择全仓买入/卖出,也可以使用仓位管理功能。最后以回测指标来评估策略的效果。回测指标包含资金收益率、与基准收益的对比、资金最大回撤、涨跌幅最大回撤等。当然,在实际交易中是有交易手续费和滑点情况的,更贴近实际的话是需要考虑这些因素。

可视化策略回测效果。可视化在各个领域的数据分析过程中都是很重要的,可以最为直观的展示数据背后的含义,此处我们可以可视化收益曲线、最大回撤曲线来更加直观地评估策略运行情况。

函数接口介绍

1、获取股票交易数据接口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]

"""

复制代码

2、择时策略信号生成接口,此处为计算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]

"""

复制代码

3、择时策略融入风险管理因子生成交易信号接口CalNdaysStopSignal。

接口介绍如下:

# 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]

"""

复制代码

4、输出策略回测报告接口SimpleBackTest。

接口介绍如下:

# 执行简易策略回测接口,可参考《收益与风险维度度量策略效果》

# 输入参数

# :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]

"""

复制代码

5、策略回测效果可视化接口DrawBackTest,该接口以图表形式输出回测结果。

接口介绍如下:

# 执行简易策略回测接口,可参考《收益与风险维度度量策略效果》

# 输入参数

# :param data: df_stockload股票数据/交易信号/回测结果数据

# :param data: code_name 股票名称

复制代码

接口使用例程如下:

DrawBackTest(df_stock, "新希望")

复制代码

调用接口后以图表形式输出回测结果。

6、账户类ST_Account,该类中提供了当前账户的剩余资金、持仓股数、总资产、交易操作等接口。

构造函数如下所示:

#可参考《择时策略融入ATR动态仓位管理》

def __init__(

self,init_hold={},

init_cash=1000000,

commission_coeff=0,

tax_coeff= 0):

"""

:param [dict] init_hold 初始化时的股票资产

:param [float] init_cash: 初始化资金

:param [float] commission_coeff: 交易佣金 :默认 万2.5(float类型 0.00025) 此处例程设定为0

:param [float] tax_coeff: 印花税 :默认 千1.5(float类型 0.001) 此处例程设定为0

"""

self.hold = init_hold

self.cash = init_cash

复制代码

创建账户的实例,如下所示:

account_a = ST_Account(dict(), 100000) # 账户A 持股数目和初始资金

account_b = ST_Account(dict(), 100000) # 账户B 持股数目和初始资金

复制代码

7、关于ATR头寸管理和动态仓位管理接口,分别由draw_graph类和run_add_postion类完成。

draw_graph包含了计算每日账户中的交易情况、绘制账户收益曲线等方法。

run_add_postion类继承了draw_graph,并且添加了动态仓位管理方法。为了体现ATR头寸管理和动态仓位管理的效果,我们在draw_graph类中默认观察2个资金账户,一个账户执行全仓买入卖出,另一个账户执行仓位管理。

测试例程如下所示:

#可参考《择时策略融入ATR动态仓位管理》

test_kind = u"test1" # test1:ATR头寸 / test2:动态仓位调整

fig = plt.figure(figsize=(16, 8), dpi=100, facecolor="white") # 创建fig对象

if test_kind == u"test1": # ATR头寸

app_graph_a = draw_graph(fig, df_stock, "600410.SS")

app_graph_a.draw_config()

else: # 动态仓位调整

app_graph_b = draw_add_postion(fig, df_stock, "600410.SS")

app_graph_b.draw_config()

plt.show()

复制代码

比如调用draw_graph的实例之后会以图表形式输出回测结果。

比如调用draw_add_postion的实例之后会输出动态仓位的调整信息。

"""

17-02-10 账户A 买入价格:8.13 买入股数:12300

17-02-10 账户B 买入价格:8.13 买入股数:11822

17-02-14 账户B 加仓价格:8.14 加仓股数:720

17-02-15 账户B 减仓价格:8.16 减仓股数:810

17-02-20 账户B 减仓价格:8.26 减仓股数:804

17-02-24 账户B 加仓价格:8.19 加仓股数:551

17-03-03 账户B 加仓价格:8.11 加仓股数:831

17-03-06 账户B 加仓价格:8.15 加仓股数:526

17-03-10 账户A 卖出价格:8.06 卖出股数:12300

17-03-10 账户B 卖出价格:8.06 卖出股数:12836

……

19-10-11 账户B 买入价格:18.62 买入股数:1368

19-10-18 账户A 卖出价格:18.06 卖出股数:5267

19-10-18 账户B 卖出价格:18.06 卖出股数:1368

19-10-22 账户A 买入价格:19.3 买入股数:4929

19-10-22 账户B 买入价格:19.3 买入股数:1407

19-11-01 账户A 卖出价格:22.09 卖出股数:4929

19-11-01 账户B 卖出价格:22.09 卖出股数:1407

"""

复制代码

总结

以上这些知识点都涵盖在课程中,此处我们提供给大家一个“索引”,旨在把知识点和所在课程中的位置相匹配起来。

同学们可以结合课程中参考的小节自己调试一番,通过这个过程使大家能够对量化交易的回测方面有更整体的掌握。

只有经过自己亲手实践,才能有更深刻的理解,当然我们也有提供了整理后的回测框架源码,有需要对比分析的同学可以在群中私信我。

以上策略及涉及到的股票仅用于教学,不构成任何投资建议!投资需谨慎,入市有风险!!!

更多的量化交易内容欢迎大家订阅小册阅读!!

同时也欢迎大家关注我的微信公众号【元宵大师带你用Python量化交易】了解更多Python量化交易相关内容

python量化策略源码_Python量化交易进阶讲堂-创建自定义量化回测框架相关推荐

  1. python量化选股策略 源码及论文_常见的十大量化投资策略(附源码)

    量化投资策略是利用量化的方法,进行金融市场的分析.判断和交易的策略.算法的总称.著名的量化投资策略有以下10种(注:策略源码模板不能直接用于实盘交易,仅供探讨交流) 01.海龟交易策略 海龟交易策略是 ...

  2. python量化策略源码_【Python量化投资】趋向系统指标策略 ADX、DMI指标用于股票池(附源码)...

    原标题:[Python量化投资]趋向系统指标策略 ADX.DMI指标用于股票池(附源码) [什么是ADX] ADX(average directional indicator) 平均趋向指数,常用的趋 ...

  3. python量化策略源码_[Python源码] 十大经典日内策略之空中花园(附源码分享)

    function kzhy(freq)% targetList = traderGetTargetList(); %获取目标资产信息 HandleList = traderGetHandleList( ...

  4. python 网格交易源码_【宽客策略源码】网格交易(期货)

    # coding=utf-8 from __future__ import print_function, absolute_import, unicode_literals import numpy ...

  5. python算法实现源码_python 实现A_算法的示例代码

    python 实现A_算法的示例代码 来源:中文源码网    浏览: 次    日期:2018年9月2日 [下载文档:  python 实现A_算法的示例代码.txt ] (友情提示:右键点上行txt ...

  6. python关键词提取源码_Python 结巴分词 关键词抽取分析

    关键词抽取就是从文本里面把跟这篇文档意义最相关的一些词抽取出来.这个可以追溯到文献检索初期,当时还不支持全文搜索的时候,关键词就可以作为搜索这篇论文的词语.因此,目前依然可以在论文中看到关键词这一项. ...

  7. python人脸识别源码_Python 抖音机器人,让你找到漂亮小姐姐

    本项目作者沉迷于抖音无法自拔,常常花好几个小时在抖音漂亮小姐姐身上. 本着高效.直接地找到漂亮小姐姐的核心思想,我用 Python + ADB 做了一个 Python 抖音机器人 Douyin-Bot ...

  8. python贪吃蛇源码_Python:游戏:贪吃蛇(附源码)

    Python:游戏:贪吃蛇(附源码) 发布时间:2018-09-05 09:59, 浏览次数:1295 , 标签: Python 贪吃蛇是个非常简单的游戏,适合练手. 首先分析一下这个游戏 1.蛇怎么 ...

  9. python字符串替换源码_Python实现字符串中某个字母的替代功能

    Python实现字符串中某个字母的替代功能 今晚想实现这样一个功能:将输入字符串中的字母 "i" 变成字母 "p".当时想的很简单,直接用for循环遍历,然后替 ...

最新文章

  1. PCL中3D特征描述子Shot详解
  2. 如何正确地运用人工智能模型?
  3. 日报 18/07/22 您的设计模式!终于有时间开写~ ~
  4. jquery笔记(常用技术)
  5. zxing二维码生成工具类
  6. 2013年 省职业学校 公共基础课程 两课 评比 计算机应用,江苏省职业学校公共基础课程两课评比教案.doc...
  7. 00001-整数倒置-Java-leetcode-要考虑到溢出问题
  8. 不同分支设置不同的远程仓库
  9. synchronized关键字的4种用法
  10. java实现word转pdf文件下载
  11. 从零开始学Android应用安全测试
  12. pulseaudio 播放卡顿的解决方法
  13. Windows开启ftp服务-使用Xlight FTP Server
  14. 6轴串联关节机器人的奇异点
  15. 你不是菜鸟2:他为什么没过试用期
  16. 如何下载react依赖包
  17. 螺杆支撑座如何避雷要害
  18. c语言中doubt和double,doubt的用法
  19. 使用iperf测试网络性能
  20. 【unity学习笔记】OnMouseEnter、OnMouseOver、OnMouseExit

热门文章

  1. MediaController类实现视频播放器
  2. iOS9 NetworkExtension使用
  3. C++轻量级可配置语法分析器(开源) - λ-calculus(惊愕到手了欧耶,GetBlogPostIds.aspx) - C++博客...
  4. 求每个部门的平均工资
  5. 时间同步Gardner环的matlab性能仿真
  6. 优秀 | 九州云入选首届混合云大会优秀案例及产业全景图
  7. Mysql 行锁 间隙锁 临键锁
  8. 基于Simulink的柴油机冷却水温度实时仿真模型
  9. 40岁开始学python_今年31岁,现在开始想自学Python语言,还来得及吗?
  10. Ubuntu nfs服务器共享文件夹