数据馈送及参数优化的改进方案 – backtrader中文教程
这些选项的行为可以通过两个新的Cerebro 参数来控制:
optdatas
(默认True
)如果
True
优化(并且系统可以preload
使用runonce
),数据预加载将在主进程中只进行一次,以节省时间和资源。optreturn
(默认True
)如果
True
优化结果不是完整Strategy
对象(以及所有数据、指标、观察者……),而是具有以下属性的对象(与中相同Strategy
):params
(或p
)执行的策略analyzers
策略已执行
在大多数情况下,只有分析器和哪些参数是评估策略性能所需的东西。如果需要对(例如) 指标的生成值进行详细分析,请将其关闭
数据馈送管理
在优化方案中,这可能是Cerebro 参数的组合:
preload=True
(默认)在运行任何回测代码之前,将预加载数据源
runonce=True
(默认)指标将在批处理模式下以紧密的 for循环计算,而不是逐步计算。
如果两个条件都是True
and optdatas=True
,那么:
- 在生成新的子进程(负责执行回测的子进程)之前,将在主进程中预加载数据馈送
结果管理
在优化方案中,在评估运行每个 *Strategy的不同参数时,有两件事应该发挥最重要的作用:
strategy.params
(或strategy.p
)用于回测的实际值集
strategy.analyzers
负责评估策略 实际执行情况的对象。例子:
SharpeRatio_A
(年化夏普比率)
当optreturn=True
,而不是返回完整的策略实例,将创建带有上述两个属性的占位符对象以进行评估。
这避免了传回大量生成的数据,例如回测期间指标生成的值
如果需要完整的策略对象,只需optreturn=False
在 cerebro实例化期间或执行时设置cerebro.run
。
一些测试运行
backtrader源中的优化示例已扩展为添加控制和(实际上是禁用它们)optdatas
optreturn
单核运行
作为参考,当 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.92
到56.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%
)到位。
这表明多核的使用是时间改进的主要贡献者。
结束语
- 优化期间减少时间的最大因素是使用多个内核
- 该示例运行
optdatas
并optreturn
显示了 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
评论被关闭。