优化改进#
backtrader 的版本
1.8.12.99
在多进程过程中优化了 数据源 和*结果*的管理方式。
注意
这两者的行为已经改变
这些选项的行为可以通过两个新的 Cerebro 参数来控制:
optdatas
(默认为True
)如果为
True
,并且正在进行优化(以及系统可以preload
和使用runonce
),数据预加载仅在主进程中进行一次,以节省时间和资源。
optreturn
(默认为True
)如果为
True
,优化结果将不是完整的Strategy
对象(包括所有的 数据源 、指标 *、*观察者 等等),而是一个具有以下属性的对象(与Strategy
中的相同):
params
(或p
):策略在执行期间的参数
analyzers
:已执行的策略在大多数情况下,只有 分析器 和使用哪些 参数*是评估策略性能所需的内容。如果需要对生成的值(例如 指标*)进行详细分析,请将此选项关闭。数据源管理
在 优化*场景中,以下是 Cerebro*参数的常见组合:
preload=True
(默认值)在运行任何回测代码之前,数据源将被预加载
runonce=True
(默认值)*指标*将以批处理模式进行计算,而不是逐步计算。
如果两个条件都为 True
且 optdatas=True
,那么:
在生成新的子进程之前, 数据源 将在主进程中预先加载(这些子进程负责执行*回测*)
结果管理#
在 优化*场景中,评估每个 策略 运行的不同 参数*时,应该重视以下两个方面:- strategy.params
(或 strategy.p
)
实际用于回测的值集合
strategy.analyzers
负责评估*策略*实际表现的对象。例如:
SharpeRatio_A
(年化 夏普比率 )
当 optreturn=True
时,不会返回完整的*策略*实例,而是创建占位符对象,其中包含上述两个属性以进行评估。
这样可以避免返回许多由指标在*回测*期间生成的数据,例如值。
如果希望返回 完整的策略对象 ,只需在 cerebro 初始化 期间或在执行 cerebro.run
时设置 optreturn=False
。
一些测试运行#
backtrader 源代码中的*优化*示例已扩展以添加对
optdatas
和optreturn
的控制(实际上是禁用它们)单核运行
作为参考,当 CPU 限制为 1
且未使用 multiprocessing
模块时会发生以下情况:
OrderedDict([(u’smaperiod’, 10), (u’macdperiod1’, 13), (u’macdperiod2’, 26), (u’macdperiod3’, 9)]) … … OrderedDict([(u’smaperiod’, 29), (u’macdperiod1’, 19), (u’macdperiod2’, 29), (u’macdperiod3’, 14)]) ================================================== 使用时间: 184.922727833
多核运行#
当不限制 CPU 数量时,Python multiprocessing
模块将尝试使用所有 CPU。
optdatas
和 optreturn
将被禁用
同时激活 optdata
和 optreturn
#
默认行为:
$ ./optimization.py … … … ================================================== 使用时间: 56.5889185394
多核和 数据输入 和*结果*的总体改善意味着从 184.92
秒降低到 56.58
秒。
请注意,该示例使用 252
个柱形和指标仅生成 252
个点长度的值。这只是一个示例。真正的问题是有多少是归因于新行为。
optreturn
取消激活#
让我们将完整的 策略 对象传递给调用者:
$ ./optimization.py --no-optreturn
...
...
...
==================================================
使用时间: 67.056914007
执行时间增加了 18.50%
(或加速了 15.62%
)。
optdatas
取消激活#
每个子进程都被强制为其自己加载一套 数据源 的值:
$ ./optimization.py --no-optdatas
...
...
...
==================================================
使用时间: 72.7238112637
执行时间增加了 28.52%
(或加速了 22.19%
)。
两者均取消激活 —————-仍然使用多核心,但是带有旧的非改进性行为:
$ ./optimization.py --no-optdatas --no-optreturn
...
...
...
==================================================
使用的时间:83.6246643786
执行时间增加了 47.79%
(或速度提升了 32.34%
)。
这表明多核心的使用是时间改进的主要因素。
注意
这些执行是在一台装有 i7-4710HQ
(4核心/8个逻辑核心)和16 G字节内存的笔记本电脑上在Windows 10 64位系统下进行的。在其他条件下可能会有所不同。
总结#
在优化过程中,时间减少的最大因素是使用多个核心
使用
optdatas
和optreturn
运行的示例分别显示了约22.19%
和15.62%
的加速度(在测试中两者一起为32.34%
)
示例用法#
::``` $ ./optimization.py –help 用法: optimization.py [-h] [–data DATA] [–fromdate FROMDATE]
[–todate TODATE] [–maxcpus MAXCPUS] [–no-runonce] [–exactbars EXACTBARS] [–no-optdatas] [–no-optreturn] [–ma_low MA_LOW] [–ma_high MA_HIGH] [–m1_low M1_LOW] [–m1_high M1_HIGH] [–m2_low M2_LOW] [–m2_high M2_HIGH] [–m3_low M3_LOW] [–m3_high M3_HIGH]
优化
- 可选参数:
- -h, --help
显示此帮助信息并退出
- --data DATA, -d DATA
添加到系统的数据
- --fromdate FROMDATE, -f FROMDATE
开始日期,格式为YYYY-MM-DD
- --todate TODATE, -t TODATE
结束日期,格式为YYYY-MM-DD
- --maxcpus MAXCPUS, -m MAXCPUS
- 用于优化的CPU数量
0(默认值):使用所有可用的CPU
1 -> n:使用指定数量的CPU
- --no-runonce
运行在下一模式下
- --exactbars EXACTBARS
- 使用指定的exactbars仍与预加载兼容
0 不节省内存 -1 中等节省内存 -2 较少的中等节省内存
- --no-optdatas
不优化优化中的数据预加载
- --no-optreturn
不优化返回的值以节省时间
- --ma_low MA_LOW
要优化的SMA范围下限
- --ma_high MA_HIGH
要优化的SMA范围上限
- --m1_low M1_LOW
要优化的MACD Fast MA范围下限
- --m1_high M1_HIGH
要优化的MACD Fast MA范围上限
- --m2_low M2_LOW
要优化的MACD Slow MA范围下限
- --m2_high M2_HIGH
要优化的MACD Slow MA范围上限
- --m3_low M3_LOW
要优化的MACD Signal范围下限
- --m3_high M3_HIGH
要优化的MACD Signal范围上限