数据重采样#

当数据仅在一个时间框架中可用,而分析却需要在不同的时间框架中进行时,就需要进行一些重采样。

实际上,”重采样”应该被称为”上采样”,因为它从一个源时间框架转换到一个更大的时间框架(例如:从天到周)。

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:0000: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()