Backtrader 教程:指標 - 時間框架混合

  |  

版本 1.3.0.92提供了混合來自不同時間範圍的數據(來自數據饋送和/或指標)的可能性。

背景:指標是智能的啞對象。

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

  • 他們是愚蠢的,因為他們在不知道哪些來源為計算提供數據的情況下進行操作

像這樣:

  • 如果提供值的數據源在Cerebro引擎內具有不同的時間範圍、不同的長度,則指標將中斷。

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

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

收盤價低於s1第一支撐)時,這裡尋求賣出信號

筆記

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

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

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

並且有一個很好的理由: self.data. close提供從第一個時刻PivotPoint 以及因此s1)只會在整整一個月過去後提供值,這大致相當於self.data0. close 。在這 22 次關閉期間,還沒有s1的值,並且嘗試從底層數組中獲取它失敗。

Lines對象支持(ago)運算符(Python 中的__call__特殊方法)以提供其自身的延遲版本:

close1 = self.data.close(-1)

在這個例子中,對象close1 (當通過[0]訪問時)總是包含由close傳遞的前一個值( -1 )。該語法已被重用以適應適應時間範圍。讓我們重寫上面的pivotpoint片段:

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

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

  • pivotpoint.s1()正在返回一個內部LinesCoupler對象,該對象遵循更大範圍的節奏。該耦合器使用來自真實s1的最新交付值填充自身(從默認值NaN開始)

但是需要一些額外的東西才能使魔法發揮作用。必須使用以下內容創建Cerebro

cerebro = bt.Cerebro(runonce=False)

或執行:

cerebro.run(runonce=False)

在這種模式下,指標和後期評估的自動對像是逐步執行的,而不是緊密循環。這使得整個操作變慢,但它使得它成為可能

底部的示例腳本被打破,現在運行:

$ ./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,第一個close < s1實例發生。

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

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

作為替代方案:

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

現在整個PivotPoint指標已耦合,可以訪問其任何(即pr1r2s1s2 )。該腳本只對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

全耦合語法

對於具有多條線對象(例如像PivotPoint這樣的指標):

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

    • clockref如果clockrefNone ,則周圍的對象(在示例中為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:
    
      ```python
      coupled_s1 = pp(line='s1')
      ```
    

對於具有單條線對象(例如來自指標PivotPoints1 ):

  • obj(clockref=None) (參見上面的clockref

結論

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

腳本代碼和用法

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期貨展期

並非每個供應商都為可以交易的工具提供連續的未來。有時提供的數據是仍然有效的到期日期的數據,即:仍在交易的日期 這在回溯測試方面並不是很有幫助,因為數據分散在幾個不同的儀器上,這些儀器另外...時間重疊。 能夠正確地將這些儀器的數據從過去連接到連續的流中,可以減輕疼痛。

BacktraderOCO訂單

Release1.9.34.116 將 OCO (又名One Cancel Others)添加到回溯測試武器庫中。 注意 這僅在回溯測試中實現,並且還沒有針對即時代理的實現 注意 隨版本1.9.36.116更新。盈透證券支援 StopTrail和 StopTrailLimit OCO。

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

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

BacktraderPyFolio 集成

注意 2017年2月 pyfolio API 已更改,不再 create_full_tear_sheet 具有 gross_lev 作為命名參數的參數。

Backtrader智慧質押

版本 1.6.4.93 標誌著 backtrader 的一個重要里程碑,即使版本號的更改很小。 職位大小調整是閱讀Van K. Tharp的《Trade Your Way To Financial Freedom 》後,為這個專案奠定基礎的事情之一。

Backtrader 教程:指標 - 時間框架混合

版本 1.3.0.92提供了混合來自不同時間範圍的數據(來自數據饋送和/或指標)的可能性。背景:指標是智能的啞對象。他們很聰明,因為他們可以進行複雜的計算。他們是愚蠢的,因為他們在不知道哪些來源為計算提供數據的情況下進行操作像這樣:如果提供值的數據源在Cerebro引擎內具有不同的時間範圍、不同的長度,則指標將中斷。

Backtrader多數據範例

社區中的幾個主題似乎以如何跟蹤訂單為導向,特別是當幾個data feeds在起作用時,還包括當多個訂單一起工作時,

Backtrader開場作弊

“發佈”1.9.44.116 添加了對 Cheat-On-Open的支援。這似乎是那些全力以赴的人的需求功能,他們在酒吧 close 后進行了計算,但希望與 open 價格相匹配。 當開盤價跳空(上漲或下跌,取決於是否buysell有效)並且現金不足以進行全面運營時,這樣的用例就會失敗。這將強制代理拒絕該操作。

Backtrader教程:數據饋送 - 熊貓

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

Backtrader信號策略

操作 backtrader 也是可能的,而無需編寫策略。雖然這是首選方式,但由於構成機器的對象層次結構,使用信號也是可能的。