Backtrader教程:Cerebro - 优化 - 改进

  |  

backtrader版本1.8.12.99改进了在多处理过程中管理data feeds和结果的方式。

注意

两者的行为都已制定

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

  • optdatas (默认值: True

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

  • optreturn (默认值: True

    如果True 优化结果不是完整的 Strategy 对象(以及所有数据、指针、 observers ...),而是具有以下属性的对象(与 中 Strategy相同):

    • params (或 p)运行策略

    • analyzers 策略已运行

    在大多数场合,只有 analyzers ,以及参数是评估策略性能所需的东西。如果需要对(例如)指针的生成值进行详细分析,请将其关闭

Data Feed 管理

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

  • preload=True (默认值)

    在运行任何回溯测试代码之前,将预加载数据费用

  • runonce=True (默认值)

    指针将在批处理模式下进行计算,而不是逐步进行循环。

如果两个条件都是Trueoptdatas=True,则:

  • Data Feeds将在生成新的子进程(负责运行回溯测试的子进程)之前预加载到主进程中

成果管理

在优化场景中,在评估运行每个策略的不同参数时,两件事应该起着最重要的作用:

  • strategy.params (或 strategy.p

    用于回溯测试的实际值集

  • strategy.analyzers

    负责评估「战略」实际运行情况的对象。例:

    SharpeRatio_A (年化夏普拉蒂奥)

当不是返回完整的策略实例时optreturn=True,将创建占比特元对象,这些对象带有上述两个属性,以便进行评估。

这避免了回传大量生成的数据,例如在回溯测试期间指针生成的值

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

一些测试运行

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

单核运行

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

$ ./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数量的情况下,Pythonmultiprocessing模块将尝试使用所有这些CPU,并将optreturn被禁用。 optdatas

两者兼optdata 而有 optreturn

缺省行为:

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

通过多核以及 data feed 和结果改进的总体改进意味着从184.92 几秒钟开始 56.58

考虑到样本使用的252 是柱线,指针仅生成点长度的值 252 。这只是一个例子。

真正的问题是,这其中有多少可归因于新行为。

optreturn 关闭

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

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

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

optdatas 关闭

每个子进程都被迫为 data feeds加载自己的一组值:

$ ./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%)到位。

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

注意

运行是在Windows 10 64位下具有i7-4710HQ 16 GB RAM的笔记型电脑中完成的(4核/ 8逻辑)。在其他条件下,里程可能会有所不同

总结

  • 优化期间时间减少的最大因素是使用多个内核

  • 该范例运行optdatas并显示周围22.19%optreturn15.62%每个的加速(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

推荐阅读

相关文章

Backtrader按日线交易

似乎在世界某个地方有一种权益(Interest)可以总结如下: 使用每日柱线引入订单,但使用开盘价 这来自工单#105订单执行逻辑与当前数据和#101动态投注计算中的对话 backtrader 尝试尽可能保持现实,并且在处理每日柱线时适用以下前提: 当每日柱被评估时,柱线已经结束 这是有道理的,

Backtrader对逐笔报价数据重新采样

backtrader 已经可以从分钟数据中重新采样。接受价格变动数据不是问题,只需将 4 个常用字段(open、 high、 low、 close)设置为价格变动值。 但是传递要重新采样的逐笔报价数据再次生成相同的数据。作为或版本 1.1.11.88,情况已不再如此。

Backtrader教程:安装

要求和版本 backtrader 是独立的,没有外部依赖关系(除非要绘图) 基本要求是: Python 2.7 Python 3.2 / 3.3/ 3.4 / 3.5 pypy/pypy3 如果需要绘图,则其他要求: Matplotlib >= 1.4.

Backtrader教程:日志记录 - 编写器

将以下内容写出到流中: csv 流,

Backtrader教程:数据馈送 - 扩展(Extending DataFeed)

GitHub 中的问题实际上是在推动文档部分的完成,或者説明我了解我是否backtrader 具有我从一开始就设想的易用性和灵活性以及在此过程中做出的决定。 在本例中为问题 #9。

Backtrader教程:Cerebro - 优化 - 改进

backtrader版本1.8.12.99改进了在多处理过程中管理data feeds和结果的方式。

Backtrader 多数据范例

社区中的几个主题似乎以如何跟踪订单为导向,特别是当几个data feeds在起作用时,还包括当多个订单一起工作时,

Backtrader教程:数据馈送 - 熊猫

注意 pandas 并且必须安装其依赖项 支持Pandas Dataframes似乎受到很多人的关注,他们依赖于已经可用的解析代码来分析不同的数据源(包括CSV)和Pandas提供的其他功能。 数据馈送的重要声明。 注意 这些只是 声明。不要盲目拷贝此代码。

Backtrader教程:分析仪 - PyFolio

注意 从(至少)2017-07-25pyfolio 开始,API已更改,不再 create_full_tear_sheet 具有 gross_lev 作为命名参数的参数。

Backtrader信贷利息

在某些情况下,真实经纪人的现金金额可能会减少,因为资产操作包括利率。例子: 卖空股票 交易所买卖基金包括多头和空头 这意味着不仅交易构成了系统的盈利能力,因为信贷上的利息在帐户上佔有一席之地。 为了涵盖这种情况, backtrader 包括(从发佈1.8.8.96开始)功能来考虑这一点。