一文读懂:只用3行Python回溯测试你的交易策略

大家好, 我是Lucy@FinTech社区。

关于不同股票分析方法的书和文章已经有很多了,但是很少有人讲述当有许多可能的策略可以采取时,怎么用系统的方法来选择一个。此文将教你如何只用3行Python来回溯测试你的交易策略,让我们一起学习吧!

 

欢迎大家添加微信fintech12,加入FinTech社区,提认知攒人脉,求职招聘!

大家好, 我是Lucy@FinTech社区。

 

市面上有很多不同的股票分析方法,其中主流的两种分别是技术分析基本面分析。相信你一定读过很多关于这些技巧的书和文章。

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

这两种类型的分析都是有意义的,因为它们可以为我们的交易提供信息;然而,市面上的文章并没有讲述当有许多可能的策略可以采取时,怎么用系统的方法来选择一个。实际上,大多数交易最终仍然是“直觉”决策,而不是由数据驱动的

 

通过阅读这篇文章,你将获得:

1. 如何评估可选策略 – 回溯测试

2. Fastquant框架

3. 3行代码回溯策略实战

4. 回溯策略的局限性以及克服方法

 

Part1 如何评估可选策略 – 回溯测试

我们如何评估那些备选策略呢?我们可以通过比较从每种方法中获得的预期投资回报率(ROI)来做到这一点。

最好的方法是使用一种称为回溯测试的方法来评估一种策略,即通过模拟过去使用它的情况来评估它的表现。

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

为了填补这个空白,我们所介绍的fastquant,目标是尽可能简单地将回溯测试引入主流。
 

使用fastquant,我们只需3行代码就可以对交易策略进行回溯测试!
 

fastquant本质上是流行的backtrader框架的包装器,它允许我们大大简化回溯测试的过程,从在backtrader上至少需要30行代码到在fastquant上只需要3行代码。

 

Part2&3 Fastquant安装及3行代码回溯策略实战

在本文的其余部分,我们将进行实践:如何通过Jollibee Food Corp.(JFC)的历史数据来回溯测试一个简单的移动平均值交叉(SMAC)策略


我们开始吧!回溯测试我们的第一个策略

 

a. 安装fastquant

它可以直接使用pip!

# Run this on your terminal
pip install fastquant

# Alternatively, you can run this from jupyter this way
!pip install fastquant

 

b. 获取股票数据

从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


 

c. 回溯测试你的交易策略
 

在这一小节中,我们利用fastquant的回溯测试功能,通过Jollibee Food Corp.(JFC)的历史股票数据,对一种简单的移动平均交叉策略(SMAC)进行回溯测试。

在SMAC策略中,快速周期(fast_period)指用于快速移动均线的时段,而slow period(slow_period)指用于慢速移动均线的时段

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

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

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

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


from fastquant import backtest
backtest('smac', jfc, fast_period=15, slow_period=40)# Starting Portfolio Value: 100000.00
# Final Portfolio Value: 100411.83

 

把所有这些放在一起-用3行Python进行回溯测试

 

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

from fastquant import backtest, get_stock_data
jfc = get_stock_data("JFC", "2018-01-01", "2019-01-01")
backtest('smac', jfc, fast_period=15, slow_period=40)# Starting Portfolio Value: 100000.00
# Final Portfolio Value: 100411.83

 

d. 改进SMAC策略

增加快周期和慢周期:

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

backtest('smac', jfc, fast_period=30, slow_period=50)# Starting Portfolio Value: 100000.00
# Final Portfolio Value: 83946.83

 

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

 

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

backtest('smac', jfc, fast_period=15, slow_period=35)# Starting Portfolio Value: 100000.00
# Final Portfolio Value: 102272.90

 

 

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

 

Part 4 回溯策略的局限性以及克服方法

 

克服回溯测试的局限性

根据以上结果,这是否意味着我们应该用最好的SMAC策略交易JFC?也许还没有。

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

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

 

a. 过度拟合

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

避免过拟合的一个方法是从样本中测试你的策略,这类似于在机器学习中使用“测试集”。这样做的目的是,当你想评估你的交易策略的盈利能力时,你只需要保留一次数据。这样,就很难过度拟合参数,因为我们并没有基于该数据集优化策略。

 

b. 前瞻性偏差

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

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

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

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

 

*值得注意的fastquant默认参数:

 

1. “get_stock_data”功能

为了使“get_stock_data”函数尽可能简单地使用,它只被设计为返回股票的收盘价(用于大多数交易策略),其格式为“c”(c=收盘价)。但是,如果你想有更多的定价数据点(例如,OHLCV代表“开盘”、“高”、“低”、“收盘”、“成交量”),只需将“get_stock_data”中的“format”参数设置为所需的数据格式。

 

特斯拉库存格式(OHLCV)示例如下:

tsla = get_stock_data("TSLA", "2018-01-01", "2019-01-01", format="ohlcv")

 

注意:对于在雅虎财经上上市的国际股票,这个格式特性应该是稳定的。对于来自PSE的符号,我们建议使用默认的“c”格式。

 

2. “backtest”功能

对于“backtest”函数,我们假设您在购买时使用的现金比例(购买逯u prop)为1(100%),您出售的股票(sell_prop)的比例为1(100%),每笔交易的佣金(佣金)为0.75%。用户可以通过设置括号中参数中的值来编辑这些默认值。

 

下面的例子中,回溯测试特斯拉,假设买入/卖出比例=50%,卖出交易佣金=1%。

backtest("smac", tsla, buy_prop=0.50, sell_prop=0.50, commission=0.01)

 

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

以上就是回溯测试交易策略的全部内容了,快来使用fastquant来找出优秀的策略吧!

 


今日互动:

小伙伴们平时还有用到什么别的回溯测试的方法,欢迎在下面的留言区一起交流学习~

近期热招: (点击标题,即可了解详情) 

   招聘 | 基金经理-上海-量化交易

   招聘 | 初级量化研究-Bondi Capital

   招聘 | 量化研究(机器学习) -AI量化公司

   招聘 | 期权交易-全球顶尖交易公司

   招聘 | 量化研究(机器学习) -AI量化公司