如果數據僅在單個時間範圍內可用,並且必須在不同的時間範圍內進行分析,則是時候進行一些重新採樣了。
“重採樣”實際上應該稱為“上採樣”,因為一個人從源時間幀到更大的時間幀(例如:幾天到幾周)
backtrader
內置支持通過篩選器對象傳遞原始數據,從而進行重採樣。雖然有幾種方法可以實現這一點,但存在一個簡單的介面來實現這一點:
-
而不是使用
cerebro.adddata(data)
,把data
cerebro.resampledata(data, **kwargs)
有兩個主要選項可以控制
-
更改時間範圍
-
壓縮條形圖
為此,請在調用resampledata
時使用以下參數:
-
timeframe
(預設值:bt.時間幀.天)有用的目標時間幀必須等於或大於源
-
compression
(預設值:1)將所選值“n”壓縮為 1 bar
讓我們看一個從「每日」到「每周」的示例,其中包含一個手工製作的腳本:
$ ./resampling-example.py --timeframe weekly --compression 1
輸出:
我們可以將其與原始每日數據進行比較:
$ ./resampling-example.py --timeframe daily --compression 1
輸出:
魔術是通過執行以下步驟來完成的:
-
像往常一樣載入數據
-
使用所需參數將數據饋送到cerebro
resampledata
:-
timeframe
-
compression
-
範例中的代碼(底部的整個腳本)。
# 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) # Add the resample data instead of the original cerebro.resampledata(data, timeframe=tframes[args.timeframe], compression=args.compression)
一個 last 示例,其中我們首先將時間範圍從每天更改為每周,然後應用 3 到 1 的壓縮:
$ ./resampling-example.py --timeframe weekly --compression 3
輸出:
從最初的 256 個每日柱線中,我們最終得到 18 個 3 周柱。細分:
-
52 周
-
52 / 3 = 17.33,因此 18 根柱
這並不需要更多的時間。當然,日內數據也可以重新採樣。
重採樣過濾器支援其他參數,在大多數情況下不應觸及這些參數:
-
bar2edge
(預設值:True
)使用時間邊界作為目標進行重新採樣。例如,對於“逐筆報價 -> 5 秒”,生成的 5 秒柱線將對齊為 xx:00、xx:05、xx:10 ...
-
adjbartime
(預設值:True
)使用邊界處的時間來調整傳遞的重新採樣條的時間,而不是 last 看到的時間戳。如果重新採樣為“5 秒”,則條形的時間將調整為 hh:mm:05,即使 last 看到的時間戳為 hh:mm:04.33
注意
只有當“bar2edge” True時,時間才會調整。如果條形圖未與邊界對齊,則調整時間是沒有意義的
-
rightedge
(預設值:True
)使用時間邊界的右邊緣來設置時間。
如果 False 並壓縮到 5 秒,則在 hh:mm:00 和 hh:mm:04 之間重新採樣的條形的時間將為 hh:mm:00(起始邊界
如果 True 則時間的已用邊界將為 hh:mm:05(結束邊界)
-
boundoff
(預設值:0
)將重採樣/重放的邊界按單位數量推動。
例如,如果重採樣從 1 分鐘到 15 分鐘,則預設行為是從 00:01:00 到 00:15:00 獲取 1 分鐘條形圖,以生成 15 分鐘的重播/重採樣條形圖。
如果
boundoff
設置為1
,則邊界向前1 unit
推。在本例中,原始單位是 1 分鐘條形圖。因此,重新採樣/重放現在將:- 使用00:00:00到00:14:00之間的條形圖生成15分鐘條形圖
重採樣測試腳本的範例代碼。
from __future__ import (absolute_import, division, print_function, unicode_literals) import argparse import backtrader as bt import backtrader.feeds as btfeeds def runstrat(): args = parse_args() # Create a cerebro entity cerebro = bt.Cerebro(stdstats=False) # Add a strategy cerebro.addstrategy(bt.Strategy) # 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) # Add the resample data instead of the original cerebro.resampledata(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') return parser.parse_args() if __name__ == '__main__': runstrat()