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數量限制為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