Backtrader教程:数据馈送 - 重新采样

  |  

如果数据仅在单个时间范围内可用,并且必须在不同的时间范围内进行分析,则是时候进行一些重新采样了。

“重采样”实际上应该称为“上采样”,因为一个人从源时间帧到更大的时间帧(例如:几天到几周)

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

输出:

魔术是通过运行以下步骤来完成的:

  • 像往常一样加载数据

  • 使用所需参数将数据馈送到cerebroresampledata

    • 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()

推荐阅读

相关文章

BacktraderPyFolio 集成

注意 2017年2月 pyfolio API 已更改,不再 create_full_tear_sheet 具有 gross_lev 作为命名参数的参数。

Backtrader教程:数据馈送 - 展期交割

并非每个供应商都为可以交易的工具提供连续的未来。有时提供的数据是仍然有效的到期日期的数据,即:仍在交易的日期 这在回溯测试方面并不是很有帮助,因为数据分散在几个不同的仪器上,这些仪器另外...时间重叠。 能够正确地将这些仪器的数据从过去连接到连续的流中,可以减轻疼痛。

Backtrader绘制日期范围

该版本1.9.31.x 增加了制作部分绘图的功能。 使用策略实例中保存的完整时间戳数组的索引 或者使用实际datetime.date 或 datetime.datetime 实例来限制必须绘制的内容。 一切都超过标准cerebro.plot。

Backtrader教程:绘图 - 日期范围

该版本1.9.31.x 增加了制作部分绘图的功能。 使用策略实例中保存的完整时间戳数组的索引 或者使用实际datetime.date 或 datetime.datetime 实例来限制必须绘制的内容。 一切都超过标准cerebro.plot。

Backtrader python 隐藏的细节

只有当遇到 backtrader 的真实用户时,人们才能意识到平台中使用的抽象和Python功能是否有意义。 在不撇开python的座右铭的情况下, backtrader 试图为用户提供尽可能多的控制权,同时通过将Python提供的隐藏功能付诸行动来简化使用。 第一个示例是系列文章的第一篇。

Backtrader教程:经纪商

经纪商仿真器该模拟支持不同的订单类型,根据当前现金检查提交的订单现金需求,跟踪每次反复运算的cerebro 现金和价值,并在不同数据上保持当前位置。

Backtrader教程:观察者 - 统计

在内部backtrader 运行的策略主要处理 data feeds 和 指针。 Data feeds 被添加到Cerebro 实例中,并最终成为策略输入的一部分(解析并用作实例的属性),而指针则由策略本身声明和管理。

Backtrader教程:指针 - ta-lib

即使 backtrader 提供了已经 high 数量的内置指针,并且开发指针主要是定义输入,输出和以自然的方式编写公式的问题,有些人也希望使用TA-LIB。

Backtrader动量策略

在另一篇伟大的文章中,泰迪·科克(Teddy Koker)再次展示了算法交易策略的发展之路: 研究优先应用 pandas 回溯测试,然后使用 backtrader 荣誉!!! 该帖子可以在以下位置找到: 泰迪·科克(Teddy Koker)给我留言,问我是否可以评论 backtrader的用法。

Backtrader终极振荡器

backtrader开发启动时的目标之一是使开发新的指针变得非常容易(至少对作者本人而言),以在数学和视觉上测试想法。 门票#102 是关于将 UltimateOscillator 添加到 backtrader 注意 它将在下一个版本中添加,同时可以使用下面的代码使用它。 票证中所示的参考: 以及: 无需在这里重复。