Backtrader终极振荡器

  |  

backtrader开发启动时的目标之一是使开发新的指针变得非常容易(至少对作者本人而言),以在数学和视觉上测试想法。

门票#102 是关于将 UltimateOscillator 添加到 backtrader

注意

它将在下一个版本中添加,同时可以使用下面的代码使用它。

票证中所示的参考:

以及:

无需在这里重复。

参考参考文献:

BP = Close - Minimum(Low or Prior Close)

TR = Maximum(High or Prior Close)  -  Minimum(Low or Prior Close)

Average7 = (7-period BP Sum) / (7-period TR Sum)
Average14 = (14-period BP Sum) / (14-period TR Sum)
Average28 = (28-period BP Sum) / (28-period TR Sum)

UO = 100 x [(4 x Average7)+(2 x Average14)+Average28]/(4+2+1)

总结:

  • 确保bt.Indicator 整个机器工作的第一个子类:

    class UltimateOscillator(bt.Indicator):
    
  • 它有1个输出 line:我们将它uo命名为:

    lines = ('uo',)
    
  • 它有 3 个参数,这些参数使用默认值7定义 3 个周期, 14 以及 28.要命名 p1p2p3

    params = (('p1', 7),
              ('p2', 14),
              ('p3', 28),
    )
    
  • 计算使用一些已经内置的东西 backtrader

    • Minimum(Low or Prior Close):这是 TrueLow 威尔斯·怀尔德为指针 RSI 定义的。因此, BP 可以计算出或购买压力:
    bp = self.data.close - TrueLow(self.data)
    
    • Maximum(Low or Prior Close) - Minimum(Low or Prior Close):这是 TrueRange 威尔斯·怀尔德为 RSI 指针定义的(可以表示为 TrueHigh - TrueLow。因此,下一个计算就像这样简单:
    tr = TrueRange(self.data)
    
    • 其余的是纯数学运算,用于SumN将 和 tr的最新p1p2p3 周期bp相加,再加上加权计算:
    av7 = SumN(bp, period=self.p.p1) / SumN(tr, period=self.p.p1)
    av14 = SumN(bp, period=self.p.p2) / SumN(tr, period=self.p.p2)
    av28 = SumN(bp, period=self.p.p3) / SumN(tr, period=self.p.p3)
    
    uo = 100.0 * (4.0 * av7 + 2.0 * av14 + av28) / (4.0 + 2.0 + 1.0)
    
    • 最后,将计算分配给定义的uoline
    self.lines.uo = uo
    

它似乎比底部的实际时间(完整代码,包括导入)更长。

由于我们不仅需要值,还需要一个漂亮的绘图,例如Stockcharts提供的绘图,因此我们将添加2个额外的触摸:

  • 2个参数,用于确定水准 lines 的位置,以划分超买和超卖区域(alaRSIStochastic):

    ('upperband', 70.0),
    ('lowerband', 30.0),
    
  • 并绘制初始化代码以使用参数。1050将添加刻度和90股票图表图中的刻度:

    def _plotinit(self):
        baseticks = [10.0, 50.0, 90.0]
        hlines = [self.p.upperband, self.p.lowerband]
    
        self.plotinfo.plotyhlines = hlines
        self.plotinfo.plotyticks = baseticks + hlines
    

为了测试和进一步使用 backtrader提供的现有设施,btrun 将使用与 backtrader 一起安装的可运行档。

  • 指针存储在名为ultimateoscillator.py

  • 使用的数据是 backtrader

  • 指针将使用缺省参数和短期参数添加两次

运行:

btrun \
  --nostdstats \
  --data 2005-2006-day-001.txt \
  --indicator ultimateoscillator:UltimateOscillator \
  --indicator ultimateoscillator:UltimateOscillator:p1=4,p2=8,p3=16 \
  --plot

注意

使用 –nostdstats 从图表中删除一些 observers 。在这种情况下,无需跟踪现金和价值

输出只是一个显示演变的UltimateOscillator图表。

代码UltimateOscillator

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


import backtrader as bt
from backtrader.indicators import SumN, TrueLow, TrueRange


class UltimateOscillator(bt.Indicator):
    '''
    Formula:
      # Buying Pressure = Close - TrueLow
      BP = Close - Minimum(Low or Prior Close)

      # TrueRange = TrueHigh - TrueLow
      TR = Maximum(High or Prior Close)  -  Minimum(Low or Prior Close)

      Average7 = (7-period BP Sum) / (7-period TR Sum)
      Average14 = (14-period BP Sum) / (14-period TR Sum)
      Average28 = (28-period BP Sum) / (28-period TR Sum)

      UO = 100 x [(4 x Average7)+(2 x Average14)+Average28]/(4+2+1)

    See:

      - https://en.wikipedia.org/wiki/Ultimate_oscillator
      - http://stockcharts.com/school/doku.php?id=chart_school:technical_indicators:ultimate_oscillator
    '''
    lines = ('uo',)

    params = (('p1', 7),
              ('p2', 14),
              ('p3', 28),
              ('upperband', 70.0),
              ('lowerband', 30.0),
    )

    def _plotinit(self):
        baseticks = [10.0, 50.0, 90.0]
        hlines = [self.p.upperband, self.p.lowerband]

        self.plotinfo.plotyhlines = hlines
        self.plotinfo.plotyticks = baseticks + hlines

    def __init__(self):
        bp = self.data.close - TrueLow(self.data)
        tr = TrueRange(self.data)

        av7 = SumN(bp, period=self.p.p1) / SumN(tr, period=self.p.p1)
        av14 = SumN(bp, period=self.p.p2) / SumN(tr, period=self.p.p2)
        av28 = SumN(bp, period=self.p.p3) / SumN(tr, period=self.p.p3)

        uo = 100.0 * (4.0 * av7 + 2.0 * av14 + av28) / (4.0 + 2.0 + 1.0)
        self.lines.uo = uo

推荐阅读

相关文章

Backtrader向 OHLC 提供买入价/卖出价数据

最近,backtrader通过实现line覆盖来运行从 ohlc-land 逃逸,这允许重新定义整个层次结构,例如,具有仅具有 bid,ask 和 datetime lines的data feeds。

BacktraderPython Hidden Powers 2

让我们进一步讨论一下Python的隐藏功能如何在 backtrader 中使用,以及如何实现它以尝试实现主要目标:易用性 这些定义是什么? 例如指针: import backtrader as bt class MyIndicator(bt.

Backtrader教程:指针 - 开发

如果必须开发任何东西(除了一个或多个获胜策略之外),那么这个东西就是一个自定义指针。 根据作者的说法,平台内的这种开发很容易。 需要满足以下条件: 从指针派生的类(直接或从现有的子类派生) 定义它将保持lines 指针必须至少具有 1 line。

Backtrader标杆

backtrader 包括 2 种不同类型的对象,可帮助进行跟踪: Observers Analyzers 工单 #89 是关于添加资产基准测试的。明智的是,人们实际上可能有一个策略,即使积极,也低于简单地跟踪资产所能提供的策略。

Backtrader教程:筛检程序

此功能是 backtrader 的相对较新的补充,必须安装到已经存在的内部结构中。这使得它不像希望的那样灵活且100%功能齐全,但在许多情况下它仍然可以达到目的。 尽管该实现试图允许随插即用的筛检程序链接,但预先存在的内部结构使得很难确保始终可以实现。因此,某些筛选器可能是链接的,而其他一些筛选器可能不是。

Backtrader跨越数字

《backtrader》的发布1.9.27.105纠正了一个疏忽。这是一个疏忽,因为拼图的所有部分都已到位,但启动并不是在所有角落都进行的。 该机制使用一个名为的属性_mindatas,因此让我们将其称为: mindatas。 社区问了这个问题,答案并不是很到位。

Backtrader教程:Cerebro - 优化 - 改进

backtrader版本1.8.12.99改进了在多处理过程中管理data feeds和结果的方式。

Backtrader混合时间帧

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

Backtrader交叉回溯测试陷阱

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

Backtrader教程:分析仪 - PyFolio

注意 从(至少)2017-07-25pyfolio 开始,API已更改,不再 create_full_tear_sheet 具有 gross_lev 作为命名参数的参数。