Un artículo sobre el backtrader del marco cuantitativo para comprender el indicador Indicador.

Introducción

La serie anterior de artículos ha introducido los principios y escenarios de aplicación de indicadores técnicos como SMA, EMA, MACD, KDJ, RSI y BOLL. Si aún no lo ha visto, se recomienda seguir la cuenta oficial para comprobarlo. afuera.

El marco Backtrader tiene más de 100 indicadores de análisis técnico integrados, que están encapsulados en el paquete backtrader.indicators, lo que puede reducir en gran medida los costos de desarrollo y aumentar la velocidad de iteración de la estrategia.

Instrucciones

Los indicadores se pueden usar en dos lugares: uno se usa en estrategias; el otro se usa en otros indicadores.

Usar los indicadores integrados en Backtrader es muy fácil, simplemente:

  • Crear una instancia del indicador correspondiente en el método __init__ de la estrategia.

  • Utilice o verifique el valor del indicador correspondiente o su valor derivado en el siguiente método

A continuación se muestra un ejemplo del uso del indicador de media móvil simple SMA.

import backtrader as bt

class MyStrategy(bt.Strategy):
    params = (('period', 20),)

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

    def next(self):
       if self.sma[0] > self.data.close[0]:
           self.buy()

Se debería notar:

  • Cualquier métrica declarada en el método __init__ se calculará antes de llamar al siguiente método.

  • Cualquier operación en el objeto de líneas en el método __init__ generará otros objetos de línea (sobrecarga del operador de Python), mientras que el siguiente método generará tipos de Python regulares, como floats o bools.

  • El método __init__ opera más rápido y simplifica la lógica del siguiente método.

  • El método __init__ no admite algunos operadores de Python y debe procesarse mediante funciones integradas de bt, como bt.And, bt.Or, bt.All, bt.Any. Además de estas, backtrader también proporciona bt.Cmp, bt.If, bt.Max, bt.Min, bt.Sum, bt.DivByZero y otras funciones.

La lista de indicadores nativos soportados por backtrader se puede ver en el sitio web oficial: Indicadores - Referencia - Backtrader

Cabe señalar que el backtrader también admite alias de indicadores, como SMA, que también se puede escribir como MovingAverageSimple o SimpleMovingAverage.

MovingAverageSimple
Alias:

SMA, SimpleMovingAverage
Non-weighted average of the last n periods

Formula:

movav = Sum(data, period) / period

Usando TA-Lib

Aunque Backtrader viene con muchos indicadores, es relativamente fácil agregar nuevos indicadores. Sin embargo, debido a que TA-lib se usa ampliamente, todos confían en él y backtrader también integra TA-Lib.

import backtrader as bt

class MyStrategy(bt.Strategy):
    params = (('period', 20),)

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

Lo anterior es un ejemplo del uso de SMA en talib en backtrader. Se puede ver que el método de uso no es muy diferente.

La documentación de ayuda se puede ver a través de  print(bt.talib.SMA.__doc__) .

>>> print(bt.talib.SMA.__doc__)
SMA([input_arrays], [timeperiod=30])

Simple Moving Average (Overlap Studies)

Inputs:
    price: (any ndarray)
Parameters:
    timeperiod: 30
Outputs:
    real

La lista de indicadores talib soportados por backtrader se puede ver en el sitio web oficial: Indicadores - ta-lib - Referencia - Backtrader

Indicadores personalizados

# 继承自bt.Indicator或其他已存在的指标类
class DummyInd(bt.Indicator):
    # 定义持有的lines,至少需要1个line
    lines = ('dummyline',)
    
    # params参数可选
    params = (('value', 5),)

    # plotinfo可选,用来控制绘图行为
    plotinfo = dict(subplot=False)

    # __init__方法或next方法必选
    def __init__(self):
        self.lines.dummyline = bt.Max(0.0, self.params.value)

En el código de muestra, este indicador generará 0,0 o self.params.value, dependiendo de si self.params.value es mayor que 0,0.

Además de implementarlo en el método __init__, el cálculo del indicador también se puede implementar en el siguiente método, como se muestra a continuación.

    def next(self):
        self.lines.dummyline[0] = max(0.0, self.params.value)

Además de la eficiencia y la legibilidad, cuando se trata del período mínimo de período, el siguiente método debe manejarlo por sí solo y el método __init__ no necesita procesamiento especial. Por lo tanto, la mejor manera es implementarlo en el método __init__, si no se puede implementar, considere implementarlo en el siguiente método. El modo runonce también se puede calcular y optimizar mediante el método once.

Visualización de métricas

Si el programa llama cerebro.plot, entonces

  • Todos los indicadores declarados se trazan automáticamente.

  • El objeto de líneas generado por la operación no se dibujará, comoclose_over_sma = self.data.close > self.sma

  • Si desea dibujar el objeto de líneas generado por la operación, puede usar LinePlotterIndicator la clase.El parámetro de nombre es el nombre de la línea que contiene el indicador.

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

El trazado del indicador se puede controlar mediante la declaración plotinfo. plotinfo puede ser tupla, dict u OrderedDict.

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)

La lista de parámetros de plotinfo es: plot (si se dibuja, el valor predeterminado es True), subplot (si se dibuja en una ventana separada, el valor predeterminado es True, este parámetro es False para los indicadores de clase MA), plotname (el nombre del gráfico del indicador, el valor predeterminado es el nombre de la clase del indicador), plotabove (la posición del gráfico está encima de los datos, el valor predeterminado es False), plotlinelabels, plotymargin, plotyticks, plotlines, plotyhlines, plotforce.

Conclusión y comunicación

Siga la cuenta pública de WeChat: Zhuge Shuo Talk para obtener más contenido. Al mismo tiempo, también puede recibir una invitación para unirse al grupo del seminario de inversión cuantitativa para comunicarse y discutir con muchos profesionales y expertos técnicos. El número de plazas es limitado, así que no se lo pierda.

Escribir artículos no es fácil. Si cree que este artículo le resulta útil, dale el visto bueno y reenvíalo para motivarme a seguir escribiendo buenos artículos.

referencia

Supongo que te gusta

Origin blog.csdn.net/richardzhutalk/article/details/125946226
Recomendado
Clasificación