Backtrader python 隐藏的细节

  |  

只有当遇到 backtrader 的真实用户时,人们才能意识到平台中使用的抽象和Python功能是否有意义。

在不撇开python的座右铭的情况下, backtrader 试图为用户提供尽可能多的控制权,同时通过将Python提供的隐藏功能付诸行动来简化使用。

第一个示例是系列文章的第一篇。

它是一个数组还是它是什么?

一个非常简单的例子:

import backtrader as bt

class MyStrategy(bt.Strategy):

    def __init__(self):

        self.hi_lo_avg = (self.data.high + self.data.low) / 2.0

    def next(self):
        if self.hi_lo_avg[0] > another_value:
            print('we have a winner!')

...
...
cerebro.addstrategy(MyStrategy)
cerebro.run()

其中一个非常迅速弹出的问题是:

  • 不能也使用期间[]__init__?。

提出问题是因为用户已经尝试过,Python已停止运行,但出现异常。

答案是:

  • 不。在 [] 初始化期间不使用。

接下来的问题是:

  • 那么,如果它不是数组,那么在期间__init__实际存储self.hi_lo_avg了什么呢?

对于程序师来说,答案并不令人费解,但对于使用Python的算法交易者来说,答案可能很令人困惑。

  • 它是一个懒惰评估的对象,它将在阶段(cerebro.run即:在策略的方法中next)通过[]操作数计算和传递值。

归纳总结:在该方法中next ,数组索引操作符 [] 将允许您访问过去和当前时间时刻的计算值。

秘诀就在酱汁中

操作员覆盖是真正的调味料。让我们分解一下 high-low- 平均值的计算:

self.hi_lo_avg = (self.data.high + self.data.low) / 2.0

组件:

  • self.data.high并且self.data.low本身就是对象(backtrader命名方案中的lines

在许多情况下,它们被错误地视为纯数字,但事实并非如此。它们成为对象的原因:

  • 0backtrader实施索引-1计划和索引计划

  • 控制缓冲区大小调整和链接到其他对象

在这种情况下,最重要的方面是:

  • 重写操作符以返回对象

这就是为什么下面的操作返回一个 lines 对象。让我们开始:

temp = self.data.high - self.data.low

然后,将临时对象除以2.0 成员变量并将其分配给成员变量:

self.hi_lo_avg = temp / 2.0

这将再次返回另一个 lines 对象。因为操作符重写不仅适用于直接在 lines 对象之间运行的操作,还适用于例如,像这种除法这样的算术运算。

这意味着 具有self.hi_lo_avglines 对象的引用。此对象在 next 策略方法中很有用,或者作为指针或其他计算的输入。

逻辑运算符示例

上面的范例在 中__init__使用了算术操作符和逻辑操作器的组合[0]> next

由于操作符重写不仅限于算术,因此让我们再举一个示例,在组合中添加一个指针。第一次尝试是:

import backtrader as bt

class MyStrategy(bt.Strategy):

    def __init__(self):
        self.hi_lo_avg = (self.data.high + self.data.low) / 2.0
        self.sma = bt.indicators.SMA(period=30)

    def next(self):
        if self.hi_lo_avg[0] > self.sma[0]:
            print('we have a winner!')

...
...
cerebro.addstrategy(MyStrategy)
cerebro.run()

但是在这种情况下,只需从another_value 更改为 self.sma[0]。让我们改进它:

import backtrader as bt

class MyStrategy(bt.Strategy):

    def __init__(self):
        self.hi_lo_avg = (self.data.high + self.data.low) / 2.0
        self.sma = bt.indicators.SMA(period=30)

    def next(self):
        if self.hi_lo_avg > self.sma:
            print('we have a winner!')

...
...
cerebro.addstrategy(MyStrategy)
cerebro.run()

一个给好人。操作符覆盖也确实有效next ,用户实际上可以删除 [0] 并直接比较对象。

如果所有这一切都是真正可能的,那实际上似乎有点过分了。但好消息是还有更多。请参阅此范例:

import backtrader as bt

class MyStrategy(bt.Strategy):

    def __init__(self):
        hi_lo_avg = (self.data.high + self.data.low) / 2.0
        sma = bt.indicators.SMA(period=30)
        self.signal = hi_lo_avg > sma

    def next(self):
        if self.signal:
            print('we have a winner!')

...
...
cerebro.addstrategy(MyStrategy)
cerebro.run()

我们做了两件事:

  1. 创建一个名为 lines 对象,该对象self.signalhigh-low- 平均值与简单移动平均值的值进行比较

    如上所述,当计算出此对象时,此对象在next

  2. 在检查 if signal True时删除 in next 的使用[0]。这是可能的,因为布尔运算也覆盖了运算符

结论

希望这能为运行__init__ 操作时实际发生的情况以及操作数重写的实际发生方式增加一些线索。

推荐阅读

相关文章

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

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

Backtrader教程:过滤器 - 参考

工作阶段筛检程序 类 backtrader.filters。

Backtrader python 隐藏的细节

只有当遇到 backtrader 的真实用户时,人们才能意识到平台中使用的抽象和Python功能是否有意义。 在不撇开python的座右铭的情况下, backtrader 试图为用户提供尽可能多的控制权,同时通过将Python提供的隐藏功能付诸行动来简化使用。 第一个示例是系列文章的第一篇。

Backtrader混合时间帧

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

Backtraderta-lib 集成

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

Backtrader教程:日期时间 - 管理

在 1.5.0 版之前, backtrader 使用直接的方法来进行时间管理,因为数据源计算的任何日期时间都只是按面值使用。 对于任何用户输入也是如此,例如可以提供给任何数据源的参数fromdate (或 sessionstart)的情况 考虑到直接控制冻结的数据源以进行回溯测试,这种方法很好。

Backtrader蟒蛇隐藏的力量3

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

Backtrader 多数据范例

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

Backtrader现实咬合

上一篇文章设法拷贝了该BTFD 策略,发现真正的收益 16x 而不是 31x。 但正如拷贝期间所指出的: 不收取佣金 使用2x 杠杆不收取利息 这就提出了一个显而易见的问题: 当收取佣金和利息时,这16x中有多少会存在? 幸运的是,前面的示例足够灵活,可以对其进行试验。

Backtrader动量策略

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