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

量化投资之⼯具篇⼀:Backtrader从⼊门到精通(7)-Indicator类源代码解读
(2)
接上⼀篇继续。
系统内置Indicator的介绍
Backtrader提供了很多内置的Indicator,了解这些Indicator对我们⾃定义指标、理解现有指标以及制定策略具有重要作⽤。
基本操作类
Backtrader提供了很多基本操作类,作为定义其他指标的基准。
先看PeriodN,这个类是所有需要使⽤周期进⾏计算指标(例如移动平均)的基类:
class PeriodN(Indicator):
'''
Base class for indicators which take a period (__init__ has to be called
dst指数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((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,第⼆条及其后续均不会计算。下⾯看看如何提供计算,以求⼀段时间的最⼤值为例:
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
关键点:
这⾥定义了highest Line,该line中保存周期内的最⼤值。这⾥解释下什么叫周期内,周期指的是从当前(包括)值往前推n个数据。
缺省值是1,也就是只有⼀个值(当前值)。
然后定义函数为max,那么highest line⾥⾯的保存的是周期类的最⼤值。具体操作请看OperationN next函数,将其中的self.func替代为max。
相同的还有如下计算类指标:
Lowest:周期内最⼩值。
SumN:周期内求和。
AnyN:周期内任意值不等于0,则返回1.
AllN:周期类所有值不等股0,则返回1.
Reduce:可以定义回调函数对周期内的值进⾏累加,直接参见python内置的duce处理。
FindFirstIndexHighest:到周期内最⼤值的索引,注意这个是往前数,0是当前值,1是前⼀个值。
FindFirstIndexLowest:⾛到周期内最⼩值的索引,注意这个是往前数,0是当前值,1是前⼀个值。
FindLastIndex:可以定义⼀个回调函数 _evalfunc,返回周期内和回调函数返回值相同的值的索引。
Accum:周期类数据值的累计。和SumN的差异这个类是可以设定⼀个参数seed,从这个值开始累加。
CointN:协整检验。特别注意下,Backtrader使⽤了python的statsmodels,这个模块提供了许多不同统计模型估计的类和函数,并且可以进⾏统计测试和统计数据的探索。所以如果要进⾏各种统计分析,这个模块必不可少。另外,要了解如何使⽤该模块进⾏指标的定义,可以参见这个类的代码。
OLS_BetaN:简单线性回归,这个也是直接使⽤Pandas的ols函数的指标,主要⽤于预测。
OLS_TransformationN:同上。
OLS_Slope_InterceptN:同上,都是使⽤python函数计算的指标。
均值Indicator基础
学过技术指标的应该都知道均值的作⽤,下⾯介绍均值Indicator使⽤的基本类:
Averages a given data arithmetically over a period
Formula:
- av = data(period) / period
See also:
- /wiki/Arithmetic_mean
'''
alias =('ArithmeticMean','Mean',)
lines =('av',)
def next(self):
self.line[0]= \
math.fsum((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设计⽅法,可以作为范例:
初始化⼀个名为av的Line,然后在next中采⽤fsum计算周期内的所有值之和除以值的个数(period),就得到算数平均值。
或者在once中批量计算这个平均值。
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)的偏差可⽤作看涨和看跌趋势的指标:
当价格⾼于其 KAMA 时,表明看涨趋势;
当价格低于其 KAMA 时,表明看跌趋势。
SmoothedMovingAverage(平滑移动平均)
也叫Modified Moving Average或者Running Moving Average ,它也是⼀种EMA,只不过平滑因⼦计算⽅法不⼀样⽽已。技术交易⼤神Wilder在1978年出版的《技术交易新概念》⼀书中使⽤。
DoubleExponentialMovingAverage(双重指数移动平均)
DEMA⾸次引⼊于1994年,由Patrick G.Mulloy在《股票和⼤宗商品技术分析》杂志上发表的⽂章《⽤更快的移动平均线平滑数据》。DEMA 使⽤两个指数移动平均线(EMA) 来消除滞后。DEMA 的使⽤⽅式与传统移动平均线(MA)类似。当价格⾼于平均值时,平均值有助于确认上升趋势,当价格低于平均值时有助于确认下降趋势。当价格越过平均线时,可能预⽰着趋势的变化。注意以下要点:
双指数移动平均线 (DEMA) 是⼀种⽐正常指数移动平均线 (EMA) 对近期价格变化反应更快的平均线。
DEMA 可以以与其他移动平均线相同的⽅式使⽤,只要交易者了解指标会更快地做出反应,因为它已经被平滑了两次。
较少的滞后并不总是⼀件好事,因为滞后有助于滤除噪⾳(就是价格的波动)。
那么如何是使⽤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⼏乎完全消除了滞后,同时也改善平滑度。既要平滑,⼜要反应快,额,既要…⼜要…。

本文发布于:2024-09-21 22:45:39,感谢您对本站的认可!

本文链接:https://www.17tex.com/tex/3/380287.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:移动   趋势   平均线   价格   指标   计算
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议