tenga el precio de cierre del objeto. Obtener el segundo último elemento de una matriz, que es la longitud de la matriz menos 2 (r[r.longitud - 2]); Los elementos de la matriz de líneas K son todos objetos que contienen el precio de apertura, el precio más alto, el precio más bajo, el precio de cierre, el volumen de operaciones y el tiempo. Para obtener el precio de cierre, simplemente agregue “.” y el nombre del atributo al final (r[r.length - 2].Close)。
Debido a que utilizamos una estrategia intradía, necesitamos cerrar la posición antes del cierre del mercado, por lo que debemos determinar si la línea K actual está cerca del cierre del mercado. Si es así, cerramos la posición. Si no es así podemos abrir la posición. El código es el siguiente:
Figura 4-23
Como se muestra en la figura anterior: Línea 8: Obtenga el atributo de marca de tiempo de la línea K actual y luego cree un objeto de tiempo (new Date(timestamp)). Línea 9: Calcula las horas y los minutos en función del objeto de tiempo y determina si la hora de la línea K es 14:45.
La información de posición es una condición muy importante en las estrategias de trading cuantitativo. Cuando se cumplen las condiciones comerciales, también es necesario determinar si se debe colocar una orden en función del estado de la posición y el número de posiciones. Por ejemplo: cuando se cumplen las condiciones para abrir una posición de compra, si tienes una posición, no necesitas volver a colocar una orden; Si no tienes una posición, puedes realizar un pedido. Así es como se ve en el código:
Figura 4-24
Como se muestra en la figura anterior:
Línea 11: Obtener el estado de la posición actual. Si hay varios pedidos, el valor es 1; si hay órdenes cortas el valor es -1; Si no hay posiciones, el valor es 0.
A continuación, debe calcular los valores de las pistas superior, media e inferior del indicador de bandas de Bollinger. Luego, primero debes obtener la matriz de bandas de Bollinger y luego obtener los valores de las bandas superior, media e inferior de la matriz. En la herramienta cuantitativa Inventor, es muy sencillo obtener la matriz de bandas de Bollinger. Puede llamar directamente a la API de Bandas de Bollinger. La parte difícil es obtener los valores de las pistas superior, media e inferior, porque la matriz de bandas de Bollinger es una matriz bidimensional.
La matriz bidimensional en realidad es muy fácil de entender. Es una matriz dentro de una matriz. Entonces, el orden de adquisición es: primero obtener la matriz especificada en la matriz y luego obtener el elemento especificado de la matriz especificada, como se muestra en la siguiente figura:
Figura 4-25
Como se muestra en la figura a continuación, las líneas 13 a 19 utilizan código para obtener los valores de los rieles superior, medio e inferior de las Bandas de Bollinger. Entre ellos, la línea 13 utiliza directamente la API de la herramienta cuantitativa del inventor para obtener directamente la matriz de bandas de Bollinger; Las líneas 14 a 16 obtienen primero la matriz de riel superior, la matriz de riel medio y la matriz de riel inferior en la matriz bidimensional respectivamente; Las líneas 17 a 19 obtienen los valores del riel superior, riel medio y riel inferior de la Banda de Bollinger de la línea K anterior de la matriz del riel superior, la matriz del riel medio y la matriz del riel inferior respectivamente.
Figura 4-26
Con los datos anteriores, puede escribir la lógica comercial y el código para realizar órdenes. El formato también es muy sencillo. La instrucción más utilizada es la “declaración if”, que se puede describir en palabras como: si se cumplen las condiciones 1 y 2, realizar un pedido; Si se cumple la condición 3 o la condición 4, realice un pedido. Como se muestra en la siguiente figura:
Figura 4-27
En la imagen de arriba, las líneas 21 a 24 son la lógica comercial y los códigos de colocación de órdenes. De arriba a abajo son: cerrado largo, cerrado corto, abierto largo, abierto corto.
Si tomamos como ejemplo la apertura de una posición larga (línea 23), esta es una “declaración if”. Si solo se ejecuta una línea de código en esta declaración, se pueden omitir las llaves “{}”. Esta declaración se traduce al texto como: Si la posición actual es 0, y el precio de cierre es mayor que la pista superior, y la hora de la línea K no es 14:45, entonces “devuelve 1”.
Las personas cuidadosas pueden encontrar que hay “return 1” y “return -1” en estas líneas. Este es un formato fijo, lo que significa: si es una compra, escribe “return 1”; Si es una venta escribe “return -1”. Abrir una posición larga y cerrar una posición corta son ambas compras, así que escribe “return 1”; Abrir una posición corta y cerrar una posición larga son ambas ventas, así que escribe “return -1”.
En este punto, se ha escrito un código de estrategia completo. Si el marco comercial, los datos comerciales, la lógica comercial, la colocación de órdenes, etc. se escribieran por separado, ¿no sería muy simple? El siguiente es el código completo de esta estrategia:
Figura 4-28
Hay dos puntos a tener en cuenta: intentar (pero no necesariamente) escribir la lógica de la estrategia de manera que cuando se cumplan las condiciones de la línea K raíz, se coloquen las órdenes de la siguiente línea K, o cuando se cumplan las condiciones de la línea K anterior, se coloquen las órdenes de la siguiente línea K. De esta manera, los resultados del backtest no serán muy diferentes de los resultados reales. No es necesario escribirlo de esta manera, pero debes prestar atención a si la lógica de la estrategia es correcta. En términos generales, la lógica de cierre de una posición debe escribirse antes de la lógica de apertura de una posición. El propósito de hacer esto es hacer que la lógica de la estrategia sea lo más consistente posible con sus expectativas. Por ejemplo: si la lógica de la estrategia alcanza a la posición inversa, la regla de la posición inversa es cerrar la posición primero y luego abrir una nueva. En lugar de abrir primero una nueva posición y luego cerrarla. Si escribimos la lógica de cierre directamente antes de la lógica de apertura, este problema no ocurrirá.
Arriba, hemos aprendido cada paso del desarrollo de una estrategia completa de trading cuantitativo intradía, incluyendo: introducción a la estrategia, método de cálculo del indicador de Banda de Bollinger, lógica de la estrategia, condiciones de compra y venta, implementación del código de la estrategia, etc. A través de este caso de estrategia, no solo puede familiarizarse con el método de programación de la herramienta cuantitativa del inventor, sino también adaptarlo a diferentes estrategias basadas en esta plantilla.
Las estrategias de trading cuantitativo no son más que resúmenes de experiencias o sistemas de trading subjetivos. Si escribimos las experiencias o sistemas utilizados en el trading subjetivo antes de escribir las estrategias, y luego los traducimos a códigos uno por uno, descubriremos que escribir estrategias será mucho más fácil. ¡Probar!
En el desarrollo de estrategias comerciales cuantitativas, si solo puede elegir un lenguaje de programación, entonces, sin dudarlo, debe elegir Python. Desde la adquisición de datos hasta el backtesting de estrategias y el trading, Python ha cubierto toda la cadena comercial. Ocupa una posición importante en el campo de la inversión cuantitativa financiera. En el próximo curso aprenderemos los conocimientos básicos del lenguaje Python.
En el desarrollo de estrategias comerciales cuantitativas, si solo puede elegir un lenguaje de programación, entonces, sin dudarlo, debe elegir Python. Desde la adquisición de datos hasta el backtesting de estrategias y el trading, Python ha cubierto toda la cadena comercial. Ocupa una posición importante en el campo de la inversión cuantitativa financiera. En este curso aprenderemos los conocimientos básicos del lenguaje Python.
Mirando hacia atrás en los cursos anteriores, hemos aprendido un total de: lenguaje Mai, lenguaje visual, lenguaje JavaScript, incluyendo el lenguaje Python que se aprenderá en esta sección. Algunos amigos pueden tener preguntas. Estoy aquí para aprender trading cuantitativo, ¿por qué tengo que aprender tantos lenguajes de programación?
De hecho, cada lenguaje de programación tiene sus propias características y no hay distinción entre lenguajes buenos y malos. Depende más de qué lenguaje de programación sea más adecuado para su estrategia y si este lenguaje de programación es adecuado para usted. Hay un dicho que dice que sólo puedes saberlo si lo intentas tú mismo. Es por eso que hemos dedicado tanto espacio a hablar sobre lenguajes de programación. Si quieres hacer bien tu trabajo, primero debes afilar tus herramientas.
Al mismo tiempo, también nos comprometemos a abrir la puerta a la investigación cuantitativa para todos y a popularizar el conocimiento de varios lenguajes de programación. La investigación cuantitativa no es tan misteriosa ni está tan fuera de nuestro alcance como imaginamos. Creo que la investigación cuantitativa se volverá popular y accesible para el público general en el futuro.
El proceso de comercio cuantitativo no es más que adquirir datos, analizarlos y calcularlos, procesarlos, etc. En términos de análisis de datos, ningún otro lenguaje puede ser tan bueno en los cálculos y mantener el rendimiento como Python. Especialmente en el procesamiento de datos de análisis de series de tiempo (K-line son datos de series de tiempo), Python tiene la ventaja de ser más simple y más conveniente. Además, en comparación con otros lenguajes de programación, Python es más conciso y fácil de aprender. Leer un buen programa en Python se siente como leer inglés.
Cinco razones para elegir Python
1. La aplicación cuantitativa es extensa:
Tanto Quantopian en Estados Unidos como Inventor Quant en China pueden utilizar el lenguaje Python.
2. Fácil de aprender:
La filosofía de diseño de Python está centrada en el usuario y es un lenguaje interpretado fácil de depurar.
3. Libre y de código abierto:
Sin costo de uso, código fuente abierto compartido y mayor eficiencia de aprendizaje y uso.
4. Biblioteca rica:
Tratamiento de datos, computación de datos, visualización, análisis estadístico, análisis técnico, aprendizaje automático…
5. Interfaz de la aplicación:
Interfaces para adquirir, almacenar, llamar y colocar órdenes basadas en información del mercado en tiempo real de las principales plataformas.
Para ayudarlo a comprender rápidamente el conocimiento clave de esta sección, antes de presentar la introducción rápida del lenguaje JavaScript cuantificado del inventor, primero debe tener una comprensión preliminar de los conceptos de esta sección. Tomemos como ejemplo la estrategia de media móvil doble más simple:
Apertura de posición larga:Si no hay ninguna posición actual y el promedio móvil de 5 períodos es mayor que el promedio móvil de 20 períodos. Abrir una posición corta:Si no hay ninguna posición actual y el promedio móvil de 5 períodos es menor que el promedio móvil de 20 períodos. Cierre de posición larga:Si actualmente mantiene una posición larga y el promedio móvil de 5 períodos es menor que el promedio móvil de 20 períodos. Cierre de posiciones cortas:Si actualmente mantiene una posición corta y el promedio móvil de 5 períodos es mayor que el promedio móvil de 20 períodos.
Si estuviera escrito en Python, se vería así:
Figura 4-29
El código de la figura anterior es una estrategia comercial cuantitativa completa escrita en Python. Puede ejecutarse en tiempo real y realizar pedidos automáticamente. En términos de cantidad de código, Python es más que JavaScript, porque no utilizamos el marco comercial CTA.
Sin embargo, el proceso de diseño de toda la estrategia es casi el mismo: establecer los tipos de mercado, obtener datos de la línea K, obtener información de la posición, calcular la lógica comercial y colocar órdenes de compra y venta. En otras palabras, aunque la sintaxis de programación es diferente, la lógica de estrategia escrita es la misma, así que a continuación, ¡aprendamos la sintaxis básica de Python!
Hay dos versiones de Python, a saber: Python2 y Python3. Una vez hubo un chiste que decía que Python es como un arma de dos cañones, pero solo puedes usar un cañón para disparar balas a la vez, pero nunca sabrás cuál es más preciso. Entonces, si eres nuevo en Python, se recomienda aprender Python 3 directamente porque es la versión más reciente y ha sido mantenida por la comunidad de Python. Nuestros cursos también se imparten en Python 3.
El identificador es el nombre de la variable, como por ejemplo prueba, Test, test10,demo, etc. Todo en Python (variables, nombres de funciones y operadores) distingue entre mayúsculas y minúsculas, lo que significa que el nombre de variable test y el nombre de variable Test son dos variables diferentes. El primer carácter de un identificador (nombre de una variable, función, propiedad, parámetro de función) debe ser una letra, un guión bajo (), los caracteres que le siguen también pueden ser números, como se muestra en la siguiente figura:
Figura 4-30
Un comentario es una traducción o explicación de una línea de código. Las reglas son muy simples e incluyen comentarios de una sola línea y comentarios a nivel de bloque. Un comentario de una sola línea comienza con un signo de almohadilla (#), y un comentario de bloque comienza con tres comillas simples (“‘) o tres comillas dobles (”“”) y termina con tres comillas simples (“’) o tres comillas dobles (”“”), como se muestra en la siguiente figura:
Figura 4-31
La característica más distintiva de Python es el uso de sangría para indicar bloques de código, sin la necesidad de llaves {}. La cantidad de espacios para sangría es variable, pero las declaraciones en el mismo bloque de código deben contener la misma cantidad de espacios para sangría. Como se muestra a continuación: En este caso, el programa informará un error. Incluso si la condición if es verdadera, no se emitirá “True”, porque Python detectará automáticamente si la sintaxis del código es correcta antes de que se ejecute el código. Si el formato del código es incorrecto, el programa no se ejecutará. La razón es que la quinta línea de código no tiene un formato de sangría de código unificado. La sangría de cuatro espacios es un formato fijo para Python y todos deben estar familiarizados con él.
Figura 4-32
Las variables pueden almacenar cualquier tipo de datos. Simplemente escribiendo el nombre de la variable se crea la variable. Sin embargo, al crear una variable, es necesario establecer el valor de la variable al mismo tiempo, de lo contrario, el programa informará un error. El lado izquierdo del operador de signo igual (=) es un nombre de variable, y el lado derecho del operador de signo igual (=) es el valor almacenado en la variable. Como se muestra en la siguiente figura: name2 es el nombre de la variable y “cuantificación del inventor” es el valor de la variable. Si no establece un nuevo valor para name2, el valor de name2 siempre será “cuantificación del inventor”.
Figura 4-33
Python tiene seis tipos de datos, tres de los cuales son inmutables y tres son mutables. Como su nombre lo indica, una vez que se crean datos inmutables, su valor no se puede cambiar y su dirección en la memoria es única; Los datos mutables son una referencia a una dirección en la memoria y, si su valor cambia, su dirección de memoria permanece sin cambios.
Datos inmutables (3): Número, Cadena, Tupla;
Datos mutables (3): Lista, Diccionario, Conjunto.
Figura 4-34
Los tipos numéricos de Python admiten int (entero), float (punto flotante), bool (booleano) y complex (número complejo). La función type() incorporada se puede utilizar para consultar el tipo de objeto al que hace referencia una variable. Como se muestra a continuación:
Figura 4-35
Como la mayoría de los lenguajes, las matemáticas en Python son sencillas. Ya sean operadores aritméticos, operadores de comparación u operadores lógicos, todos son iguales a los que aprendimos en la escuela. Entre ellos, los operadores aritméticos son las operaciones matemáticas de suma, resta, multiplicación y división. Los operadores de comparación pueden comparar si dos valores son menores o menores que. Los principales operadores lógicos son: AND lógico, OR lógico y NOT lógico. [¿Puede hablar brevemente sobre las cadenas comúnmente utilizadas en las estrategias comerciales?] Por ejemplo, en nuestras estrategias comerciales, la cadena más utilizada es el código del producto, como: “rb1910”, “MA1910”.
Figura 4-36
Cabe señalar que “y” es un AND lógico, que significa “y”. “o” es un OR lógico, que significa “cualquiera”. “¡¡ … es una negación lógica, que significa “no”: “y” significa que cuando todas las condiciones son “verdaderas”, la condición final es “verdadera”; “o” significa que entre todas las condiciones, siempre que alguna de ellas sea “verdadera”, la condición final será “verdadera”.
Si hay un 100*Para la expresión (10-1)/(10+5), ¿qué paso calcula primero el programa? Las matemáticas de secundaria nos dicen: ① Si se trata de una operación del mismo nivel, generalmente se calcula de izquierda a derecha. ② Si hay suma y resta, así como multiplicación y división, calcule primero la multiplicación y la división, luego la suma y la resta. ③Si hay paréntesis, calcule primero el contenido de los paréntesis. ④ Si se ajusta a las leyes de operación, estas se pueden utilizar para simplificar el cálculo. La prioridad del idioma Mai es la misma que se muestra a continuación:
Figura 4-37
Booleano representa verdadero o falso y generalmente se utiliza en juicios condicionales y declaraciones de bucle. Python define dos constantes “True” y “False” para representar verdadero y falso. De hecho, cualquier objeto puede convertirse al tipo booleano y también puede usarse directamente para el juicio condicional, como se muestra en la siguiente figura:
Figura 4-38
Las cadenas son texto. Las cadenas, como “if1905”, se utilizan a menudo al configurar códigos de producto. Las cadenas en Python se escriben entre comillas simples (‘) o dobles (’). El signo más + es el operador de concatenación de cadenas. Se puede obtener un carácter en una cadena según el valor del índice, como se muestra a continuación:
Figura 4-39
La lista es el tipo de dato más utilizado en Python. Puedes pensar en una lista como un contenedor, excepto que los elementos del contenedor están organizados en orden de izquierda a derecha. El primer elemento es 0, el segundo elemento es 1, y así sucesivamente. Además, las listas de Python pueden almacenar cualquier tipo de datos, como se muestra a continuación:
Figura 4-40
Las funciones en Python son esencialmente las mismas que las funciones que aprendimos en la escuela secundaria. Puedes pensarlo como lo que se pasa y lo que se emite a través del cálculo de la función, como se muestra en la siguiente figura:
Figura 4-41
Si a menudo aparecen en nuestra vida frases como: Si hoy llueve, sostendré un paraguas. Es decir, la declaración ejecutará el código sólo cuando la condición especificada sea Verdadera. ¡Nota: preste atención al formato de sangría del código, de lo contrario se generará un error de Python! Como se muestra en la siguiente figura:
Figura 4-42
Las declaraciones if…else también son declaraciones de uso común, por ejemplo: Si llueve hoy, sostendré un paraguas; De lo contrario, no sostendré un paraguas. La instrucción else es una extensión de la instrucción if, es decir, el código que sigue a else se ejecutará solo cuando la condición especificada sea Falso. Como se muestra en la siguiente figura:
Figura 4-43
Dado que Python no admite sentencias switch, Python solo puede usar sentencias elif para implementar múltiples juicios condicionales. Por ejemplo: si es una línea positiva, seré alcista; de lo contrario, si es una línea negativa, seré bajista; De lo contrario, esperaré y veré. Como se muestra en la siguiente figura:
Figura 4-44
A veces necesitamos obtener los datos de la línea K de los últimos días y necesitamos obtenerlos de la matriz de la línea K en secuencia de acuerdo con la posición de los datos de la línea K. Entonces es muy conveniente utilizar un bucle for, como se muestra en la siguiente figura:
Figura 4-45
Todos sabemos que el mercado está cambiando constantemente. Si desea obtener la última matriz K-line, debe ejecutar el mismo código una y otra vez. Luego usa el bucle whilex. Mientras la condición especificada sea verdadera, el bucle siempre puede obtener la última matriz de K líneas.
Figura 4-46
El bucle tiene una condición previa. Sólo cuando la condición previa sea “verdadera” el bucle comenzará a hacer algo repetidamente, y el bucle no finalizará hasta que la condición previa sea “falsa”. Sin embargo, la declaración break puede salir inmediatamente del bucle durante la ejecución del mismo; La instrucción continue puede interrumpir un determinado bucle y luego continuar el siguiente. Como se muestra en la siguiente figura:
Figura 4-47
La declaración de retorno finaliza la ejecución de una función y devuelve el valor de la función. La declaración de retorno solo puede aparecer en el cuerpo de una función. Si aparece en cualquier otra parte del código, provocará un error de sintaxis.
Figura 4-48
Puede entender la arquitectura de la estrategia como un formato fijo de la estrategia. La herramienta cuantitativa del inventor adopta un modo de sondeo. La siguiente es una arquitectura clásica de estrategia de futuros de materias primas.
Las líneas 4 a 7 son las funciones de entrada principales de todo el programa, es decir, el ordenador comienza a ejecutar el código desde la línea 4; luego ejecuta directamente la línea 5 y entra en un bucle infinito; luego, la función lógica de estrategia (onTick) y la función de dormir (Sleep) se ejecutan en el bucle infinito; La función onTick es el código en la línea 1, y puedes escribir la lógica de la estrategia en la línea 2; Sabemos que en el bucle, la velocidad de ejecución del programa es muy rápida, por lo que usar la función de suspensión (Sleep) puede pausar el programa por un tiempo. El siguiente código Sleep(500) significa que duerme durante 500 milisegundos cada vez que se completa el bucle.
Figura 4-49
Lo anterior es una introducción rápida al lenguaje Python. Aunque se trata simplemente de un conocimiento básico simple, no supone ningún problema utilizarlo para escribir una estrategia de trading cuantitativa simple. Si necesita escribir estrategias más complejas, puede consultar la documentación de la API del lenguaje Python de la herramienta cuantitativa Inventor.
Entre las estrategias de tendencia en el campo del análisis técnico, la media móvil y la ruptura de canal son sin duda las dos escuelas principales. Aunque el objetivo es capturar la tendencia de los movimientos de precios, las filosofías comerciales y las características de riesgo de estas dos estrategias son completamente diferentes. Después de aprender la introducción al lenguaje Python en esta sección, en la siguiente sección le mostraremos cómo escribir una estrategia comercial cuantitativa para la ruptura del canal.
En el artículo anterior, aprendimos la introducción, la sintaxis básica, el marco de estrategia, etc. del lenguaje Python. Aunque el contenido sea aburrido, es una habilidad esencial para implementar tu estrategia comercial y debes aprenderla. En este artículo, aprovecharemos la oportunidad y continuaremos con los conocimientos básicos de Python del artículo anterior. Comenzaremos con una estrategia simple, aprenderemos mientras la usamos y ayudaremos a todos a realizar una estrategia comercial cuantitativa factible paso a paso.
Entre muchas estrategias comerciales, la estrategia del canal de Donchian debería ser una de las estrategias de ruptura más clásicas. Era conocida ya en 1970. En ese momento, una empresa extranjera realizó pruebas de simulación e investigación sobre las principales estrategias comerciales de programas. Los resultados mostraron que, entre todas las pruebas de estrategia, la estrategia del Canal Donchian fue la más exitosa.
Más tarde, en Estados Unidos tuvo lugar el entrenamiento de comerciante “Tortuga” más famoso de la historia del trading, que tuvo un enorme éxito. En ese momento, los métodos comerciales de las “Tortugas” se mantuvieron en secreto, pero más de diez años después, cuando se hicieron públicas las “Reglas de Comercio de las Tortugas”, la gente descubrió que las “Tortugas” estaban usando una versión mejorada del Canal Donchian. estrategia.
Las estrategias de trading con ruptura son adecuadas para operar con productos con tendencias relativamente suaves. El método de trading con ruptura más común es utilizar la relación de posición relativa entre el precio y los niveles de soporte y resistencia para determinar puntos específicos de compra y venta. La estrategia del Canal Donchian en esta sección se basa en este principio.
El canal de Donchian es un indicador de tendencia, y su apariencia y señales son algo similares al indicador de bandas de Bollinger. Pero el canal de precios de Donchian se construye en base a los precios más altos y más bajos dentro de un cierto período de tiempo. Por ejemplo: calcular el valor máximo del precio más alto de las últimas 50 K líneas para formar la pista superior; calcular el valor mínimo del precio más bajo de las últimas 50 K líneas para formar la pista inferior. Este indicador consta de tres curvas de diferentes colores. El valor predeterminado son los precios más altos y más bajos dentro de 20 períodos para mostrar la volatilidad de los precios del mercado. Cuando el canal es estrecho, significa que la volatilidad del mercado es pequeña. Por el contrario, un canal amplio significa que la volatilidad del mercado es relativamente grande.
Si el precio sube por encima de la pista superior, es una señal de compra; por el contrario, si el precio cae por debajo de la pista inferior, es una señal de venta. Dado que los canales superior e inferior se calculan utilizando los precios más altos y más bajos, en circunstancias normales, los precios rara vez suben y bajan por debajo de las líneas del canal superior e inferior al mismo tiempo. En la mayoría de los casos, los precios se mueven unilateralmente a lo largo de la trayectoria superior o inferior, o entre las trayectorias superior e inferior.
En la herramienta cuantitativa Inventor, el método de cálculo del canal de Donchian es muy simple. Puede usarlo directamente para obtener el precio más alto o el precio más bajo dentro del período especificado, como se muestra en la siguiente figura: la quinta línea es para obtener el valor máximo del precio más alto de 50 períodos y la sexta línea es para obtener el valor mínimo del precio más bajo de 50 períodos.
Figura 4-50
Existen muchas formas de utilizar el canal de Donchian. Se puede utilizar solo o en combinación con otros indicadores. En este curso utilizaremos el método más simple. Es decir, cuando el precio rompe la pista superior de abajo hacia arriba, es decir, rompe la línea de presión superior, creemos que la fuerza alcista se está haciendo más fuerte, se ha formado una ola de mercado ascendente y una señal de apertura de compra. Se genera; cuando el precio cae de arriba a abajo y rompe la pista inferior, es decir, cuando cae por debajo de la línea de soporte, creemos que el lado corto se está fortaleciendo, se ha formado una tendencia bajista y se abre una venta. Se genera la señal.
Figura 4-51
Si el precio vuelve a caer a la pista media del canal de Donchian después de abrir una posición larga, creemos que los alcistas se están debilitando o los bajistas se están fortaleciendo, y se genera una señal de venta; si el precio vuelve a caer a la pista media trayectoria del canal de Donchian después de abrir una posición corta, creemos que los alcistas se están debilitando o los bajistas se están fortaleciendo, y se genera una señal de venta; cuando vuelve a subir a la trayectoria media del canal de Donchian, creemos que La fuerza de los osos se está debilitando, o la fuerza de los alcistas se está fortaleciendo, y se genera una señal de compra para cerrar.
Condiciones comerciales Apertura de posición larga:Si no hay posición y el precio de cierre es mayor que el track superior Abrir una posición corta:Si no hay posición y el precio de cierre es menor que el precio de la pista inferior Cierre de posición larga:Si mantiene una orden larga y el precio de cierre es menor que el precio medio Cierre de posiciones cortas:Si mantiene una orden corta y el precio de cierre es mayor que el precio medio
El primer paso para implementar una estrategia es obtener datos, porque los datos son un prerrequisito para una estrategia comercial. ¿Imagina qué datos necesitamos? ¿Y cómo obtener estos datos? Luego diseñamos la lógica comercial en base a estos datos; Finalmente, colocamos órdenes de compra y venta de acuerdo con la lógica comercial. Los pasos específicos son los siguientes:
Puedes pensar en la biblioteca comercial como un módulo funcional. La ventaja de utilizar la biblioteca comercial es que le permite concentrarse en escribir la lógica de la estrategia. Por ejemplo: cuando utilizamos la biblioteca comercial, al abrir y cerrar posiciones, podemos utilizar directamente la API de órdenes en la biblioteca comercial; pero si no utilizamos la biblioteca de trading, al abrir y cerrar posiciones, necesitamos obtener el precio del mercado, considerar el problema de colocar órdenes pero no ejecutarlas, considerar el problema de cancelar órdenes, etc.
Figura 4-52
La imagen de arriba es el marco de la estrategia CTA utilizando las herramientas cuantitativas del inventor. Este es un formato de código fijo, y todos los códigos de lógica de transacción se escriben a partir de la línea 4. No se requieren modificaciones en ningún otro lugar.
La biblioteca de plantillas de JavaScript está incorporada, Python necesita copiar y guardar esta plantilla: https://www.fmz.com/strategy/24288. Luego haga clic en Referencia en la página de edición de políticas. Por supuesto, también puedes completar la estrategia sin utilizar la biblioteca de plantillas.

Piénsalo detenidamente, ¿qué datos necesitas? A partir de nuestra lógica de estrategia comercial, descubrimos que: primero debemos obtener el estado actual de la posición, luego comparar la relación entre el precio de cierre y las pistas superior, media e inferior del indicador de Banda de Bollinger, y finalmente determinar si el mercado está a punto de cerrar. Así que obtengamos estos datos.
El primer paso es obtener la matriz de la línea K y el precio de cierre actual de la línea K. Sólo con la matriz de K líneas podemos llamar a la API para obtener el precio más alto o más bajo de N períodos. Así es como se ve en el código:
Figura 4-53
Como se muestra en la figura anterior:
Línea 4: obtiene la matriz de K líneas, que tiene un formato fijo.
Línea 5: Filtra la longitud de la línea K. Como calculamos el precio más alto o más bajo de N períodos, el parámetro utilizado es 50. Cuando el número de K líneas es menor que 50, no se puede calcular. Por lo tanto, necesitamos filtrar la longitud de la línea K aquí. Si hay menos de 50 líneas K, omita este bucle y continúe esperando la siguiente línea K.
Línea 6: Usamos el código “records[len(records) - 1]” obtiene primero los últimos datos de la matriz de K-líneas, es decir, los datos más recientes de K-líneas. Estos datos son un objeto que contiene: precio de apertura, precio máximo, precio mínimo, precio de cierre, volumen de operaciones, hora y otros datos. Al ser un objeto, podemos usar directamente “.Close” para obtener el último precio de cierre de K-líneas.
La información de posición es una condición muy importante en las estrategias de trading cuantitativo. Cuando se cumplen las condiciones comerciales, también es necesario determinar si se debe colocar una orden en función del estado de la posición y el número de posiciones. Por ejemplo: cuando se cumplen las condiciones para abrir una posición de compra, si tienes una posición, no necesitas volver a colocar una orden; Si no tienes una posición, puedes realizar un pedido. Esta vez encapsulamos directamente la información de posición en una función, y podemos usarla simplemente llamando a esta función:
Figura 4-54
Como se muestra en la figura anterior: Esta es una función que obtiene información de posición. Si es una posición corta, devuelve 0; si es una posición larga, devuelve 1; Si es una posición corta, devuelve -1. Tenga en cuenta el código de arriba: Línea 2: Crea una función llamada mp, que no tiene parámetros. Línea 3: Obtiene la matriz de posición, que tiene un formato fijo. Línea 4: Determina la longitud de la matriz de posiciones. Si su longitud es igual a , debe ser una posición vacía, por lo que devuelve 0 Línea 6: use un bucle for para comenzar a recorrer la matriz. La siguiente lógica es muy simple. Si mantiene una posición larga, devuelve 1; Si mantiene una posición corta, devuelve -1. Línea 18: Llama a la función mp que acabamos de escribir para obtener la información de posición.
En la herramienta cuantitativa de Inventor, puede obtenerlo directamente utilizando las funciones “TA.Highest” y “TA.Lowest” sin tener que escribir los cálculos lógicos usted mismo. Y los resultados devueltos por las funciones “TA.Highest” y “TA.Lowest” son valores específicos en lugar de matrices. Esto es muy conveniente. No sólo eso, el funcionario ha incorporado cientos de funciones indicadoras.
Figura 4-55
Como se muestra en la figura anterior: Línea 19: Llamar a la función “TA.Highest” para obtener el valor máximo del precio más alto en 50 períodos Línea 20: Llamar a la función “TA.Lowest” para obtener el valor mínimo del precio más bajo en 50 períodos Línea 21: Calcular el valor promedio en base al valor máximo del precio más alto en 50 periodos y el valor mínimo del precio más bajo en 50 periodos
Con los datos anteriores, puede escribir la lógica comercial y el código para realizar órdenes. El formato también es muy sencillo. La instrucción más utilizada es la “declaración if”, que se puede describir en palabras como: si se cumplen las condiciones 1 y 2, realizar un pedido; Si se cumple la condición 3 o la condición 4, realice un pedido.
Figura 4-56
Como se muestra en la figura anterior: Línea 22: Utilice la biblioteca de transacciones, que tiene un formato fijo Líneas 23 y 24: Esta es una declaración para cerrar una posición larga, que utiliza los “operadores de comparación” y los “operadores lógicos” que aprendimos antes. Esto significa que si actualmente mantiene una posición larga y el precio de cierre es menor que el precio medio, se cerrarán todas las posiciones. Líneas 25 y 26: Esta es una declaración para cerrar una orden corta, que utiliza los “operadores de comparación” y los “operadores lógicos” que aprendimos antes. Esto significa que si actualmente mantiene una orden corta y el precio de cierre es mayor que el precio medio, se cerrarán todas las posiciones. Línea 27: Determinar el estado de la posición actual. Si la posición es corta, proceda al siguiente paso. Líneas 28 y 29: Determinar si el precio de cierre es mayor que el límite superior. Si el precio de cierre sube por encima del nivel superior, compre para abrir una posición. Líneas 30 y 31: Determinar si el precio de cierre es menor que el tramo inferior. Si el precio de cierre cae por debajo del nivel inferior, venda y abra una posición.
Arriba, hemos aprendido cada paso del desarrollo de una estrategia comercial cuantitativa completa usando Python, incluyendo: introducción a la estrategia, método de cálculo del canal de Donchian, lógica de la estrategia, condiciones de compra y venta, implementación del código de estrategia, etc. Esta sección es solo una estrategia simple, como punto de partida. Hay más de un método. Puede superponer diferentes métodos comerciales según su propio sistema comercial para formar su propia estrategia comercial cuantitativa.
En el desarrollo de estrategias comerciales cuantitativas, desde la perspectiva de la velocidad de ejecución del lenguaje de programación, si preguntamos qué lenguaje es el más rápido, solo puede ser C++. Especialmente en el campo de los derivados y el comercio de alta frecuencia, C++ tiene una especificidad de lenguaje única y ventajas en los cálculos numéricos. Su velocidad se puede incrementar en varios órdenes de magnitud en comparación con JavaScript y Python. Si quieres desarrollarte en el campo de los derivados y el trading de alta frecuencia en el futuro, este será un curso que no te puedes perder.
El backtesting es la mayor diferencia entre el trading cuantitativo y el trading tradicional. Basándose en datos reales del mercado ocurridos históricamente, simula rápidamente la activación de señales de estrategia y la coincidencia de transacciones para obtener informes de rendimiento y otros datos durante un período de tiempo. Es uno de los componentes más importantes del desarrollo de estrategias para acciones nacionales y extranjeras, futuros de materias primas, divisas y otros mercados.
En los capítulos anteriores, aprendimos los conceptos básicos de los principales lenguajes de programación y le enseñamos cómo utilizar estos conceptos básicos de programación para escribir algunas estrategias comerciales simples. Se puede decir que ya hemos recorrido más de la mitad de la larga marcha. Sin embargo, una vez escrita una estrategia, no se puede poner en práctica directamente. Todavía se requieren pruebas retrospectivas continuas, depuración, pruebas retrospectivas, depuración, y así sucesivamente, hasta que la estrategia pueda implementar completamente el contenido del modelo y funcionar sin problemas.
Desde la perspectiva de la lógica del trading cuantitativo, las estrategias se basan en realidad en una serie de conocimientos y suposiciones sobre el mercado. Las pruebas retrospectivas pueden determinar de manera eficiente si estas suposiciones son válidas y estables. ¿Qué pérdidas podrían ocurrir durante períodos históricamente inestables y cómo ayudar a tomar decisiones para prevenir esas pérdidas?
Además, desde la perspectiva de la operación comercial cuantitativa, el backtesting puede ayudar a detectar errores en la lógica de la estrategia, como funciones futuras, robo de precios, multi-ajuste, etc. Proporciona evidencia confiable de que la estrategia se puede utilizar en el comercio real.
Por lo tanto, la importancia del backtesting es restaurar el proceso comercial real de la forma más realista posible a través de datos históricos, verificar la efectividad de la estrategia, evitar pagar un precio alto por estrategias equivocadas y ayudarnos a detectar, mejorar y optimizar las estrategias comerciales.
Las estrategias comerciales se prueban retrospectivamente basándose en datos históricos estáticos. Los datos de transacciones reales son dinámicos. Por ejemplo: si el precio más alto es mayor que el precio de cierre de ayer, entonces compre para abrir una posición. En el trading real, si la línea K aún no se ha completado, el precio más alto será dinámico y la señal comercial puede oscilar de un lado a otro. Durante las pruebas retrospectivas, el motor de pruebas retrospectivas puede simular transacciones coincidentes basadas en datos históricos estáticos.
La función futura utiliza precios futuros, lo que significa que las condiciones actuales pueden modificarse en el futuro. La función futura también puede provocar que la señal parpadee. Por lo tanto, cualquier función tiene las características de una función futura, como por ejemplo la “función zigzag”.
Como se muestra en la siguiente figura: La función ZigZag indica los puntos de inflexión de los picos y valles. Puede ajustar su valor en consecuencia según el último precio en tiempo real. Sin embargo, si el precio actual cambia, el resultado calculado por la función ZigZag también cambiará. Si se utiliza una función con una función futura, se puede establecer la señal de orden actual y se puede colocar la orden, pero es posible que la señal no se establezca después de un tiempo.
Figura 5-1
El llamado robo de precios se refiere al uso de precios pasados para comerciar. Por ejemplo: si el precio más alto es mayor que un precio fijo, comprar al precio de apertura. Esta condición es robar precios, porque en el mercado real, cuando el precio más alto es mayor que un precio determinado, el precio ya es una cierta distancia más alto que el precio de apertura, y en este momento no se puede comprar al precio de apertura. Pero en el backtest, hay una señal de compra y la transacción se puede completar.
Hay otra situación. Si el precio sube más y se abre más alto que el precio fijo establecido por la estrategia, la transacción se puede completar al precio fijo durante la prueba retrospectiva, pero este precio fijo obviamente no está disponible en el mercado real.
Existen varias situaciones en las que los precios no pueden negociarse: El primero: en el trading real, generalmente no puedes comprar cuando el precio alcanza el límite superior, y viceversa. Sin embargo, es posible realizar operaciones durante el backtest.
El segundo tipo: El mecanismo de emparejamiento de intercambio es: prioridad de precio y prioridad de tiempo. Algunas variedades suelen tener pedidos enormes al precio del mercado. Si realiza una orden de compra o venta durante una negociación real, debe esperar a que el precio del mercado se espese antes de que la transacción pueda completarse, o incluso no pueda completarse. Sin embargo, durante las pruebas retrospectivas, se pueden ejecutar órdenes de compra y venta pendientes.
El tercer tipo: si se trata de una estrategia de arbitraje, entonces el beneficio del backtesting es muy alto, porque cada vez durante el backtesting, se supone que se han aprovechado estas diferencias de precios. En realidad, muchos diferenciales de precios no se pueden aprovechar, o solo se puede aprovechar una pata. En términos generales, la pierna que no es favorable a tu dirección se ejecutará primero, por lo que debes llenar la otra pierna inmediatamente. En este momento, el deslizamiento ya no es de 1 o 2 puntos, y la propia estrategia de arbitraje gana la diferencia de precio de estos pocos puntos. Esta situación no se puede simular mediante backtesting. El beneficio real no es tan bueno como el del backtest.
El cuarto tipo: evento del cisne negro. Como se muestra en el círculo rojo en la figura a continuación, en el evento del cisne negro del tipo de cambio del franco suizo, aunque hay precios de apertura, precios más altos, precios más bajos y precios de cierre en la superficie, de hecho, en las condiciones extremas del mercado del día, el precio en el medio es vacío, una gran cantidad de órdenes de stop loss causaron estampidas, la liquidez era cero y las transacciones eran muy difíciles, pero se podían lograr stop loss en las pruebas retrospectivas.
Figura 5-2
Cada vez que veo la imagen de abajo, pienso: Jajajaja… De la imagen de abajo, se puede ver que un modelo absurdo, siempre que sea lo suficientemente complejo, puede adaptarse perfectamente a los datos.
Figura 5-3
En el caso del trading cuantitativo, el backtesting se basa en datos históricos, pero las muestras de datos históricos son limitadas. Si la estrategia comercial tiene demasiados parámetros o la lógica comercial es demasiado complicada, la estrategia comercial se adaptará demasiado a los datos históricos.
El proceso de modelado de estrategias cuantitativas es esencialmente un proceso de búsqueda de datos locales no aleatorios a partir de una gran cantidad de datos aparentemente aleatorios. Sin la ayuda del conocimiento estadístico, es fácil caer en la trampa del sobreajuste.
Así que no te engañes a ti mismo. Si descubre que los datos fuera de la muestra no funcionan bien y piensa que es una lástima descartar el modelo o no está dispuesto a admitir que su modelo no es bueno y continúa optimizándolo con los datos fuera de la muestra hasta que funcione tan bien con ellos, al final será su dinero duramente ganado el que saldrá perjudicado.
Hay un chiste popular en Wall Street: supongamos que hay 1.000 monos participando en inversiones en el mercado. En el primer año se eliminarán 500 monos que pierdan en el mercado. En el segundo año, la mitad de los monos fueron eliminados nuevamente, quedando 250 monos. Al final del tercer año, quedaban 125 monos.
Figura 5-4
Para el noveno año sólo quedaba un mono. Luego lo miras, a la izquierda y a la derecha, y te parece familiar. Finalmente, cuando vi la portada de una revista financiera, de repente recordé: “Oh, ¿no es este Buffett?”
Por supuesto, esto es sólo una broma, pero ¿alguna vez has pensado que si hay 1.000 gestores de fondos, entonces después de 10 años, alrededor de 10 gestores de fondos superarán al mercado durante 10 años consecutivos? Pero esto puede estar determinado por el azar y la suerte, y no tiene nada que ver con las habilidades de los administradores de los fondos.
Al igual que el rendimiento de la prueba retrospectiva en el lado izquierdo de la imagen a continuación, creo que la mayoría de los inversores quedarán sorprendidos. Esta estrategia de inversión ha tenido un rendimiento muy sólido y casi no ha presentado caídas significativas.
Figura 5-5
Espera un minuto, como se muestra en la imagen de la derecha, la situación real está en el interior. Resulta que la curva de backtest de la izquierda es simplemente la de mejor rendimiento entre muchas pruebas retrospectivas. Es decir, en el backtest de la izquierda hay muchas situaciones con un rendimiento aún peor.