数据多时间帧

  |  

有时投资决策是使用不同的时间框架做出的:

  • 每周评估趋势

  • 每天执行条目

或者5分钟对60分钟。

这意味着需要将多个时间帧的数据组合在 backtrader 中以支援此类组合。

对它的本机支持已经内置。最终使用者只能遵循以下规则:

  • 具有最小时间帧(因此柱数较大的数据)必须是要添加到Cerebro实例中的第1个数据

  • 数据必须正确对齐日期时间,以便平台从中产生任何意义

除此之外,最终使用者可以自由地在较短/较长的时间范围内按预期应用指标。答案是肯定的:

  • 应用于较大时间帧的指标将产生较少的柱线

该平台还将考虑以下因素

  • 较大时间帧的最小週期

最小週期,这可能会产生副作用,即在将策略添加到 Cerebro 开始行动之前,必须消耗几个数量级的较小时间帧柱。

内置DataResampler 的将用于创建更大的时间范围。

下面是一些示例,但首先是测试脚本的酱汁。

    # Load the Data
    datapath = args.dataname or '../datas/sample/2006-day-001.txt'
    data = btfeeds.BacktraderCSVData(
        dataname=datapath)

    tframes = dict(
        daily=bt.TimeFrame.Days,
        weekly=bt.TimeFrame.Weeks,
        monthly=bt.TimeFrame.Months)

    # Handy dictionary for the argument timeframe conversion
    # Resample the data
    if args.noresample:
        datapath = args.dataname2 or '../datas/sample/2006-week-001.txt'
        data2 = btfeeds.BacktraderCSVData(
            dataname=datapath)
    else:
        data2 = bt.DataResampler(
            dataname=data,
            timeframe=tframes[args.timeframe],
            compression=args.compression)

步骤:

  • 载入数据

  • 根据使用者指定的参数对其进行重新採样

    该脚本还允许载入第 2 个 数据

  • 将资料新增到 cerebro

  • 将重新採样的数据(更大的时间帧)添加到 cerebro

示例 1 - 每日和每周

文稿的唿叫:

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

和输出图表:

范例 2 - 每日和每日压缩(2 个 bar 到 1)

文稿的唿叫:

$ ./data-multitimeframe.py --timeframe daily --compression 2

和输出图表:

范例 3 - 使用 SMA 的策略

虽然绘图很好,但这里的关键问题是显示更大的时间框架如何影响系统,特别是当它归结为起点时。

该脚本可以添加--indicators 一个策略,该策略在较小和较大的时间帧数据上创建 週期为10 的简单移动平均线。

如果只考虑较小的时间范围:

  • next 将在10根柱线后首先调用,这是简单移动平均线产生值所需的时间

    注意

    请记住,Strategy 监控已创建的指标,并且仅在所有指标都生成值时才调用next 。基本原理是最终使用者已添加指标以在逻辑中使用它们,因此,如果指标未生成任何值,则不应发生任何逻辑。

但是在这种情况下,较大的时间帧(每周)延迟调用next ,直到每周数据产生一个值的简单移动平均线,这需要...10周。

该脚本将nextstart 覆盖仅调用一次且预设为调用 next 以显示首次调用时的脚本。

唿叫 1:

只有较小的时间帧,每天,得到一个简单的移动平均线

命令 line 和输出

$ ./data-multitimeframe.py --timeframe weekly --compression 1 --indicators --onlydaily
--------------------------------------------------
nextstart called with len 10
--------------------------------------------------

和图表。

唿叫 2:

两个时间帧都得到一个简单的移动平均线

命令 line

$ ./data-multitimeframe.py --timeframe weekly --compression 1 --indicators
--------------------------------------------------
nextstart called with len 50
--------------------------------------------------
--------------------------------------------------
nextstart called with len 51
--------------------------------------------------
--------------------------------------------------
nextstart called with len 52
--------------------------------------------------
--------------------------------------------------
nextstart called with len 53
--------------------------------------------------
--------------------------------------------------
nextstart called with len 54
--------------------------------------------------

这里要注意两件事:

  • 该策略不是在10 个週期后调用,而是在50个週期后调用1st

    之所以如此,是因为应用于较大(每周)时间帧的简单移动平均线在10周后产生一个值......那就是10周* 5天/周...50 天

  • nextstart 被调用 5 次,而不仅仅是 1 次。

    这是混合时间帧并将指标(在本例中只有一个)应用于较大时间帧的自然副作用。

    较大的时间帧简单移动平均线产生相同值的 5 倍,而 5 个日柱线被消耗。

    而且由于周期的开始被较大的时间帧nextstart 控制,因此被调用了5次。

和图表。

结论

多个时间帧数据可以在没有特殊物件或调整的情况下使用backtrader :只需先添加较小的时间帧即可。

测试脚本。

from __future__ import (absolute_import, division, print_function,
                        unicode_literals)

import argparse

import backtrader as bt
import backtrader.feeds as btfeeds
import backtrader.indicators as btind


class SMAStrategy(bt.Strategy):
    params = (
        ('period', 10),
        ('onlydaily', False),
    )

    def __init__(self):
        self.sma_small_tf = btind.SMA(self.data, period=self.p.period)
        if not self.p.onlydaily:
            self.sma_large_tf = btind.SMA(self.data1, period=self.p.period)

    def nextstart(self):
        print('--------------------------------------------------')
        print('nextstart called with len', len(self))
        print('--------------------------------------------------')

        super(SMAStrategy, self).nextstart()


def runstrat():
    args = parse_args()

    # Create a cerebro entity
    cerebro = bt.Cerebro(stdstats=False)

    # Add a strategy
    if not args.indicators:
        cerebro.addstrategy(bt.Strategy)
    else:
        cerebro.addstrategy(
            SMAStrategy,

            # args for the strategy
            period=args.period,
            onlydaily=args.onlydaily,
        )

    # Load the Data
    datapath = args.dataname or '../datas/sample/2006-day-001.txt'
    data = btfeeds.BacktraderCSVData(
        dataname=datapath)

    tframes = dict(
        daily=bt.TimeFrame.Days,
        weekly=bt.TimeFrame.Weeks,
        monthly=bt.TimeFrame.Months)

    # Handy dictionary for the argument timeframe conversion
    # Resample the data
    if args.noresample:
        datapath = args.dataname2 or '../datas/sample/2006-week-001.txt'
        data2 = btfeeds.BacktraderCSVData(
            dataname=datapath)
    else:
        data2 = bt.DataResampler(
            dataname=data,
            timeframe=tframes[args.timeframe],
            compression=args.compression)

    # First add the original data - smaller timeframe
    cerebro.adddata(data)

    # And then the large timeframe
    cerebro.adddata(data2)

    # 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('--dataname2', default='', required=False,
                        help='Larger timeframe file to load')

    parser.add_argument('--noresample', action='store_true',
                        help='Do not resample, rather load larger timeframe')

    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')

    parser.add_argument('--indicators', action='store_true',
                        help='Wether to apply Strategy with indicators')

    parser.add_argument('--onlydaily', action='store_true',
                        help='Indicator only to be applied to daily timeframe')

    parser.add_argument('--period', default=10, required=False, type=int,
                        help='Period to apply to indicator')

    return parser.parse_args()


if __name__ == '__main__':
    runstrat()

推荐阅读

相关文章

Backtrader跨越数字

《backtrader》的发布1.9.27.105纠正了一个疏忽。这是一个疏忽,因为拼图的所有部分都已到位,但启动并不是在所有角落都进行的。 该机制使用一个名为的属性_mindatas,因此让我们将其称为: mindatas。 社区问了这个问题,答案并不是很到位。

Backtrader期货补偿与现货补偿

版本1.9.32.116 增加了对社区中呈现的有趣用例 的支持 以期货开始交易,包括实物交割 让一个指针告诉你一些事情 如果需要, close 现货价格操作,有效地取消实物交割,无论是为了接收货物还是为了必须交付货物(并希望获利)来头寸。

Backtrader教程:分析仪 - PyFolio

注意 从(至少)2017-07-25pyfolio 开始,API已更改,不再 create_full_tear_sheet 具有 gross_lev 作为命名参数的参数。

Backtrader 多数据范例

社区中的几个主题似乎以如何跟踪订单为导向,特别是当几个data feeds在起作用时,还包括当多个订单一起工作时,

Backtrader按日线交易

似乎在世界某个地方有一种权益(Interest)可以总结如下: 使用每日柱线引入订单,但使用开盘价 这来自工单#105订单执行逻辑与当前数据和#101动态投注计算中的对话 backtrader 尝试尽可能保持现实,并且在处理每日柱线时适用以下前提: 当每日柱被评估时,柱线已经结束 这是有道理的,

Backtrader信贷利息

在某些情况下,真实经纪人的现金金额可能会减少,因为资产操作包括利率。例子: 卖空股票 交易所买卖基金包括多头和空头 这意味着不仅交易构成了系统的盈利能力,因为信贷上的利息在帐户上佔有一席之地。 为了涵盖这种情况, backtrader 包括(从发佈1.8.8.96开始)功能来考虑这一点。

Backtrader教程:安装

要求和版本 backtrader 是独立的,没有外部依赖关系(除非要绘图) 基本要求是: Python 2.7 Python 3.2 / 3.3/ 3.4 / 3.5 pypy/pypy3 如果需要绘图,则其他要求: Matplotlib >= 1.4.

Backtrader教程:数据馈送 - 扩展(Extending DataFeed)

GitHub 中的问题实际上是在推动文档部分的完成,或者説明我了解我是否backtrader 具有我从一开始就设想的易用性和灵活性以及在此过程中做出的决定。 在本例中为问题 #9。

Backtrader教程:日志记录 - 编写器

将以下内容写出到流中: csv 流,

数据多时间帧

有时投资决策是使用不同的时间框架做出的: 每周评估趋势 每天执行条目 或者5分钟对60分钟。 这意味着需要将多个时间帧的数据组合在 backtrader 中以支援此类组合。 对它的本机支持已经内置。