作者|Lorenzo Ampil

编译|VK

来源|Towards Data Science

自从我开始学习投资,我接触了不同的股票分析方法-技术分析和基本面分析。我甚至读过很多关于这些技巧的书和文章。

简言之,技术分析认为,你可以根据股票的历史价格和成交量的变动来确定买卖股票的正确时间。另一方面,基本面分析认为,你可以根据公司财务报表中的基本信息来衡量股票的实际内在价值。

这两种类型的分析对我来说都是有意义的,我希望用它们来为我的交易提供信息;然而,我总是对一件主要的事情感到沮丧:

有许多可能的策略可以采取,但没有系统的方法来选择一个。实际上,大多数交易最终仍然是“直觉”决策,而不是由数据驱动的。

那么我们如何评估这些策略呢?我们可以通过比较从每种方法中获得的预期投资回报率(ROI)来做到这一点。最好的方法是使用一种称为回测的方法来评估一种策略,即通过模拟过去使用它的情况来评估它的表现。

现在,已经有很多回测框架,但是其中大多数都需要高级的编码知识。一个简单的helloworld实现通常需要多达30行代码。

为了填补这个空白,我决定创建fastquant,目标是尽可能简单地将回测进行引入。使用fastquant,我们只需3行代码就可以对交易策略进行回测!

在本文的其余部分,我将指导你如何通过Jollibee Food Corp.(JFC)的历史数据来回测一个简单的移动平均值交叉(SMAC)策略。

我们开始吧!

回测我们的第一个策略

安装fastquant

它就像使用pip安装一样简单!

# 在你的终端上运行这个

pip install fastquant

# 或者,你可以这样从jupyter运行这个

!pip install fastquant

获取股票数据

从fastquant导入get_stock_data函数,用于拉取Jollibee Food Corp.(JFC)2018年1月1日至2019年1月1日的库存数据。注意,我们有日期(dt)列和收盘价(close)的列。

from fastquant import get_stock_data

jfc = get_stock_data("JFC", "2018-01-01", "2019-01-01")

print(df.head())

# dt close

# 2019-01-01 293.0

# 2019-01-02 292.0

# 2019-01-03 309.0

# 2019-01-06 323.0

# 2019-01-07 321.0

回测你的交易策略

利用fastquant的回测功能和Jollibee Food Corp.(JFC)的历史股票数据,对一种简单的移动平均交叉策略(SMAC)进行回测。

在SMAC策略中,fast_period指用于快速移动平均值的时段,而slow_period指用于慢速移动平均值的时段。

当快速移动平均线从下方越过慢速移动平均线时,这被认为是一个“买入”信号,而如果它从上方越过到下方,这被认为是“卖出”信号。

首先,让我们分别将快周期和慢周期初始化为15和40。

你应该在日志底部看到下面的最终投资组合价值。这个值可以解释为你的投资组合在回测期结束时的价值(这里是2019年1月1日)。

你得到的“最终投资组合价值”和“初始投资组合价值”之间的差额,这将是基于回测的预期收益(在本例中为PHP 411.83)。

from fastquant import backtest

backtest('smac', jfc, fast_period=15, slow_period=40)

# 起始价值: 100000.00

# 最终价值: 100411.83

把所有代码放在一起-用3行Python进行回测

下面的代码展示了如何在3行python中执行上述所有步骤:

from fastquant import backtest, get_stock_data

jfc = get_pse_data("JFC", "2018-01-01", "2019-01-01")

backtest('smac', jfc, fast_period=15, slow_period=40)

# 起始价值: 100000.00

# 最终价值: 100411.83

改进SMAC策略

增加快周期和慢周期

这将说明了小的改变可以很快地将一个成功的策略变成一个失败的策略。在快速增长期和缓慢增长期分别增加到30和50之后,我们的最终投资组合价值从100412 PHP下降到83947 PHP(减少16465 PHP)

backtest('smac', jfc, fast_period=30, slow_period=50)

# 起始价值: 100000.00

# 最终价值: 83946.83

减少慢周期,同时保持快周期不变

在这种情况下,我们的策略的性能实际上得到了改善!我们的最终投资组合价值从100412 PHP上升到102273 PHP(增加1861 PHP),之后将慢周期减少到35,并将快速周期保持在15。

backtest('smac', jfc, fast_period=15, slow_period=35)

# 起始价值: 100000.00

# 最终价值: 102272.90

下表比较了我们3种SMAC策略的性能:

克服测试的局限性

现在,这是否意味着我们应该用最好的SMAC策略交易?也许还没有。

回测有相当多的局限性,克服这些局限性通常需要额外的步骤来增加我们对回测结果和建议可靠性的信心。

以下是回测的两个限制,以及克服这些限制的保障措施:

过拟合

这指的是你导出的“最佳参数”与前一个时间段的模式太吻合的情况。这意味着,当你决定使用该策略时,你的策略预期盈利能力不会转化为实际盈利能力。

防止这种情况最好是从样本中测试你的策略,这类似于在机器学习中使用“测试集”。这样做的目的是,当你想评估你的交易策略的盈利能力时,你需要保留一个测试数据。这样,就很难过拟合参数,因为你没有基于该数据集优化策略。

前瞻性偏差

这是由于在回测期间利用在测试期间不可用的信息而产生的偏差。例如,你可以在JFC上测试一个策略的有效性,假设你在JFC真正公开前一个月就已经知道它的财务表现(例如净收入)。这会给你不可靠的信心,你的战略可能会损失你很多钱。

在这种情况下,要避免这种偏差,最好的方法之一就是彻底验证在回测策略时所做的假设。严格评估你的战略,以及正确执行战略所需的信息是值得的。

这些只是回测所带来的众多限制中的两个。我确实打算写一篇文章,在将来更详细地讨论这些,所以请继续关注!

在解决了上述局限性之后,我们应该对我们选择的战略更有信心;但是,请记住,虽然我们可以对我们的战略更有信心,但它在看不见的现实世界中的表现永远不会百分之百确定。

我建议,一旦你在现实世界中采用了一种策略,那么就从相对较少的资金开始,并且只在该策略显示出更为一致的成功时增加它;否则,准备好在现实世界中证明它效果不佳的情况下杀死它。

为fastquant提供更多策略

请记住,fastquant拥有与现有策略库中相同数量的策略。到目前为止,有8种策略可供选择——包括简单移动平均交叉(SMAC)、相对强度指数(RSI),甚至是基于情绪分析的策略!

正如我在本文介绍中提到的,有大量不同的策略可以应用于交易。感谢你阅读本文

python回测代码_只用3行Python回测你的交易策略相关推荐

  1. python秒表游戏代码_用20行Python代码实现2048小游戏,你会吗?

    前些天在b站上看到有个大佬用c写了一个2048小游戏,我便一下来了兴趣.心想着,我貌似也能用Python来整一波,话不多说,直接开搞. 2048的游戏规则: 2048游戏总共有16个格子,初始时会有两 ...

  2. python画人脸代码_[转]7行Python代码的人脸识别

    随着去年alphago 的震撼表现,AI 再次成为科技公司的宠儿.AI涉及的领域众多,图像识别中的人脸识别是其中一个有趣的分支.百度的BFR,Face++的开放平台,汉王,讯飞等等都提供了人脸识别的A ...

  3. 50行python游戏代码_使用50行Python代码从零开始实现一个AI平衡小游戏

    使用50行Python代码从零开始实现一个AI平衡小游戏 发布时间:2020-10-23 09:26:14 来源:脚本之家 阅读:74 集智导读: 本文会为大家展示机器学习专家 Mike Shi 如何 ...

  4. 聚类 python 代码_不足 20 行 Python 代码,高效实现 k-means 均值聚类算法

    下载好向圈APP可以快速联系圈友 您需要 登录 才可以下载或查看,没有帐号?立即注册 x 不足 20 行 Python 代码,高效实现 k-means 均值聚类算法-1.jpg (143.81 KB, ...

  5. python 车牌识别简单_简单30行Python代码让你玩转YOLO目标识别检测!

    YOLO是一种实时目标检测算法,与faster R-CNN不同的是,YOLO不是过多的注重物体定位的精度,而是着重于速度和物体种类的识别.在实际应用中,实时性是目标检测中非常重要的,例如对于一辆自动驾 ...

  6. 50行的python游戏代码_使用50行Python教AI玩运杆游戏

    编译:yxy 出品:ATYUN订阅号 嗨,大家好!今天我想展示如何使用50行Python代码教一台机器来平衡杆!我们将使用标准的OpenAI Gym作为我们的测试环境,并只使用numpy创建我们的智能 ...

  7. python大作业代码_大二期末python大作业有效代码不低于5000行是什么水平?

    6月30日更新 鉴于题主说老师已经收回对行数的要求,就请大家看过则罢,不要再点赞了(还有收藏的是什么鬼?).本文说的不过是一些投机取巧的伎俩,不值取,不可取. ~~~以下是原文~~~: 一个熟练工程序 ...

  8. python拼图游戏代码_教你用Python自制拼图小游戏,轻松搞定熊孩子

    摘要:本文主要为大家详细介绍了python实现拼图小游戏,文中还有示例代码介绍,感兴趣的小伙伴们可以参考一下. 开发工具 Python版本:3.6.4 相关模块: pygame模块: 以及一些Pyth ...

  9. python简笔画程序_只用C++和Python,让你的简笔画实时动起来!

    原标题:只用C++和Python,让你的简笔画实时动起来! 大数据文摘出品 作者:刘俊寰 让蒙娜丽莎笑起来对AI来说已经不是什么新鲜事了. 试想,如果在画纸上创作的图像能够实时地生成动画,达芬奇可能会 ...

最新文章

  1. php连接不到mysql怎么解决,怎么解决php无法连接mysql的问题
  2. 自动滚放的html,HTML5实现视频播放器随页面滚动固定页面右下角效果详解
  3. [裴礼文数学分析中的典型问题与方法习题参考解答]4.3.15
  4. 深入解读f-散度和f-GAN训练的相关数学性质
  5. [Debug]IOS微信浏览器不支持form表单的target=_blank
  6. openbsd 禁止root远程登陆
  7. adas功能受限_高级驾驶辅助系统(ADAS)的主要功能有哪些?
  8. jpa怎么传参到in中_Java中如何处理开关状态的属性字段?
  9. python自动化测试之mysql5.0版本数据库查询数据时出现乱码问题分析
  10. 使用instantclient_11_2和PL/SQL Developer工具包连接oracle 11g远程数据库
  11. 如果一个人请优雅的活着。
  12. Servlet详细介绍
  13. 03_安装和配置 kubectl
  14. windows重装系统或者苹果重装系统
  15. Java基础知识面试复习大纲
  16. MATLAB 如何导入.txt文本
  17. Mysql实现查询5分钟之前的数据
  18. 百度VR智拍再升级,3D环物拍摄一站生成
  19. javaScript中的undefined
  20. 《电信3.0——第二章》

热门文章

  1. Twitter或面临欧盟更严格内容审核;韩国电商巨头用机器人军团替代仓库工人;高通公司副总裁加盟三星丨每日大事件...
  2. deepinv2 添加打印机_Deepin环境下Brother 打印机网络打印驱动安装步骤的图解
  3. 自动售货机 顺序图_饮料自动售货机系统的分析与设计
  4. Android11.0 增加人脸解锁功能
  5. PPT经常用的115个技巧收藏
  6. postgre 年月日转年月_关于datetime:带时区的PostgreSQL日期函数date()
  7. 宝妈也能通关‼️PMP要么不考,要考就要5A️
  8. 【网络】IEEE 802现有标准
  9. LeetCode 682 棒球比赛
  10. 2021年Python编程发展趋势分析