Backtrader交叉回溯測試陷阱

  |  

backtrader 社區中 ,傾向於重複的事情是,用戶解釋了複製在例如 TradingView 中獲得的回溯測試結果的意願,這些天非常流行,或者其他一些回溯測試平臺。

在不真正瞭解TradingView中使用的語言(命名Pinescript)並且對回溯測試引擎內部進行零公開的情況下,仍然有一種方法可以讓使用者知道,跨平臺編碼必須加緊鹽。

指標:並不總是忠於來源

當為 backtrader實施新指標時,無論是直接用於分發還是作為網站的片段,都非常重視原始定義。這是RSI 一個很好的例子。

  • 威爾斯·懷爾德設計了RSI 使用 Modified Moving Average (又名 Smoothed Moving Average,參見 維琪百科 - 修改後的移動平均線

  • 儘管如此,許多平臺還是為使用者提供了一些稱為經典RSIExponential Moving Average的東西,而不是書中所說的。

  • 鑒於兩個平均值都是指數級的,差異並不大,但這不是Welles Wilder所定義的。它可能仍然有用,甚至可能更好,但它不是RSI.文件(如果可用)沒有提到這一點。

in backtrader 的預設配置RSI是使用 MMA 忠實於源,但要使用的移動平均線是一個參數,可以通過子類化或在運行時實例化期間更改為使用EMA甚至簡單移動平均線。

例如:頓奇安海峽

維琪百科的定義:維琪百科 - Donchian頻道 )。它只是文本,它沒有提到使用通道突破作為交易信號。

另外兩個定義:

這兩個引用明確指出,用於計算通道的數據不包括當前柱,因為如果它包含...突破不會被反映出來。這是來自股票圖表的示例圖表

現在轉到TradingView。首先是連結

以及該頁面的圖表。

甚至Investopedia也使用TradingView的圖表,顯示沒有突破。這裡: 投資百科 - 頓奇安頻道 - https://www.investopedia.com/terms/d/donchianchannels.asp

正如有些人所說...起泡的藤壺!!!!。因為在 TradingView 圖表 中看不到 突破。這意味著指標的實現是使用 當前 價格柱來計算通道。

backtrader的頓奇安海峽

標準backtrader發行版中沒有DonchianChannels實現,但可以快速製作。參數將是當前柱是否用於通道計算的決定因素。

class DonchianChannels(bt.Indicator):
    '''
    Params Note:
      - ``lookback`` (default: -1)

        If `-1`, the bars to consider will start 1 bar in the past and the
        current high/low may break through the channel.

        If `0`, the current prices will be considered for the Donchian
        Channel. This means that the price will **NEVER** break through the
        upper/lower channel bands.
    '''

    alias = ('DCH', 'DonchianChannel',)

    lines = ('dcm', 'dch', 'dcl',)  # dc middle, dc high, dc low
    params = dict(
        period=20,
        lookback=-1,  # consider current bar or not
    )

    plotinfo = dict(subplot=False)  # plot along with data
    plotlines = dict(
        dcm=dict(ls='--'),  # dashed line
        dch=dict(_samecolor=True),  # use same color as prev line (dcm)
        dcl=dict(_samecolor=True),  # use same color as prev line (dch)
    )

    def __init__(self):
        hi, lo = self.data.high, self.data.low
        if self.p.lookback:  # move backwards as needed
            hi, lo = hi(self.p.lookback), lo(self.p.lookback)

        self.l.dch = bt.ind.Highest(hi, period=self.p.period)
        self.l.dcl = bt.ind.Lowest(lo, period=self.p.period)
        self.l.dcm = (self.l.dch + self.l.dcl) / 2.0  # avg of the above

將與範例圖表一起使用lookback=-1 看起來像這樣(放大)

人們可以清楚地看到突破,而版本中沒有突破lookback=0

編碼影響

程式師首先進入商業平臺,並使用Donchian Channels實施策略。由於圖表不顯示突破,因此必須將當前價格值與之前的通道值進行比較。某物如

if price0 > channel_high_1:
    sell()
elif price0 < channel_low_1:
    buy()

當前價格,即:price0 正在與週期前的 high/low 通道值 1 進行比較(因此後 _1 綴)

作為一個謹慎的程式師,並且不知道 backtrader 中Donchian通道的實現預設為突破,代碼被移植並看起來像這樣

    def __init__(self):
        self.donchian = DonchianChannels()

    def next(self):
        if self.data[0] > self.donchian.dch[-1]:
            self.sell()
        elif self.data[0] < self.donchian.dcl[-1]:
            self.buy()

這是錯誤的!!!因為突破發生在比較的同一時刻。正確的代碼:

    def __init__(self):
        self.donchian = DonchianChannels()

    def next(self):
        if self.data[0] > self.donchian.dch[0]:
            self.sell()
        elif self.data[0] < self.donchian.dcl[0]:
            self.buy()

雖然這隻是一個小例子,但它顯示了回溯測試結果可能有何不同,因為指標已使用柱差進行1 編碼。它可能看起來不多,但是當錯誤的交易開始時,它肯定會有所作為。

推薦閱讀

相關文章

Backtrader向 OHLC 提供買入價/賣出價數據

最近,backtrader通過實現line覆蓋來執行從 ohlc-land 逃逸,這允許重新定義整個層次結構,例如,具有僅具有 bid,ask 和 datetime lines的data feeds。

Backtrader教程:指標 - 開發

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

Backtrader教程:安裝

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

Backtrader期貨補償與現貨補償

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

Backtrader標杆

backtrader 包括 2 種不同類型的物件,可幫助進行跟蹤: Observers Analyzers 工單 #89 是關於添加資產基準測試的。明智的是,人們實際上可能有一個策略,即使積極,也低於簡單地跟蹤資產所能提供的策略。

Backtrader教程:數據饋送 - 擴展 (Extending DataFeed)

GitHub 中的問題實際上是在推動文檔部分的完成,或者説明我瞭解我是否backtrader 具有我從一開始就設想的易用性和靈活性以及在此過程中做出的決定。 在本例中為問題 #9。

Backtrader股票篩選

在尋找其他一些東西時,我在StackOverlow家族網站之一上遇到了一個問題:Quantitative Finance aka Quant StackExchange。問題: 它被標記為Python,因此值得一看的是 backtrader 是否能夠勝任這項任務。 分析儀本身 該問題似乎適合用於簡單的分析器。

Backtrader教程:Cerebro - 優化 - 改進

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

Backtrader智慧質押

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

Backtrader信貸利息

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