Backtrader 教程:绘图 - 同一轴

  |  

上一篇future-spot 将原始数据和稍微(随机)修改的数据绘制在同一空间上,但不在同一轴上。

从该帖子中恢复第一张图片。

有人能看见:

  • 图表左右两侧有不同的刻度

  • 当查看在原始数据周围振荡+- 50点的摆动红线(随机数据)时,这一点最为明显。

    在图表上,视觉印像是这些随机数据大多总是高于原始数据。由于比例不同,这只是视觉印象。

虽然1.9.32.116版已经有了一些初始支持,可以完全绘制在同一轴上,但图例标签会被拷贝(只有标签,而不是数据),这真的很令人困惑。

版本1.9.33.116治愈了这种影响,并允许在同一轴上进行完整绘图。使用模式就像决定要绘制哪些其他数据的模式。从之前的帖子。

import backtrader as bt

cerebro = bt.Cerebro()

data0 = bt.feeds.MyFavouriteDataFeed(dataname='futurename')
cerebro.adddata(data0)

data1 = bt.feeds.MyFavouriteDataFeed(dataname='spotname')
data1.compensate(data0)  # let the system know ops on data1 affect data0
data1.plotinfo.plotmaster = data0
data1.plotinfo.sameaxis = True
cerebro.adddata(data1)

...

cerebro.run()

data1获取一些plotinfo值以:

  • 在与plotmasterdata0相同的空间上绘图

  • 获取使用相同轴的sameaxis

    这个指示的原因是平台无法提前知道每个数据的尺度是否兼容。这就是为什么它将以独立的比例绘制它们

上一个示例获得了在sameaxis上绘制的附加选项。示例运行:

$ ./future-spot.py --sameaxis

结果图表

通知:

  • 右手边只有一个刻度

  • 现在随机数据似乎明显围绕原始数据振荡,这是预期的视觉行为

示例使用

$ ./future-spot.py --help
usage: future-spot.py [-h] [--no-comp] [--sameaxis]

Compensation example

optional arguments:
  -h, --help  show this help message and exit
  --no-comp
  --sameaxis

示例代码

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

import argparse
import random
import backtrader as bt


# The filter which changes the close price
def close_changer(data, *args, **kwargs):
    data.close[0] += 50.0 * random.randint(-1, 1)
    return False  # length of stream is unchanged


# override the standard markers
class BuySellArrows(bt.observers.BuySell):
    plotlines = dict(buy=dict(marker='$\u21E7$', markersize=12.0),
                     sell=dict(marker='$\u21E9$', markersize=12.0))


class St(bt.Strategy):
    def __init__(self):
        bt.obs.BuySell(self.data0, barplot=True)  # done here for
        BuySellArrows(self.data1, barplot=True)  # different markers per data

    def next(self):
        if not self.position:
            if random.randint(0, 1):
                self.buy(data=self.data0)
                self.entered = len(self)

        else:  # in the market
            if (len(self) - self.entered) >= 10:
                self.sell(data=self.data1)


def runstrat(args=None):
    args = parse_args(args)
    cerebro = bt.Cerebro()

    dataname = '../../datas/2006-day-001.txt'  # data feed

    data0 = bt.feeds.BacktraderCSVData(dataname=dataname, name='data0')
    cerebro.adddata(data0)

    data1 = bt.feeds.BacktraderCSVData(dataname=dataname, name='data1')
    data1.addfilter(close_changer)
    if not args.no_comp:
        data1.compensate(data0)
    data1.plotinfo.plotmaster = data0
    if args.sameaxis:
        data1.plotinfo.sameaxis = True
    cerebro.adddata(data1)

    cerebro.addstrategy(St)  # sample strategy

    cerebro.addobserver(bt.obs.Broker)  # removed below with stdstats=False
    cerebro.addobserver(bt.obs.Trades)  # removed below with stdstats=False

    cerebro.broker.set_coc(True)
    cerebro.run(stdstats=False)  # execute
    cerebro.plot(volume=False)  # and plot


def parse_args(pargs=None):
    parser = argparse.ArgumentParser(
        formatter_class=argparse.ArgumentDefaultsHelpFormatter,
        description=('Compensation example'))

    parser.add_argument('--no-comp', required=False, action='store_true')
    parser.add_argument('--sameaxis', required=False, action='store_true')
    return parser.parse_args(pargs)


if __name__ == '__main__':
    runstrat()

推荐阅读

相关文章

Backtrader策略选择

休士顿我们有一个问题: cerebro 不应多次运行。这不是第1次 ,而不是认为用户做错了,这似乎是一个用例。 这个有趣的用例是通过票证177出现的。在这种情况下, cerebro 被多次用于评估从外部数据源获取的不同策略。 backtrader 仍然可以支持此用例,但不能以直接尝试的方式支持。

Backtrader写下来

随着 1.1.7.88 版本的发布, backtrader有了一个新的补充:作家这可能早就到期了,应该已经存在了,问题 #14中的讨论也应该已经开始了开发。但迟到总比没有好。

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

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

Backtrader回溯

在一些关于改进的ShapeRatio的提示之后, backtrader 已将此分析仪添加到其武器库中。 文献位于: 从对数回报的好处开始,并遵循在SharpeRatio方程的分母中具有标准偏差的副作用,本文档开发了该分析仪的公式和期望。

Backtrader混合时间帧

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

Backtrader教程:观察者 - 统计

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

Backtrader教程:佣金计划 - 信贷利息

在某些情况下,真实经纪人的现金金额可能会减少,因为资产操作包括利率。例子: 卖空股票 交易所买卖基金包括多头和空头 该费用直接与经纪人帐户中的现金余额挂钩。但它仍然可以被视为佣金计划的一部分。因此,它已被建模为 backtrader。

Backtrader佣金计划

发布 backtrader 使用示例使我对缺失的东西有了深刻的了解。

Backtrader动量策略

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

Backtrader教程:数据馈送 - 多个时间帧

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