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

一键发币: 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_ma
和 slow_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()
方法将我们创建的信号(入场和出场)添加到策略中。在方法的前三个参数( symbol
、 entries
和 exits
)之后,其余参数是 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翻译整理,转载请标明出处
免责声明:本站资源仅用于学习目的,也不应被视为投资建议,读者在采取任何行动之前应自行研究并对自己的决定承担全部责任。