数据重采样#
当数据仅在一个时间框架中可用,而分析却需要在不同的时间框架中进行时,就需要进行一些重采样。
实际上,”重采样”应该被称为”上采样”,因为它从一个源时间框架转换到一个更大的时间框架(例如:从天到周)。
backtrader
内置了通过将原始数据通过过滤对象进行重采样的支持。虽然有几种实现方式,但存在一种简单的接口来实现此目的:
不要使用
cerebro.adddata(data)
将data
添加到系统中,而是使用cerebro.resampledata(data, **kwargs)
可以控制两个主要选项
更改时间框架
压缩数据条
要这样做,请在调用 resampledata
时使用以下参数: - timeframe
(默认值:bt.TimeFrame.Days)
目标时间范围,需要相等或大于源时间范围才能使用
compression
(默认值:1)将选择的值“n”压缩为1个条
让我们看一个从日线转换到周线的手工脚本示例:
$ ./resampling-example.py –timeframe weekly –compression 1
输出结果:
我们可以将其与原始的日线数据进行比较:
$ ./resampling-example.py –timeframe daily –compression 1输出:
通过执行以下步骤完成魔术:
正常加载数据
使用
resampledata
函数将数据输入 cerebro,同时传入所需参数:
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)
最后一个例子是先将时间框架从日间调整为每周,然后进行 3:1 的压缩:
$ ./resampling-example.py –timeframe weekly –compression 3输出:
从原来的256个每日柱状图,我们得到了18个3周的柱状图。具体情况如下:
52周
52 / 3 = 17.33,所以有18个柱状图
不需要太多操作。当然,一分钟数据也可以进行重采样。
重采样过滤器支持额外的参数,在大多数情况下不需要修改:
bar2edge
(默认值:True
)使用时间边界来进行重采样。例如,使用“ticks -> 5秒”的重采样,结果的5秒柱状图将与 xx:00, xx:05, xx:10 … 对齐。
adjbartime
(默认值:True
)使用边界处的时间来调整交付的重新采样的柱状条的时间,而不是最后看到的时间戳。如果重新采样为“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(结束边界)。
boundoff
(默认值:0
)将重新采样/重播的边界推迟一定单位的数量。
例如,如果重新采样是从 * 1分钟* 到* 15分钟 ,则默认行为是从 00:01:00 到 00:15:00 * 获取1分钟柱状条,以生成一个15分钟的重播/重新采样柱状条。如果
boundoff
设置为1
,那么边界将向前推进1个单位
。在这种情况下,原始的 单位 是 * 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()