如果數據僅在單個時間範圍內可用,並且必須在不同的時間範圍內進行分析,則是時候進行一些重新採樣了。
“重採樣”實際上應該稱為“上採樣”,因為一個人從源時間幀到更大的時間幀(例如:幾天到幾周)
backtrader 內置支持通過篩選器對象傳遞原始數據,從而進行重採樣。雖然有幾種方法可以實現這一點,但存在一個簡單的介面來實現這一點:
-
而不是使用
cerebro.adddata(data),把datacerebro.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()