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


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

这两种类型的分析对我来说都是有意义的,我希望用它们来为我的交易提供信息;然而,我总是对一件主要的事情感到沮丧:有许多可能的策略可以采取,但没有系统的方法来选择一个。实际上,大多数交易最终仍然是“直觉”决策,而不是由数据驱动的。

那么我们如何评估这些策略呢?我们可以通过比较从每种方法中获得的预期投资回报率(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),甚至是基于情绪分析的策略!