4.4 Cómo implementar estrategias en Python

El autor:La bondad, Creado: 2019-04-28 16:51:22, Actualizado:

Resumen de las actividades

En el artículo anterior, aprendimos sobre la introducción al lenguaje Python, la sintaxis básica, el marco de la estrategia y más. Aunque el contenido era aburrido, pero es una habilidad imprescindible en el desarrollo de su estrategia comercial.

Introducción a la estrategia

Entre muchas estrategias comerciales, la estrategia de canal Donchian debería ser una de las estrategias de avance más clásicas. Ha sido famosa desde 1970.

Más tarde, en los Estados Unidos, ocurrieron los famosos eventos de capacitación de comerciantes de tortugas, que tuvieron un gran éxito en la historia del comercio de valores.

La estrategia de negociación de avance se adapta a la tendencia relativamente suave de las variedades de negociación. La forma más común de avance es utilizar la relación posicional relativa entre el soporte de precio y la resistencia para determinar la posición de negociación específica.

Reglas de estrategia del canal de Donchian

El canal de Donchian es un indicador orientado a la tendencia, y su apariencia y señal son algo similares al indicador de la banda de Bollinger. Sin embargo, su canal de precios se construye de acuerdo con los precios más altos y más bajos en un determinado período.

img

como se muestra anteriormente: este indicador con la curva compuesta por tres colores diferentes, la configuración predeterminada es el precio más alto y el más bajo en el ciclo 20 para mostrar la volatilidad de los precios.

Si los precios suben por encima del carril superior, aparecerá la señal de compra; a la inversa, si el precio cae por debajo del carril inferior, aparecerá la señal de venta.

Método de cálculo del canal de Donchian

En la plataforma FMZ Quant, el cálculo del canal Donchian es simple, usted sólo puede acceder al precio más alto o más bajo en el ciclo dado, como se muestra a continuación: la 5a línea es obtener el precio más alto de 50 ciclos, la 6a línea es obtener el precio más bajo de 50 ciclos.

def main(): # program entry
    exchange.SetContractType("this_week") # set the variety type by using the weekly k-line 
    while True: # enter the loop
        records = exchange.GetRecords() # get the k line array
        upper = TA.Highest(record, 50, 'high') # get the highest price of 50 cycles
        lower = TA.Lowest(record, 50, 'low') # get the lowest price of 50 cycles
        middle = (upper + lower) / 2 # calculate the average value of upper and lower rails 
        Log("upper rail: ", upper) # print the upper rail value in the log
        Log("lower rail: ", lower) # print the lower rail value in the log
        Log("middle rail: ", middle) # print the middle rail value in the log

Estrategia lógica

Hay muchas maneras de usar el canal de Donchian, que se puede usar solo o en combinación con otros indicadores. En esta sección lo usaremos de la manera más fácil. Es decir: cuando los precios rompen el tren superior, lo que significa que rompen por encima de la línea de presión, el poder adquisitivo es fuerte, se ha formado una ola de energía ascendente, se genera una señal de compra; cuando el precio rompe por debajo del tren inferior, lo que significa que rompe por debajo de la línea de soporte, se genera la señal de venta.

img

Si el precio vuelve a caer al carril medio del canal después de la apertura de la posición larga, creemos que la fuerza del poder de compra se está debilitando, o la fuerza del poder de venta se está fortaleciendo, y se genera la señal de apertura de la posición corta; el mismo principio se aplica a la posición corta de apertura

Condiciones de negociación

  • Posición larga abierta: si no hay posición mantenida y el precio de cierre es mayor que la barrera superior

  • Posición corta abierta: Si no hay posición mantenida y el precio de cierre es inferior al nivel inferior

  • Posición larga de cierre: si se mantiene actualmente una posición larga y el precio de cierre es inferior al precio medio

  • Posición corta de cierre: si se mantiene actualmente una posición corta y el precio de cierre es mayor que el precio medio

Aplicación del código de estrategia

El primer paso en la implementación de la estrategia es obtener los datos primero, porque los datos son un requisito previo parte de la estrategia de comercio.

El siguiente paso es calcular la lógica de negociación basada en estos datos; el paso final es el comercio de acuerdo con la lógica. pasos como sigue:

Paso 1: Utilización de la biblioteca de clases comerciales

Puede pensar en la biblioteca de clase de trading como un módulo funcional. La ventaja de usar una biblioteca de clase de trading es que le permite centrarse en escribir lógica de estrategia. Por ejemplo, cuando usamos la biblioteca de clase de trading, para abrir o cerrar una posición, podemos usar directamente la interfaz API en la biblioteca de clase de trading; pero si no usamos la biblioteca de clase de trading, necesitamos obtener el precio de mercado al abrir la posición. Necesitamos considerar el tema de las órdenes no ejecutadas y el tema de las órdenes de retiro, y así sucesivamente.

def main();
    wile true:
        obj = ext.NewPositionManager() # using the trading class library
        # followed by strategy logic and placing order part

La parte de codificación anterior es el marco de estrategia de CTA utilizando la herramienta FMZ Quant. Este es un formato de codificación fijo, y todo el código de lógica de negociación comenzará en la línea 4.

Paso 2: Obtener todo tipo de datos

Piense en ello, ¿qué tipo de datos necesitamos? desde nuestra lógica de la estrategia de negociación, primero necesitamos obtener el estado de la posición actual, y luego comparar el precio de cierre con el indicador de la banda de Bollinger superior, media e inferior rieles.

  • Obtener datos de la línea K

La primera es obtener la matriz de datos de línea K y el precio de cierre de línea K actual, con la matriz de línea K, podemos calcular el período de ciclo N del precio más alto y más bajo a través de la interfaz API. se puede escribir así:

def main(): # main function
    exchange.SetContractType("this_week") # set the variety type by using the weekly k-line 
    while True: # enter the loop
        records = exchange.GetRecords() # get the k line array
        if len(records) < 50: continue # if the number of K line is less than 50, skip this loop.
        close = records[len(records) - 1].Close # get the closing price of the latest k-line

Como se muestra anteriormente:

Línea 4: Obtener la matriz línea K, que es un formato fijo.

Línea 5: Filtrar la longitud de la línea K, porque el parámetro para calcular el indicador del canal de Donchian es 50, cuando el número de líneas K es menor a 50, es imposible calcularlo.

Línea 6: Utilizamos el código "records[ len (records) - 1] " para obtener los últimos datos de la matriz de la línea K, que es el último dato de la línea K. Estos datos son un objeto, que contiene: el precio de apertura, el precio más alto, más bajo y de cierre, también el volumen de negociación, tiempo y otros datos, ya que es un objeto, por lo que sólo utilizamos .Close para obtener el último precio de cierre de la línea K.

  • Obtener datos de posición

La información de posición es una condición muy importante en la estrategia de negociación cuantitativa. Cuando se establecen las condiciones de negociación, es necesario juzgar si colocar un pedido por el estado de la posición y el número de posiciones. Por ejemplo, cuando se establecen las condiciones para abrir posiciones largas, si hay posiciones de retención, no colocar el pedido; si no hay posición de retención, colocar el pedido. Esta vez encapsulamos directamente la información de posición en una función, simplemente podemos llamar a esta función para usarla. así:

# get the position information function
def mp():
    positions = exchange.GetPosition() # get the holding position array
    if len(position) == 0: # if the holding position array is 0
        return 0 # meaning currently has no position holding, return 0
    for i in range(len(position)): # Traversing the position array
        if (position[i]['Type'] == PD_LONG): 
            return 1 # if there are long position holding, return 1
        elif (position[i]['Type'] == PD_SHORT):
            return -1 # if there are short position holding, return -1
        
def main(): # main function
    exchange.SetContractType("this_week") # set the variety type by using the weekly k-line
    while True: # enter the loop
        records = exchange.GetRecords() # get the k line array
        if len(records) < 50: continue # if the number of K line is less than 50, skip this loop.
        close = records[len(records) - 1].Close # get the closing price of the latest k-line
        position = mp() # get the position information function

Como se muestra anteriormente:

Esta es una función que obtiene la información de posición. Si hay posición larga, el valor es 1; si hay posición corta, el valor es -1; si no hay posición, el valor es 0.

Línea 2: Crear una función con el nombre mp. Esta función no tiene parámetros.

Línea 3: Obtener la matriz de posición, que es un formato fijo.

Línea 4: Determine la longitud de la matriz de posiciones. Si su longitud es igual a 0, significa que no tiene posición de retención, devuelve 0.

Línea 6 : Usando el bucle for, comenzando a atravesar esta matriz, la siguiente lógica es muy simple, si está sosteniendo posición larga, devuelve 1 ; si está sosteniendo posición corta, devuelve -1.

Línea 18: Llamar a la función de información de posición mp.

  • Adquiere el precio más alto y más bajo de las 50 líneas K más recientes

En la herramienta de comercio cuantitativo de FMZ Quant, puede usar directamente las funciones "TA.Highest" y "TA.Lowest" sin tener que escribir sus propios cálculos lógicos. Y la función TA.Highest y TA.Lowest devuelve un resultado de los valores específicos en lugar de una matriz. Esto es muy conveniente. no solo eso, la plataforma FMZ Quant tiene oficialmente incorporadas cientos de otras funciones de indicadores.

# get the position information function
def mp():
    positions = exchange.GetPosition() # get the holding position array
    if len(position) == 0: # if the holding position array is 0
        return 0 # meaning currently has no position holding, return 0
    for i in range(len(position)): # Traversing the position array
        if (position[i]['Type'] == PD_LONG): 
            return 1 # if there are long position holding, return 1
        elif (position[i]['Type'] == PD_SHORT):
            return -1 # if there are short position holding, return -1
        
def main(): # main function
    exchange.SetContractType("this_week") # set the variety type by using the weekly k-line
    while True: # enter the loop
        records = exchange.GetRecords() # get the k line array
        if len(records) < 50: continue # if the number of K line is less than 50, skip this loop.
        close = records[len(records) - 1].Close # get the closing price of the latest k-line
        position = mp() # get the position information function
        upper = TA.Highest(record, 50, 'High') # get the highest price of 50 cycles
        lower = TA.Lowest(record, 50, 'Low') # get the lowest price of 50 cycles
        middle = (upper + lower) / 2 # calculate the average value of the upper and lower rail

Como se muestra anteriormente:

Línea 19: llame a la función TA.Highest para obtener el precio más alto de 50 ciclos

Línea 20: llame a la función TA.Lowest para obtener el precio más bajo de 50 ciclos

Línea 21: calcular el valor medio del carril superior e inferior según el precio más alto y el más bajo de 50 ciclos

Paso 3: Posicionamiento de pedidos y operaciones

Con los datos anteriores, podemos escribir la lógica de negociación y la parte de la orden de colocación ahora. También es muy simple, la más comúnmente utilizada es la declaración if, que se puede describir como: si la condición 1 y la condición 2 son ciertas, coloque el pedido; si la condición 3 o la condición 4 son ciertas, coloque el pedido. Como se muestra a continuación:

# get the position information function
def mp():
    positions = exchange.GetPosition() # get the holding position array
    if len(position) == 0: # if the holding position array is 0
        return 0 # meaning currently has no position holding, return 0
    for i in range(len(position)): # Traversing the position array
        if (position[i]['Type'] == PD_LONG): 
            return 1 # if there are long position holding, return 1
        elif (position[i]['Type'] == PD_SHORT):
            return -1 # if there are short position holding, return -1
        
def main(): # main function
    exchange.SetContractType("this_week") # set the variety type by using the weekly k-line
    while True: # enter the loop
        records = exchange.GetRecords() # get the k line array
        if len(records) < 50: continue # if the number of K line is less than 50, skip this loop.
        close = records[len(records) - 1].Close # get the closing price of the latest k-line
        position = mp() # get the position information function
        upper = TA.Highest(record, 50, 'High') # get the highest price of 50 cycles
        lower = TA.Lowest(record, 50, 'Low') # get the lowest price of 50 cycles
        middle = (upper + lower) / 2 # calculate the average value of the upper and lower rail
        obj = ext.NewPositionManager() # using the trading class library
        if position > 0 and close < middle: # If currently holding long position, and the closing price is less than the middle rail
            obj.CoverAll() # close all position
        if position < 0 and close > middle: # If currently holding short position, and the closing price is greater than the middle rail
            obj.CoverAll() # close all position
        if position == 0: # if currently holding no position
            if close > upper: # if the closing price is greater than the middle rail
                obj.OpenLong("this_week", 1) # open long position
            elif close < lower: # if the closing price is less than the middle rail
                obj.OpenShort("this_week", 1) # open short position

Como se muestra anteriormente:

Línea 22 : Utilizando la biblioteca de clases de negociación, este es un formato fijo

Líneas 23, 24: Esta es una declaración de posición larga de cierre que utiliza los operadores de comparación y operadores lógicos que hemos aprendido antes, lo que significa que si la tenencia actual es una posición larga y el precio de cierre es menor que el medio, cierre todas las posiciones.

Líneas 25, 26: Esta es una declaración de posición corta de cierre que utiliza los operadores de comparación y operadores lógicos que hemos aprendido antes, lo que significa que si la orden actual es una posición corta y el precio de cierre es mayor que la línea media, cierre todas las posiciones.

Línea 27: Determine el estado de la posición actual.

Líneas 28, 29: Determinar si el precio de cierre es mayor que la línea superior. Si el precio de cierre sube por encima de la línea superior, abrir una posición larga.

Líneas 30, 31: Determinar si el precio de cierre es inferior al nivel inferior.

En resumen

En la sección anterior hemos aprendido cada paso para desarrollar una estrategia de trading cuantitativa completa utilizando Python, incluyendo: introducción de estrategia, método de cálculo de canal Donchian, lógica de estrategia, condiciones de trading, implementación de código de estrategia, etc. Esta sección es solo una estrategia simple. Como método de inspiración, hay más de una manera de lograrlo. Puede superponer diferentes métodos de trading de acuerdo con su sistema de trading para formar su propia estrategia de trading cuantitativa.

Notificación de la siguiente sección

En el desarrollo de estrategias de negociación cuantitativas, desde la perspectiva de la velocidad de ejecución del lenguaje de programación, ¿cuál es el más rápido? debe ser el C ++. Especialmente en el campo de los derivados financieros y el comercio de alta frecuencia. El C ++ es único en la especificidad del lenguaje y tiene ventajas en los cálculos numéricos. En comparación con JavaScript y Python, su velocidad se puede aumentar en varios órdenes de magnitud. Si desea ir al campo de los derivados financieros o el comercio de alta frecuencia en el futuro. Este será el curso que no debe perderse.

Ejercicios extraescolares

  1. Comience con lo básico e implemente la estrategia de esta sección.

  2. Trate de añadir un indicador de media móvil a la estrategia de esta sección para reducir la frecuencia de negociación.


Más.