Un artículo sobre el backtrader del marco cuantitativo para comprender al observador.

Introducción

El observador Backtrader se utiliza principalmente para observar varios indicadores de estado durante la operación de la estrategia, como fondos, puntos de compra y venta, etc. Después de llamar a cerebro.plot(), puede visualizar fácilmente los cambios en los indicadores de estado, como se muestra en La siguiente figura puede utilizar los tres observadores de Broker, Trades y BuySell para ver los cambios en el efectivo y la capitalización de mercado, las ganancias y pérdidas comerciales y los puntos de compra y venta durante el proceso de backtesting.

Instrucciones

  1. Agregar observador a través de cerebro.addobserver()

import backtrader as bt
# 查看收益序列
cerebro.addobserver(bt.observers.TimeReturn)
# 查看回撤序列
cerebro.addobserver(bt.observers.DrawDown)
  • addobserver (obscls,  args, **kwargs): el parámetro obscls corresponde al observador observador, args, **kwargs corresponde a los parámetros admitidos por el observador

cerebro = bt.Cerebro(stdstats=False)
cerebro.addobserver(bt.observers.Broker)
cerebro.addobserver(bt.observers.Trades)
cerebro.addobserver(bt.observers.BuySell)
  • Cerebro agregará observadores Broker (Cash & Value), Trades y BuySell 3 de forma predeterminada (stdstats=True). Puede controlar la visualización no predeterminada a través de bt.Cerebro(stdstats=False) al crear una instancia de cerebro.

  1. observadores tiempo de ejecución del observador: los observadores ejecutan y recopilan datos después de que se ejecutan todos los indicadores y el siguiente método de la estrategia. Por lo tanto, los últimos datos del observador [0] leídos en el siguiente método de la estrategia son posteriores a la hora actual del siguiente. un bar

  2. Cómo leer datos del observador

  • Los observadores pertenecen al objeto de líneas, que almacena datos históricos de backtest y puede operarse como el objeto de líneas de mercado. Se puede acceder a los observadores a través del atributo de política self.stats

class MyStrategy(bt.Strategy):
    def next(self):
        # 当前时点的前一天的可用现金
        self.stats.broker.cash[0]
        self.stats.broker.value[0]
        # 获取当前时刻前一天的收益
        self.stats.timereturn.line[0]
  1. Cómo guardar datos en el observador

Actualmente, Backtrader no tiene un mecanismo para guardar directamente los datos del observador en archivos y debemos implementarlo nosotros mismos. El método de implementación recomendado por backtrader es:

  • Abra el archivo en el método de inicio de la política.

  • Escriba los valores correspondientes en los métodos next y stop de la política.

Tomando el modo de observador DrawDown como ejemplo, el código de muestra es el siguiente:

class MyStrategy(bt.Strategy):

    def start(self):

        self.mystats = open('mystats.csv', 'wb')
        self.mystats.write('datetime,drawdown, maxdrawdown\n')

    def next(self):
        self.mystats.write(self.data.datetime.date(-1).strftime('%Y-%m-%d'))
        self.mystats.write(',%.2f' % self.stats.drawdown.drawdown[0])
        self.mystats.write(',%.2f' % self.stats.drawdown.maxdrawdown[0])
        self.mystats.write('\n')

    def stop(self):
        self.mystats.write(self.data.datetime.date(0).strftime('%Y-%m-%d'))
        self.mystats.write(',%.2f' % self.stats.drawdown.drawdown[0])
        self.mystats.write(',%.2f' % self.stats.drawdown.maxdrawdown[0])
        self.mystats.write('\n')

El observador que viene con el backtrader.

Los observadores integrados incluyen:

  • Punto de referencia: registra la secuencia de retorno del punto de referencia de rendimiento. Los datos del punto de referencia de rendimiento deben agregarse al cerebro de antemano mediante adddata, resampledata, replaydata y otras funciones de adición. Durante la visualización, la secuencia de retorno de la estrategia en sí y la curva de retorno de el punto de referencia de desempeño se establecerá al mismo tiempo.

  • Corredor, Efectivo, Valor:  El observador del Corredor registra los fondos disponibles y los activos totales del corredor en cada momento. Las curvas de efectivo y valores se mostrarán simultáneamente durante la visualización; si desea mostrar efectivo y valores por separado , puedes llamar a backtrader.observers respectivamente. .Cash y backtrader.observers.Value

  • BuySell: registra las señales de compra y venta durante el proceso de backtesting y marcará los puntos de compra y venta en la curva de precios durante la visualización.

  • DrawDown: registra la secuencia de retroceso del proceso de backtesting y dibuja la curva de retroceso durante la visualización.

  • TimeReturn:  registra la secuencia de retorno durante el proceso de backtesting, y la curva de retorno TimeReturn se dibujará durante la visualización.

  • Operaciones:  registra las pérdidas y ganancias de cada transacción durante el proceso de prueba retrospectiva y extrae los puntos de pérdidas y ganancias durante la visualización.

  • LogReturns: registra los retornos de registro de la estrategia

  • LogReturns2: LogReturns extendidos para admitir 2 datos, datos0 y datos1

  • FundValue: registra el valor del fondo durante el proceso de backtesting

  • FundShares: registra las acciones del fondo durante el proceso de backtesting.

Entre ellos, los observadores de uso común incluyen: Broker, BuySell, Trades, TimeReturn, DrawDown, Benchmark, etc.

Crear nuevos observadores

El observador Broker tiene 2 líneas de objetos: efectivo y valor. Su implementación es similar a la siguiente:

class Broker(Observer):
    alias = ('CashValue',)
    lines = ('cash', 'value')

    plotinfo = dict(plot=True, subplot=True)

    def next(self):
        self.lines.cash[0] = self._owner.broker.getcash()
        self.lines.value[0] = value = self._owner.broker.getvalue()

Como puede verse, los pasos para personalizar el observador son los siguientes:

  • Los observadores personalizados heredan de bt.observer.Observer; también pueden heredar de otros observadores existentes.

  • Declare las líneas y parámetros requeridos. Los parámetros son opcionales. Almacene los datos correspondientes en el siguiente método.

  • Declare los atributos plotinfo y plotlines para su visualización en cerebro.plot()

  • Hay un atributo automático _propietario que indica la estrategia de retención del observador.

Además, podemos personalizar OrderObserver (consulte el sitio web oficial): el observador estándar de BuySell solo se preocupa por las operaciones que se han realizado. Podemos crear un observador para ver el estado de creación y vencimiento de la orden, como se muestra a continuación.

class OrderObserver(bt.observer.Observer):
    lines = ('created', 'expired',)

    plotinfo = dict(plot=True, subplot=True, plotlinelabels=True)

    plotlines = dict(
        created=dict(marker='*', markersize=8.0, color='lime', fillstyle='full'),
        expired=dict(marker='s', markersize=8.0, color='red', fillstyle='full')
    )

    def next(self):
        for order in self._owner._orderspending:
            if order.data is not self.data:
                continue

            if not order.isbuy():
                continue

            # Only interested in "buy" orders, because the sell orders
            # in the strategy are Market orders and will be immediately
            # executed

            if order.status in [bt.Order.Accepted, bt.Order.Submitted]:
                self.lines.created[0] = order.created.price

            elif order.status in [bt.Order.Expired]:
                self.lines.expired[0] = order.created.price

Por supuesto, también podemos heredar el código de referencia de otros observadores existentes:

class MyBuySell(bt.observers.BuySell):
    # 将barplot默认值改为True
    params = (('barplot', True), ('bardist', 0.015))
    # 将三角形改为箭头
    plotlines = dict(
        buy=dict(marker=r'$\Uparrow$', markersize=8.0, color='#d62728' ),
        sell=dict(marker=r'$\Downarrow$', markersize=8.0, color='red')
    )

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 invitaciones para unirse a grupos de intercambio de inversiones y grupos de seminarios de inversión cuantitativa, donde podrá comunicarse y discutir con muchos entusiastas de las inversiones, profesionales cuantitativos y expertos en tecnología, y mejorar rápidamente su nivel de inversión.

Escribir artículos no es fácil, si cree que este artículo le resulta útil, haga clic y léalo.

referencia

Supongo que te gusta

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