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教程:指標 - 開發

如果必須開發任何東西(除了一個或多個獲勝策略之外),那麼這個東西就是一個自定義指標。 根據作者的說法,平臺內的這種開發很容易。 需要滿足以下條件: 從指標派生的類(直接或從現有的子類派生) 定義它將保持lines 指標必須至少具有 1 line。

Backtrader教程:安裝

要求和版本 backtrader 是獨立的,沒有外部依賴關係(除非要繪圖) 基本要求是: Python 2.7 Python 3.2 / 3.3/ 3.4 / 3.5 pypy/pypy3 如果需要繪圖,則其他要求: Matplotlib >= 1.4.

Backtrader教程:操作平臺

Line 反覆運算器 為了參與操作,plaftorm使用 line 反覆運算器的概念。它們已經鬆散地模仿了Python的反覆運算器,但實際上與它們無關。 策略和指標是 line 反覆運算器。

Backtrader教程:日誌記錄 - 編寫器

將以下內容寫出到流中: csv 流,

Backtrader數據多時間幀

有時投資決策是使用不同的時間框架做出的: 每周評估趨勢 每天執行條目 或者5分鐘對60分鐘。 這意味著需要將多個時間幀的數據組合在 backtrader 中以支援此類組合。 對它的本機支持已經內置。

Backtrader教程:數據饋送 - 熊貓

注意 pandas 並且必須安裝其依賴項 支援Pandas Dataframes似乎受到很多人的關注,他們依賴於已經可用的解析代碼來分析不同的數據源(包括CSV)和Pandas提供的其他功能。 數據饋送的重要聲明。 注意 這些只是 聲明。不要盲目複製此代碼。

Backtrader教程:分析儀 - PyFolio

注意 從(至少)2017-07-25pyfolio 開始,API已更改,不再 create_full_tear_sheet 具有 gross_lev 作為命名參數的參數。

Backtrader信貸利息

在某些情況下,真實經紀人的現金金額可能會減少,因為資產操作包括利率。例子: 賣空股票 交易所買賣基金包括多頭和空頭 這意味著不僅交易構成了系統的盈利能力,因為信貸上的利息在帳戶上佔有一席之地。 為了涵蓋這種情況, backtrader 包括(從發佈1.8.8.96開始)功能來考慮這一點。