Backtrader混合時間幀

  |  

1.3.0.92版本帶來了混合來自不同時間幀的數據(來自 data feeds 和/或指標)的可能性。

到版本:https://github.com/mementum/backtrader/發佈/標籤/1.3.0.92

背景:指示器是智慧啞物件。

  • 他們很聰明,因為他們可以進行複雜的計算。

  • 他們是愚蠢的,因為他們不知道哪些來源為計算提供數據。

因此:

  • 如果提供這些值的數據源具有不同的時間幀,引擎內部 Cerebro 的長度也不同,則指標將中斷。

計算範例,其中data0 的時間範圍為天, data1 時間範圍為 months

pivotpoint = btind.PivotPoint(self.data1)
sellsignal = self.data0.close < pivotpoint.s1

這裡,當close低於s1line1st支撐位)時,尋求賣出信號

注意

PivotPoint 根據定義,在更大的時間範圍內工作

這將在過去出現以下錯誤:

return self.array[self.idx + ago]
IndexError: array index out of range

並且有充分的理由:self.data.close第1個瞬間開始提供值,但是PivotPoint(因此s1line)只會在整整一個月過去一次時才提供值,這大致相當於22個值self.data0.close。在此 22 關閉期間,尚無 值s1,並且嘗試從基礎陣列中獲取它失敗。

Lines 物件支援() 運算符(__call__ Python中的特殊方法)來提供自身的延遲版本:

close1 = self.data.close(-1)

在此示例中,物件close1(噹通過 [0]訪問時)始終包含 由 close傳遞的先前值 (-1)。該語法已被重用以適應適應時間範圍。讓我們重寫上面的pivotpoint片段:

pivotpoint = btind.PivotPoint(self.data1)
sellsignal = self.data0.close < pivotpoint.s1()

()瞭解如何在沒有參數的情況下執行 (在後台提供 aNone)。正在發生以下情況:

pivotpoint.s1() 返回一個內部 LinesCoupler 物件,該物件遵循較大範圍的嚴格程度。該耦合器用實數 s1 中最新傳遞的值填充自身(從預設值 NaN開始)

但是需要一些額外的東西來使魔術起作用。Cerebro 必須使用以下命令建立:

cerebro = bt.Cerebro(runonce=False)

或通過以下方式執行:

cerebro.run(runonce=False)

在此模式下,指標和後期評估的自動 lines 物件是逐步執行的,而不是在緊密迴圈中執行的。這使得整個操作變慢,但它使它成為可能

底部的示例腳本正在上面斷開,現在運行:

$ ./mixing-timeframes.py

帶輸出:

0021,0021,0001,2005-01-31,2984.75,2935.96,0.00
0022,0022,0001,2005-02-01,3008.85,2935.96,0.00
...
0073,0073,0003,2005-04-15,3013.89,3010.76,0.00
0074,0074,0003,2005-04-18,2947.79,3010.76,1.00
...

在交易 74 時,第 1 個 實例 close < s1 的 take palce。

該腳本還提供了對其他可能性的見解:耦合指標的所有 lines 。在我們之前:

self.sellsignal = self.data0.close < pp.s1()

作為替代方案:

pp1 = pp()
self.sellsignal = self.data0.close < pp1.s1

現在整個PivotPoint指標已經耦合,並且可以訪問其任何lines(即p, , r1r2s1, ) s2。該腳本只對以下內容感興趣s1,並且訪問是直接的:

$ ./mixing-timeframes.py --multi

輸出:

0021,0021,0001,2005-01-31,2984.75,2935.96,0.00
0022,0022,0001,2005-02-01,3008.85,2935.96,0.00
...
0073,0073,0003,2005-04-15,3013.89,3010.76,0.00
0074,0074,0003,2005-04-18,2947.79,3010.76,1.00
...

這裡沒有驚喜。和以前一樣。甚至可以繪製「耦合」物件:

$ ./mixing-timeframes.py --multi --plot

完整耦合語法

對於具有多個lineslines物件(例如,指標如下PivotPoint):

  • obj(clockref=None, line=-1)

    • clockref 如果 clockrefNone,則周圍的物件(在示例a Strategy中)將是使較大的時間幀(例如: Months)適應更小/更快的時間幀(例如: Days)的引用

    如果需要,可以使用其他引用

    line

    - If the default `-1` is given, all *lines* are coupled.
    
    - If another integer (for example, `0` or `1`) a single line will be
      coupled and fetched by index (from `obj.lines[x]`)
    
    - If a string is passed, the line will be fetched by name.
    
      In the sample the following could have been done:
    
      ```
      coupled_s1 = pp(line='s1')
      ```
    

對於具有單個linelines物件(例如,指標中的PivotPointlines1):

  • obj(clockref=None) (見上文 clockref

結論

集成在常規() 語法中,來自不同時間幀的數據可以混合在指標中,同時始終考慮 cerebro 需要使用 runonce=False實例化或創建的數據。

腳本代碼和用法

可作為樣品在源。backtrader用法:

$ ./mixing-timeframes.py --help
usage: mixing-timeframes.py [-h] [--data DATA] [--multi] [--plot]

Sample for pivot point and cross plotting

optional arguments:
  -h, --help   show this help message and exit
  --data DATA  Data to be read in (default: ../../datas/2005-2006-day-001.txt)
  --multi      Couple all lines of the indicator (default: False)
  --plot       Plot the result (default: False)

代碼:

from __future__ import (absolute_import, division, print_function,
                        unicode_literals)

import argparse

import backtrader as bt
import backtrader.feeds as btfeeds
import backtrader.indicators as btind
import backtrader.utils.flushfile


class St(bt.Strategy):
    params = dict(multi=True)

    def __init__(self):
        self.pp = pp = btind.PivotPoint(self.data1)
        pp.plotinfo.plot = False  # deactivate plotting

        if self.p.multi:
            pp1 = pp()  # couple the entire indicators
            self.sellsignal = self.data0.close < pp1.s1
        else:
            self.sellsignal = self.data0.close < pp.s1()

    def next(self):
        txt = ','.join(
            ['%04d' % len(self),
             '%04d' % len(self.data0),
             '%04d' % len(self.data1),
             self.data.datetime.date(0).isoformat(),
             '%.2f' % self.data0.close[0],
             '%.2f' % self.pp.s1[0],
             '%.2f' % self.sellsignal[0]])

        print(txt)


def runstrat():
    args = parse_args()

    cerebro = bt.Cerebro()
    data = btfeeds.BacktraderCSVData(dataname=args.data)
    cerebro.adddata(data)
    cerebro.resampledata(data, timeframe=bt.TimeFrame.Months)

    cerebro.addstrategy(St, multi=args.multi)

    cerebro.run(stdstats=False, runonce=False)
    if args.plot:
        cerebro.plot(style='bar')


def parse_args():
    parser = argparse.ArgumentParser(
        formatter_class=argparse.ArgumentDefaultsHelpFormatter,
        description='Sample for pivot point and cross plotting')

    parser.add_argument('--data', required=False,
                        default='../../datas/2005-2006-day-001.txt',
                        help='Data to be read in')

    parser.add_argument('--multi', required=False, action='store_true',
                        help='Couple all lines of the indicator')

    parser.add_argument('--plot', required=False, action='store_true',
                        help=('Plot the result'))

    return parser.parse_args()


if __name__ == '__main__':
    runstrat()

推薦閱讀

相關文章

Backtrader按日線交易

似乎在世界某個地方有一種权益(Interest)可以總結如下: 使用每日柱線引入訂單,但使用開盤價 這來自工單#105订单执行逻辑与当前数据和#101动态投注计算中的對話 backtrader 嘗試盡可能保持現實,並且在處理每日柱線時適用以下前提: 當每日柱被評估時,柱線已經結束 這是有道理的,

Backtrader對逐筆報價數據重新取樣

backtrader 已經可以從分鐘數據中重新採樣。接受價格變動數據不是問題,只需將 4 個常用欄位(open、 high、 low、 close)設置為價格變動值。 但是傳遞要重新採樣的逐筆報價數據再次生成相同的數據。作為或版本 1.1.11.88,情況已不再如此。

Backtrader教程:指標 - 開發

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

Backtrader期貨補償與現貨補償

版本1.9.32.116 增加了對社區中呈現的有趣用例 的支援 以期貨開始交易,包括實物交割 讓一個指標告訴你一些事情 如果需要, close 現貨價格操作,有效地取消實物交割,無論是為了接收貨物還是為了必須交付貨物(並希望獲利)來頭寸。

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

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

Backtrader教程:Cerebro - 優化 - 改進

backtrader版本1.8.12.99改進了在多處理過程中管理data feeds和結果的方式。

Backtrader數據多時間幀

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

Backtraderta-lib 集成

即使 backtrader 提供了已經 high 數量的內置指標,並且開發指標主要是定義輸入,輸出和以自然的方式編寫公式的問題,有些人也希望使用TA-LIB。

Backtrader教程:數據饋送 - 熊貓

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

Backtrader信貸利息

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