backtrader性能评估

backtrader作者在这篇博客里测试了使用pypy能够显著提升backtrader回测速度,至少节约一半时间。

作者看reddit论坛有人说backtrader处理不了160万k线。

作者用backtrader进行了如下测试:
1 数据
作者首先生成100支股票,每支生成20000根k线,这样总共有200万根k线,分别放在100个csv文件里。

2 测试平台
i7 cpu 32G内存, win10
比较了两个python 解释器:传统的CPython 3.6.1 和快速的pypy 3.6.0.0

3 策略
测试策略就是一个简单的双均线策略,所有股票出现金叉买入,死叉卖出。

4 不执行交易的测试结果
所谓不执行交易,也就是策略的next方法为空,相当于只是加载数据。另外,不计算指标,只是简单的迭代。

4.1 在backtrader默认的批运行模式(runonce mode)下

CPython:高峰内存348M,总时间135秒,其中76秒用于预加载数据,其余是迭代时间。平均每秒处理14713根k线。

pypy: 高峰内存269M,总时间57秒,每秒处理34971根k线。相对CPython,时间节约了一半多。

4.2 在exactbars=True模式下
如果不用默认模式,在cerebro运行参数里设置exactbars=True,stdstats=False,则不会一次性预加载所有数据。来看看测试结果。

CPython:高峰内存75M,总时间114秒。平均每秒处理17494根k线。

pypy: 高峰内存49M,总时间66秒,每秒处理30025根k线。

相对4.1 内存节约明显,速度节约不明显。

5 执行交易的测试结果pypy
如果在策略next方法中,执行双均线交易逻辑,这是和实际策略一样的测试。运行在批模式下runonce mode。只报告pypy下的结果。
高峰内存消耗:1.3G
执行时间:156秒(含指标计算+交易),每秒处理12743根k线。

6 结论
backtrader默认可以处理百万级k线。
尽量使用pypy(例如,如果你不需要绘图输出的话)

7 测试8000支股票?
pypy下,如果回测8000支股票,每支20000根k线,相当于总计1.6亿根k线。所花时间粗略估计为上述80倍,即156×80=12480秒=3.5小时。内存可能消耗几个G。

Share