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

  • optdatas(默认True

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

  • optreturn(默认True

    如果True优化结果不是完整Strategy 对象(以及所有数据指标观察者……),而是具有以下属性的对象(与中相同Strategy):

    • params(或p)执行的策略
    • analyzers策略已执行

    在大多数情况下,只有分析器和哪些参数是评估策略性能所需的东西。如果需要对(例如) 指标的生成值进行详细分析,请将其关闭

数据馈送管理

优化方案中,这可能是Cerebro 参数的组合:

  • preload=True(默认)

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

  • runonce=True(默认)

    指标将在批处理模式下以紧密的 for循环计算,而不是逐步计算。

如果两个条件都是Trueand optdatas=True,那么:

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

结果管理

优化方案中,在评估运行每个 *Strategy的不同参数时,有两件事应该发挥最重要的作用:

  • strategy.params(或strategy.p

    用于回测的实际值集

  • strategy.analyzers

    负责评估策略 实际执行情况的对象。例子:

    SharpeRatio_A(年化夏普比率

optreturn=True,而不是返回完整的策略实例,将创建带有上述两个属性的占位符对象以进行评估。

这避免了传回大量生成的数据,例如回测期间指标生成的

如果需要完整的策略对象,只需optreturn=False 在 cerebro实例化期间或执行时设置cerebro.run

一些测试运行

backtrader源中的优化示例已扩展为添加控制和(实际上是禁用它们)optdatasoptreturn

单核运行

作为参考,当 CPU 数量受限1且未 multiprocessing使用模块时会发生什么:

$ ./optimization.py --maxcpus 1
==================================================
**************************************************
--------------------------------------------------
OrderedDict([(u'smaperiod', 10), (u'macdperiod1', 12), (u'macdperiod2', 26), (u'macdperiod3', 9)])
**************************************************
--------------------------------------------------
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)])
==================================================
Time used: 184.922727833

多核心运行

在不限制 CPU 数量的情况下,Python 多处理模块将尝试使用所有 CPU。 optdatas 和 optreturn 将被禁用

optdata 和 optreturn 都处于活动状态

默认行为:

$ ./optimization.py
...
...
...
==================================================
Time used: 56.5889185394

拥有多核以及数据馈送结果改进的总体改进 意味着从几秒缩短184.9256.58几秒。

考虑到样本正在使用252条形图,并且指标仅生成​​具有点长度的252值。这只是一个例子。

真正的问题是这在多大程度上归因于新行为。

optreturn停用

让我们将完整的策略对象传回给调用者:

$ ./optimization.py --no-optreturn
...
...
...
==================================================
Time used: 67.056914007

执行时间增加18.50%(或加速15.62%)到位。

optdatas停用

每个子进程都被迫为数据馈送加载自己的一组值:

$ ./optimization.py --no-optdatas
...
...
...
==================================================
Time used: 72.7238112637

执行时间增加28.52%(或加速22.19%)到位。

两者都停用

仍在使用多核但具有旧的未改进行为:

$ ./optimization.py --no-optdatas --no-optreturn
...
...
...
==================================================
Time used: 83.6246643786

执行时间增加47.79%(或加速32.34%)到位。

这表明多核的使用是时间改进的主要贡献者。

结束语

  • 优化期间减少时间的最大因素是使用多个内核
  • 该示例运行optdatasoptreturn显示了 around22.19%15.62%each 的加速(32.34%在测试中都一起)

示例使用

$ ./optimization.py --help
usage: 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]

Optimization

optional arguments:
  -h, --help            show this help message and exit
  --data DATA, -d DATA  data to add to the system
  --fromdate FROMDATE, -f FROMDATE
                        Starting date in YYYY-MM-DD format
  --todate TODATE, -t TODATE
                        Starting date in YYYY-MM-DD format
  --maxcpus MAXCPUS, -m MAXCPUS
                        Number of CPUs to use in the optimization
                          - 0 (default): use all available CPUs
                          - 1 -> n: use as many as specified
  --no-runonce          Run in next mode
  --exactbars EXACTBARS
                        Use the specified exactbars still compatible with preload
                          0 No memory savings
                          -1 Moderate memory savings
                          -2 Less moderate memory savings
  --no-optdatas         Do not optimize data preloading in optimization
  --no-optreturn        Do not optimize the returned values to save time
  --ma_low MA_LOW       SMA range low to optimize
  --ma_high MA_HIGH     SMA range high to optimize
  --m1_low M1_LOW       MACD Fast MA range low to optimize
  --m1_high M1_HIGH     MACD Fast MA range high to optimize
  --m2_low M2_LOW       MACD Slow MA range low to optimize
  --m2_high M2_HIGH     MACD Slow MA range high to optimize
  --m3_low M3_LOW       MACD Signal range low to optimize
  --m3_high M3_HIGH     MACD Signal range high to optimize

 

评论被关闭。