Backtrader蟒蛇隐藏的力量3

  |  

Last,但并非最不重要的一点是,在这个系列中,关于如何在 backtrader 中使用Python的隐藏功能是一些神奇变量是如何出现的。

self.datas其他人从哪里来?

通常的可疑类(或其子类)StrategyIndicator, 、 AnalyzerObserver 具有自动魔法定义的属性,例如包含 data feeds的数组。

Data Feeds 将添加到实例中cerebro ,如下所示:

from datetime import datetime
import backtrader as bt

cerebro = bt.Cerebro()
data = bt.YahooFinanceData(dataname=my_ticker, fromdate=datetime(2016, 1, 1))
cerebro.adddata(data)

...

当高于简单移动平均线时,我们对示例的close 获胜策略将持续很长时间。我们将使用信号来缩短范例:

class MyStrategy(bt.SignalStrategy):
    params = (('period', 30),)

    def __init__(self):
        mysig = self.data.close > bt.indicators.SMA(period=self.p.period)
        self.signal_add(bt.signal.SIGNAL_LONG, mysig)

它被添加到混合中:

cerebro.addstrategy(MyStrategy)

任何读者都会注意到:

  • __init__ 不带参数,无论是否命名

  • 没有super 调用,因此不会直接要求基类运行其 init

  • 引用的self.data定义mysig可能与YahooFinanceData添加到cerebro

    确实如此!

实际上还有其他属性,这些属性在那里,在示例中看不到。例如:

  • self.datas:包含添加到的所有 data feeds 的数组 cerebro

  • self.dataX:其中 X 是一个数字,它反映了数据添加到 cerebro 的顺序(data0 将是上面添加的数据)

  • self.data:指向 self.data0。为了方便起见,这只是一个队列,因为大多数示例和策略仅针对单个数据

可以在文档中找到更多内容:

如何创建这些属性?

在本系列的第 2 篇文章中,发现类创建机制和实例创建机制被截获。后者用于运行此操作。

  • cerebro 通过以下方式接收类 adstrategy

  • 它将在需要时实例化它,并将自身添加为属性

  • 策略new 的类方法在创建 Strategy 实例期间被截获,并检查哪些 data feedscerebro

    它确实创建了上面提到的数组和别名

此机制应用于 backtrader 生态系统中的许多其他对象,以便简化最终用户必须运行的操作。因此:

  • 例如,无需不断创建包含命名datas 参数的函数原型,也无需将其分配给 self.datas

    因为它是在后台自动神奇地完成的

这种拦截的另一个例子

让我们定义一个获胜指针,并将其添加到获胜策略中。我们将重新包装 close SMA的想法:

class MyIndicator(bt.Indicator):
    params = (('period', 30),)
    lines = ('signal',)

    def __init__(self):
        self.lines.signal = self.data - bt.indicators.SMA

现在将其添加到常规策略中:

class MyStrategy(bt.Strategy):
    params = (('period', 30),)

    def __init__(self):
        self.mysig = MyIndicator(period=self.p.period)

    def next(self):
        if self.mysig:
            pass  # do something like buy ...

从上面的代码中,显然有一个计算正在进行MyIndicator

self.lines.signal = self.data - bt.indicators.SMA

但它似乎无处可做。如本系列的第 1 篇文章所示,该操作会生成一个对象,该对象被 self.lines.signal 分配给并发生以下情况:

  • 此对象还会截获其创建过程

  • 它扫描堆栈以了解正在创建的上下文,在本例中为MyIndicators

  • 在初始化完成后,它会将自己添加到MyIndicator

  • 稍后在计算时MyIndicator ,它将依次计算由 self.lines.signal

不错,但谁计算MyIndicator

遵循完全相同的过程:

  • MyIndicator 在创建过程中扫描堆栈并找到 MyStrategy

  • 并将自己添加到结构中MyStrategy

  • 在调用之前nextMyIndicator 被要求重新计算自身,这反过来又告诉 self.lines.signal 重新计算自己

该过程可以具有多层间接寻址。

对用户来说最好的事情:

  • 无需像创建某些内容时那样register_operation 添加调用

  • 无需手动触发计算

总结

本系列中 last 文章展示了如何使用类/实例创建拦截来简化最终用户生活的另一个示例::

  • 从生态系统中添加需要的对象并创建别名

  • 自动注册类和触发计算

推荐阅读

相关文章

Backtrader对逐笔报价数据重新采样

backtrader 已经可以从分钟数据中重新采样。接受价格变动数据不是问题,只需将 4 个常用字段(open、 high、 low、 close)设置为价格变动值。 但是传递要重新采样的逐笔报价数据再次生成相同的数据。作为或版本 1.1.11.88,情况已不再如此。

Backtrader教程:安装

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

Backtrader期货补偿与现货补偿

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

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

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

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

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

数据多时间帧

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

Backtrader混合时间帧

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

Backtraderta-lib 集成

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

Backtrader 多数据范例

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

Backtrader教程:数据馈送 - 熊猫

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