优化改进#

backtrader 的版本 1.8.12.99 在多进程过程中优化了 数据源 和*结果*的管理方式。

注意

这两者的行为已经改变

这些选项的行为可以通过两个新的 Cerebro 参数来控制:

  • optdatas (默认为 True

    如果为 True ,并且正在进行优化(以及系统可以 preload 和使用 runonce ),数据预加载仅在主进程中进行一次,以节省时间和资源。

  • optreturn (默认为 True

    如果为 True ,优化结果将不是完整的 Strategy 对象(包括所有的 数据源指标 *、*观察者 等等),而是一个具有以下属性的对象(与 Strategy 中的相同):

    • params (或 p ):策略在执行期间的参数

    • analyzers :已执行的策略

    在大多数情况下,只有 分析器 和使用哪些 参数*是评估策略性能所需的内容。如果需要对生成的值(例如 指标*)进行详细分析,请将此选项关闭。数据源管理


优化*场景中,以下是 Cerebro*参数的常见组合:

  • preload=True (默认值)

    在运行任何回测代码之前,数据源将被预加载

  • runonce=True (默认值)

    *指标*将以批处理模式进行计算,而不是逐步计算。

如果两个条件都为 Trueoptdatas=True ,那么:

  • 在生成新的子进程之前, 数据源 将在主进程中预先加载(这些子进程负责执行*回测*)

结果管理#

优化*场景中,评估每个 策略 运行的不同 参数*时,应该重视以下两个方面:- strategy.params (或 strategy.p

实际用于回测的值集合

  • strategy.analyzers

    负责评估*策略*实际表现的对象。例如:

    SharpeRatio_A (年化 夏普比率

optreturn=True 时,不会返回完整的*策略*实例,而是创建占位符对象,其中包含上述两个属性以进行评估。

这样可以避免返回许多由指标在*回测*期间生成的数据,例如值。

如果希望返回 完整的策略对象 ,只需在 cerebro 初始化 期间或在执行 cerebro.run 时设置 optreturn=False

一些测试运行#

backtrader 源代码中的*优化*示例已扩展以添加对 optdatasoptreturn 的控制(实际上是禁用它们)单核运行


作为参考,当 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。 optdatasoptreturn 将被禁用

同时激活 optdataoptreturn#

默认行为:

$ ./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位系统下进行的。在其他条件下可能会有所不同。

总结#

  • 在优化过程中,时间减少的最大因素是使用多个核心

  • 使用 optdatasoptreturn 运行的示例分别显示了约 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范围上限

```