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

 
mytarmailS:
Ya lo hice, la red neuronal no aprende en un horizonte mayor con el objetivo que le di

Sonrío ante sus palabras.

No es una red neuronal que no aprende, sino que tú haces que no aprenda, literalmente. La red neuronal aprenderá donde hay señal además de ruido, pero su tarea es separar esta señal del ruido con la ayuda de la Gran Red Neuronal, sin dejar que vuelva a aprender.

 
Alexey Burnakov:
Esta es una respuesta más correcta). Tengo que probar diferentes métodos.

Una vez sugerí este enfoque.

Tomamos un Asesor Experto, puede ser de kodobase. Lo principal es que sea de pleno derecho y no importa si está perdiendo. Puede establecer los requisitos previos. Por ejemplo: tendencia, tres ventanas, sin SL y TP, MM, recuperación de errores de estados...

Deberíamos buscar el motivo de la pérdida e intentar solucionarlo con R. Resolvemos los problemas en las ventanas bajas por extrapolación, en la ventana alta predecimos el siguiente compás por clasificación.

 
Alexey Burnakov:

Mi artículo sobre la selección de características.

https://habrahabr.ru/company/aligntechnology/blog/303750/

Ha sido interesante leerlo, gracias por el esfuerzo. No entiendo el experimento 6: ¿por qué se seleccionaron al final los predictores Y y Z? Z es la variable objetivo, no debería haber estado en la lista de predictores.

Me gusta la idea de tomar un gráfico de conejo en 3D y entrenar el modelo en él. Para ser sincero, al principio pensé que el "conejo" es una especie de dato pseudoaleatorio que queda bien en el gráfico y que sólo tiene sentido para un humano con su capacidad de ver el conejo en una serie de números. Pero no hay ninguna función que describa al conejo, para cualquier modelo es sólo un conjunto de puntos que forman grupos de formas especiales en el espacio tridimensional. Desde mi punto de vista, las tres coordenadas de cada punto no tienen relaciones y dependencias entre ellas, esperaba que ningún algoritmo pudiera manejarlo. Al final del artículo me sorprendió.

He probado el mismo experimento con PCA, y los resultados son los siguientes:
Necesito un componente para una precisión del 95%, utiliza X e Y. Pero el algoritmo de predicción no funciona con un solo componente, necesito al menos dos. Básicamente ambos usan X e Y (no se muestra en el código, pero se puede ver en el gráfico), así que está bien.
Entrenar el modelo en la muestraA, luego predecir Z para la muestraA : R^2 = 0.04759303
Entrenar el modelo en la muestraA, luego predecir Z para la muestraB: R^2 = 0.05325888

Dibujo un gráfico 3d de la Z predicha para la muestraB, salió mal. El modelo no encontró realmente ninguna dependencia, simplemente promedió todas las Z en un plano. El conejo salió plano. ¿Has probado a entrenar algunos modelos y a dibujar un conejo previsto? Me pregunto cómo funciona para los diferentes modelos.

Adjunto el código del conejo y el pca de y. Hay un pequeño error, el gráfico de cargas de los predictores está ordenando los componentes por alguna razón. Es decir, son 1,10,11,12,2,3,4,5,... pero en orden de importancia deberían verse en este orden: PC1, PC2, PC3,...

Archivos adjuntos:
bunny_pca.txt  5 kb
 
mytarmailS:
Ya lo he hecho antes, la red neuronal no aprende en un horizonte mayor con el objetivo que le puse

Todavía no he intentado entrenar la neurona más allá de una barra, pero supongo que el principio será el mismo. Trabajo con él de la siguiente manera:

1) recoger todos los datos en bruto posibles de mt5 - ohlc, tiempo, indicadores. Como no sé qué es útil y qué no, lo cojo todo y trato de cribar la basura. No puedo enviar todo a neuronka, porque neuronka reentrena en la basura y en este caso se equivoca en fronttest. No es fácil cribar la basura, de hecho las 28 páginas de este hilo tratan sobre cómo hacerlo, y hasta ahora todo es ambiguo. Agrego una variable objetivo a los datos - 0 o 1 dependiendo de la caída/subida del precio para la siguiente barra.

2) Cribado de residuos propiamente dicho. Debe haber una función que analice los datos iniciales y le dé una puntuación. Cuanto más alta sea la estimación, menos basura habrá. Intentamos alimentar la función de evaluación con varias combinaciones de predictores de origen (columnas de la tabla de entrenamiento) e intentamos aumentar el resultado. Con el tiempo, se encontrará un determinado conjunto de predictores que, en teoría, no conducirá a un sobreentrenamiento.

3) Supongamos que se elimina la basura. Ahora es el momento de entrenar la red neuronal. Utilizo el paquete nnet de R, tiene ventajas en forma de ausencia de hiperparámetros como la velocidad de entrenamiento, la aceleración, el retardo, los tipos de funciones de entrenamiento. Menos hiperparámetros significan menos problemas. Hay que entrenar con validación cruzada. Tomo la tabla inicial y la divido en tres filas con una proporción de 70%/15%/15% (las nuevas tablas se llaman train/test/validate) (el código se puede tomar del registro de rattle, yo partí de él). Luego hago, por ejemplo, 10 iteraciones de entrenamiento de neuronas en la mesa de entrenamiento. Calculo el error de predicción R^2. Predigo los resultados de las tablas de prueba y validación y calculo R^2 para ellos también. Hago 10 iteraciones más de entrenamiento, repito la predicción para 3 tablas y miro el nuevo R^2. Deje de entrenar cuando R^2 en algunas de las tablas empiece a caer (siempre crecerá sólo en la tabla del tren). Hecho. Ahora puede repetir todo esto de nuevo, utilizando un número diferente de neuronas ocultas y un número diferente de iteraciones de entrenamiento entre las validaciones cruzadas, con la esperanza de que el R^2 mínimo de tres tablas al final sea mayor que la última vez.

Todo esto puede parecer un poco complicado, pero en realidad es aún más complicado :), hay un montón de problemas en cada uno de estos pasos. Pero da resultados consistentes.

 
SanSanych Fomenko:

Menos mal que no aprendiste, porque enseñas sobre el ruido. Pero si lo hicieras, aprenderías en el grial, en el real....

Ocupado aquí tratando de eliminar el ruido. Por eso tomamos tantos predictores con la esperanza de que al menos quede algo.

Estás tratando de usar el ruido como entrenador, deberías entender que si el estocástico (por ejemplo) tuviera el número mágico 90 y el mercado cayera cuando el indicador tuviera tal valor, no necesitaríamos ninguna red, sería visible a simple vista.

1) En el mejor de los casos lo que se hace es seleccionar los 10 mejores indicadores de entre 100 posibles por algún criterio, y el indicador tiene un rango de valores - digamos que de estos 100 valores sólo 3 funcionan y no siempre pero en algunas situacionessólo estos 3 valores no son ruido y sólo ellos deben mantenerse en lugar del indicador ya que el resto de valores son el mismo ruido, por lo que todos estos rechazos son cualitativamente poco profundos y por tanto poco eficientes

2) Además, existe esa noción de inconsistencia de atributos, por ejemplo, tomemos el precio, es objetivo y no contradictorio, es decir, si el precio es alcista, es alcista y no hay un segundo (si ignoramos los matices de la fuerza de la tendencia, etc.), tomemos el mismo estocástico, puede tomar 90 valores cuando la tendencia es plana y alcista y bajista, es decirPor otro lado, este indicador no ayuda a la red, al contrario, siempre confunde al mercado porque sus lecturas son inconsistentes, por lo que los indicadores ordinarios no son aplicables al mercado , y ni siquiera se piensa en ello, solo se llena todo, y luego me dices del ruido.

No estoy satisfecho con el horizonte de previsión como he escrito arriba.

 
Dr.Trader:

Ha sido interesante leerlo, gracias por el esfuerzo. No entiendo el experimento 6: ¿por qué se seleccionaron al final los predictores Y y Z? Z es la variable objetivo, no debería haber estado en la lista de predictores.

Me gusta la idea de tomar un gráfico de conejo en 3D y entrenar el modelo en él. Para ser sincero, al principio pensé que el "conejo" es una especie de dato pseudoaleatorio que queda bien en el gráfico y que sólo tiene sentido para un humano con su capacidad de ver el conejo en una serie de números. Pero no hay ninguna función que describa al conejo, para cualquier modelo es sólo un conjunto de puntos que forman grupos de formas especiales en el espacio tridimensional. Desde mi punto de vista, las tres coordenadas de cada punto no tienen relaciones y dependencias entre ellas, esperaba que ningún algoritmo pudiera manejarlo. Al final del artículo me sorprendió.

Probado el mismo experimento con PCA, los resultados son así:
Se necesita un componente para una precisión del 95%, utiliza X e Y. Pero el algoritmo de predicción no funciona con un solo componente, sino que hay que tomar al menos dos. Básicamente ambos utilizan X e Y (no se muestra en el código, pero se puede ver en el gráfico), así que está bien.
Entrenar el modelo en la muestraA, luego predecir Z para la muestraA : R^2 = 0.04759303
Entrenar el modelo en la muestraA, luego predecir Z para la muestraB: R^2 = 0.05325888

Dibujo un gráfico 3d de la Z predicha para la muestraB, salió mal. El modelo no encontró realmente ninguna dependencia, simplemente promedió todas las Z en un plano. El conejo salió plano. ¿Has probado a entrenar algunos modelos y a dibujar un conejo previsto? Me pregunto cómo funciona para los diferentes modelos.

Adjunto el código del conejo y el pca de y. Hay un pequeño error, el gráfico de cargas de los predictores está ordenando los componentes por alguna razón. Es decir, son 1,10,11,12,2,3,4,5,... pero en orden de importancia debes buscar en este orden: PC1, PC2, PC3,...

Entonces, ¿tienes X e Y en los componentes principales? Sería importante entenderlo.

Segundo, sobre la aproximación del conejo. ¡Claro que sí! Es un modelo lineal. Sólo dibujará un plano (si X e Y) con un poco de pendiente, o una línea (si un predictor). Ese es todo el modelo lineal del conejo ) Por eso intento utilizar modelos no lineales.

Así se reconstruye el conejo con otro método (basado en valores discretos).

 
Alexey Burnakov:

Entonces, ¿aparecen X e Y en los componentes principales? Sería importante entenderlo.

Sí, sólo X e Y. Todavía no he encontrado cómo hacer esto mediante código, todos los artículos sobre esto operan con gráficos. El número de componentes a tomar puede verse en la variable componentsToUse. En este caso componentsToUse = 2, significa que necesita tomar sólo aquellos predictores que tienen líneas horizontales anchas en el gráfico para PC1 y PC2.

En ese gráfico de arriba, fíjese en las columnas PC1 y PC2 (los componentes principales primero y segundo), y luego en las líneas horizontales verdes. Si la línea se aleja de 0 (sea positiva o negativa), entonces ese predictor se utiliza en el componente principal correspondiente. PC1 utiliza y_clean ("_clean" se añade automáticamente al escalar los datos para evitar la confusión con el predictor original), PC2 utiliza x_clean. Este es el resultado del análisis de componentes PCA: hay que tomar x_clean e y_clean.

En adelante, PC3 utilizaría input_noise_3_clean. Esto es sólo un ejemplo, el PC3 no es necesario en este caso.

En realidad, esto ha funcionado muy bien. X e Y destacan claramente en el gráfico. Anteriormente he publicado el mismo gráfico para forex donde todo es malo.

 
Dr.Trader:

Sí, sólo X e Y. Todavía no he encontrado cómo hacer esto mediante código, todos los artículos sobre esto operan con gráficos. El número de componentes a tomar puede verse en la variable componentsToUse. En este caso componentsToUse = 2, significa que necesita tomar sólo aquellos predictores que tienen líneas horizontales anchas en el gráfico para PC1 y PC2.

En ese gráfico de arriba, fíjese en las columnas PC1 y PC2 (los componentes principales primero y segundo), y luego en las líneas horizontales verdes. Si la línea se aleja de 0 (no importa si es positiva o negativa), entonces ese predictor se utiliza en el componente principal correspondiente. PC1 utiliza y_clean ("_clean" se añade automáticamente al escalar los datos para evitar la confusión con el predictor original), PC2 utiliza x_clean.

En adelante, PC3 utilizaría input_noise_3_clean. Esto es sólo un ejemplo, no es necesario utilizar el PC3 en este caso.

En realidad, esto ha funcionado muy bien. X e Y destacan claramente en el gráfico. He publicado el mismo gráfico para forex antes, pero no es tan bueno allí.

La selección de los predictores resultó ser aquí a través del método lineal. Bueno, me alegro de que te sorprendas. Significa que has visto algo nuevo )
 
Dr.Trader:

Todavía no he intentado entrenar la neurona más allá de una barra, pero supongo que el principio será el mismo. Trabajo con él de la siguiente manera:

1) recoger todos los datos en bruto posibles de mt5 - ohlc, tiempo, indicadores. Como no sé qué es útil y qué no, lo cojo todo y trato de cribar la basura. No puedo enviar todo a neuronka, porque neuronka reentrena en la basura y en este caso se equivoca en fronttest. No es fácil cribar la basura, de hecho las 28 páginas de este hilo tratan sobre cómo hacerlo, y hasta ahora todo es ambiguo. Agrego una variable objetivo a los datos - 0 o 1 dependiendo de la caída/subida del precio para la siguiente barra.

2) Cribado de residuos propiamente dicho. Debe haber una función que analice los datos iniciales y le dé una puntuación. Cuanto más alta sea la estimación, menos basura habrá. Intentamos alimentar la función de evaluación con varias combinaciones de predictores de origen (columnas de la tabla de entrenamiento) e intentamos aumentar el resultado. Con el tiempo, se encontrará un determinado conjunto de predictores que, en teoría, no conducirá a un sobreentrenamiento.

3) Supongamos que se elimina la basura. Ahora es el momento de entrenar la red neuronal. Utilizo el paquete nnet de R, tiene ventajas en forma de ausencia de hiperparámetros como la velocidad de entrenamiento, la aceleración, el retardo, los tipos de funciones de entrenamiento. Menos hiperparámetros significan menos problemas. Hay que entrenar con validación cruzada. Tomo la tabla inicial y la divido en tres filas con una proporción de 70%/15%/15% (las nuevas tablas se llaman train/test/validate) (el código se puede tomar del registro de rattle, yo partí de él). Luego hago, por ejemplo, 10 iteraciones de entrenamiento de neuronas en la mesa de entrenamiento. Calculo el error de predicción R^2. Predigo los resultados de las tablas de prueba y validación y calculo R^2 para ellos también. Hago 10 iteraciones más de entrenamiento, repito la predicción para 3 tablas y miro el nuevo R^2. Deje de entrenar cuando R^2 en algunas de las tablas empiece a caer (siempre crecerá sólo en la tabla del tren). Hecho. Ahora puede repetir todo esto de nuevo, utilizando un número diferente de neuronas ocultas y un número diferente de iteraciones de entrenamiento entre las validaciones cruzadas, con la esperanza de que el R^2 mínimo de tres tablas al final sea mayor que la última vez.

Todo esto puede parecer un poco complicado, pero en realidad es aún más complicado :), hay un montón de problemas en cada uno de estos pasos. Pero da resultados consistentes.

Tengo un punto de vista diferente y tú no lo entiendes
 

SanSanych Fomenko:
¿Y si se toman los 10 primeros (más o menos) antes del paso, y se descarta el resto?

He dibujado un gráfico de R^2 y del porcentaje de casos ganadores en función del número de componentes utilizados. El mejor resultado en la prueba frontal fue con 41 componentes (ganancia de alrededor del 70%, muy buena). Pero eso no se nota en los gráficos de backtest, simplemente siguen subiendo todo el tiempo. Si nos basamos en la importancia de los componentes, deberíamos haber tomado 73, que no es el mejor resultado en el fronttest.

R^2 de fronttest puede ser negativo incluso cuando se gana >50% de los casos, debido a los resultados requeridos desequilibrados, el número de clases "0" es diferente de "1", por lo que su promedio no es 0,5, y R^2 de eso es ligeramente peor.