其他分享
首页 > 其他分享> > 量化投资之工具篇一:Backtrader从入门到精通(6)-Indicator类源代码解读(2)

量化投资之工具篇一:Backtrader从入门到精通(6)-Indicator类源代码解读(2)

作者:互联网

接上一篇继续。

系统内置Indicator的介绍

Backtrader提供了很多内置的Indicator,了解这些Indicator对我们自定义指标、理解现有指标以及制定策略具有重要作用。

基本操作类

Backtrader提供了很多基本操作类,作为定义其他指标的基准。

先看PeriodN,这个类是所有需要使用周期进行计算指标(例如移动平均)的基类:

class PeriodN(Indicator):
    '''
    Base class for indicators which take a period (__init__ has to be called
    either via super or explicitly)

    This class has no defined lines
    '''
    params = (('period', 1),)

    def __init__(self):
        super(PeriodN, self).__init__()
        self.addminperiod(self.p.period)

PeriodN没有lines,只是定义了参数period,并且自动增加最小周期。所以只要基于这个类的指标,都自动计算最小周期。那么如何对指标进行 计算了,Backtrader定义了OperationN:

class OperationN(PeriodN):
    '''
    Calculates "func" for a given period

    Serves as a base for classes that work with a period and can express the
    logic in a callable object

    Note:
      Base classes must provide a "func" attribute which is a callable

    Formula:
      - line = func(data, period)
    '''
    def next(self):
        self.line[0] = self.func(self.data.get(size=self.p.period))

    def once(self, start, end):
        dst = self.line.array
        src = self.data.array
        period = self.p.period
        func = self.func

        for i in range(start, end):
            dst[i] = func(src[i - period + 1: i + 1])

在这里可以看到,可以调用回调函数func对数据进行处理,其它需要对数据进行处理的类可以直接继承,只需要定义要使用的回调即可。而且要特别注意,这里只针对line[0]进行计算,如果有多条line,第二条及其后续均不会计算。下面看看如何提供计算,以求一段时间的最大值为例:

class Highest(OperationN):
    '''
    Calculates the highest value for the data in a given period

    Uses the built-in ``max`` for the calculation

    Formula:
      - highest = max(data, period)
    '''
    alias = ('MaxN',)
    lines = ('highest',)
    func = max

关键点:

相同的还有如下计算类指标:

均值Indicator基础

学过技术指标的应该都知道均值的作用,下面介绍均值Indicator使用的基本类:

class Average(PeriodN):
    '''
    Averages a given data arithmetically over a period

    Formula:
      - av = data(period) / period

    See also:
      - https://en.wikipedia.org/wiki/Arithmetic_mean
    '''
    alias = ('ArithmeticMean', 'Mean',)
    lines = ('av',)

    def next(self):
        self.line[0] = \
            math.fsum(self.data.get(size=self.p.period)) / self.p.period

    def once(self, start, end):
        src = self.data.array
        dst = self.line.array
        period = self.p.period

        for i in range(start, end):
            dst[i] = math.fsum(src[i - period + 1:i + 1]) / period

代码展示了典型的Indicator设计方法,可以作为范例:

Indicator的代码基本都遵循这个范例,后续我们不再讲解代码,具体的大家可以在backtrader\indicators目录下看看代码。代码看多了,自然可以自己写。下面我们重点介绍各个指标的含义以及用途。

几种常用的移动均线

移动平均值是一种简单也很使用的技术分析工具,通常被计算为确定股票的趋势方向或确定其支撑和阻力水平。它是一个趋势跟踪或滞后的指标,因为它基于过去的价格。

移动平均的时间越长,则滞后越大。因此,一个250天的移动平均值将比20天的MA滞后的程度大得多,因为它包含过去250天的价格。20天和250天的股票移动平均数是重要的交易信号,通常称之为月均线和年均线。

移动平均值是一个完全可定制的指标,这意味着我们可以在计算平均值时自由选择想要的时间范围。移动平均数中最常见的时段为15、20、30、50、100和250天。用于创建平均值的时间范围越短,对价格变化就越敏感。时间跨越长,平均的敏感度就越低。

我们可以选择不同长度的不同时段,根据其交易目标计算移动平均值。较短的移动平均线通常用于短期交易,而较长的移动平均线更适合长期投资者。

移动平均也可作为其他技术分析指标的基础,如移动平均收敛度(MACD),通常用来监测两个移动平均之间的关系。具体方法从12天指数移动平均值减去26天指数移动平均值。

当MACD为值大于0的时候,短期平均线(也叫快速均线)位于长期平均线(也叫慢速均线)以上。这是上升势头的迹象。当短期均线低于长期均线时,就表明其发展势头正在下降。零以上是购买的信号,零以下的交叉是卖出的信号。有点熟悉吧,就是咱们之前实现的双均线策略。当然MACD的使用是一门很大的学问,有很多文章和书籍,大家可以参考。

Backtrader提供的通用的移动平均包括如下种类:

MovingAverageSimple(简单移动平均)

移动平均线的最简单形式称为简单移动平均线(SMA),其计算方法是取周期内给定值的算术平均值。换句话说,一组数字(比如close价格)被加在一起,然后除以集合中的价格数。直接参见Average类的实现。

WeightedMovingAverage(权重移动平均)

加权平均是一种计算方法,它考虑到数据集中数字的不同重要程度。在计算加权平均值时,在进行最终计算之前,将数据集中的每个数字乘以预定的权重。权重的赋值原则是近期的数据更大的权重。指数移动平均线也是权重移动均线的一种。

ExponentialMovingAverage(指数移动平均线)

指数移动平均线对最近的价格给予更大的权重,使其对新信息更敏感。要计算均线,首先计算特定时间段内的简单移动平均线(SMA)。接下来,计算加权EMA的乘数(称为“平滑因子”),通常遵循以下公式:[2/(周期+1)]。因此,对于20天移动平均线,乘数应为[2/(20+1)]=0.0952。然后,使用平滑因子与前一个EMA组合,以获得当前值。因此,EMA对近期价格给予更高的权重(所以他也是一种权重移动平均),而SMA对所有价值给予同等的权重。具体计算就不细讲了,代码也很清楚,有兴趣直接参考代码。

增强的移动均线

AdaptiveMovingAverage(自适应移动均线,也称为考夫曼移动均线,KAMA)

那么移动均线的效果如何呢?

罗伯特·爱德华兹(Robert Edwards)和约翰·马吉(John Magee)在第一版《股票趋势技术分析》中总结了移动平均线的优缺点,他们说“而且,回到1941年,我们很高兴地发现了这一点(尽管许多其他人以前也发现过)通过对一定天数内的数据进行平均……我们可以得出一种自动趋势线,它肯定会解释趋势的变化……这似乎太好了,不可能是真的。"

为啥说不可能是真的呢?

比如说简单移动均线,我们之前提供的均线策略的简单的应用中,交易者在价格高于移动平均线时买入,在价格超过移动平均线时卖出。这样的方法保证了交易在每次重大交易中都处于正确的位置。不幸的是,在平滑数据的同时,移动平均线也会落后于市场,几乎总是会在交易中回吐大部分利润。通过我们的实际测试,效果确实也不好。

于是,分析师花了数年时间试图减少与这种滞后相关的问题。这些创新之一是指数移动平均(EMA)。这种方法对最近的数据赋予相对较高的权重,因此它比简单的移动平均线更接近价格走势。

虽然指数移动平均线减少了滞后,但它无法解决移动平均线的另一个问题,即使用移动平均线作为交易信号将导致大量交易失败。在《技术交易系统的新概念》一书中,威尔斯·怀尔德(Welles Wilder)估计,市场只有四分之一的时间呈现趋势。高达75%的交易行为局限于窄区间,当价格快速高于或低于移动平均线时,移动平均线买入和卖出信号将反复产生(震荡情况下,收益不高,佣金太多)。为了解决这个问题,一些分析师建议改变EMA计算的权重因子。

解决移动均线缺点的一种方法是将加权因子乘以波动率。这样做意味着,在动荡的市场中,移动平均线将远离当前价格。移动平均线将更接近当前的市场走势,理论上,允许交易者保留趋势期间获得的大部分收益。佩里·考夫曼(Perry Kaufman)在其著作《新交易系统和方法》(New Trading Systems and Methods)中建议将EMA公式中的“权重”变量替换为基于效率比(ER)的常数。该指标旨在衡量趋势的强度,定义范围为-1.0至+1.0。它表示的是每单位价格变动能产生多少方向性变动(或趋势)。ER为+1.0表示股票处于完美的上涨趋势-1.0代表了一个完美的下降趋势。实际上,很少达到极端。

Backtrader中提供了考夫曼的AdaptiveMovingAverage(KAMA),该均线用他的名字命名。它考虑到市场方向和波动性,使用了连续缩放的平滑因子。平滑因子由两个指数移动平均平滑因子计算得出,一个是快速平滑因子,一个是慢速平滑因子。如果市场趋势,价值将趋向于快速均线平滑期。如果市场没有趋势,它将走向缓慢的均线平滑期。

KAMA 与收盘价(Close)的偏差可用作看涨和看跌趋势的指标:

SmoothedMovingAverage(平滑移动平均)

也叫Modified Moving Average或者Running Moving Average ,它也是一种EMA,只不过平滑因子计算方法不一样而已。技术交易大神Wilder在1978年出版的《技术交易新概念》一书中使用。

DoubleExponentialMovingAverage(双重指数移动平均)

DEMA首次引入于1994年,由Patrick G.Mulloy在《股票和大宗商品技术分析》杂志上发表的文章《用更快的移动平均线平滑数据》。DEMA 使用两个指数移动平均线(EMA) 来消除滞后。DEMA 的使用方式与传统移动平均线(MA)类似。当价格高于平均值时,平均值有助于确认上升趋势,当价格低于平均值时有助于确认下降趋势。当价格越过平均线时,可能预示着趋势的变化。注意以下要点:

那么如何是使用DEMA呢?

DEMA 的使用方式与传统 MA 的使用方式相同。DEMA 还可用于分析价格上升趋势或下降趋势的强度。如果使用多个 DEMA(具有不同的周期),交易者可能会观察价格(例如我们经常使用的Close)是否与 DEMA 交叉,或者 DEMA 是否会相互交叉。DEMA 也可能提供支撑或阻力。

交易者观察相对于 DEMA 的价格以评估趋势方向和趋势强度。当价格高于 DEMA 并且 DEMA 正在上涨时,它有助于确认上升趋势。当价格低于 DEMA 并且 DEMA 正在下降时,这有助于确认下降趋势。

基于上述情况,如果价格从下方穿越到 DEMA 上方,则可能表明下跌趋势结束并且价格开始上涨。如果价格从上方跌破 DEMA,则可能表明上涨趋势已经结束,价格即将下跌。这就是我们提到过的均线策略。

交易者还可以在图表上显示两个(或更多)具有不同周期的 DEMA。当这些线交叉时,可以产生交易信号。例如,当 20 周期 DEMA 穿过 50 周期 DEMA 时,交易者可能会买入。当 20 周期回到 50 周期以下时,他们会卖出。这就是我们之前提到双均线策略。

**TripleExponentialMovingAverage(三重指数移动平均) **

和双重指数移动平均一样,三重指数移动平均线 (TEMA) 也是Mulloy提出的,旨在平滑价格波动和减少滞后,比双重指数平均的滞后更少,从而更容易识别趋势。它通过采用原始 EMA 的多个指数移动平均线(EMA) 并减去一些滞后来实现。TEMA 像其他 均线一样使用。它可以帮助识别趋势方向,发出潜在的短期趋势变化或回调的信号,并提供支撑或阻力识别。

TRIX(三重指数平滑移动平均)

和上一个指标的差别是这里用了平滑技术,参见SmoothedMovingAverage的说明。

TRIX(又叫三重指数平滑移动平均指标,Triple Exponentially Smoothed Average”)是在 1980 年代初期由《股票和商品技术分析》杂志的编辑 Jack Hutson 开发的。在技术分析中,它被认为是一种动量指标。TRIX 显示证券收盘价的三次指数平滑移动平均线的百分比变化率,以消除与较大趋势相比一些小的的价格变动。

TRIX 是一种围绕零线振荡的振荡器,用于技术分析以识别超卖和超买。正 TRIX 值表示超买状态,而负值表示超卖市场。TRIX 也可以用作动量指标。正值表示动量正在增加,而负值表示动量正在减少。

许多交易者和技术分析师在交易系统中使用 TRIX 来生成信号。技术分析表明,当 TRIX 在低于零线后穿过零线时会产生“买入”信号,而当 TRIX 向下穿过零线时会产生“卖出”信号。

同时,价格和TRIX的背离可以表明市场出现拐点的可能性。通常的做法是绘制一条周期较短的移动平均线(“信号线”)以发现 TRIX 方向的变化。在这种情况下,TRIX 和“信号线”交叉可用作买入/卖出信号。

TRIX 相对于移动平均线、MACD的主要优势和其他趋势跟踪指标是其对市场噪音的出色过滤。通过使用三重指数平均计算,TRIX 线消除了较小的短期趋势并指示市场方向的变化。许多交易者将 TRIX 视为最佳趋势反转和动量指标之一。当 TRIX 在交易系统中用作领先指标时,建议将其与其他市场指标结合使用,以最大程度地减少错误指示并提高系统的可靠性。

Backtrader还提供了TrixSignal,该指标在Trix的基础上,增加了信号线。

ZeroLagIndicator(零滞后指标)

前面咱们说过,所有的移动平均值都有滞后。滞后是必然的,因为平滑是使用过去的数据完成的。有两个哥们(约翰·埃勒斯和里克·韦, John Ehlers and Ric Way)写了篇文章,提出了零滞后指标,介绍如何消除滞后。有兴趣的可以看看。

Backtrader中提供如下基于零滞后的指标:

ZeroLagExponentialMovingAverage:根据名字可以知道,它是采用零滞后指标对EMA的增强。

HullMovingAverage:这个是由Alan Hull提出的,他解决了一个由来已久的难题,即在保持曲线平滑的同时,使移动平均线对当前价格活动更具响应性。事实上,HMA几乎完全消除了滞后,同时也改善平滑度。既要平滑,又要反应快,额,既要…又要…。

DicksonMovingAverage:迪克森移动平均线结合了ZeroLagIndicator和HullMovingAverage的优势,从测试效果来看,基本上就和源数据线重合了。

移动均线的包络线(Envelope)

包络线也是一种指标,通常绘制在具有上限和下限的价格图表上。最常见示例是移动平均线包络线,关键点在于:

通常的使用是基于当价格达到上限时,证券被视为超买(超买是当认为证券的交易价格高于其内在价值或公允价值时使用的术语。超买通常描述证券价格的近期或短期变动,并反映市场将在不久的将来修正价格的预期。),并产生卖出信号。相反,当价格达到下限时,证券被视为超卖(超卖一词是指资产价格走低并有可能出现价格反弹的情况。超卖状态可以持续很长时间,因此超卖并不意味着价格很快就会反弹,或者根本不会反弹。),并产生买入信号。这些策略基于均值回归原则。

在Backtrader系统指标中,提供了如下包络线类(对应的都是前述各种用移动平均线):

注意,这些类在代码中是搜不到的,因为它们都是自动生成的,具体参见Envelope.py文件。

移动均线的振荡器(Oscillator)

振荡器是一种技术分析工具,它在两个极值之间构建高低带,然后构建在这些范围内波动的趋势指标。交易者使用趋势指标来发现买卖点。当振荡器的值接近上极值时,分析师将该信息解释为资产买入,而当它接近下极值时,分析师认为资产卖出。关键要点是:

简单点讲,振荡器就是两个数据(line)之间的差值,通常与其他技术分析指标结合使用来做出交易决策。分析师发现,当他们无法轻易找到公司股价的明显趋势时,震荡指标最为有利,例如当股票横盘时。

我们这里重点介绍移动均线的振荡器(Oscillator of a Moving Average (OsMA))。

OsMA 也是一种技术指标,显示在给定时间段内振荡器与其移动平均线之间的差异。

关键要点:

MACD(Moving Average Convergence Divergence,移动平均收敛散度)是在均线指示器中使用的最常见的振荡器。MACD 有一个内置的移动平均线,也就是信号线。信号线是 MACD 线的平均值。OsMA 是这两条线之间的差值,通常绘制为直方图。它可以提供趋势确认以及可能的交易信号。这个比较重要,下面一个章节专门讲。

如何计算移动均线振荡器呢?

  1. 选择一个振荡器及其时间范围。
  2. 选择移动平均线类型和 周期数。
  3. 计算振荡器值,然后计算振荡器的 MA。由于移动平均线是多个值的平均值,因此在计算 MA 之前根据需要计算尽可能多的振荡器值。例如,如果你选择振荡器的九周期简单移动平均线(SMA),那么在计算 SMA 之前您至少需要九个振荡器值。
  4. 取振荡器和 MA 之间的差值以获得 OsMA 读数。这可以是正数或负数。
  5. 在每个时间段结束时重复步骤和三和四。

OsMA 是趋势和趋势强度的有用指标。高于零的值,尤其是高于零的一些时期,有助于确认价格上涨。低于零的值,尤其是连续低于零的多个周期,有助于确认价格下跌。

零线的交叉点也很重要。当振荡器在其均线上方或下方交叉时,会发生零线交叉。如果振荡器值低于 MA 值,则 OsMA 将记录一个负值并显示价格正在下降。如果振荡器升至均线上方,则 OsMA 将为正值并表示价格正在上涨。

在Backtrader中,提供了如下均线振荡器(对应前述的移动均线):

和Envelop类似,这些类在代码中也是搜不到的,因为它们都是自动生成的,具体参见oscillator.py文件。

移动均线收敛度(MACD)

这估计是使用最广泛的指标了。

MACD一种趋势跟随动量指标,基于快速MA(代表短期趋势)和慢速MA(代表长期趋势)之间的差异。它由 Gerald Appel 在 1970 年代首次实现,随后在 1986 年,Thomas Aspray 将 MACD 直方图添加到 MACD 中。

MACD 简单可靠。它计算快速移动平均线和慢速移动平均线之间的差异。比较流行的是计算 26 天和 12 天指数移动平均线 (EMA) 之间的差异(Backtrader中使用这两个缺省值)。但是,MACD 设置可能因股票和时间框架而异。也可以使用不同的移动平均线(简单、指数、加权等)。

这里我们看下MACD的代码实现(前面讲最小周期的时候也以此为示例,这里再贴一遍,也正好学习下如何定义Indicator):

class MACD(Indicator):
    lines = ('macd', 'signal',)
    params = (('period_me1', 12), ('period_me2', 26), ('period_signal', 9),
              ('movav', MovAv.Exponential),)

    plotinfo = dict(plothlines=[0.0])
    plotlines = dict(signal=dict(ls='--'))

    def _plotlabel(self):
        plabels = super(MACD, self)._plotlabel()
        if self.p.isdefault('movav'):
            plabels.remove(self.p.movav)
        return plabels

    def __init__(self):
        super(MACD, self).__init__()
        me1 = self.p.movav(self.data, period=self.p.period_me1)
        me2 = self.p.movav(self.data, period=self.p.period_me2)
        self.lines.macd = me1 - me2
        self.lines.signal = self.p.movav(self.lines.macd,
                                         period=self.p.period_signal)

关键要点如下:

从以上可以看出,定义一个Indicator还是比较简单的,只要你知道指标的具体计算公式。

同时Backtrader还提供了一个MACDHisto(MACD直方图)类,继承自MACD:

class MACDHisto(MACD):
    
    alias = ('MACDHistogram',)

    lines = ('histo',)
    plotlines = dict(histo=dict(_method='bar', alpha=0.50, width=1.0))

    def __init__(self):
        super(MACDHisto, self).__init__()
        self.lines.histo = self.lines.macd - self.lines.signal

MACDHisto增加了一个histo线,但是注意第6行,这个线的绘图方法为柱状图(bar),宽度为1.histo线等于macd和signal的差值。

可以看出,MACDHisto绘制为一条在零线(中心线)上方和下方移动的线。在指数和股票图表上,MACD 由三条线组成 - MACD 本身、应用于 MACD 并用作信号线的指数移动平均线和 MACD 直方图。MACD 直方图代表 MACD 与其信号线 (EMA) 之间的差异。如果MACD的值大于其 EMA 信号的值,则 MACD 柱状图上的值将为正。相反,如果 MACD 的值小于其 EMA 信号,则 MACD 柱状图上的值将为负数。MACD 直方图使中心线交叉和背离更容易识别。

我们要知道 MACD 是滞后指标,而滞后取决于周期设置。通过选择较小的 MACD 周期设置可以减少滞后,但 MACD 线将变得更加波动。当然我们也可以增加 MACD 的周期设置以使 MACD 线更平滑,但是会增加滞后。技术分析的艺术是找到满足需求的设置。

如前所述,MACD是两个指数移动平均线 (EMA) 之间的差值,那么 可以是正数或负数。正MACD 表明快速 EMA 趋势高于慢速 EMA,表明看涨。负 MACD 表明快速 EMA 趋势低于慢速 EMA,表明看跌。当快速的移动平均线穿过慢速的移动平均线时, MACD穿过中心线。

当然,MACD也可以和其他指标(例如后面要讲的RSI)一起使用,这个指标的使用的文章和书数不胜数,大家可以进一步探索。

一些增强的振荡器

在Backtrader中还提供了一些增强的的振荡器,下面分别介绍下。

AwesomeOscillator

Awesome Oscillator (AO) 是一个动量指标,反映了市场驱动力的精确变化,有助于确定趋势的强度,直至形成和反转的点。Awesome Oscillator 以及其他几个指标和振荡器的创造者是著名的交易员 Bill Williams。

虽然显示市场情绪及其趋势的指标本质上是滞后的,但震荡指标不仅可以确认趋势,还可以预测可能的冲动和走势。Awesome Oscillator 通过将近期动量(5周期的均线)与更长的趋势(34周期均线)进行比较来检测市场中看涨或看跌力量的:从 5 期均线中减去 34 期均线。

此外,34 周期和 5 周期简单移动平均线不是通过收盘价计算的,而是通过所选时间范围内的高点和低点的算术平均值来计算的。

这个指标的使用,和其他振荡器类似,高于0,产生买入信号,低于0,产生卖出信号。当然也有人有更复杂的使用,后续如有有使用的话再详述。

AccelerationDecelerationOscillator

AccelerationDecelerationOscillator(AC)也是动量指标,反映了当前市场驱动力加速或减速。它 的运行原理基于其创建者 Bill Williams 的假设,即在价格变动方向改变之前,其变动动量应该下降。

这个指标和AO一样,也是在中间值 0附近波动,这对应于市场驱动力与加速度的相对平衡。正值表示看涨趋势不断增长,而负值可能被视为看跌趋势发展。AC 指标在市场发生任何实际趋势逆转之前改变其方向,因此它是可能的趋势方向变化的预警信号 。

同样,简单的策略也是高于0看多,低于0看空。

PriceOscillator

这个价格振荡器,测量的是快速指数均线(周期缺省为12)和慢速指数均线EMA(周期缺省为26)之间的距离,这个返回的是绝对值,不好比较,因此不常用。要用的话,使用PercentagePriceOscillator,这个给出的是相对值。

PercentagePriceOscillator

百分比价格振荡器(PPO),给出的值为快慢均线的差值除以慢速均线。和MACD有点类似,不过MACD给出的是绝对值。基本上,PPO 是 MACD 的百分比表示,与MACD一起使用的所有技术分析原理都可以应用于 PPO,并且 PPO 会产生与 MACD 产生的信号相似的信号。因此,PPO 广泛用于 PPO 直方图,其分析方式与MACD 直方图相同。

与 MACD 相同,PVO 可用于从以下位置生成信号:

PPO 优于MACD的优势在于,由于 PPO 是基于百分比的,它允许比较各种证券的 PPO。

PercentagePriceOscillatorShort

这个和上面基本一样,就是分母为快速均线。

DetrendedPriceOscillator

前面几个基于价格的振荡器想要发现价格趋势,这个指标反其道而行。DPO(去趋势价格震荡)由乔·迪纳波利 (Joe DiNapoli) 在他的著作《Trading with DiNapoli levels》中提出的。看到没?一个指标可以写一本书。这个指标就不是趋势指标了,它的目的是去掉趋势,使用方法就是用将close价格减去均值(也就是趋势),突出了价格的高峰和低谷,用于根据历史周期估计买卖点。

记住几个关键要点:

去趋势价格振荡器旨在帮助交易者识别资产的价格周期。它通过将 SMA 与接近回溯期中期的历史价格进行比较来实现。

通过查看指标上的历史高峰和低谷,它们与价格的高峰和低谷相一致,交易者通常会在这些节点绘制垂直线,然后计算它们之间经过的时间。

如果底部相隔两个月,这有助于评估下一个买入机会何时到来。这是通过隔离指标/价格中的最近低点,然后从那里预测下两个月的底部来完成的。

如果峰值通常相隔 1.5 个月,交易者可以找到最近的峰值,然后预测下一个峰值将在 1.5 个月后出现。这个预计的高峰/时间框架可以用作在价格回落之前潜在卖出头寸的机会。

为了进一步帮助把握交易时机,波谷与波峰之间的距离可用于估计多头交易的持仓时间,或波峰与波谷之间的距离可用于估计空头交易的持仓时间。

DPO 本身并不提供交易信号,而是一种辅助交易时机的附加工具。它通过查看过去价格何时达到峰值和触底来做到这一点。虽然此信息可能为未来的预期提供参考点或基线,但不能保证历史周期长度会在未来重复。未来周期可能会变长或变短。

这个指标用来用来识别周期,比如猪周期,库存周期等,对我们有一定的指导意义。

PrettyGoodOscillator

好得不得了振荡器(PGO),瞧这名字起得就是有自信。它是马克·约翰逊发明的,测量当前收盘价与其简单的周期平均移动平均线的距离,相对于ATR(AverageTrueRang后续再介绍)的值。

因此,例如 PGO 值为 +2.5 意味着当前收盘价比 SMA 高出 2.5 天的平均范围。

约翰逊的方法是将其用作长期交易的突破系统。如果 PGO 升至 3.0 以上然后做多,或低于 -3.0 然后做空,并且在这两种情况下都在返回零时退出( 就是平均收盘价)。

UltimateOscillator

名字越来越牛了,这个叫终极振荡器。

Ultimate Oscillator 由 Larry Williams 于 1976 年开发。该技术指标用于衡量资产在多个时间范围内的价格动量。通过使用三个不同时间框架的加权平均值,与其他依赖单一时间框架的振荡器相比,该指标的波动性和交易信号更少。背离后会产生买入和卖出信号。由于其多时间粒度,最终振荡器产生的发散信号少于其他振荡器。

UltimateOscillator在 0 和 100% 之间波动,其分析可以与RSI(相对强弱指数,后面还要说明)技术分析进行比较,其中指标读数低于 30% 水平被视为超卖状态的指示,指标读数高于 70% 水平表明超买状态。当 Ultimate Oscillator 向上移动时,表明购买压力很大。相应地,终极震荡指标下降表明购买压力较弱。

交易系统可以根据上述技术分析制定交易策略,当Ultimate Oscillator向上突破30%时建议买入(股票从超卖状态开始攀升),当Ultimate Oscillator向下突破70%时建议卖出(股票从超买状态开始下跌)。

动量指标

前面有些振荡器和均线也是动量指标,导致我的分类就比较麻烦,这里动量指标就不包括振荡器了。

Backtrader也提供了很多动量指标,下面从Momentum开始。

Momentum

动量是证券价格的加速速度,即价格变化的速度。市场动量是指整个大盘的总加速度。

市场动量可用作衡量整体市场情绪的指标,可以支持与市场趋势和相同或者与市场趋势相反的买卖。它是可以帮助投资者跟随市场动能的几个指标之一。

几个要点需要记住:

动量的计算也很简单,就是当前价格减去一定周期前的价格(在Backtrader中可以设置)。这个计算结果可以绘制不同的趋势线用于计算。

正动量可以表示潜在的看涨趋势,而负动量可以表示看跌趋势。从广义上讲,动量可以衡量资产类别和个别证券,尤其是市场动量,指的是整个市场。这里要特别指出,动量更适用于宽基指数。

动量交易是一种寻求利用动量进入趋势的策略,因为它正在加速发展。在股票方面,企业利润的增长有助于创造积极的价格动能。在固定收益中,利率下降可能是价格动能的催化剂。

投资者可以使用动量作为一种交易技术,从市场心理的羊群行为中获利 。动量交易不是“低买高卖”,而是遵循“高买高卖”的策略。一旦动量交易者看到股票的价格、收益或收入加速,交易者通常会 持有该股票的多头或 空头头寸,希望其动能将继续向上或向下。该策略依赖于股票价格的短期变动而不是基本价值。说白了,就是跟踪趋势的交易,或者叫右侧交易,这个交易方式要严格纪律,遵循止损不止盈的策略。

广义上说,移动均线也是追踪动量的最简单方法之一。移动平均线是指定时间段内其价格的平均值。较高的移动平均趋势线表示积极的势头,而下降的移动平均趋势线表示消极的势头。

成交量加权平均价格(VWAP) 也是另一个广泛使用的动量指标(Backtrader中没有,需要的话可以自行定义)。VWAP 允许交易者跟踪价格相对于其数量的趋势。VWAP 的显著增加可能是一个强烈的看涨信号,而显着下降可能是一个强烈的看跌信号。也就是放量上涨,未来大概率继续涨。放量下跌,未来大概率继续跌,动量形成的趋势不会轻易改变。

MomentumOscillator

这个和Momentum差不多,计算方法不一样,Momentum计算的方式是当前价格减去一定周期前的价格,结果是绝对值。而MomentumOscillator计算的是当前价格除以一定周期前的价格,结果是相对值。

RateOfChange

这个是变化率,计算方法是(当前价格-N周期之前的价格)/N周期之前的价格,周期缺省是12. 这个计算的结果是变化率。

另外提供了RateOfChange100,结果是RateOfChange乘以100,变化率以百分比标记。

RelativeStrengthIndex

RelativeStrengthIndex(相对强弱指数,RSI) 是技术分析中最流行的动量指标,用于衡量近期价格变化的幅度,以评估股票或其他资产价格的超买或超卖状况。RSI 显示为振荡器(在两个极端之间移动的折线图),读数范围为 0 到 100。该指标最初由 J. Welles Wilder Jr. 开发,并在他 1978 年的开创性著作《技术交易系统的新概念》中介绍。

RSI 的传统解释和用法是,70 或以上的值表明证券正在变得超买或高估,并且可能为趋势逆转或价格的修正回调做好准备。RSI 读数为 30 或以下表明处于超卖或低估状态。

几个要点记住:

但是呢,我们也要注意,RSI 超过 70% 或跌至 30% 以下时,当的股票(或指数)被视为超买或超卖时,并不一定意味着会立即看到趋势反转。一只股票可能处于超买状态,但是其价格可能会继续上涨。同样的,一只股票可能会因在超卖状态而继续下跌。此外,也有的技术分析建议不要在 RSI 超过 70% 水平时卖出,而是在之前高于 70% 后跌破该水平时卖出。这可以解释为:“处于超买状态的股票开始下跌,这可能是多头的购买力耗尽的迹象”。类似地,RSI 在低于 30% 水平后上升,可以解释为“处于超卖状态的股票开始上涨,这可能是空头的卖力耗尽的迹象”。总之,这玩意儿是个艺术,不好掌握。

如何计算呢?看代码:

def __init__(self):
        upday = UpDay(self.data, period=self.p.lookback)
        downday = DownDay(self.data, period=self.p.lookback)
        maup = self.p.movav(upday, period=self.p.period)
        madown = self.p.movav(downday, period=self.p.period)
        if not self.p.safediv:
            rs = maup / madown
        else:
            highrs = self._rscalc(self.p.safehigh)
            lowrs = self._rscalc(self.p.safelow)
            rs = DivZeroByZero(maup, madown, highrs, lowrs)

        self.lines.rsi = 100.0 - 100.0 / (1.0 + rs)
        super(RelativeStrengthIndex, self).__init__()    

简单说明下:

从公式可以看看出,周期内涨得越多,这个RSI的值就越大,也就是超买程度越高。

也有人根据周期的不同给RSI不同的命名,例如RSI1(6天),RSI2(12天),RSI3(24天),几条线综合起来看。

DV2

DV2是对RSI2的替换方案,但是用得较少,这里不介绍了。

TrueStrengthIndicator

真实强度指数 (TSI) 是一种技术动量振荡器,用于识别趋势和逆转。该指数可用于确定超买和超卖情况,通过中心线或信号线交叉指示潜在的趋势方向变化,并通过背离显示趋势疲软。真实强度指数由其作者威廉·布劳 (William Blau) 首次在《股票与商品》杂志上介绍。它用价格的双指数(默认)来衡量动量。

TSI在-100% 和 +100% 之间波动,但是,大多数 TSI 读数出现在 -25% 和 +25% 之间的范围内。传统技术分析指出,当 TSI 读数超过 +25% 时,被分析的股票(ETF、指数或任何其他证券)被视为超买,而当 TSI 读数低于 -25% 水平时,同一证券被视为超卖。相应地,基于TSI分析的交易系统建议TSI 在低于 -25% 水平后买入,并在 TSI 在高于该水平后跌至 +25% 水平时卖出。

RelativeMomentumIndex

相对动量指数(Relative Momentum Index,RMI)由 Roger Altman 开发,他在 1993 年 2 月发行的《股票和商品技术分析》杂志的文章中引入。

RMI是对RSI的进一步发展,它使用当前和之前 N 个周期之间收盘价的变化,而不是1个周期(通常为1天)的变化。。结果是一个更平滑的 RSI。

与 RSI 一样,RMI 指标在 0 到 100 的范围内移动,相对动量指数值高于 70 和低于 30 分别被视为超买和超卖情况的指示。

在技术分析中,RMI 指标的分析方式与RSI基本相同。通常经验建议在 RMI 值在低于 30 后升至 30 以上时买入,当 RMI 值在高于 70 后低于 70 时建议卖出。

由于 RMI 读数高于 50 被认为是看涨的,而 RMI 读数低于 50 被认为是看跌的,一些交易者可能会选择在 RMI 和 50 中线的交叉点上产生信号:当 RMI 跌破 50 时卖出,当 RMI 涨到 50 以上时买入.

CommodityChannelIndex

商品通道指数 (CCI) 是一种基于动量的振荡器,用于帮助确定投资工具何时达到超买或超卖状态。

该技术指标由唐纳德·兰伯特 (Donald Lambert) 开发,可评估价格趋势方向和强度,使交易者能够确定他们是否想要进入或退出交易。

关键要点:

CCI 计算可以分四步进行:

第一步:计算周期内每天(bar)的典型价格:

TP = (H+L+C)/3
其中 H = 最高价格,L = 最低价格,C = 收盘价格。
第二步:通过20天均线线计算 SMATP (典型价格的简单移动平均线):

SMATP = Simple MA(20) 应用于步骤 1 中计算的 TP

第三步:计算平均偏差:首先,计算上一周期的 SMATP 与过去 20 个周期中每个数据(bar)的典型价格之间差异的绝对值。然后将这些绝对值相加并除以 20 以计算平均偏差。Backtrader中,提供了MeanDeviation类来完成这个计算。

最后一步是通过以下公式计算 CCI:

CCI =(典型价格 - SMATP)/(0.015 X 平均偏差)

看Backtrader中这段代码真是简洁明了,给大家欣赏下:

    def __init__(self):
        tp = (self.data.high + self.data.low + self.data.close) / 3.0
        tpmean = self.p.movav(tp, period=self.p.period)

        dev = tp - tpmean
        meandev = MeanDev(tp, tpmean, period=self.p.period)

        self.lines.cci = dev / (self.p.factor * meandev)

        super(CommodityChannelIndex, self).__init__()

可以看出,Backtrader不仅易于使用,而且也易于编码实现各种指标。

那么如何使用这个指标呢?

当 CCI 从负或接近零区域移动到 100 以上时,这可能表明价格开始新的上升趋势。一旦发生这种情况,交易者可以观察价格回落,随后价格和 CCI 均出现反弹,以表示买入机会。

同样的概念也适用于下降趋势。当指标从正值或接近零读数变为低于 -100 时,下降趋势可能开始。这是一个退出多头或开始观察空头机会的信号。

特别注意,由于这个是无界限的振荡器,所以超买 或 超卖水平不固定。因此,我们需要查看该指标的过去读数,以了解价格反转的位置。对于一只股票,它可能倾向于在 +200 和 -150 附近反转,另一种商品可能倾向于在 +325 和 -350 附近反转。

阿隆指标(Aroon)

在Backtrader中,提供了阿隆系列指标。

Aroon 指标由 Tushar Chande 于 1995 年开发,用于确定股票是否处于趋势中,以及趋势的强度。Aroon 指标用于价格技术分析以指示趋势可能变化的时刻。这个指标是基于这样的认识:强劲的上升趋势会经常看到新的高点(不断创新高),而强劲的下降趋势会经常看到新的低点(不断创新低),这个可以用于类似这样的策略:1个月不创新低就可以买入。

Aroon 指标表示从分析周期开始到 Aroon 最高价格(上涨)或 Aroon 最低价格(下跌)出现的时候(对应周期内的索引)占分析期间的总持续时间。

最高价格和最低价格这两种情况,分别对应AroonUpAroonDown

计算公式为:

Aroonup=(周期-周期内出现最高价格的索引)/周期。

AroonDown=(周期-周期内出现最低价格的索引)/周期。

还记得如何查找周期内最高/最低价格?Backtrader提供了FindFirstIndexHighestFindFirstIndexLowest,特别注意的是,这个索引是从当前值(索引为0)从前查找的。前一个数据(bar)是1,以此类推。

比如说:如果过去 14 个周期的最高价格在 6 个周期(从当前值往前数)的时候达到,则 AroonUp为 (14-6) / 14 x 100 = 57。

同样,如果,在14 天的统计周期,前一个数据(1个bar)达到最低价格,则 AroonDown的值为 (14-1) / 14 x 100 = 93。

如果当天就是最高价或者最高价,那么Aroon的值就是100.

如果我们要知道一个月不创新低,那怎么办呢?那就设置一个周期为22天(一个月的交易日)AroonDown指标,该指标等于0,就是一个月没有创新低。当然,这个指标不能独立使用,需要结合其他指标一起。

AroonUp 和 AroonDown 线在 0 和 100 之间波动,接近 100 的值(当天就创新高了)表示强劲趋势,接近零的值表示弱趋势。AroonUp 越低,上升趋势越弱,下降趋势越强,反之亦然。主要底层逻辑是,股票的价格不断创新高,对AroonDown也一样。

基于AroonUp和AroonDown,Backtrader还提供了AroonOscillator

AroonOscillator简单地通过从AroonUp减去AroonDown来计算。由于 Aroon 线在 0 到 100 之间的范围内移动,因此 Aroon 振荡器围绕 -100 到 +100 之间的零中心线振荡。

几个要点记住:

指标上的交叉可能看起来不错,但这并不意味着价格必然会出现大的变动。该指标不考虑变化的大小,它只关心自高点或低点以来的天数(对于日数据来说)。即使价格相对平稳,也会发生交叉,因为最终会在过去 25 个周期内创造新的高点或低点。交易者仍然需要使用价格分析和潜在的其他指标来做出明智的交易决策。不建议仅仅依赖一个指标。其中30天不创新低的指标在指数投资中有一定作用。

此外,Backtrader还提供了一个AroonUpDown将AroonUp和AroonDown放在一起。还有一个AroonUpDownOscillator,看名字,就是将前述3个指标揉在一起。

运动指标

DirectionalMovementIndex

Directional Movement Index(定向运动指数 ,DMI) 是 J. Welles Wilder (这个名字是不是在我们的文章中出现多次了?大神啊)于 1978 年开发的一项指标,用于确定资产价格的变动方向。该指标通过比较先前的高点和低点并绘制两条线来实现这一点:正向运动线 (+DI) 和负向运动线(-DI)。可选的第三条线,称为平均方向指数 (ADX),也可用于衡量上升趋势或下降趋势的强度。

当+DI高于-DI时,价格的上行压力大于下行压力。相反,如果-DI高于+DI,则价格下行压力更大。该指标可以帮助交易者评估趋势方向。线之间的交叉有时也用作买卖的交易信号。

记住要点:

这个计算比较复杂,反正Backtrader给你算好了,有兴趣参看代码。

Backtrader中还定义同类型的其他指标。

MinusDirectionalIndicator:只包含-DI

PlusDirectionalIndicator:包含 +DI

DirectionalIndicator(DI):包含+DI和-DI。

AverageDirectionalMovementIndexRating:包含ADXR。基于ADX进行计算的一个结果,和ADX一样使用。

DirectionalMovement(DM):和DMI相比,增加了ADRX

此外,Backtrader还提供了两个运动方向的指标:

UpMove:公式为当前价格减去上一天(或者bar)的价格。

DownMove:公式为上一天(或者bar)的价格减去当前的价格。

布林带(BollingerBands)

布林带本质上就是个均线,为啥单独列为一节呢,因为它比较重要,也是我后续要重点使用的一个指标。

布林带由 John Bollinger 在 80 年代定义,又是一个以大神名字命令的指标,据说他还有版权。它由一组趋势线定义,这些趋势线绘制了表征偏离证券价格的简单移动平均线(SMA) 的两个标准差(正值和负值),在Backtrader中,数量可以设置。其目的让投资者更有可能正确识别资产何时超卖或超买。

关键要点记住:

计算 布林带的第一步是计算证券价格的简单移动平均线,通常使用 20 天 SMA。接下来,将获得证券价格的标准差。标准差是平均方差的数学度量,在统计学、经济学、会计学和金融学中占有突出地位。对于给定的数据集,标准差衡量数字与平均值的分布情况,用于衡量价格图的波动性。标准差可以通过取方差的平方根来计算,具体我们后续章节专门说明。最后,将该标准差值乘以 2,然后从沿 SMA 的每个点添加和减去该值。那些产生上带和下带。

布林带将证券的 20 天(Backtrader中可设置) SMA 与价格的每日波动一起设置为上下波段。因为标准差是衡量波动性的指标,所以当市场变得更加波动时,波段会变宽;在波动较小的时期,波段会收缩。

当股票价格持续触及上布林带时,价格被认为超买;相反,当它们持续触及下限时,价格被认为超卖,触发买入信号。

使用布林带时,将上限和下限指定为价格目标。如果价格偏离下带并越过 20 天平均线(中线),上带就代表了上价格目标。在强劲的上升趋势中,价格通常在上限和 20 天移动平均线之间波动。当这种情况发生时,低于 20 天移动平均线的交叉点警告趋势反转下行。

尽管每种策略都有其缺点,但布林带已成为聚焦证券短期价格的最有用和最常用的工具之一。在股价低于布林带下限时买入,通常有助于交易者利用超卖情况,并在股价回升至中心移动平均线时获利。

在Backtrader中,还提供了BollingerBandsPct,就是在布林带上增加一条按百分比显示的线,这个线表示相对于上带和下带,当前价格所处的位置位置。计算公式为:

百分比= ((收盘 - 布林下带) / (布林上带 - 布林下带))*100

举个例子说明:

在交易系统中使用布林百分比指标时,使用以下价格趋势强度评估规则:

除了布林带百分比,还有一个布林带带宽(Bollinger Bandwidth)的指标,不过这个在Backtrader中未定义,有需要咱们可以自己写。

布林带让我们直观地识别高波动率和低波动率的时期(窄带表示低波动率,宽带表示高波动率),但带宽提供了实际的波动率值。它的计算公司为:

带宽=(布林带上带- 布林带下带)/布林带中带

布林线带宽图表分析很简单。 当布林带宽度移动到高水平时波动率很高,当带宽接近零时波动率很低。通常,股票的价格和波动率会周期性变动——价格上下波动,低波动期被高波动期取代。一般来说,在下降趋势和向下修正期间可以注意到高波动时期。在上升趋势和复苏期间可以观察到低波动期。有了这些知识,我们可以构建一个交易系统根据波动率技术分析生成信号。

布林带带宽可用于识别“挤压”——当带宽在 n 周期内处于最低值时。布林格指出,挤压可能发生在趋势逆转之前,例如“暴风雨前的平静”。在这种情况下,可以在挤压之后的价格突破时生成交易买入/卖出信号。简单点说,就是长期盘整之后容易引起行情的突变。

布林带并不表示价格的方向。因此咱们需要结合其他技术研究使用波动率指标(包括布林线带宽)。布林格建议使用RSI确认挤压,也可以使用其他基于价格和数量的指标。

使用布林线带宽和其他波动率指标最流行的方法之一是寻找价格和波动率之间的差异。基于较低的波动性是看涨趋势的典型信息,在上涨过程中波动性的增加可能预示着即将到来的下行逆转,并可用于产生“卖出”信号。相反,技术分析指出,如果波动率开始下降而价格仍在下跌,则可能表明即将出现上行逆转,可用于生成“买入”信号。

除了布林带之外,Backtrader还提供了一个AverageTrueRange来衡量波动性。

AverageTrueRange

平均真实范围(ATR)也是在Welles Wilder Jr. 在其著作《技术交易系统的新概念》中引入的,通过分析一定时间类资产价格的整个范围来衡量市场波动性。和布林带一样,ATR 指标不反映价格方向,不用于预测价格。该指标广泛用于技术分析,以衡量价格变动或价格波动的程度。

TR 的计算很简单,包括两个步骤:

第一步:定义真实范围 (TR), 真实范围计算方法:

第二步:将移动平均线应用于定义的 TR,也就是ATR = SMA(TR)。

在技术分析中,ATR主要用于根据波动率标准选择股票并预测长期趋势逆转。

根据个人交易偏好和风险承受能力,交易者可以为其投资组合寻找低、中或高波动性股票。ATR 指标可能是根据波动率标准筛选股票的绝佳工具。

在预测长期趋势逆转时,技术分析指出,在长期下降趋势、衰退和股市崩盘期间,可能会记录到比平常更高的波动率。这种行为是由人为因素导致的,因为大多数投资者在看跌市场期间更加恐慌并且对他们的投资未来更加不确定。在牛市期间,交易者对他们的投资选择更有信心。这种波动模式可用于识别看涨和看跌的长期趋势。

统计指标

衡量一组数据的可变性或波动性 的两种最流行的方法是标准差和平均差(也称为平均绝对差)。尽管这两个测量值相似,但它们的计算方式不同,并且提供的数据视图略有不同。

确定波动率(即偏离中心)在金融领域很重要,因此会计、投资和经济学专业人士应该熟悉这两个概念。

Backtrader提供了两个指标类用于计算标准差和平均差。

StandardDeviation(标准差)

在统计中,标准差提供了一个很好的波动率指示,通常被称为波动率指标。在技术分析中,该指标应用于收盘价(close),以衡量平均收盘价的值的离散程度。证券(股票、指数等)实际收盘价与证券平均收盘价之间的差值称为离差。离差越大(收盘价和平均价之间的差异),标准差和波动率就越高。离差越小(收盘价越接近平均价格),标准差越小,证券的价格波动越低。

正如我们之前提到的,标准偏差用于技术分析和交易系统,通过显示价格和平均价格之间的差异来统计衡量股票的波动性。通常,该指标用作其他指标的组成部分。如前所述,标准偏差用于确定上下布林带之间的价差,因此,布林带宽度指标可用作标准偏差指标的替代品。

标准差的另一个用途是确认下降趋势或上升趋势。通常,市场在上涨趋势中波动较小,而在下跌趋势或市场崩盘期间,由于恐慌性抛售,我们可能会看到高波动性。

在交易系统中标准偏差(与其他波动率指标一样)用于定义波动期并调整使用它的技术指标的设置。众所周知,在高度波动的市场中,价格趋势变化更快。因此,交易系统应该更快地对信号做出反应,否则可能为时已晚,无法开仓或平仓。同时,在低波动性的市场中,交易者可以设置交易系统延迟信号的产生,以避免过早开仓或平仓。

标准差的计算可以分六个步骤完成(具体可参见代码)。例如,要计算 10 个周期的标准差:

  1. 计算收盘价的简单平均值(平均值)。
  2. 对于周期内每个数据(bar),从实际收盘价中减去平均收盘价。这将给出周期内每个close的偏差。
  3. 将在步骤2 中获得的每个周期的偏差的平方。
  4. 将在第 3 步中获得的平方偏差求和。
  5. 将平方偏差的总和除以周期数(在我们的示例中为 10)。标准偏差等于该数字的平方根。

MeanDeviation(平均差)

和标准差的用途类似,平均差计算方法是:

  1. 计算收盘价(close)的简单平均值(平均值)。
  2. 对于周期内每个close,从实际收盘价中减去平均收盘价。这将给出周期内每个close的偏差。
  3. 计算上述偏差的绝对值,并计算其平均值;

标准差通常用于衡量投资基金或策略回报的波动性,因为它也可以帮助衡量波动性。较高的波动性通常与较高的损失风险相关,因此投资者希望从产生较高波动性的基金中获得更高的回报。

平均平均值或平均绝对偏差被认为是最接近标准偏差的替代方案。它也用于衡量市场和金融工具的波动性,但使用频率低于标准差。

一般来说(根据数学家的说法),当数据集是正态分布时(也就是没有很多异常值)标准差是衡量可变性的更可取的衡量标准。但是,当存在较大的异常值时,标准偏差将记录比平均绝对偏差更高的离散度或与中心的偏差。

其他指标

Backtrader支持的其他指标,我也没想好咋分类的,统一就扔这儿吧。

交叉

CrossDown CrossUp CrossOver

这哥仨是一起的,通常作用于两个数据(包括普通数据或者Indicator)当第一个数据Line向上穿越第二个数据line的时候,CrossUp指标计算结果为1.向下穿越的时候计算结果为1. 对于Crossover,向上穿越结果为1,向下穿越结果为-1,也就是同时产生两个信号。上一篇文章讲解Strategy的时候使用了这个类,回头去看看。

这个几个指标还是很有作用的,比如咱们经常是说的金叉和死叉。

**金叉(**Golden Cross)

金叉是一种图表模式,其中相对短期的移动平均线穿过长期移动平均线。黄金交叉是由涉及证券的短期移动平均线(例如 15 天移动平均线)突破其长期移动平均线(例如 50 天移动平均线)。黄金交叉表明牛市即将到来,并因高交易量而得到加强。

但是呢?如前面所述,金叉用了移动均线,不管如何消除滞后,这玩意儿还是个滞后指标,只有在市场上涨后才能确定,它看起来很可靠。然而,由于也是由于滞后,在事后也很难知道什么时候信号是假的。交易者通常使用黄金交叉作为趋势或信号与其他指标相结合的确认。

有了CrossUp类,很容易就可以实现金叉:

        self.fast = bt.indicators.SimpleMovingAverage(self.datas[0], period=15)
        self.slow = bt.indicators.SimpleMovingAverage(self.datas[0], period=50)
        self.GodenCross=bt.indicators.crossover.CrossUp(self.fast, self.slow)

**死叉(**Death Cross)

和金叉相反,当一只股票的短期均线向下穿越其长期均线形成的交叉,我们称之为死叉。通常,此策略中最常用的移动平均线是 50 天和 200 天移动均线。死亡交叉指标已被证明是上个世纪美国最严重熊市的可靠预测指标:1929 年、1938 年、1974 年和 2008 年。在这些熊市开始时退出股市的投资者避免了1930 年代高达 90% 的巨额亏损。国内咋样,简单测试了下,好像也不太可靠,主要是滞后的原因。

同样我们也可很容易实现死叉:

        self.deathfast = bt.indicators.SimpleMovingAverage(self.datas[0], period=50)
        self.deathslow = bt.indicators.SimpleMovingAverage(self.datas[0], period=200)
        self.deadcross=bt.indicators.crossover.CrossDown(self.deathfast, self.deathslow)

枢轴点

PivotPoint

枢轴点是支撑位,是根据典型价格(高+低+收盘)/3 计算得出的阻力位,称为枢轴点。技术分析师假设在这些水平上,价格趋势可能改变其方向。

枢轴点是趋势预测指标(领先指标),有的人喜欢使用它进行日内的短线交易,但一些人可能更喜欢在更长的时间范围内使用枢轴点,它们基于平均每周或每月的开盘价、最高价和最低价。作为一个长线交易者,我喜欢这个指标。

在技术分析中,枢轴点主要用作股票/指数/市场走势的预测指标。如果在市场开盘时,股票、指数或任何其他商品的交易价格高于枢轴点,这通常与积极(看涨)情绪有关。相反,低于枢轴点交易的股票与看跌情绪有关。基于此知识,交易者可以调整交易策略,即在价格高于枢轴点时使用其他技术研究仅交易“买入”信号,而当价格低于枢轴点时仅交易“卖出”信号。

使用枢轴点的另一种方法是交易支撑位和阻力位。技术分析表明,在枢轴支撑位和阻力位,股票价格倾向于改变其趋势。由于这些水平并不表示价格趋势的变化而仅表明趋势的弱点,因此使用支撑和阻力水平的最常见方法是将它们用作利润目标和止损水平。例如,如果股票在枢轴点上方交易,交易者可能会决定以低于枢轴点几个点的止损进行多头交易。当股价上涨到第一条支撑线上方时,交易者可以将止损移动到第一条支撑线下方几个点,依此类推。

表示枢轴点的常用方法是用五条线表示,其中中心线是枢轴点 (PP) 线,枢轴点上方的两条线是第一和第二个阻力位,枢轴点下方的两条线是第一和第二个阻力位支持水平。在Backtrader的PivotPoint中,定义了5条线,分别名称为p,s1,s2,r1,r2.

此外,Backtrader还提供了DemarkPivotPointDemarkPivotPoint两种增强的枢轴点,两者只是计算方法有了增强,具体就不讲了。

前后值比较

Backtrader提供了如下6种指标用于对比当前数据和前一天(bar)的数据,主要用于各种指标的计算。

UpDay

这个也是Welles Wilde大神提出的,主要给其他指标(比如RSI)提供计算支持。计算公式是就是返回当前close价格和前一天(或bar)close的差值。如果当前的close价格低于前一天,那么设置为0.

DownDay

和upDay相反,DownDay是前一天(或Bar)close的值减现值,注意,最小值为0.

UpDayBool

和Upday含义一样,就是不返回差值了,如果当前值大于前一天的值,就返回1,否则为0.

DownDayBool

和DownDay含义一样,但是不返回差异,如果前一天的值大于现值,就返回1,否则为0.

UpMove

和UpDay含义差不多,可以为负值。

DownMove

和DownDay含义差不多,可以为负值。

Fractal(分型)

分形指标基于金融市场中常见的简单价格模式。在交易之外,分形是一种在所有时间范围内重复出现的重复几何图案。从这个概念出发,设计了分形指标。该指标隔离价格图表上的潜在转折点。然后它会绘制箭头来指示模式的存在。在看涨的分形图案信号价格可能会走高。一个看跌的分形信号价格可能会走低。看涨分形由向下箭头标记,看跌分形由向上箭头标记。

几个关键要点:

计算分形更多地要靠眼睛看,而不是数学。非要用数学的描述,就比较僵化,而且分型这玩意儿严重滞后,经常产生信号,可能需要和其他指标一起用,咱们就不详细讨论了,大家知道有这个东西就好,有兴趣的可以深入研究。

HeikinAshi(平均K线图)

这个是日本人搞出的东东,他不是一个指标,而是一个数据处理机制。在技术分析中,HeikinAshi K线图可以 传统K线图一起使用,当然它们可以单独使用。HeikinAshi K线图的作用是为了过滤小的价格波动和波动,如何过滤呢?就是求平均值。

在技术分析中,HeikinAshi K线图用于生成信号。主要有五种类型:

另外,基于这种K线图,还有一个专门的指标haDelta,这个指标由Dan Valcu提出,专门还要一本书《Heikin-Ashi: How to Trade Without Candlestick Patterns》,该指标首先计算平均K线图收盘价和开盘价之间的差异,也就是柱体的长度。haDelta是基于这个柱体长度的3周期移动均线。

HurstExponent(赫斯特指数)

赫斯特指数以英国水文学家哈罗德·赫斯特命名,起初被用来分析水库与河流之间的进出流量,后来被广泛用于各行各业的分形分析,自然也用于金融分析,主要作用是寻找未来可能重复或逆转的股票和债券价格的周期、模式和趋势。

赫斯特指数可用于趋势交易投资策略。投资者会寻找表现出强烈持久性的股票,如何识别呢?通常认为股票的 H 值大于 0.5。H 小于 0.5 可以与技术指标配对以发现价格反转。例如,价值投资者可能会寻找 H 小于 0.5 且价格已经下跌了一段时间的股票。

基于证券将恢复到之前状态的假设,均值回归交易旨在利用证券价格的极端变化。交易者使用 H 指数来推测均值回复时间序列策略,例如配对交易,其中两种资产之间的价差是均值回归的。

Ichimoku(云图指标)

看着名字有点奇怪,因为是日本人发现并命名的。它是由 Goichi Hosada 于 1969 年开发。该指标已在技术分析中用于定义支撑位和阻力位、揭示趋势方向、生成交易信号和定义信号强度。Ichimoku Cloud也可以译为“一目了然的平衡图表”。该指标在图表上虽然乍一看似乎很复杂,但那些熟悉如何阅读图表的人通常会发现通过明确定义的交易信号很容易理解。通常用于确定趋势和检测趋势突破。与大多数技术指标一样,它在长期图表上使用时表现更好。

关键要点:

另外注意一点,这个指标也是滞后指标的。

这个图需要结合图来描述,就不细讲了,有兴趣的网上搜索下。

KnowSureThing(KST)

这个指标的名字给出了大家美好的愿望,知道确定的事情。投资最确定的特点就是不确定。

KST是一个“总和”动量指标,由 Martin Pring 1992年发布,旨在使交易者更容易解读变化率(Rate of Change,前面介绍过)指标。

记住关键点:

KST 的计算方法是采用四个不同变化率(ROC) 简单移动平均线 (SMA) ,将它们加在一起得出 KST,并通过采用 9 个周期的 SMA 创建一条信号线。

KST 指标可以以与许多其他动量振荡器相同的方式使用,例如前面介绍的相对强度指数(RSI)。当 KST 越过信号线时会产生交易信号,但交易者也可能会寻找与价格、超买或超卖情况或中线 交叉的收敛和背离。

LaguerreFilter

Laguerre过滤器是基于Lagurere多项式的平滑过滤器。它的第一项是 EMA,然后用阻尼因子进一步平滑。阻尼因子可以取 0 到 1 之间的任何值。当阻尼因子设置为 0 时,指标变为有限脉冲响应 (FIR) 滤波器。当阻尼因子设置为接近 1 的值时,滤波器变得更平滑。然而,这反过来又会产生明显的滞后。

其实这玩意儿还是在解决平滑和之后的问题,技术分析中麻烦的问题是避免洗盘交易(震荡过程中产生过多的信号)。当移动平均线变得更平滑以避免这些洗盘时,平滑产生的滞后通常会使信号无效。因此,难题是如何在可以获得的平滑量和可以容忍的滞后量之间取得平衡。

前面在6.4节介绍了很多类似指标。

Backtrader还实现了基于Laguerre过滤器的LaguerreRSI,对原RSI进行了加强。

ParabolicSAR(抛物线指标)

抛物线指标PSAR由 J. Welles Wilder, Jr. 于 1978 年在他为在《技术交易系统中的新概念》一书中定义,名字挺熟的吧,在本文中搜索下,看有多少指标是这个大神提供的。SAR 代表停止和反转((Stop and Reverse),该指标用于基于价格和时间的交易系统。这是为发现趋势反转点而开发的趋势跟踪(滞后)指标。它可以用作追踪止损,也可以用于定义进入和退出点。

在图表上,PSAR指标显示为位于价格条上方或下方的一系列点。低于价格的点被视为看涨信号。相反,价格上方的一个点用于说明空头处于控制之中,并且势头可能会保持向下。当点翻转时,表明价格方向的潜在变化正在进行中。例如,如果点高于价格,当它们下降低于价格时,可能预示着价格会进一步上涨。

随着股票价格的上涨,这些点也会上升,先是缓慢上升,然后加速上升,并随着趋势而加速。随着趋势的发展,SAR 开始移动得更快一些,并且点很快就会赶上价格。

PSAR指标 有两个参数可以调整:加速因子 (af),也称为“步长”。最大加速度(afmax),也称为“最大步长”。通过调整这两个参数,可以调整指标对趋势变化的敏感度。

这个指标试了下,看起来效果不错,后续专门研究下。

Stochastic(随机指标)

随机指标由George C. Lane 在 20 世纪 50 年代后期引入,该指标(振荡器)是一种动量指标。

在技术分析中,随机指标用于显示最近收盘价与最低低点和最高点之间的距离(在计算期间):

高于 80 的随机指标读数通常被认为表明超买情况,而低于 20 的随机指标读数通常被认为表明超卖情况;然而,低于 20 的读数不一定是看涨的,高于 80 的读数也不一定是看跌的信号。随机指标达到80后,股票可能会继续上涨;反过来; 即使在其随机指标达到 20 之后,它也可能继续下跌。当成交量激增发生在指数高点或低点附近时,反转的可能性要高得多。

作为一般规则,在价格上涨期间出现的成交量激增(由高 PVO 表示,PVO是成交量振荡器,Backtrader中没有,需要的话可以自定义,或者使用Ta-lib中的成交量指标,下一章节介绍)与高点附近的收盘价(即随机指标 > 80%)相结合,表明潜在的下行逆转。

同样在价格下跌期间出现的成交量激增(由高 PVO 表示)与接近低点的收盘价(即随机指标 < 20%)相结合,表明潜在的上行逆转。

忽略随机指标读数超过 20% 且低于 80% 时出现的成交量激增。在这种情况下,市场反应可能是短暂的。

随机指标根据以下公式计算:

原始随机指标(一定周期内,周期值可设置) = 100 * (当前收盘价 - 最低价) / (最高价 - 最低价);

K = 原始随机指标的 3 周期移动平均线;

D = K 的 3 个周期移动平均线;

因为它是一个百分比或比率,K在 0 和 100 之间波动。K 的 3 天简单移动平均线通常与 D 一起绘制,作为信号或触发线。

Vortex(涡旋指标)

涡轮指标,名字越来越魔幻了。

这个是Etienne Botes和Douglas Siepman发明的技术指标,用于识别金融市场中新趋势的开始或现有趋势的延续。它发表在2010年1月的《股票和商品技术分析》中。灵感来自奥地利发明家Viktor Schauberger的工作,他研究了河流和涡轮机中的水流。这俩哥们就提出了金融市场内的运动和流动类似于水中的涡旋运动的想法。涡流指标还部分受J.Welles Wilder的定向运动(DM)概念的启发。

在技术分析中,涡流指标的使用方式与定向运动指标的使用方式相同。定向运动 (DM) 由两条线组成 - 正向和负向(+DM 和 -DM)定向运动。涡流指示器也由两条线组成 - 正涡流和负涡流(+VI 和 -VI)。这两个技术指标非常相似。方向运动指数使用前一根柱线的极端价格变化(当前高点与前一高点之间的差异以及当前低点与前一低点之间的差异)来构建正负方向移动线。另一方面,涡流指标也使用极端价格变化(当前高点与先前低点之间的差异以及当前低点与先前高点之间的差异)来构建正负涡旋线。

专家建议考虑在正涡 (+VI) 穿过负涡 (-VI) 下方时卖出,表明负价格变化的力量更强。当正涡旋 (+VI) 上穿负涡旋 (-VI) 时,这表明正价格走势的力量更强,技术分析建议在这种情况下考虑买入。

说实话,这些指标(以及之前的赫斯特)使用自然界的规律应用到股票/商品市场,完全忽略了市场是有人参与的,而人的情绪是无法度量的,总之,对这种指标我持保留态度。

WilliamsAD(威廉姆斯累积/分配)

Williams Accumulation /Distribution(简写为WAD) 由 Larry Williams 创建,通过比较正(累积)和负(分布)价格变动来衡量看涨和看跌价格压力的指标。

在技术分析中,WAD用于衡量/比较看涨和看跌的价格压力。根据拉里威廉姆斯的理论,技术分析师应该寻找价格和指标之间的背离。他说:

通常,当价格上涨时,WAD 会上涨 ——积极的价格变动会添加到该指标中。在价格下跌期间,从 WAD 中减去负价格变动,该指标向下移动。然而,由于拉里·威廉姆斯在WAD计算中使用TrueHigh 和TrueLow(前面介绍过这两种指标),可能会出现价格创出新高而 WAD 没有或价格跌至新低和WAD 无法做到这一点。为了更好地了解我们在寻找价格/指标背离时到底有什么,必须更深入地研究 WAD 计算,看看什么样的价格行为可能导致背离以及为什么我们应该将其视为买入/卖出信号,这里就不深入研究了。

此外,该作者还开发另外一个指标WilliamsR。

WilliamsR(威廉姆斯%R)

威廉姆斯 %R 也是由拉里威廉姆斯开发的,是一种用于技术分析的动量技术指标,与随机指标非常相似。与随机指标一样,Williams %R 用于定义超买和超卖水平。0 和负 20 之间的值被认为表示超买状态,而负 80 和负 100 范围内的读数表示超卖状态。随机指标和威廉姆斯 %R 指标之间的区别在于,前者始终为正并在 0 和 100 之间移动,而后者始终为负并在负 100 和 0 之间移动。

与用于定义超买/超卖水平的随机指标和其他技术分析方面一样,超买市场(股票、证券)并不一定意味着买上应该卖出,而超卖市场并不一定意味着马上买入。股票(证券)可能被严重超买并仍然上涨,而强烈超卖的股票可能由于恐慌性抛售而继续下跌。因此有专家建议在威廉姆斯 %R 在低于该水平后(超卖后)移动到负 80 以上时等待买入,并在威廉姆斯 %R 在高于该水平后(在超买后)跌至负 20 以下时等待再卖出. 保守的方法可能是等待威廉姆斯 %R 穿过负 50 以确认趋势反转。

一旦证券变得超买或超卖,交易者应该等待价格反转发生的信号。一种方法可能是等待威廉姆斯 %R 超过或低于 -50 以进行确认。价格反转确认也可以通过其他指标或技术分析方面与威廉姆斯 %R 相结合来获得。

计算比较简单:

威廉姆斯 %R = [(N 个周期内的高点 - 收盘价)/(N 个周期内的高点 - N 个周期内的低点)] * (-100)

代码也很简单:

def __init__(self):
        h = Highest(self.data.high, period=self.p.period)
        l = Lowest(self.data.low, period=self.p.period)
        c = self.data.close

        self.lines.percR = -100.0 * (h - c) / (h - l)

        super(WilliamsR, self).__init__()

至此,Backtrader内置的Indicator就介绍完了。这一章花了很多功夫整理,应该是市面上最全的介绍了。

按道理来说,这么多指标足够使用了,而且你也可以看出,自定义指标也很容易,只要你知道计算公式。但是,你以为这就是Backtrader的极限了,错了,Backtrader还提供了对Ta-lib的支持,Ta-lib是啥?

Ta-lib

TA-Lib金融软件包是目前金融行业最常用的技术指标函数库,其中包含了很多传统金融指标,包括我们前面介绍Backtrader内置的很多指标。

即使backtrader提供了大量的内置指标,并且开发指标主要是定义输入、输出和以简单的方式编写公式的问题,但是有些人还是想使用TA-LIB。一些原因:

为了满足各种口味,Backtrader提供了TA-LIB集成。

安装方法

当然,首先要安装talib python包,国内使用pip install talib好像报错.可以从https://www.lfd.uci.edu/~gohlke/pythonlibs/#ta-lib下载离线安装包,然后 如下命令离线安装:

pip install TA_Lib-0.4.21-cp38-cp38-win_amd64.whl

如何使用Ta-lib

使用Ta-lib很简单,就和使用内置indicator是一样的。比如SMA(简单移动平均),使用内置indicator的代码如下:

        self.sma = bt.indicators.SMA(self.data, period=self.p.period)

如果使用Ta-lib呢?

        self.sma = bt.talib.SMA(self.data, timeperiod=self.p.period)

瞧!多简单!当然,ta-lib 指标的参数是由Talib库本身定义的,而不是由backtrader定义的。例如,ta-lib 中的SMA采用一个名为的timeperiod参数来定义周期的大小。

如果要输入多个参数怎么办呢?比如Stochastic指标:

self.stoc = bt.talib.STOCH(self.data.high, self.data.low, self.data.close,
                                   fastk_period=14, slowk_period=3, slowd_period=3)

可以看出,high,low和close分别需要输入,如果使用内置指标的话,就不用了,Bactrader自己知道需要使用什么数据,而ta-lib必须要指明,如果你输错了,它就算错了,所以你一定要清楚输入的参数。可以看出,内置Indicator更易于使用。

另外,ta-lib的帮助信息也自动添加到Backtrader中,比如你要了解STOCH函数的信息,你可以:

print(bt.talib.STOCH.__doc__)

结果如下:

Stochastic (Momentum Indicators)

Inputs:
prices: [‘high’, ‘low’, ‘close’]
Parameters:
fastk_period: 5
slowk_period: 3
slowk_matype: 0
slowd_period: 3
slowd_matype: 0
Outputs:
slowk
slowd

从中可以看出输入的参数以及顺序,部分参数的缺省值以及输出的line。特别注意的是,通常ta-lib输入的narray结构,我们不需要自己转换,因为backtrader替我们转好了,只需要直接输入Backtrader的数据即可。

有些指标(例如STOCH)可以设置移动均线的类型,Backtrader中可以访问 ta-lib的MA_Type来指定,比如:

print('SMA:', bt.talib.MA_Type.SMA)
print('T3:', bt.talib.MA_Type.T3)

结果是:

SMA: 0
T3: 8

就是说,设置为0,就是简单移动平均。设置为8,就是T3(TRIX,Triple Exponentially Smoothed Average)。

对于绘图功能,在backtrader中,Talib也无需做特殊处理。

总之,就当Talib作为内置的indicator使用就好了。

那么最重要的,内置指标和Talib指标哪个更好,或者说更准确?作者也不服气啊,对于一些关键指标进行对比,对比图发在网站上,结论是差不多。另外,Backtrader很多专业机构在使用,就不用担心其可靠性了。

我的建议是如果需要的指标在内置指标中,就使用内置指标,如果没有,使用Talib。有编程能力的也可自己写,后面我会提供示例。

Ta-lib的函数

Ta-lib是开源软件,可以到官网https://ta-lib.org查看,本章为了方便使用,专门总结下。

在Ta-lib中,函数分为以下类别:

Overlap Studies Functions(重叠研究指标)

函数对应内部指标使用示例代码
BBANDSBollingerBandsupperband, middleband, lowerband = BBANDS(close, timeperiod=5, nbdevup=2, nbdevdn=2, matype=0)
DEMADoubleExponentialMovingAveragereal = DEMA(close, timeperiod=30)
EMAExponentialMovingAveragereal = EMA(close, timeperiod=30)
HT_TRENDLINE无,希尔伯特变换。也是一种趋势指标,其构造原理是仍然对价格收盘价进行平均,并根据计算结果来进行分析,用于判断价格未来走势的变动趋势。real = HT_TRENDLINE(close)
KAMAAdaptiveMovingAveragereal = KAMA(close, timeperiod=30)
MAMovingAverageBase,matype似乎可以指定类型,但是测试后发现没啥变化。real = MA(close, timeperiod=30, matype=0)
MAMA和ZeroLagIndicator类似,都是相同作者提出的,均是对EMA的增强。mama, fama = MAMA(close, fastlimit=0, slowlimit=0)
MAVP可变周期均线。怎么可变呢?就是对于每一个平均值(bar)的计算,可以通过periods参数指定不同的周期。特别注意,periods要和输入的数据close长度一样,这样可以针对每一bar分别基于不同周期计算均值。real = MAVP(close, periods, minperiod=2, maxperiod=30, matype=0)
MIDPOINT周期内的中点,计算方法就是周期内(最高点+最低点)/2,可以通过内置指标计算得出:MIDPOINT =(HIGHEST+LOWEST)/2real = MIDPRICE(high, low, timeperiod=14)
MIDPRICE和上一个指标没看出啥区别real = MIDPRICE(high, low, timeperiod=14)
SARParabolicSARreal = SAR(high, low, acceleration=0, maximum=0)
SAREXT抛物线 SAR的扩展real = SAREXT(high, low, startvalue=0, offsetonreverse=0, accelerationinitlong=0, accelerationlong=0, accelerationmaxlong=0, accelerationinitshort=0, accelerationshort=0, accelerationmaxshort=0)
SMASimpleMovingAveragereal = SMA(close, timeperiod=30)
T3TripleExponentialMovingAveragereal = T3(close, timeperiod=5, vfactor=0)
TEMATRIXreal = TEMA(close, timeperiod=30)
TRIMA三角移动平均线,也是一种加权移动平均线,其中最高权重分配给中间数据。real = TRIMA(close, timeperiod=30)
WMAWeightedMovingAveragereal = WMA(close, timeperiod=30)

Momentum Indicators 动量指标

函数对应内部指标使用示例代码
ADXDirectionalMovementIndex ,其中一个Linereal = ADX(high, low, close, timeperiod=14)
ADXRAverageDirectionalMovementIndexRatingreal = ADXR(high, low, close, timeperiod=14)
APOPriceOscillatorreal = APO(close, fastperiod=12, slowperiod=26, matype=0)
AROONAroonUp 和AroonDownaroondown, aroonup = AROON(high, low, timeperiod=14)
AROONOSCAroonOscillatorreal = AROONOSC(high, low, timeperiod=14)
BOP无,力量平衡(Balance of Power,BOP) 指标。参见Note 1.real = BOP(open, high, low, close)
CCICommodityChannelIndexreal = CCI(high, low, close, timeperiod=14)
CMOChande Momentum Oscillator, 钱德动量摆动指标。参见Note 2real = CMO(close, timeperiod=14)
DXDirectionalMovementIndexreal = DX(high, low, close, timeperiod=14)
MACDMACDmacd, macdsignal, macdhist = MACD(close, fastperiod=12, slowperiod=26, signalperiod=9)
MACDEXT可以指定均线类型。Bactrader的MACD参数也可以指定。macd, macdsignal, macdhist = MACDEXT(close, fastperiod=12, fastmatype=0, slowperiod=26, slowmatype=0, signalperiod=9, signalmatype=0)
MACDFIX修复了啥?不清楚。建议直接用内置的MACD.macd, macdsignal, macdhist = MACDFIX(close, signalperiod=9)
MFIMoney Flow Index 资金流量指标,参见Note 3.real = MFI(high, low, close, volume, timeperiod=14)
MINUS_DIMinusDirectionalIndicatorreal = MINUS_DI(high, low, close, timeperiod=14)
MOMMomentumreal = MOM(close, timeperiod=10)
PLUS_DIPlusDirectionalIndicatorreal = PLUS_DI(high, low, close, timeperiod=14)
PLUS_DMDirectionalMovementreal = PLUS_DM(high, low, timeperiod=14)
PPOPercentagePriceOscillatorreal = PPO(close, fastperiod=12, slowperiod=26, matype=0)
ROCRateOfChange100real = ROC(close, timeperiod=10)
ROCPRateOfChangereal = ROCP(close, timeperiod=10)
ROCR当前价格/前一价格real = ROCR(close, timeperiod=10)
ROCR100当前价格*100/前一价格real = ROCR100(close, timeperiod=10)
RSIRelativeStrengthIndexreal = RSI(close, timeperiod=14)
STOCHStochasticslowk, slowd = STOCH(high, low, close, fastk_period=5, slowk_period=3, slowk_matype=0, slowd_period=3, slowd_matype=0)
STOCHFStochasticFastfastk, fastd = STOCHF(high, low, close, fastk_period=5, fastd_period=3, fastd_matype=0)
STOCHRSI随机 RSI,参见Note 4fastk, fastd = STOCHRSI(close, timeperiod=14, fastk_period=5, fastd_period=3, fastd_matype=0)
TRIXTRIX,前面TEMA是TRIX均线,这里是均线的ROCreal = TRIX(close, timeperiod=30)
ULTOSCUltimateOscillatorreal = ULTOSC(high, low, close, timeperiod1=7, timeperiod2=14, timeperiod3=28)
WILLRWilliamsRreal = WILLR(high, low, close, timeperiod=14)

Note:

  1. 力量平衡(Balance of Power,BOP) 指标由 Igor Livshin 开发,在 2001 年 8 月的《股票和商品杂志》中介绍。BOP通过评估价格被推至极高和极低水平的强度来评估买方与卖方的实力来衡量价格趋势。就其本身而言,力量平衡是一个非常不稳定的指标,并且应用简单移动平均线来平滑它。BOP 在 -1 到 +1 的范围内围绕零中心线振荡。BOP 读数为正表明买方占主导地位,而 BOP 读数为负则表明卖压增强。当 BOP 等于 0 时,表明买家和卖家同样强大。
  2. Chande Momentum Oscillator (CMA) 是由技术分析师 Tushar Chande 开发的,他以RSI (相对强弱指数)计算为基础,采取不一样的计算方法,其计算公式为:CMO = 100 x (Up - Down) / (Up + Down),其中UP指一段时间的正收益之和,Down为一段时间负收益之和。而RSI是一段时间正收益均值和负收益的均值。CMO 指标在负 100 到正 100 的范围内围绕 0振荡。正 CMO 值被视为看涨,负 CMO 值被视为看跌。CMO 指标的超买和超卖水平分别被认为是 +50 和 -50。
  3. MFI(资金流量指数)是一种动量技术指标,在计算和解释上都可以与 RSI(相对强度指数)进行比较。但是 MFI 是基于成交量的指标,它可以在技术分析中用于衡量资金流入和流出证券、指数和市场的强度。MFI计算的原理是“正资金流”与“负资金流”的比值。与 RSI 相同,MFI 范围在 0 到 100 之间。MFI 可用于定义超买/超卖情况,如果 MFI 高于 80 则股票(指数)被视为“超买”,如果 MFI 跌至 20 以下则被视为“超卖” 。MFI是基于价格和数量的技术指标,将其应用于指数可获得最佳效果。该指标可以和基于价格的指标综合使用,完成量价的分析。这个指标非常重要,需要重点关注。
  4. StochRSI 由 Tushar S. Chande 和 Stanley Kroll 开发,并在他们于 1994 年首次出版的“The New Technical Trader,”一书中详细介绍。它将随机震荡指标公式应用于一组相对强度指数 (RSI)值,以定义 RSI 相对于 RSI 最低和最高读数的位置。也即是说它是两个指标的结合。随机RSI显示RSI从顶部 下降多远或从底部上升多远。与RSI 指标类比,根据技术分析规则,随机 RSI 在其交叉点上产生 0.3 和 0.7 水平的信号。因此,当随机 RSI 在高于 0.8 水平后跌至低于 0.8 水平时产生卖出信号,而当随机 RSI 在低于该水平后上升至高于 0.2 水平时产生“买入”信号。

Volume Indicators 成交量指标

函数对应内部指标使用示例代码
ADChaikin A/D Line 累积/分配线,参见Note 1.real = AD(high, low, close, volume)
ADOSC上述A/D的 振荡器real = ADOSC(high, low, close, volume, fastperiod=3, slowperiod=10)
OBV平衡成交量,具体参见Note 2real = OBV(close, volume)

Note:

  1. AD由 Marc Chaikin 开发,也是以他的名字命名。累积(A)/分配(D)概念的基础是,根据收盘价相对于特定时期最高价和最低价的位置,技术人员可以将同一时期的交易量视为累积(正资金流,看涨量)或作为分配(负资金流,看跌量)。如果收盘价在一个周期区间的上半部分,我们就计入A,但如果一只股票收盘在一个周期区间的下半部分,我们就计入D。
  2. 平衡成交量(OBV) 是技术分析中的首要成交量指标之一。由 Joe Granville 于 1963 年引入,它是最常用的分析正负成交量流量的技术指标之一。另外,这个指标受专利保护,不知道现在用会不会要收费。与所有成交量指标一样,“成交量推动市场”的原则是 OBV 指标的核心。通过了解没有成交量就没有价格变动,没有价格变动就没有成交量(建议读读英国安娜·库林的《量价分析》一书》,20 世纪中叶的技术分析已经意识到成交量分析的重要性。OBV可用作确认指标以及预测即将到来的趋势反转的工具。 综合OBV 线和价格 MA (移动平均线) 的技术分析表明,OBV可以 确认上升趋势(就是放量上涨)。同时,价格下跌期间的 OBV 下降将确认下跌趋势(就是缩量下跌)。OBV 走势和价格趋势的背离可用于预测市场趋势的可能变化。价格上涨期间 OBV 下降可能表明新的下降趋势可能开始(缩量上涨),而价格下跌期间 OBV 上升可能表明有可能寻求新的上升趋势(放量下跌)。

特别注意的是,Backtrader中基本没有成交量指标,这一块可由Ta-lib弥补。

Volatility Indicator Functions 波动率指标函数

函数对应内部指标使用示例代码
ATRAverageTrueRangereal = ATR(high, low, close, timeperiod=14)
NATRATR的取值和具体证券相关,不好比较。
NATR进行归一化处理,方便不同资产对比。
real = NATR(high, low, close, timeperiod=14)
TRANGETrueRangereal = TRANGE(high, low, close)

Price Transform 价格指标

函数对应内部指标使用示例代码
AVGPRICE平均价格,计算方法:(Open+High+Low+Close)/4real = AVGPRICE(open, high, low, close)
MEDPRICE中间价格,计算方法:(High+Low)/2real = MEDPRICE(high, low)
TYPPRICE典型价格,计算方法:(High + Low + Close)/3real = TYPPRICE(high, low, close)
WCLPRICE加权收盘价,计算方法:(High+Low+2*Close)/4real = WCLPRICE(high, low, close)

Cycle Indicators 周期指标

这里面提供了5个函数使用希尔伯特变化对close数据进行处理,而希尔伯特变换主要用于信号的处理,这里引入到对证券价格进行分析,具体使用目前不太了解,暂时留存,后续进行复杂数据处理应该有作用。

入参都是close。

Pattern Recognition 形态识别

除了各种指标之外,Ta-lib还提供读图的函数,市面上K线图的各种形态,分别表示不同的含义,很多牛人通过读图进行操作,人送外号技术派。其实这玩意儿我不会用,但是为了介绍的完整性,Ta-lib支持的各种形态识别函数列举如下表所示,供有兴趣的同学研究:

函数含义说明
CDL2CROWSTwo Crows 两只乌鸦三日K线模式,第一天长阳,第二天高开收阴,第三天再次高开继续收阴,收盘比前一日收盘价低,预示股价下跌。
CDL3BLACKCROWSThree Black Crows 三只乌鸦三日K线模式,连续三根阴线,每日收盘价都下跌且接近最低价,每日开盘价都在上根K线实体内,预示股价下跌。
CDL3INSIDEThree Inside Up/Down 三内部上涨和下跌三日K线模式,母子信号+长K线,以三内部上涨为例,K线为阴阳阳,第三天收盘价高于第一天开盘价,第二天K线在第一天K线内部,预示着股价上涨。
CDL3LINESTRIKEThree-Line Strike 三线震荡四日K线模式,前三根阳线,每日收盘价都比前一日高,开盘价在前一日实体内,第四日市场高开,收盘价低于第一日开盘价,预示股价下跌。
CDL3OUTSIDEThree Outside Up/Down 三外部上涨和下跌三日K线模式,与三内部上涨和下跌类似,K线为阴阳阳,但第一日与第二日的K线形态相反,以三外部上涨为例,第一日K线在第二日K线内部,预示着股价上涨。
CDL3STARSINSOUTHThree Stars In The South 南方三星三日K线模式,与大敌当前相反,三日K线皆阴,第一日有长下影线,第二日与第一日类似,K线整体小于第一日,第三日无下影线实体信号,成交价格都在第一日振幅之内,预示下跌趋势反转,股价上升。
CDL3WHITESOLDIERSThree Advancing White Soldiers 三白兵三日K线模式,三日K线皆阳,每日收盘价变高且接近最高价,开盘价在前一日实体上半部,预示股价上升。
CDLABANDONEDBABYAbandoned Baby 弃婴三日K线模式,第二日价格跳空且收十字星(开盘价与收盘价接近,最高价最低价相差不大),预示趋势反转,发生在顶部下跌,底部上涨。
CDLADVANCEBLOCKAdvance Block 大敌当前/推进三日K线模式,三日都收阳,每日收盘价都比前一日高,开盘价都在前一日实体以内,实体变短,上影线变长。
CDLBELTHOLDBelt-hold 捉腰带线两日K线模式,下跌趋势中,第一日阴线,第二日开盘价为最低价,阳线,收盘价接近最高价,预示价格上涨。
CDLBREAKAWAYBreakaway 脱离五日K线模式,以看涨脱离为例,下跌趋势中,第一日长阴线,第二日跳空阴线,延续趋势开始震荡,第五日长阳线,收盘价在第一天收盘价与第二天开盘价之间,预示价格上涨。
CDLCLOSINGMARUBOZUClosing Marubozu 收盘光头光脚一日K线模式,以阳线为例,最低价低于开盘价,收盘价等于最高价,预示着趋势持续。
CDLCONCEALBABYSWALLConcealing Baby Swallow 藏婴吞没四日K线模式,下跌趋势中,前两日阴线无影线,第二日开盘、收盘价皆低于第二日,第三日倒锤头,第四日开盘价高于前一日最高价,收盘价低于前一日最低价,预示着底部反转。
CDLCOUNTERATTACKCounterattack 反击线二日K线模式,与分离线类似。
CDLDARKCLOUDCOVERDark Cloud Cover 乌云盖顶二日K线模式,第一日长阳,第二日开盘价高于前一日最高价,收盘价处于前一日实体中部以下,预示着股价下跌。
CDLDOJIDoji 十字一日K线模式,开盘价与收盘价基本相同。
CDLDOJISTARDoji Star 十字星一日K线模式,开盘价与收盘价基本相同,上下影线不会很长,预示着当前趋势反转。
CDLDRAGONFLYDOJIDragonfly Doji 蜻蜓十字/T形十字一日K线模式,开盘后价格一路走低,之后收复,收盘价与开盘价相同,预示趋势反转
CDLENGULFINGEngulfing Pattern 吞没模式两日K线模式,分多头吞噬和空头吞噬,以多头吞噬为例,第一日为阴线,第二日阳线,第一日的开盘价和收盘价在第二日开盘价收盘价之内,但不能完全相同。
CDLEVENINGDOJISTAREvening Doji Star 黄昏十字星三日K线模式,基本模式为暮星,第二日收盘价和开盘价相同,预示顶部反转。
CDLEVENINGSTAREvening Star 黄昏之星三日K线模式,与晨星相反,上升趋势中,第一日阳线,第二日价格振幅较小,第三日阴线,预示顶部反转。
CDLGAPSIDESIDEWHITEUp/Down-gap side-by-side white lines 向上/下跳空并列阳线二日K线模式,上升趋势向上跳空,下跌趋势向下跳空,第一日与第二日有相同开盘价,实体长度差不多,则趋势持续。
CDLGRAVESTONEDOJIGravestone Doji 墓碑十字/倒T十字一日K线模式,开盘价与收盘价相同,上影线长,无下影线,预示底部反转。
CDLHAMMERHammer 锤头一日K线模式,实体较短,无上影线,下影线大于实体长度两倍,处于下跌趋势底部,预示反转。
CDLHANGINGMANHanging Man 上吊线一日K线模式,形状与锤子类似,处于上升趋势的顶部,预示着趋势反转。
CDLHARAMIHarami Pattern 母子线/阴阳线二日K线模式,分多头母子与空头母子,两者相反,以多头母子为例,在下跌趋势中,第一日K线长阴,第二日开盘价收盘价在第一日价格振幅之内,为阳线,预示趋势反转,股价上升。
CDLHARAMICROSSHarami Cross Pattern 十字孕线二日K线模式,与母子县类似,若第二日K线是十字线,便称为十字孕线,预示着趋势反转。
CDLHIGHWAVEHigh-Wave Candle 风高浪大线/长脚十字线三日K线模式,具有极长的上/下影线与短的实体,预示着趋势反转
CDLHIKKAKEHikkake Pattern 陷阱三日K线模式,与母子类似,第二日价格在前一日实体范围内,第三日收盘价高于前两日,反转失败,趋势继续。
CDLHIKKAKEMODModified Hikkake Pattern 改良的陷阱三日K线模式,与陷阱类似,上升趋势中,第三日跳空高开;下跌趋势中,第三日跳空低开,反转失败,趋势继续。
CDLHOMINGPIGEONHoming Pigeon 家鸽二日K线模式,与母子线类似,不同的的是二日K线颜色相同,第二日最高价、最低价都在第一日实体之内,预示着趋势反转。
CDLIDENTICAL3CROWSIdentical Three Crows 三胞胎乌鸦三日K线模式,上涨趋势中,三日都为阴线,长度大致相等,每日开盘价等于前一日收盘价,收盘价接近当日最低价,预示价格下跌。
CDLINNECKIn-Neck Pattern 颈内线二日K线模式,下跌趋势中,第一日长阴线,第二日开盘价较低,收盘价略高于第一日收盘价,阳线,实体较短,预示着下跌继续。
CDLINVERTEDHAMMERInverted Hammer 倒锤头一日K线模式,上影线较长,长度为实体2倍以上,无下影线,在下跌趋势底部,预示着趋势反转。
CDLKICKINGKicking 反冲形态二日K线模式,与分离线类似,两日K线为秃线,颜色相反,存在跳空缺口。
CDLKICKINGBYLENGTHKicking - bull/bear determined by the longer marubozu 由较长光头光脚决定的反冲形态二日K线模式,与反冲形态类似,较长缺影线决定价格的涨跌。
CDLLADDERBOTTOMLadder Bottom 梯底五日K线模式,下跌趋势中,前三日阴线,开盘价与收盘价皆低于前一日开盘、收盘价,第四日倒锤头,第五日开盘价高于前一日开盘价,阳线,收盘价高于前几日价格振幅,预示着底部反转。
CDLLONGLEGGEDDOJILong Legged Doji 长脚十字一日K线模式,开盘价与收盘价相同居当日价格中部,上下影线长,表达市场不确定性。
CDLLONGLINELong Line Candle 长蜡烛线一日K线模式,K线实体长,无上下影线。
CDLMARUBOZUMarubozu 光头光脚/缺影线一日K线模式,上下两头都没有影线的实体,阴线预示着熊市持续或者牛市反转,阳线相反。
CDLMATCHINGLOWMatching Low 相同低价/匹配低价二日K线模式,下跌趋势中,第一日长阴线,第二日阴线,收盘价与前一日相同,预示底部确认,该价格为支撑位。
CDLMATHOLDMat Hold 铺垫五日K线模式,上涨趋势中,第一日阳线,第二日跳空高开影线,第三、四日短实体影线,第五日阳线,收盘价高于前四日,预示趋势持续。
CDLMORNINGDOJISTARMorning Doji Star 十字晨星/早晨十字星三日K线模式,基本模式为晨星,第二日K线为十字星,预示底部反转。
CDLMORNINGSTARMorning Star 晨星三日K线模式,下跌趋势,第一日阴线,第二日价格振幅较小,第三天阳线,预示底部反转。
CDLONNECKOn-Neck Pattern 颈上线二日K线模式,下跌趋势中,第一日长阴线,第二日开盘价较低,收盘价与前一日最低价相同,阳线,实体较短,预示着延续下跌趋势。
CDLPIERCINGPiercing Pattern 刺透形态两日K线模式,下跌趋势中,第一日阴线,第二日收盘价低于前一日最低价,收盘价处在第一日实体上部,预示着底部反转。
CDLRICKSHAWMANRickshaw Man 黄包车夫一日K线模式,与长腿十字线类似,若实体正好处于价格振幅中点,称为黄包车夫。
CDLRISEFALL3METHODSRising/Falling Three Methods 上升/下降三法五日K线模式,以上升三法为例,上涨趋势中,第一日长阳线,中间三日价格在第一日范围内小幅震荡,第五日长阳线,收盘价高于第一日收盘价,预示股价上升。
CDLSEPARATINGLINESSeparating Lines 分离线/分割线二日K线模式,上涨趋势中,第一日阴线,第二日阳线,第二日开盘价与第一日相同且为最低价,预示着趋势继续。
CDLSHOOTINGSTARShooting Star 射击之星/流星一日K线模式,上影线至少为实体长度两倍,没有下影线,预示着股价下跌
CDLSHORTLINEShort Line Candle 短蜡烛线一日K线模式,实体短,无上下影线。
CDLSPINNINGTOP一日K线,实体小。CDLSPINNINGTOP (Spinning Top 纺锤)
CDLSTALLEDPATTERNStalled Pattern 停顿形态三日K线模式,上涨趋势中,第二日长阳线,第三日开盘于前一日收盘价附近,短阳线,预示着上涨结束。
CDLSTICKSANDWICHStick Sandwich 条形三明治三日K线模式,第一日长阴线,第二日阳线,开盘价高于前一日收盘价,第三日开盘价高于前两日最高价,收盘价于第一日收盘价相同。
CDLTAKURITakuri (Dragonfly Doji with very long lower shadow) 探水竿一日K线模式,大致与蜻蜓十字相同,下影线长度长。
CDLTASUKIGAPTasuki Gap 跳空并列阴阳线三日K线模式,分上涨和下跌,以上升为例,前两日阳线,第二日跳空,第三日阴线,收盘价于缺口中,上升趋势持续。
CDLTHRUSTINGThrusting Pattern 插入形态二日K线模式,与颈上线类似,下跌趋势中,第一日长阴线,第二日开盘价跳空,收盘价略低于前一日实体中部,与颈上线相比实体较长,预示着趋势持续。
CDLTRISTARTristar Pattern 三星形态三日K线模式,由三个十字组成,第二日十字必须高于或者低于第一日和第三日,预示着反转。
CDLUNIQUE3RIVERUnique 3 River 独特三河三日K线模式,下跌趋势中,第一日长阴线,第二日为锤头,最低价创新低,第三日开盘价低于第二日收盘价,收阳线,收盘价不高于第二日收盘价,预示着反转,第二日下影线越长可能性越大。
CDLUPSIDEGAP2CROWSUpside Gap Two Crows 向上跳空的两只乌鸦/双飞乌鸦三日K线模式,第一日阳线,第二日跳空以高于第一日最高价开盘,收阴线,第三日开盘价高于第二日,收阴线,与第一日比仍有缺口。
CDLXSIDEGAP3METHODSUpside/Downside Gap Three Methods 上升/下降跳空三法五日K线模式,以上升跳空三法为例,上涨趋势中,第一日长阳线,第二日短阳线,第三日跳空阳线,第四日阴线,开盘价与收盘价于前两日实体内,第五日长阳线,收盘价高于第一日收盘价,预示股价上

Note:

以上所有函数的输入均为(Open, High, Low, Close),输出只有100,0,-100三个值。这三个值的具体含义,还没弄清楚,后面有时间再研究。

Statistic Functions 统计学指标

Ta-lib还提供金融中通常使用一些统计学函数,主要用于模型的开发和评估,这里只做简单介绍,后续建模会用到,再详细探讨。如下表所示:

函数含义说明
BETA贝塔系数一种风险指数,用来衡量个别股票或股票基金相对于整个股市的价格波动情况。
它所反映的是某一投资对象相对于大盘的表现情况。其绝对值越大,显示其收益变化幅度相对于大盘的变化幅度越大;绝对值越小,显示其变化幅度相对于大盘越小。
至于选择高贝塔还是低贝塔,看你的风险好恶程度。
示例:real = BETA(high, low, timeperiod=5)
CORREL皮尔逊相关系数皮尔逊相关系数用于度量两个变量(X和Y)之间的线性相关程度,其值介于-1与1之间。这种线性相关直观表述就是,随着X增大,Y是否同时增大或者减小;当二者分布在一条直线上时,皮尔逊相关系数等于1(完全相关)或-1(完全负相关); 两个变量之间没有线性关系,皮尔逊相关系数为0.
real = CORREL(high, low, timeperiod=30)
LINEARREG线性回归线性回归是利用数理统计中回归分析,来确定两种或两种以上变量间相互依赖的定量关系的一种统计分析方法,运用十分广泛。
real = LINEARREG(close, timeperiod=14)
LINEARREG_ANGLE线性回归角度同上。
real = LINEARREG_ANGLE(close, timeperiod=14)
LINEARREG_SLOPE线性回归斜率同上。
real = LINEARREG_SLOPE(close, timeperiod=14)
STDDEV标准差等同内置指标StandardDeviation
TSF时间序列预测时间序列分析法是根据过去的变化趋势预测未来的发展,它的前提是假定事物的过去延续到未来。用于对股票等资产价格的预测。试了下,对数据的拟合还挺好的。
real = TSF(close, timeperiod=14)
VAR方差方差用来计算每一个变量(观察值)与总体均数之间的差异。为避免出现离均差总和为零,统计学采用平均离均差平方和来描述变量的变异程度.
real = VAR(close, timeperiod=5, nbdev=1)

Math Transform 数学变换

含义说明
ACOS矢量三角函数反余弦函数
ASIN矢量三角函数反正弦函数
ATAN矢量三角函数反正切函数
CEIL-向上取整数
COS矢量三角函数余弦函数
COSH矢量三角双曲正弦函数
EXP矢量算术指数曲线
FLOOR-向下取整数
LN自然函数自然对数是以常数e为底数的对数,记作lnN(N>0)。
LOG10-对数函数log,以10为底。
SIN矢量三角正弦函数
SINH双曲正弦函数
SQRT平方根非负实数的平方根
TAN矢量三角函数正切函数
TIGHT矢量三角函数双曲正切函数

Note:所有函数输入都是一组数据即可,例如Close。

Math Operators 数学运算符

另外,Ta-lib 还提供了如下数学运算,这个在Backtrader中基本都有:

总结

本文提供了Backtrader中指标的详细描述,包括指标代码实现,具体使用方法,以及自定义指标的开发方法,尤其是对Backtrader中所有指标均进行了介绍,通过这个介绍,大家对量化基金中使用的各种指标(起码覆盖了90%以上的指标)应该有了全局的了解,为后续开发策略奠定基础。同时,我们还对Ta-lib的函数也进行了完整的介绍,并和Backtrader中内置指标进行了关联,方便大家理解各个指标的含义和用法。

下一步,我们继续介绍Backtrader的交易模块,评估模块以及可视化模块,完成这几个模块的学习,才能说基本掌握了这个工具,然后就可以进行策略的开发,交易系统的搭建,一步一步来,不着急。

标签:Indicator,价格,平均线,Backtrader,self,移动,指标,源代码,趋势
来源: https://blog.csdn.net/h00cker/article/details/122642944