您的位置:  首页 » 量化交易与机器学习 » backtrader » Python隐藏权力(3) – backtrader中文教程

Python中的隐藏的力量(3)

最后,但并非最不重要,在这一系列关于如何Python的隐藏的权力使用backtrader是怎么有些神奇的变量显示up.

Where做self.datas等人从何而来?

普通嫌疑犯类(或亚类的化合物)Strategy, Indicator,
Analyzer, Observer有自动神奇定义的属性,像例如其中包含数组的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上面那张`一个Simple Moving Average。我们将使用Signals让例子更短:

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__不带参数,命名或not
  • There没有super所以调用基类没有被直接问到做的
  • 引用mysig它initself.dataThe定义,可能有做的YahooFinanceData这是添加到cerebro

    的确如此实例!

有哪些,还有并没有在实际上看到其他属性例。例如:

  • self.datas:阵列包含所有data feeds它被添加到cerebro
  • self.dataX:其中X是一个数字反映的顺序数据被添加到脑(data0将上述添加的数据)
  • self.data:指向self.data0。只是为了方便快捷,因为大多数示例和策略只针对单一data

More可以在文档中找到:

  • https://www.backtrader.com/docu/concepts.html
  • https://www.backtrader.com/docu/datafeed.html

How是创建的那些属性?

在2nd文章在这个系列可看出,该类创作机制和实例创建机制被拦截。后者则用于做that.

  • cerebro接收class经由adstrategy
  • 需要时将其实例化和自身添加为attribute
  • Thenew战略类方法的创建过程中被拦截的Strategy实例并检查其data feeds可在cerebro

    而且它创建abovearrayaliases

这种机制被应用到许多其它的目的在backtrader的生态系统,为了simplifly什么最终用户必须做的。因此:

  • 有例如没有必要不断地创造出函数原型,其包含名为参数datas没必要把它分配给self.datas

    因为它是在这个interception

Let年代background

Another例子进行自动神奇地定义一个成功的指标,并把它添加到一个成功的策略。我们将重新包装该close over 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

但它似乎无处完成。正如本系列看到的1st文章中,操作生成object,其被分配给self.lines.signal和会发生以下情况:

  • 该目的还拦截其创建process
  • It扫描stack了解正被创建的上下文,在这种情况下的一个实例内MyIndicators
  • 而且它的initialization建成后,它将自身添加到内部的MyIndicator
  • 后来,当MyIndicator计算,这将反过来计算结构操作这是self.lines.signal

好引用的对象内,但谁计算MyIndicator

正是同样的流程进行后续处理

  • MyIndicator创建过程中扫描堆栈和发现MyStrategy
  • ,并增加了本身的结构MyStrategy
  • 权之前nextMyIndicator被要求重新计算本身,这又告诉self.lines.signal重新计算itself

The进程可以有indirection.

And的多个层的用户的最好的事情:

  • 无需添加像调用register_operation当事情是created
  • No需要手动触发calculations

Concluding

The系列中的最后一篇文章显示了另一个例子如何类/实例创建拦截所使用,使最终用户更轻松的生活:

  • 需要的地方,他们从生态系统有添加对象和创建aliases
  • 自动登记类和触发calculations

发表评论

电子邮件地址不会被公开。 必填项已用*标注