用VectorBT构建算法交易模型

尽管看起来构建一个算法交易模型可能很艰巨,但使用一个名为VectorBT的强大Python库可以大大简化这个过程,并使其变得轻而易举。

用VectorBT构建算法交易模型
一键发币: SUI | SOL | BNB | ETH | BASE | ARB | OP | POLYGON | AVAX | FTM | OK

也许,你想构建你的第一个算法交易模型。尽管看起来可能很艰巨,但使用一个名为VectorBT的强大Python库可以大大简化这个过程,并使其变得轻而易举。我个人非常喜欢VectorBT,因为它免费,并且让我们能够用令人惊讶的少量代码构建交易和回测程序。在本文中,我们将构建一个仅使用移动平均线指标的模型,而在下一篇文章中我们将探索其他策略。

1、前提条件

在文章主要内容之前,有几个前提条件:

  • 在终端中运行以下两个代码片段以安装VectorBT库和datetime库(虽然datetime应该已经随Python一起安装):
pip install vectorbt datetime
  • 浏览VectorBT的文档。不需要深入研究,但熟悉一些内置函数和类可能会有所帮助。
  • 查看Yahoo Finance上的不同指标,并尝试不同的指标。至少要查看移动平均线指标。(它非常直观,但仍然值得与常规图表进行比较)

2、理论基础

我们在本文中将构建的策略很简单,并且在现实世界中并不是最有效的,但它易于实现,是一个很好的学习如何构建回测程序的例子。

该策略的工作原理如下:当您所交易的证券价格变化时,记录两条移动平均线。其中一条是“短期”移动平均线,另一条是“长期”移动平均线——在我的代码中,我用“快速”和“慢速”来表示这两条移动平均线。

该策略基于这样一个想法,即证券可以有买卖的动量,因此当短期移动平均线高于长期移动平均线时,证券具有正向动量,很可能会上涨趋势,所以您买入(这称为“黄金交叉”)。相反,当短期移动平均线低于长期移动平均线时,价格具有负向动量,所以您卖出(这称为“死亡交叉”)。

由于该策略完全依赖单一指标,可能导致发出错误信号,因此再次强调,这不是一个单独使用的良好策略,但是一个极好的学习示例,与其他指标结合使用时会更有效。

3、代码实现

首先,导入我们将使用的两个库:VectorBT和datetime。

import vectorbt as vbt  
import datetime as dt

接下来,我们设置回测窗口的时间范围,这是我们测试的时间长度。我们需要datetime库来完成这一点,并使用 now()timedelta()方法。第一行获取当前日期/时间,第二行初始化startDate变量并将它设置为今天之前的730天(2年),通过从当前日期(由“rn”变量表示)减去730天使用 timedelta()方法。

rn = dt.datetime.now()  
startDate = rn - dt.timedelta(days=730)

接下来,我们使用VectorBT导入数据。 download()方法的第一个参数是证券的符号( SPY),第二个参数是要获取的数据间隔( 1d),最后一个参数是数据的开始日期( start=startDate)。 download()方法还有其他可传递的参数,但这个程序只需要这些。最后我们使用 get()方法选择我们刚刚下载的数据中实际想要使用的数据。我们传递 Close参数以仅使用收盘价数据。

symbol = vbt.YFData.download('SPY', interval='1d', start=startDate).get('Close')

在更面向数据科学的部分代码中,我们使用VectorBT分析收盘价数据并从中生成移动平均线数据。我们使用两个不同的变量, fast_maslow_ma来完成这一点。 run()方法是VectorBT的方法,它将应用于第一个参数传递的数据中的任何指标(这里是‘MA’)。当我们在这里使用 run()方法与移动平均线指标时,必须传递的另一个参数是窗口大小。在我的例子中,我们使用50天(快)和100天(慢)。

fast_ma = vbt.MA.run(symbol, 50)  
slow_ma = vbt.MA.run(symbol, 100)

开始代码中特定于交易的部分,我们定义了入场和出场条件。要定义这些条件,您使用之前创建的数据集之一(要么是 fast_ma要么是 slow_ma),然后使用VectorBT方法将其与另一个进行比较。在这种情况下,我们定义入场条件为当 fast_ma跨越到 slow_ma之上时,而退出条件则相反。

entries = fast_ma.ma_crossed_above(slow_ma)  
exits = fast_ma.ma_crossed_below(slow_ma)

最后,我们使用VectorBT的“Portfolio”类将我们之前的所有工作结合起来,并对我们的策略进行回测。从Portfolio类中,我们使用 from_signals()方法将我们创建的信号(入场和出场)添加到策略中。在方法的前三个参数( symbolentriesexits)之后,其余参数是 init_cash,它设置了我们投资组合的起始价值/购买力, freq声明了程序可以交易的频率, sl_stop允许我们设置止损参数, tp_stop允许我们设置获利参数。

pf = vbt.Portfolio.from_signals(symbol, entries, exits, init_cash=100, freq='1d', sl_stop=0.05, tp_stop=0.2)

最后,我们使用几行代码来显示结果。最后一行,用于创建图形并显示图形,使用的是VectorBT。

print(pf.total_profit())  
print(pf.stats())  
pf.plot().show()

为了便于复制粘贴进行测试,以下是完整的代码:

import vectorbt as vbt  
import datetime as dt  
  
rn = dt.datetime.now()  
startDate = rn - dt.timedelta(days=730)  
  
symbol = vbt.YFData.download('SPY', interval='1d', start=startDate).get('Close')  
  
fast_ma = vbt.MA.run(symbol, 50)  
slow_ma = vbt.MA.run(symbol, 100)  
  
entries = fast_ma.ma_crossed_above(slow_ma)  
exits = fast_ma.ma_crossed_below(slow_ma)  
  
pf = vbt.Portfolio.from_signals(symbol, entries, exits, init_cash=100, freq='1d', sl_stop=0.05, tp_stop=0.2)  
print(pf.total_profit())  
print(pf.stats())  
pf.plot().show()

最后,这是我在S&P 500(SPY)上运行策略后的图表,使用了上述确切参数:

这是你可以使用VectorBT绘图功能创建的许多图表之一。

希望你喜欢这篇文章,如果你读到这里,感谢你的阅读。说实话,我对算法交易也很新,但我认为互联网需要更多简化的、分步骤的信息。我也爱上了VectorBT,但发现很难找到很多教程,所以我决定写一些我自己构建的不同策略的教程。

如果你想继续学习,我建议在Quantitative Finance Stack Overflow上探索一下,在Medium上搜索文章,对于VectorBT具体问题,请查看VectorBT的GitHub网站


原文链接:Building Your First Algorithmic Trading Model With VectorBT

DefiPlot翻译整理,转载请标明出处

免责声明:本站资源仅用于学习目的,也不应被视为投资建议,读者在采取任何行动之前应自行研究并对自己的决定承担全部责任。
通过 NowPayments 打赏