Aprendizaje automático en el trading: teoría, práctica, operaciones y más - página 78

 
Mihail Marchukajtes:
No, chicos, el sistema ha desaparecido, ni siquiera tiene sentido mostrarlo.

¿Será porque se me olvidó advertir que el clasificador ternario ha cambiado su lógica?

El binario tiene la misma lógica: si el valor de salida es menor que cero, es como un 0 en la muestra. Si es más, es 1 en la muestra.

Y ternario si la salida es: 1 como 1 en la muestra, 0 como 0 en la muestra, -1 como "-" en jPredicción.

 


realizó por interés un comité de 8 modelos y simuló en la validación una secuencia de 4000 operaciones (5,5 años de negociación). Se trata de una simulación de Montecarlo para hacerse una idea del posible alcance del crecimiento de los depósitos, sin ajustar los puntos iniciales de las operaciones (lo que da lugar a una ejecución en el probador de estrategias). Aquí la MO en la validación es de 0,00026 pips. El cuantil inferior está obviamente por encima de cero, que es lo que quería obtener.

A continuación, analizaremos la distribución del factor de recuperación de estas series.

Esta es la distribución del factor de recuperación. La mediana de 3,7 es una especie de valor objetivo (plan). El cuantil inferior tampoco está mal...

Todavía tenemos que esperar a que se realice una prueba de formación con 80 muestras más de formación y hacer un comité más grande.

 
Yury Reshetov:

¿Será porque me olvidé de avisar que el clasificador ternario ha cambiado su lógica?

El binario tiene la misma lógica: si el valor de salida es menor que cero, es como un 0 en la muestra. Si es más, es 1 en la muestra.

Y ternario si la salida es: 1 como 1 en la muestra, 0 como 0 en la muestra, -1 como "-" en jPredicción.

ҮNo lo entiendo, está bien con eso.... Hay otra cosa aquí. La cuestión es que el optimizador es muy bueno para encontrar datos que contengan información de salida. Una vez que los datos se encuentran con una generalización superior al 80%. Estos datos pueden utilizarse con éxito en cualquier otra topología de red y el resultado del entrenamiento será perfecto, sin necesidad de reentrenamiento, etc. Esto es para aquellos que no quieren utilizar el optimizador directamente en el comercio. En mi caso resultó que los datos utilizados para la clasificación de la salida no fueron del todo acertados, por lo que los resultados de las operaciones del viernes no fueron los deseados. Sin embargo, no me desanimé y encontré otro conjunto de predicados que, cuando se construyen repetidamente, no conducen a un estado de basura en la entrada y la salida....... de todos modos aquí hay algunas recomendaciones para utilizar el clasificador como un filtro de señal inteligente para su TS (no el pronóstico)

1. Separe las señales de compra y venta por separado. Si se utilizan datos de valores anteriores y dicha separación confunde el orden de los datos, entonces necesariamente uno de los predicados debe ser el signo de la señal. Compra=1, Venta=-1, es decir, uno de los predicados será la dirección de la señal.

2. Los predicados deben estar relacionados de alguna manera con el sistema de predicción. Lo tengo como Zscore de la señal, Kelli de la señal, orden de la señal (el sistema no es reversible, por lo que puede haber varias señales consecutivas en una dirección). Básicamente, la información que de alguna manera se relaciona con el sistema. Usted puede incluso tomar el Momentum, por separado en el optimizador MT4 he seleccionado un parámetro que hace un beneficio en un período de prueba cuando el comercio por las señales del sistema. Es decir, el impulso está optimizado para las señales del sistema en la zona de entrenamiento, etc.

3. Salir. Esta es la parte más importante, ya que tenía salida de 100 pips de beneficio daba el 50% de la generalización, y lo cambié a 10 pips y la generalización creció al 65%. En el TS de Demark es bastante difícil de hacer. A menudo tengo que mirarlo manualmente, porque la formalización del enfoque en este caso no pasa........ En el área de entrenamiento es mejor cometer errores en las señales, pero aún así obtener un modelo con un alto nivel de generalización. Digamos que, la señal ganó 100 pips en la formación y aún así la marcamos como 0 porque el mercado era propenso al reverso de la señal. Es decir, dejamos que la ST pierda deliberadamente para aumentar el nivel de generalización y así hacer que la ST funcione mejor en el futuro. Después de todo nuestra salida es ideal, que sea un poco no ideal, pero correcto....

4) Utilizar los volúmenes de negociación de la CME en las predicciones. Esto realmente funciona y aumenta el nivel de generalización del modelo SIGNIFICATIVAMENTE...... Tomo del grupo delta, así que es como esto.....

 
Alexey Burnakov:

Se trata de una simulación de Montecarlo para hacerse una idea del posible rango de crecimiento de los depósitos, sin ajustar los puntos iniciales de las operaciones (lo que da lugar a una ejecución en el probador de estrategias).

Espero que, independientemente de cómo se muevan los puntos de partida de los oficios, todos sean posteriores al periodo de formación. Por ejemplo, si entrenó el modelo con datos de enero y marzo de 2015 (eliminando los datos de febrero), entonces no debería hacer la validación final en febrero, aunque estos datos no estuvieran en la muestra de entrenamiento, pero tales resultados no serán fiables. La validación sólo mostrará los resultados adecuados esperados en el comercio real si se inicia en abril de 2015, después de todas las fechas que podría haber utilizado el modelo en el entrenamiento o en las validaciones cruzadas para ajustar los parámetros del modelo.

Mi segundo intento (regresión redondeada a [0;0,5;1]) con sus datos no tuvo éxito. El modelo y la genética volvieron a elegir la opción de clase constante "sin comercio".
Aparentemente, para predecir tres clases la neurona debe tener necesariamente 3 salidas, de lo contrario no puede encajar tres clases en una salida con niveles. O tenía que eliminar la clase "no comerciar" y dejar dos clases y trabajar con ellas.

Para comprobar de alguna manera algo en el fronttest tomé una lista de predictores seleccionados por la genética, entrené una neurona sobre ellos (todo correcto, con tres salidas y con factor en la entrada) mediante caret con validaciones cruzadas (método = "repeatedcv"). El resultado fue mediocre, la precisión, incluso en los datos de entrenamiento, es sólo del 40%.
Acabo de darme cuenta de que el archivo de validación tiene números reales en sus salidas, no clases. Acabo de sustituirlos por +1 para todos los positivos y -1 para todos los negativos.
Además, obtuve dos precisiones para la prueba frontal:
1) dado que en la predicción=0 el modelo no debe operar, entonces el resultado correcto es irrelevante, porque la operación no se abrirá y no afectará a las estadísticas finales. En ese caso, las predicciones -1 y 1 son correctas el 51% de las veces (ignorando todos los ejemplos en los que la predicción=0).
2) Tomar todas las predicciones, comparar con todos los resultados correctos. En ese caso la precisión = 14%, incluso peor que la aleatoria.

Me pregunto cuál será el resultado del modelo de comercio en su emulador de comercio, ¿podría por favor hacer un gráfico como el anterior, pero el comercio con el modelo que he adjuntado?
El archivo RData era demasiado grande y el foro no lo aceptó inmediatamente. Hice dos archivos vinrar y los puse por separado en archivos zip. Tienes que extraer ambos archivos comprimidos, luego abrir el primer archivo comprimido, extraer los datos, el segundo archivo comprimido se conectará por sí mismo y lo más importante es que deben estar en la misma carpeta.
O puede ejecutar el script r adjunto, que contiene una lista de predictores seleccionados, y generará un modelo con ellos. Deberías tener el archivo csv original que publicaste, se utiliza.
El mismo script también puede ser ejecutado después de abrir RData desde el atachment, el script tomará el modelo listo en lugar de crear uno nuevo, hay un ejemplo de predicción y estimación de precisión en el código. El archivo RData que publicaste antes es necesario para el fronttest.

Teniendo en cuenta los errores del pasado, estoy empezando mi tercer intento.

 
Dr.Trader:

1) considerando que en predicción=0 el modelo no debe operar, entonces el resultado correcto no importa, porque la operación no se abrirá y no afectará a las estadísticas finales. En este caso, las predicciones -1 y 1 son correctas en el 51% de los casos (ignorando todos los ejemplos en los que la predicción=0).

Por una respuesta incorrecta daría -2 puntos, por no responder -1, por una respuesta correcta 1. La proporción de puntos que se otorga a las respuestas puede cambiarse en un sentido o en otro, pero es importante que la red no se estropee innecesariamente, por lo que debe penalizar la "abstención".

El comité de dos redes dio cada una 1 señal, -1 (o 0) ninguna señal, si las señales eran contradictorias la señal final era 0. Así que las señales de las redes se combinaron en una señal total de [-1, 0, 1].

 

Dr.Trader:

Espero que, independientemente de cómo se muevan los puntos de partida de los oficios, todos sean posteriores al periodo de formación. Por ejemplo, si entrenó el modelo con datos de enero y marzo de 2015 (eliminando los datos de febrero), entonces no debería hacer la validación final en febrero, aunque estos datos no estuvieran en la muestra de entrenamiento, pero tales resultados no serán fiables. La validación sólo mostrará los resultados adecuados esperados en el comercio real si se inicia en abril de 2015, después de todas las fechas que podría haber utilizado el modelo en el entrenamiento o en las validaciones cruzadas para ajustar los parámetros del modelo.


Sí, por supuesto, puedes ser férreo. Es exactamente la validación. Lo que ocurre es que las secuencias de transacciones se muestrean aleatoriamente a partir de un gran volumen de observaciones. Se necesita el método Monte Carlo para entender dónde puede estar la curva comercial. Cualquier desplazamiento de las operaciones por unos minutos en una dirección u otra genera sus propias curvas. En el probador de MT veo una curva - una implementación. Si construyo una condición con un generador de números aleatorios en cada operación y abro con un número aleatorio, puedo ejecutar el probador de estrategias 500 veces y obtener las mismas curvas. Pero en MT tardaría mucho tiempo. Y lo necesito en 30 segundos.

Luego, cuando haga el EA en la comisión, ejecutaré la validación en el probador de estrategias. La curva debe encajar en un abanico y obtendré un valor único de factor de recuperación y una expectativa matemática. Pero no se pueden sacar conclusiones de una sola carrera. No es deseable.

 
Dr.Trader:


Me pregunto cuál será el resultado de operar con el modelo en su emulador de operaciones, ¿podría hacer un gráfico como el anterior, pero operando con el modelo que he adjuntado?
El archivo RData es demasiado grande y el foro no lo aceptó de inmediato. Hice dos archivos vinrar y los puse por separado en archivos zip. Tienes que extraer ambos archivos comprimidos, luego abrir el primer archivo comprimido, extraer los datos, el segundo archivo comprimido se conectará por sí mismo y lo más importante es que deben estar en la misma carpeta.
O puede ejecutar el script r adjunto, que contiene una lista de predictores seleccionados, y generará un modelo con ellos. Deberías tener el archivo csv original que publicaste, se utiliza.
El mismo script también puede ser ejecutado después de abrir RData desde el atachment, el script tomará el modelo listo en lugar de crear uno nuevo, hay un ejemplo de predicción y estimación de precisión en el código. El archivo RData que publicaste antes es necesario para el fronttest.

Teniendo en cuenta los errores del pasado, estoy empezando un tercer intento.

¿Qué modelo estás aprendiendo, la Red Neural?

Déjame intentarlo más tarde. Tengo un modelo que aprende en todos los núcleos las 24 horas del día.

En realidad, pensé que tú serías el juez de eso. Sólo hay que sustituir las predicciones del modelo en el archivo de validación que he dado en el enlace. Estas deben ser direcciones de la forma +1 / -1 / 0. Habrá una nueva columna de predicción. Multiplica la columna de predicción por la columna de destino. Reste 0,0001 de dispersión. Elimina las entradas en las que la salida del modelo es 0. Toma la función cumsum:

plot(cumsum(your_data$trades_simulated_after_spread), type = 'l')

 mean(your_data$trades_simulated_after_spread)

De forma aproximada, esto graficará el comercio sobre todas las observaciones y calculará la MO. Es muy sencillo.

 
Alexey Burnakov:

¿Y qué modelo está aprendiendo, la red neuronal?

...

Multiplica la columna de predicción por la columna de destino.

Sí, estoy aprendiendo una red neuronal, el paquete nnet. En este caso, estoy entrenando el modelo con caret, que recoge un par de parámetros del modelo.

Volví a mirar la columna de resultados en su archivo RData, ahora vi inmediatamente que se trataba de ganancias de precios. La última vez pensé que era una especie de probabilidades.
Me ha gustado cómo almacena el incremento del precio en la variable de destino, si es necesario puede convertirlos fácilmente en clases para la formación, o calcular el beneficio. Yo también lo haré.

Lo tengo todo, gracias por la aclaración, conté la ganancia, factoricé el spread, dibujé el gráfico. Muy mal, MO = -2,052423e-05, pérdida lenta pero segura.

Sobre el spread, sólo hay que tenerlo en cuenta en 4 casos:
1, 2) Previsión para la última barra = 0; previsión para la nueva barra = -1 o 1. Apertura de una nueva posición.
3) Previsión en la última barra = -1; previsión en la nueva barra = 1. Al revés, se cierra la posición anterior y se abre la nueva.
4) Previsión de la barra anterior = 1; previsión de la nueva barra = -1. Al revés, la posición anterior se cierra; la nueva se abre.
En todos los demás casos, se mantiene la antigua posición de la última barra o se cierra la antigua posición, o bien no hay ninguna posición. Todo esto no requiere una extensión.

(Más concretamente, las operaciones de compra se abren al precio de compra+spread, y se cierran al precio de venta. Las operaciones de venta se abren de forma inversa a la oferta, y se cierran con la oferta+spread. La oferta es el precio que suele aparecer en el terminal. Pero, por comodidad, con un diferencial constante, basta con considerarlo una vez al abrir una nueva posición - es más fácil así).

Todo esto debe ser considerado en un EA para que no cierre una posición que se abre de nuevo inmediatamente en la misma dirección en una nueva barra. Una vez cometí un error de este tipo al pensar que iba a recibir descuentos de mi corredor. Pero en ese caso la frecuencia de las transacciones para las rebajas no da resultado, todo es peor.

 
Dr.Trader:

Sí, estoy aprendiendo una red neuronal, el paquete nnet. En este caso estoy entrenando el modelo con caret, que recoge un par de parámetros del modelo.

He vuelto a mirar la columna de resultados en su archivo RData, ahora he visto inmediatamente que se trata de ganancias de precio. La última vez pensé que era una especie de probabilidades.
Me gustó la forma en que almacena el incremento de precio en la variable de destino, si es necesario puede convertirlos fácilmente en clases para la formación, o calcular el beneficio. Yo también lo haré.

Lo tengo todo, gracias por la aclaración, conté la ganancia, factoricé el spread, dibujé el gráfico. Muy mal, MO = -2,052423e-05, pérdida lenta pero segura.

Sobre el spread, sólo hay que tenerlo en cuenta en 4 casos:
1, 2) Previsión para la última barra = 0; previsión para la nueva barra = -1 o 1. Apertura de una nueva posición.
3) Previsión en la última barra = -1; previsión en la nueva barra = 1. Al revés, se cierra la posición anterior y se abre la nueva.
4) Previsión de la barra anterior = 1; previsión de la nueva barra = -1. Al revés, la posición anterior se cierra; la nueva se abre.
En todos los demás casos, se mantiene la antigua posición de la última barra o se cierra la antigua posición, o bien no hay ninguna posición. Todo esto no requiere una extensión.

(Más concretamente, las operaciones de compra se abren al precio de compra+spread, y se cierran al precio de venta. Las operaciones de venta se abren contrarreloj a precio de oferta+spread, y se cierran a precio de oferta+spread. La oferta es el precio que suele aparecer en el terminal. Pero, por comodidad, con un diferencial constante, basta con considerarlo una vez al abrir una nueva posición - es más fácil así).

Todo esto debe ser considerado en un EA para que no cierre una posición que se abre de nuevo inmediatamente en la misma dirección en una nueva barra. Una vez cometí un error de este tipo al pensar que iba a recibir descuentos de mi corredor. Pero la frecuencia de las transacciones para las rebajas en este caso no compensa, sólo empeora.

En orden.

MO ES 0,00002. Esto ya es más que -difusión. Es decir, el modelo ha aprendido algo del ruido, pero la fuerza de la predicción es insuficiente.

Segundo. ¿Ha especificado de alguna manera qué parte de los datos debe deslizarse en un pliegue concreto? Si sólo se pone por defecto CV (CV repetido) el modelo tomará observaciones seleccionadas al azar para la prueba. No es la mejor opción en el caso de las series temporales.

A continuación, la simulación del comercio. Tengo una señal simple para abrir y cerrar después de un cierto número de minutos. Y luego puedes hacerlo más complejo. Por lo tanto, tengo una MO positiva si se tiene en cuenta el diferencial de cada operación. Y esto es realista de conseguir.

Trabaja con la validación cruzada. Es posible crear conjuntos de índices para incluir determinadas partes de las series temporales en los vados.

Y hay muchos otros métodos además de los neuronales. Uno de los mejores hoy en día es GBM o XGBOOST. Hasta ahora he elegido la primera. Me gusta.

 

He utilizado el método "repeatedcv" en trainControl, con una división por defecto. Hace poco escribí el código para la validación cruzada yo mismo, probé la validación cruzada tanto con barras tomadas al azar como con trozos tomados consecutivamente sin huecos. No vi ninguna diferencia en la prueba frontal, dio casi el mismo resultado en ambos casos. Dividí los datos para el entrenamiento/validación cruzada 50%/50%, tal vez en esa proporción ya no importa.
Voy a experimentar con eso en caret...

Recuerdo que en ese artículo que colgaste hace un tiempo, la comparación líder eran árboles potenciados con el método de Platt (algo así). Todo lo que he encontrado en google sobre este método es que hay que pasar la salida del modelo a sigmoide y tomar su resultado. ¿Pueden gbm o xgboost hacer eso? Este enfoque parece ser mejor que el bosque, la neuronka y algunos "árboles embolsados", que ocupan el segundo lugar.

Razón de la queja: