Backtrader 文档学习-Indicators

Backtrader 文档学习-Indicators

Indicators可以在平台中的两个地方使用:

  • 策略内
  • 指标内

1.指标运行

Indicators在策略中的__init__期间被实例化
Indicators(或派生值)在next中使用
重要的公理需要考虑:
在调用next之前,在__init__中计算声明的任何Indicators(或其派生值)。
下面介绍操作模式的区别。

2. init vs next

工作模式:

  • __init__期间涉及lines对象的任何操作都会生成另一个lines对象
  • next期间任何涉及lines对象的操作都会产生常规的Python类型,比如floats和bools

3.During init

在__init__的例子:

hilo_diff = self.data.high - self.data.low

变量hilo_diff保存对lines对象的引用,该对象在调用next之前已预先计算好,可以使用标准数组符号[]来访问 。
hilo_diff包含了数据载入所有bar的高值-低值之间的差异。
当然也可以混合line ,indicator和close混合计算:

sma = bt.SimpleMovingAverage(self.data.close)
close_sma_diff = self.data.close - sma

close_sma_diff 包括line对象 。
使用逻辑操作符:

close_over_sma = self.data.close > sma

生成的lines对象将包含一组布尔值数组。

4.next方法

逻辑操作符:

close_over_sma = self.data.close > self.sma

指定index,等效逻辑数组:

close_over_sma = self.data.close[0] > self.sma[0]

close_over_sma产生一个boolen,它是比较两个浮点值的结果,两个浮点值是由应用于self.data.close和self.sma的[0]运算符返回的

5.The init vs next

逻辑简化(以及易用性)是关键。计算和大多数相关的逻辑可以在__init__期间声明,在next期间保持实际的操作逻辑最少。
实际上还有一个好处:速度快(即开头解释的预先计算) ,实际上两者区别就是在init中是一次性计算,在next中,是一个bar一个bar计算。
一个完整buy示例:

class MyStrategy(bt.Strategy):

    def __init__(self):
        sma1 = btind.SimpleMovingAverage(self.data) # indicator对象
        ema1 = btind.ExponentialMovingAverage() # indicator对象

        close_over_sma = self.data.close > sma1 # 逻辑值
        close_over_ema = self.data.close > ema1 #逻辑值
        sma_ema_diff = sma1 - ema1 # 浮点值

        # 三个逻辑值与计算
        buy_sig = bt.And(close_over_sma, close_over_ema, sma_ema_diff > 0)

    def next(self):

        if buy_sig:
            self.buy()

说明:

Python的and运算符不能被重写,BT定义自己的And。同样适用于其他结构,如Or和If

6.说明

在上面的例子中,与其他平台相比,BT简化了两件事:

  • 声明的indicator既没有取得父对象参数(如创建它们的策略),也没有调用任何类型的注册方法/函数。 尽管如此,策略还是会启动indicator计算,任何因为操作而产生的lines对象(比如sma - ema)。
  • 正在实例化不带self.data的指数移动平均值 。如果没有传递任何数据,父项的第一个数据(在本例中是正在创建的策略)将在后台自动传递 。

7.indicator绘图

  • 默认自动绘制已声明indicator(如果调用了cerebro.plot)
  • 操作中的Lines对象不会被打印 ,close_over_SMA 是逻辑对象,非indicator对象。

close_over_SMA = self . data . close > self.SMA)

如果需要绘图,辅助的LinePlotterIndicator方法,绘制非indicator操作:

close_over_sma = self.data.close > self.sma
LinePlotterIndicator(close_over_sma, name=‘Close_over_SMA’)

把close_over_sma转化为name是Close_over_SMA的indicator对象,用于绘图。

8.控制绘图

在开发indicator的过程中,可以添加一个plotinfo声明。它可以是一个元组(2个元素)、dict或OrderDict类型。如下:

class MyIndicator(bt.Indicator):

    ....
    plotinfo = dict(subplot=False)
    ....

访问和赋值:

myind = MyIndicator(self.data, someparam=value)
myind.plotinfo.subplot = True

或者在实例化中赋值:

myind = MyIndicator(self.data, someparams=value, subplot=True)

subplot=True将被传递给indicator的实例化成员变量plotinfo。
plotinfo提供了以下参数来控制打印行为:

  • plot (default: True) 是否要绘制指示器
  • subplot (default: True) 是否在不同的窗口中绘制指标。对于移动平均线之类的指标,默认值被改为False
  • plotname (default: ‘’) 设置要在绘图上显示的绘图名称。空值表示指示器的规范名称(类。name)将被使用。有命名限制,因为Python标识符不能使用算术运算符。如命名DI+ ,是不合法的:
class DIPlus(bt.Indicator):
    plotinfo=dict(plotname='DI+')
  • plotabove (default: False) indicator通常绘制在它们所操作的数据下方(子图=True的指标)。将此项设置为True将使indicator绘制在数据上方。
  • plotlinelabels (default: False)
    意为“指标”上的“指标”。如果计算RSI的SMA,绘图通常会显示相应绘图线的名称SMA。是indicator的名称,而不是实际绘制的线,实际绘制的线是RSI的SMA。
    默认行为的意义是因为用户通常希望看到使用RSI创建了一个SMA。
    如果该值设置为True,将使用SMA中的实际名称。
  • plotymargin (default: 0.0)
    indicator顶部和底部的边距量(0.15 -> 15%)。有时matplotlib图离轴的顶部/底部太远,需要控制顶部/底部的边距 。
    -plotyticks (default: [])
    用于控制绘制的y标尺刻度
    如果传递了一个空列表,将自动计算“y刻度”。对于像Stochastic 指标,将其设置为众所周知的行业标准可能是有意义的,比如:[20.0,50.0,80.0]
    指示器提供了参数,如上限和下限,参数实际上用于操作y刻度
  • plothlines (default: [])
    用于控制沿indicator轴绘制水平线。
    如果传递的是空列表,则不会绘制水平线。
    对于像随机指标,为众所周知的行业标准画线可能是有意义的,比如:[20.0,80.0]
    indicator提供参数,例如上带和下带,参数实际上用于控制水平线
  • plotyhlines (default: [])用于使用单个参数同时控制plotyticks和plothlines。
  • plotforce (default: False)如果出于某种原因,需要indicator应该绘图,但它没有绘图,没有设置为真,作为最后的强制绘图手段。
  • 20
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值