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
(預設值)指標將在批處理模式下進行計算,而不是逐步進行迴圈。
如果兩個條件都是True
和 optdatas=True
,則:
- Data Feeds將在生成新的子進程(負責執行回溯測試的子進程)之前預載入到主進程中
成果管理
在優化場景中,在評估運行每個策略的不同參數時,兩件事應該起著最重要的作用:
-
strategy.params
(或strategy.p
)用於回溯測試的實際值集
-
strategy.analyzers
負責評估「戰略」實際執行情況的物件。例:
SharpeRatio_A
(年化夏普拉蒂奧)
當不是返回完整的策略實例時optreturn=True
,將創建佔位元元對象,這些物件帶有上述兩個屬性,以便進行評估。
這避免了回傳大量生成的數據,例如在回溯測試期間指標生成的值
如果需要完整的策略物件,只需在cerebro實例化期間或執行 cerebro.run
時設置optreturn=False
即可。
一些測試運行
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數量的情況下,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%
和optreturn
15.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