如果数据仅在单个时间范围内可用,并且必须在不同的时间范围内进行分析,则是时候进行一些重新采样了。
“重采样”实际上应该称为“上采样”,因为一个人从源时间帧到更大的时间帧(例如:几天到几周)
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()