Backtrader数据重采样

  |  

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

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

“下采样”尚不可能。

backtrader通过将原始数据传递给智能命名为DataResampler的过滤器对象,内置了对重采样的支持。

该类有两个功能:

  • 更改时间范围

  • 压缩杆

为此, DataResampler在构建期间使用标准feed.DataBase参数:

  • timeframe (默认:bt.TimeFrame.Days)

    有用的目标时间范围必须等于或大于源

  • compression (默认值:1)

    将所选值“n”压缩为 1 bar

让我们看一个使用手工脚本从每日到每周的示例:

$ ./data-resampling.py --timeframe weekly --compression 1

输出:

我们可以将其与原始的每日数据进行比较:

$ ./data-resampling.py --timeframe daily --compression 1

输出:

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

  • 像往常一样加载数据

  • 将数据送入具有所需数据的DataResampler

    • 大体时间

    • 压缩

示例中的代码(底部的整个脚本)。

    # Load the Data
    datapath = args.dataname or '../datas/sample/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)

    # Resample the data
    data_resampled = bt.DataResampler(
        dataname=data,
        timeframe=tframes[args.timeframe],
        compression=args.compression)

    # Add the resample data instead of the original
    cerebro.adddata(data_resampled)

最后一个示例,我们首先将时间范围从每天更改为每周,然后应用 3 比 1 的压缩:

$ ./data-resampling.py --timeframe weekly --compression 3

输出:

从最初的 256 个每日柱,我们最终得到 18 个 3 周柱。细分:

  • 52 周

  • 52 / 3 = 17.33 因此 18 个柱

不需要更多。当然,日内数据也可以重新采样。

重采样测试脚本的示例代码。

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/sample/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)

    # Resample the data
    data_resampled = bt.DataResampler(
        dataname=data,
        timeframe=tframes[args.timeframe],
        compression=args.compression)

    # Add the resample data instead of the original
    cerebro.adddata(data_resampled)

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

推荐阅读

相关文章

Backtrader规范与非规范

这个问题或多或少地出现了几次:这样: backtrader如何最好/规范地实现这一点或那样? 作为 backtrader 的目标之一,可以灵活地 支持尽可能多的情况和用例,答案很简单:“至少在几种方式上”。

Backtrader订单历史

通过发布1.9.55.122, backtrader 现在可用于评估一组外部订单的性能。

Backtrader在同一轴上打印

上一篇文章期货和现货补偿,在同一空间上绘制原始数据和略微(随机)修改的数据,但不是在同一轴上。 从该帖子中恢复第 1张图片。 人们可以看到: 图表的左侧和右侧有不同的刻度 当查看在原始数据周围振荡+- 50点的旋转红line(随机数据)时,这一点最为明显。

Backtrader教程:观察者 - 基准测试

工单 #89 是关于针对资产添加基准测试的。明智的是,人们实际上可能有一个策略,即使积极,也低于简单地跟踪资产所能提供的策略。

Backtrader智能质押

版本 1.6.4.93 标志着 backtrader 的一个重要里程碑,即使版本号的更改很小。 职位大小调整是阅读Van K. Tharp的《Trade Your Way To Financial Freedom 》后,为这个项目奠定基础的事情之一。

Backtrader混合时间帧

1.3.0.92版本带来了混合来自不同时间帧的数据(来自 data feeds 和/或指针)的可能性。 到版本:https://github.com/mementum/backtrader/发布/标签/1.3.0.92 背景:指示器是智能哑对象。 他们很聪明,因为他们可以进行复杂的计算。

Backtrader 教程:交易

交易的定义:当工具中的头寸从 0 变为大小 X 时,交易打开,对于多头/空头头寸可能为正/负)当头寸从 X 变为 0 时,交易平仓。以下两个动作:正转负负转正实际上被视为:一笔交易已关闭(仓位从 X 变为 0)新交易已开立(仓位从 0 变为 Y)交易只是提供信息,没有用户可调用的方法。

Backtrader教程:观察者 - 统计

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

Backtrader扩展佣金计划

佣金和相关功能由单个类 CommissionInfo 管理,该类主要通过调用 broker.setcommission 进行实例化。有一些帖子讨论了这种行为。佣金:股票与期货提高佣金:股票与期货该概念仅限于具有保证金和每份合约固定佣金的期货以及具有基于价格/规模百分比的佣金的股票。

Backtrader 教程:订单 - 目标订单

在1.8.10.96版本之前,可以使用反向交易者通过策略方法进行智能质押: buy和sell 。这一切都是为了在负责赌注大小的等式中添加一个Sizer 。 Sizer不能做的是决定操作是买入还是卖出。这意味着需要一个新概念,在其中添加一个小的智能层来做出这样的决定。