Backtrader扩展指针

  |  

在面向对象编程中,当然在 Python 本身中,现有类的扩展可以通过两种方式实现。

  • 继承(或子类化)

  • 组合(或嵌入)

在开发指针中,仅用几代码开发了指针TrixChartSchool - Trix参考文献有一个带有信号线Trix ,显示与 MACD 的相似性。

让我们使用已经开发的Trix “组合” MyTrixSignal

class MyTrixSignalComposed(bt.Indicator):

    lines = ('trix', 'signal')
    params = (('period', 15), ('sigperiod', 9))

    def __init__(self):
        self.lines.trix = MyTrix(self.data, period=self.p.period)
        self.lines.signal = btind.EMA(self.lines.trix, period=self.p.sigperiod)

有些东西必须在定义中重复,例如trix线的名称和用于计算的period 。已定义新的线路signal和相应的sigperiod参数。

2-liner是一个很好的结果。

现在让我们开始继承,但首先回顾一下Trix的样子:

class MyTrix(bt.Indicator):

    lines = ('trix',)
    params = (('period', 15),)

    def __init__(self):
        ema1 = btind.EMA(self.data, period=self.p.period)
        ema2 = btind.EMA(ema1, period=self.p.period)
        ema3 = btind.EMA(ema2, period=self.p.period)

        self.lines.trix = 100.0 * (ema3 - ema3(-1)) / ema3(-1)

使用Trix作为基类,这是TrixSignal的方面

class MyTrixSignalInherited(MyTrix):

    lines = ('signal',)
    params = (('sigperiod', 9),)

    def __init__(self):
        super(MyTrixSignalInherited, self).__init__()
        self.lines.signal = btind.EMA(self.lines.trix, period=self.p.sigperiod)

继承的指针最终也是一个 2 线,但是:

  • 无需重新定义trix线

  • 不需要重新定义period参数

两者都继承自基类Trix 。并且trix线的计算是在基类的__init__方法中完成的:

  • 超级(MyTrixSignalInherited,自我)。初始化()

组合继承的选择是一个经典。这个例子并不是为了澄清哪个更好,而是更多地表明:

笔记

即使存在线参数的元定义,继承也有效,它们也继承自基类的元定义

最后是两个版本的代码和图表在付诸实施时。

  1. 第一个显示继承的版本
from __future__ import (absolute_import, division, print_function,
                        unicode_literals)

import backtrader as bt
import backtrader.feeds as btfeeds

from mytrix import MyTrixSignalInherited


class NoStrategy(bt.Strategy):
    params = (('trixperiod', 15),
              ('analyzer', False),)

    def __init__(self):
        MyTrixSignalInherited(self.data, period=self.p.trixperiod)


if __name__ == '__main__':
    # Create a cerebro entity
    cerebro = bt.Cerebro()

    # Add a strategy
    cerebro.addstrategy(NoStrategy, trixperiod=15)

    # Create a Data Feed
    datapath = ('../datas/2006-day-001.txt')
    data = bt.feeds.BacktraderCSVData(dataname=datapath)

    # Add the Data Feed to Cerebro
    cerebro.adddata(data)

    # Run over everything
    cerebro.run()

    # Plot the result
    cerebro.plot()
  1. 第一个显示组合版本
from __future__ import (absolute_import, division, print_function,
                        unicode_literals)

import backtrader as bt
import backtrader.feeds as btfeeds

from mytrix import MyTrixSignalComposed


class NoStrategy(bt.Strategy):
    params = (('trixperiod', 15),
              ('analyzer', False),)

    def __init__(self):
        MyTrixSignalComposed(self.data, period=self.p.trixperiod)


if __name__ == '__main__':
    # Create a cerebro entity
    cerebro = bt.Cerebro()

    # Add a strategy
    cerebro.addstrategy(NoStrategy, trixperiod=15)

    # Create a Data Feed
    datapath = ('../datas/2006-day-001.txt')
    data = bt.feeds.BacktraderCSVData(dataname=datapath)

    # Add the Data Feed to Cerebro
    cerebro.adddata(data)

    # Run over everything
    cerebro.run()

    # Plot the result
    cerebro.plot()

推荐阅读

相关文章

Backtrader改进代码

时不时地,带有 backtrader 代码的示例会在互联网上弹出。在我看来,有几个是中国人。最新的一个在这里: 标题是: backtrader-学习笔记2,这显然(感谢谷歌)翻译成 backtrader- 学习笔记2。

Backtrader 教程:经纪人 - 滑点

回测不能保证真实的市场状况。无论市场仿真有多好,在真实的市场条件下都会发生滑点。这意味着:要求的价格可能不匹配。集成的回测代理支持滑点。

Backtrader体积填充

到目前为止, backtrader中的默认交易量填充策略相当简单明了:忽略音量笔记2016 年 7 月 15 日更正了实现中的错误并更新了示例以close头寸并在休息后重复。

Backtrader交叉回溯测试陷阱

在backtrader 社区中 ,倾向于重复的事情是,用户解释了拷贝在例如 TradingView 中获得的回溯测试结果的意愿,这些天非常流行,或者其他一些回溯测试平台。

Backtrader 教程:数据馈送 - 开发 - CSV

backtrader已经提供了通用 CSV数据提要和一些特定的 CSV数据提要。

Backtrader卡尔曼等

注意 对以下指令的支持从提交开始 发布1.9.30.x 将是包含它的第1个版本 。 backtrader的原始目标之一是成为纯python,即:仅使用标准发行版中可用的软件包。只有一个例外是matplotlib在没有重新发明轮子的情况下进行绘图。

Backtrader教程:数据馈送 - 熊猫

注意 pandas 并且必须安装其依赖项 支持Pandas Dataframes似乎受到很多人的关注,他们依赖于已经可用的解析代码来分析不同的数据源(包括CSV)和Pandas提供的其他功能。 数据馈送的重要声明。 注意 这些只是 声明。不要盲目拷贝此代码。

Backtrader多核优化

利用所有可用的内核是我为反向交易者考虑的事情,但从未完成。支持自然运算,删除数组符号,包含新指针和 bla, bla, bla。实际上,我不是优化的忠实拥护者,因此也不是为优化使用所有内核的忠实拥护者。恕我直言,一个好主意值得一百万次优化。笔记最初的多核支持已经存在,并且适用于众所周知的测试用例集。

Backtrader 教程:订单 - 目标订单

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

Backtrader 教程:数据馈送 - 开发 - 常规

笔记示例goog.fd中使用的二进制文档属于 VisualChart,不能与backtrader一起分发。对直接使用二进制文档感兴趣的人可以免费下载VisualChart 。 CSV数据馈送开发已经展示了如何添加新的基于 CSV 的数据馈送。