作者 |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),甚至是基于情绪剖析的策略!
正如我在本文介绍中提到的,有大量不同的策略能够利用于交易。感激你浏览本文
原文链接:https://towardsdatascience.co…
欢送关注磐创 AI 博客站:
http://panchuang.net/
sklearn 机器学习中文官网文档:
http://sklearn123.com/
欢送关注磐创博客资源汇总站:
http://docs.panchuang.net/