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
-
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.
-
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
-
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]
-
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.