Backtrader 教程:數據饋送 - 重播

  |  

時間已經過去,針對完全形成和封閉的柱線測試策略是好的,但它可能會更好。

這就是 Data Replay 的用武之地。如果:

  • 該策略對時間範圍 X 的數據進行操作(例如:每日)

  • 更小時間範圍 Y(例如:1 分鐘)的數據可用

數據重放正如其名稱所暗示的那樣:

  • 使用 1 分鐘數據重播每日柱

這當然不完全是市場的發展方式,但它比孤立地查看每日完全形成和封閉的柱線要好得多:

如果策略在每日柱形的形成過程中實時運行,則柱形的近似值提供了在真實條件下複製策略的實際行為的機會

將數據重放付諸行動遵循backtrader的常規使用模式

  • 加載數據饋送

  • 使用replaydata將數據傳遞給cerebro

  • 添加策略

筆記

重播數據時不支持預加載,因為每個條實際上都是實時構建的。它會在任何Cerebro實例中自動禁用。

可以傳遞給replaydata的參數:

  • timeframe (默認:bt.TimeFrame.Days)

    有用的目標時間範圍必須等於或大於源

  • compression (默認值:1)

    將所選值“n”壓縮為 1 bar

擴展參數(如果不是真的需要,請勿觸摸):

  • bar2edge (默認值: True

    使用時間邊界作為封閉柱的目標重播。例如,使用“ticks -> 5 seconds”,生成的 5 秒條將對齊到 xx:00、xx:05、xx:10 …

  • adjbartime (默認值: False

    使用邊界處的時間來調整交付的重採樣柱的時間,而不是最後看到的時間戳。如果重新採樣到“5 秒”,則柱的時間將調整為例如 hh:mm:05,即使最後看到的時間戳是 hh:mm:04.33

    注意:僅當“bar2edge”為True時才會調整時間。如果條未與邊界對齊,則調整時間沒有意義

  • rightedge (默認值: True

    使用時間邊界的右邊緣設置時間。

    如果False並壓縮到 5 秒,則在 hh:mm:00 和 hh:mm:04 之間重新採樣的條形的時間將是 hh:mm:00(起始邊界

    如果為True ,則使用的時間邊界將是 hh:mm:05(結束邊界)

為了使用示例,將每週重播標準的 2006 年每日數據。意思是:

  • 最終將有 52 個酒吧,每週一個

  • Cerebro將調用prenextnext共 255 次,這是每日柱的原始計數

訣竅:

  • 當周柱形成時,策略的長度 ( len(self) ) 將保持不變。

  • 每個新的一周,長度將增加一

下面是一些示例,但首先是測試腳本的調味汁,其中數據被加載並使用replaydata ......然後run .

    # Load the Data
    datapath = args.dataname or '../../datas/2006-day-001.txt'
    data = btfeeds.BacktraderCSVData(dataname=datapath)

    # Handy dictionary for the argument timeframe conversion
    tframes = dict(
        daily=bt.TimeFrame.Days,
        weekly=bt.TimeFrame.Weeks,
        monthly=bt.TimeFrame.Months)

    # First add the original data - smaller timeframe
    cerebro.replaydata(data,
                       timeframe=tframes[args.timeframe],
                       compression=args.compression)

示例 - 每天到每週重播

腳本的調用:

$ ./replay-example.py --timeframe weekly --compression 1

不幸的是,圖表無法向我們展示後台發生的真實情況,所以讓我們看一下控制台輸出:

prenext len 1 - counter 1
prenext len 1 - counter 2
prenext len 1 - counter 3
prenext len 1 - counter 4
prenext len 1 - counter 5
prenext len 2 - counter 6
...
...
prenext len 9 - counter 44
prenext len 9 - counter 45
---next len 10 - counter 46
---next len 10 - counter 47
---next len 10 - counter 48
---next len 10 - counter 49
---next len 10 - counter 50
---next len 11 - counter 51
---next len 11 - counter 52
---next len 11 - counter 53
...
...
---next len 51 - counter 248
---next len 51 - counter 249
---next len 51 - counter 250
---next len 51 - counter 251
---next len 51 - counter 252
---next len 52 - counter 253
---next len 52 - counter 254
---next len 52 - counter 255

正如我們所見,內部self.counter變量正在跟踪對prenextnext的每次調用。前者在應用的簡單移動平均線產生一個值之前被調用。後者在簡單移動平均線產生值時調用。

鑰匙:

  • 策略的長度 (len(self)) 每 5 個柱變化一次(一周中的 5 個交易日)

該策略有效地看到:

  • 每週欄如何在 5 次拍攝中發展。

    同樣,這並不能複制市場的實際逐筆交易(甚至不是一分鐘、一小時)的發展,但它比實際看到一根柱線要好。

視覺輸出是每週圖表的輸出,這是系統再次測試的最終結果。

示例 2 - 每天到每天都有壓縮

當然,“重播”可以應用於相同的時間範圍,但需要進行壓縮。

控制台:

$ ./replay-example.py --timeframe daily --compression 2
prenext len 1 - counter 1
prenext len 1 - counter 2
prenext len 2 - counter 3
prenext len 2 - counter 4
prenext len 3 - counter 5
prenext len 3 - counter 6
prenext len 4 - counter 7
...
...
---next len 125 - counter 250
---next len 126 - counter 251
---next len 126 - counter 252
---next len 127 - counter 253
---next len 127 - counter 254
---next len 128 - counter 255

這次我們得到了預期的一半,因為因素 2 要求壓縮。

圖表:

結論

重建市場發展是可能的。通常可以使用較小的時間範圍數據集,並可用於離散地重放系統運行的時間範圍。

測試腳本。

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


class SMAStrategy(bt.Strategy):
    params = (
        ('period', 10),
        ('onlydaily', False),
    )

    def __init__(self):
        self.sma = btind.SMA(self.data, period=self.p.period)

    def start(self):
        self.counter = 0

    def prenext(self):
        self.counter += 1
        print('prenext len %d - counter %d' % (len(self), self.counter))

    def next(self):
        self.counter += 1
        print('---next len %d - counter %d' % (len(self), self.counter))


def runstrat():
    args = parse_args()

    # Create a cerebro entity
    cerebro = bt.Cerebro(stdstats=False)

    cerebro.addstrategy(
        SMAStrategy,
        # args for the strategy
        period=args.period,
    )

    # Load the Data
    datapath = args.dataname or '../../datas/2006-day-001.txt'
    data = btfeeds.BacktraderCSVData(dataname=datapath)

    # Handy dictionary for the argument timeframe conversion
    tframes = dict(
        daily=bt.TimeFrame.Days,
        weekly=bt.TimeFrame.Weeks,
        monthly=bt.TimeFrame.Months)

    # First add the original data - smaller timeframe
    cerebro.replaydata(data,
                       timeframe=tframes[args.timeframe],
                       compression=args.compression)

    # Run over everything
    cerebro.run()

    # Plot the result
    cerebro.plot(style='bar')


def parse_args():
    parser = argparse.ArgumentParser(
        description='Pandas test script')

    parser.add_argument('--dataname', default='', required=False,
                        help='File Data to Load')

    parser.add_argument('--timeframe', default='weekly', required=False,
                        choices=['daily', 'weekly', 'monhtly'],
                        help='Timeframe to resample to')

    parser.add_argument('--compression', default=1, required=False, type=int,
                        help='Compress n bars into 1')

    parser.add_argument('--period', default=10, required=False, type=int,
                        help='Period to apply to indicator')

    return parser.parse_args()


if __name__ == '__main__':
    runstrat()

推薦閱讀

相關文章

Backtrader磚塊

Renko Bricks 是呈現價格演變的另一種方式,其中價格比時間發揮更重要的作用。這已在1.9.54.122的1.9.54.122版本中作為過濾器引入Stockcharts 對 Renko Bricks 有很好的參考。

Backtrader按日線交易

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

Backtrader 教程:佣金計劃 - 自定義計劃

將 CommInfo 對象改造成實際涉及的最重要的部分:保留原來的CommissionInfo類和行為為輕鬆創建用戶定義的佣金打開大門使格式 xx% 成為新佣金方案的默認值,而不是 0.

Backtrader唐鐘斯10天連勝

它已成為新聞。DJI正在創下歷史新高,已經連續10個上漲日和9個歷史高點。例如,請參閱: 當然,許多人已經注意到道瓊斯指數處於這樣的狀態,這篇文章只是告訴我們它正在成為主流。

Backtrader教程:觀察者 - 基準測試

工單 #89 是關於針對資產添加基準測試的。明智的是,人們實際上可能有一個策略,即使積極,也低於簡單地跟蹤資產所能提供的策略。

Backtrader交叉回溯測試陷阱

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

Backtraderta-lib 集成

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

Backtrader教程:分析儀 - PyFolio

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

Backtrader信號策略

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

Backtrader熊貓數據饋送

在一些小的增強功能和一些OrderDict調整中,以獲得更好的Python 2.6支援, backtrader 的最新版本增加了對分析Pandas Dataframe或Time Series數據的支援。