作者|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. 基于消失点的相机自标定(2)
  2. 访问nfs_通过NFS访问编年引擎
  3. html 定时刷新 数据,js中,设置定时器 每隔几秒刷新一次页面数据
  4. 华为2019年校招(20届实习)机考题python版解答与思路(2019-3-13软件题)
  5. 前端接入HTTP协议浅析
  6. 开源影响发量?这届开源中的巾帼力量
  7. 鼠标移开事件(onmouseout)
  8. Vue 数组封装和组件data定义为函数一些猜测
  9. 微信朋友圈千亿访问量背后的技术挑战和实践总结
  10. gsettings set org.gnome.desktop.interface scaling-factor 2无效果
  11. 廖雪峰python3练习题二
  12. 总结嵌入式C语言知识点
  13. Java Web程序设计
  14. 再添近10个新冠知识图谱,OpenKG发布第二批开放数据集
  15. 仿微信语音输入页面(讯飞语音)
  16. macOS如何修改Hosts文件
  17. matlab改变图片尺寸及像素与尺寸的转换
  18. 高等数学学习笔记——第六十讲——向量值函数的导数与积分
  19. hive优化——并行执行
  20. python抓取A股市场历史数据(个股、指数)

热门文章

  1. MinIO 如何设置永久分享链接
  2. react中城市选择器组件
  3. 数据库的数据导入与导出
  4. 【工具】1634- 提高工作效率,这 10 款 AI 工具不能错过!
  5. HTML基础快捷键的使用
  6. 一个控制器怎么转发到另外一个控制器_商用车多合一控制器集成化路线分析
  7. 零散小知识(Website Recommend)
  8. 2023最新Mac电脑必备推荐下载 缺一不可|新手Mac软件下载
  9. 麦当劳中国内地第4000家餐厅开业;圣培露携手心灵厨房打造更可持续的未来 | 知消...
  10. 【IoT】产品经理进阶之道:五元方法论