¿Qué es una operación comercial en backtrader? Es posible que no lo entienda

1. Información general

En el programa de backtesting de backtrader, cuando el estado de la operación comercial cambia, se activará el método notificar_trade de la estrategia, donde se puede generar la información de la operación comercial, los ejemplos son los siguientes:

Registre los ingresos de la transacción (se puede omitir, el resultado no se emite de forma predeterminada)

def notify_trade(self, trade):       
   
    if trade.isclosed:
        print('毛收益 %0.2f, 扣佣后收益 % 0.2f, 佣金 %.2f' %
              (trade.pnl, trade.pnlcomm, trade.commission))

Si no tiene cuidado, puede asumir que ha entendido el concepto de comercio, pero si lo piensa, ¿realmente lo comprende? ¿Cambia la verificación del estado comercial? ¿Cuántos estados tiene? Qué significa eso? ¡Pronto estarás borroso!

Cuando generalmente compramos y vendemos acciones, solo implicamos la emisión de órdenes a los corredores y no existe el concepto de comercio. No es la próxima orden de compra, es una transacción y la próxima orden de venta representa otra transacción. El concepto de transacción es en realidad el concepto del lado del usuario.

2 Entonces, ¿cómo se define la transacción en backtrader?

Para el uso normal de los fondos propios para comprar acciones y no se puede acortar, cuando una orden hace que la posición cambie de 0 a positiva, se abre una transacción. Después de eso, cuando una orden hace que la posición cambie de positiva a 0, la transacción Cerrar , ambos casos activarán el método notify_trade.

Una transacción puede constar de varios pedidos. Si no puede quedarse corto, por ejemplo, observe el cambio de estado de la transacción, en el siguiente método:

La primera vez que se coloca una orden de compra para comprar 100 acciones. Cuando se ejecuta esta orden, la posición cambia de 0 a un valor positivo (100). El sistema abre una transacción y activa el método notify_trade. Verifique el estado de la transacción en notify_trade , que es 1 abierto.

Luego, coloque la segunda orden de compra por 100 acciones, el notify_trade no se activará cuando se ejecute la orden y la posición se convierte en 200.

Luego, coloque una orden de venta para vender 100 acciones, y el notify_trade aún no se activará y la posición se convertirá en 100.

La siguiente orden de venta vende 100 acciones. Cuando se ejecuta, la posición cambia de 100 a 0, la transacción se cierra, se activanotify_trade y el estado de la transacción es 2 cerrado.

Cuando no es posible la venta en corto, el comando self.close () venderá todas las posiciones al precio de mercado a la vez y cerrará la transacción.

En el caso de las ventas en corto, cuando la posición cambia de 0 a un valor distinto de cero (la posición larga es positiva, la posición corta es negativa), se abre una transacción y, después de eso, la posición cambia de un valor distinto de cero a un valor cero. entonces se cierra la transacción. En una operación de venta corta, self.close () recomprará todas las posiciones cortas al precio de mercado por defecto y cerrará la transacción.

Si una orden cambia una posición de un valor positivo a un valor negativo, o de un valor negativo a un valor positivo, significa dos acciones: una transacción se cierra (la posición cambia de un valor distinto de cero a 0) y una nueva transacción está abierto (la posición cambia de 0 a distinto de cero).

El objeto comercial tiene los siguientes atributos:

El código fuente del libro adjunto tradestatus.py muestra los cambios en el estado de la transacción.Los lectores pueden ejecutar el código fuente por sí mismos para observar los cambios en el estado de la transacción.

3 Uso más avanzado

Podemos usar la variable self.trade para registrar el objeto de transacción en el método notify_trade, y luego usarlo en otros lugares.

  def __init__(self):
    self.trade = None # 定义跟踪交易的变量

# 记录交易收益情况(可省略,默认不输出结果)
def notify_trade(self, trade):
    
    self.trade = trade # 记录交易
    if trade.isclosed:
        print('毛收益 %0.2f, 扣佣后收益 % 0.2f, 佣金 %.2f' %
              (trade.pnl, trade.pnlcomm, trade.commission))

A veces, queremos clasificar las transacciones, por ejemplo, 0 significa comercio de tendencia y 1 significa comercio de reversión. De esta forma, al finalizar el backtest se puede analizar el desempeño de diferentes transacciones. ¿Como hacer esto?

Cuando crea un pedido, puede especificar el tipo de transacción al que pertenece el pedido, como self.buy (tradeid = 1). Esto abre una transacción y establece el tradeid en 1 para indicar una transacción de reversión media, que se puede analizar más tarde.

Para obtener más información, consulte nuestros tutoriales técnicos de backtrader escritos por nosotros.

Supongo que te gusta

Origin blog.csdn.net/qtbgo/article/details/109799469
Recomendado
Clasificación