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

 

La dimensionalidad de la matriz X

> dim(X1)
[1] 7000    8
X <- array( c(X1,X2), dim=c(7000, 8, 2) )

En su caso sería

X <- array( c(X1,...X100), dim=c(7000, 8, 100) )
#или, что равнозначно
X <- array( c(X1,...X100), dim=c(dim(X1), 100) )

Naturalmente, si el número de ejemplos es 7000 y la longitud de la conversión = 8.

 

Este paquete "rnn" es más un ejercicio de programación que un producto para usar. Consulte el paquete "RSNNS" en su lugar.

Hay algunas redes recurrentes por ahí. Bueno, más a fondo, PyBrain, keras en Ruthon

Buena suerte

 
¡Gracias! Lo investigaré.
 

Estoy teniendo algunos problemas extraños con la validación cruzada del modelo entrenado. O mejor dicho, resulta que siempre ha habido problemas, sólo que no me he dado cuenta.

Mis acciones son más o menos las siguientes: Hay diferentes indicadores para el eurusd para el año. Divido los datos aleatoriamente por filas en una proporción de 70%/15%/15% para el entrenamiento/validación/validación.

Además, estos datos contienen 9000 predictores. Busco genéticamente entre sus variantes, entreno un modelo PCA basado en cada subconjunto de predictores. Entreno el modelo en una muestra de entrenamiento, determino el error. Pruebe el mismo modelo en ambas muestras de validación, determine el error en ellas.

Calculo el resultado final de una función de aptitud de la siguiente manera:
max(error_train,error_validate1,error_validate2) - min(error_train,error_validate1,error_validate2)
La cuestión es que la diferencia entre los errores mínimos y máximos debe ser lo más pequeña posible (el llamado "criterio de Fomenko" :) ).

Todo parece ir bien, el modelo alcanza un error de alrededor del 25% en las tres muestras. Pero, en la prueba frontal, el error aumenta repentinamente al 40%. Me puse a pensar un poco, cambié random.seed para generar muestras de cadenas (no predictores, sólo cadenas), y para un conjunto de predictores previamente definido (el mejor) obtuve un error de entrenamiento/validación/validación del 25%/35%/35% en lugar del 25%/25%/25%, y de nuevo el mismo 40% para el fronttest. El error en las muestras de validación aumentó un +10%, muy malo.

Así, resulta que la genética encuentra la mejor versión de los predictores para un entrenamiento concreto y unas muestras de validación específicas. Si dispersamos las filas sobre las muestras en un orden diferente, el modelo predictivo entrenado ya no funciona adecuadamente con los mismos predictores.

¿Existe alguna forma estándar de tratar esto para que el modelo entrenado dé aproximadamente los mismos errores para cualquier distribución de filas sobre las muestras? Este es un problema grave. Puedo, por ejemplo, generar de nuevo muestras de entrenamiento y validación en cada generación de genética. O hacer dos conjuntos diferentes de muestras de filas, entrenar dos modelos PCA en ellos, y tomar el peor resultado para la función de aptitud. ¿Tiene esto sentido?

 
Dr.Trader:

Estoy teniendo algunos problemas extraños con la validación cruzada del modelo entrenado. Más concretamente, resulta que siempre ha habido problemas, sólo que no me he dado cuenta.

(el llamado "criterio Fomenko" :) ).

Me ha gustado mucho el criterio. Gracias.

Pero no está completamente declarado por usted.

Mi criterio DEBE incluir la prueba frontal. Si te fijas en todos mis posts, siempre he escrito exactamente sobre el fronttest, bajo el cual, según mis ideas, debe realizarse sobre un trozo de observaciones, que están separadas por el tiempo (por el índice) de los tres primeros conjuntos.

Me encontré con esto en rattle, que divide el conjunto proporcionado como lo hizo. Obtienes buenos datos, yo obtuve menos del 10% en las tres muestras, y luego tomas un nuevo archivo y tu error del 40% sigue siendo un buen resultado. He tenido cosas peores.

Así que mi criterio para el sobreentrenamiento es:

1. dividimos el conjunto original en dos partes, SIN trucos aleatorios, de forma puramente mecánica, en orden de índice ascendente

2. Dividimos la primera parte por cualquiera de los métodos aleatorios en tres partes: pruebas de aprendizaje y validación.

3. si en estas tres partes el error es aproximadamente igual, vaya al paso 4

4. Ejecute el modelo entrenado en la segunda parte. El error debería ser aproximadamente igual. Esto es fundamental, porque al operar siempre lo hacemos fuera de la muestra de entrenamiento y obtenemos consistentemente (no al azar) barra tras barra.

Si obtenemos aproximadamente el mismo error en los 4 puntos, el modelo no se reentrena.

Si hay discrepancias significativas, se vuelve a entrenar el modelo. No he encontrado ninguna herramienta en R para eliminar el ruido. Yo tengo mi propio casero, aquí hay otro artículo sobre PCA.

 
mytarmailS:

Anton Zverev

No tengamos ese tipo de conversación, la gente que aprende y comparte sus experiencias aquí está dispuesta a ayudarse mutuamente, mientras que tú adoptas la postura de que eres estúpido y yo lo sé todo) Será mejor que me ayudes a entender lo que piensas y lo que sabes que es correcto.

Estoy de acuerdo contigo en que solo dar BP no es suficiente, hay que comprimir la información y descartar cosas innecesarias que impidan una buena decisión, idealmente a 0 o 1 los comprar/vender, es decirSi tenemos 10 indicadores (que no creo) y filtramos 9 de ellos, dejando sólo el RSI, no será suficiente ya que el indicador tiene un rango y resulta que no funciona con valores de -70 a 70, por lo que hay que comprimirlos y así sucesivamente.. la cuestión es cómo hacerlo.

Tengo pensamientos sobre esto, pero no tengo suficiente conocimiento para implementar tal selector, todavía...

Mi primer intento fue hace mucho tiempo, me bucle hacia atrás desde el precio actual y buscó una situación casi idéntica en el pasado, a continuación, estas situaciones fueron ordenados por el resultado, cómo resultaron, por ejemplo, tengo una situación actual, para ello se encontró 10 análogos en el pasado 8 análogos resultó subida de precios, 2 terminó en una caída, por lo que crecerá ... Pero el horror )) es que resultó ser todo lo contrario, el precio cayó muy a menudo y con fuerza en estas situaciones con un fuerte sesgo hacia la compra, y luego a menudo se volvió a probar tick a tick...

Entonces hice una especie de indicador, tomé la suma acumulada de todos los precios de compra y también la suma por ganancia, construí su diferencia y obtuve algún índice, cuando lo comparé con el precio resultó ser opuesto al precio, la correlación fue de -0.7 a -0.9, así que, simplemente hablando, el mercado va en contra de sus propias estadísticas, esto es algo para pensar y reconsiderar

aDr.Trader

Quizás esto te ayude a entender un poco.....

He encontrado una forma más rápida y sencilla de ver este efecto, si es interesante puedo escribir más sobre ello

 
SanSanych Fomenko:

4. Ejecute el modelo entrenado en la segunda parte. El error debería volver a ser aproximadamente igual. Esto es fundamental porque al operar siempre lo hacemos fuera de la muestra de entrenamiento y obtenemos consistentemente (no al azar) barra tras barra.

Lo tengo, gracias. Resulta que no hay 2 sino 3 muestras de validación - una de ellas está tomada estrictamente de las últimas entradas del archivo fuente sin aleatoriedad. Las demás muestras son aleatorias. Lo intentaré.

Una vez intenté tomar la primera parte del archivo de entrenamiento para la validación, también estrictamente por índices, también sin aleatoriedad. La idea era que si el modelo entrenado muestra un pequeño error en los datos del periodo de preentrenamiento, entonces mostrará el mismo error en los datos del periodo de postentrenamiento. Resultó ser erróneo, los errores antes del periodo de formación y después del periodo de formación no se correlacionaron en absoluto.

mytarmailS:

Entonces implementé dicho indicador, tomé la suma acumulada de todos los pronósticos de compra y venta, calculé su diferencia y obtuve un índice, y cuando lo comparé con el precio declaró casi lo contrario al precio, la correlación fue de -0.7 a -0.9, simplemente hablando el mercado se mueve en contra de sus propias estadísticas,esto es algo para pensar y reconsiderar

¿Le funciona siempre este método, en cualquier intervalo de tiempo? Por supuesto, tiene un aspecto extraño, pero lo principal es que funciona. Tuve observaciones similares con mi modelo no entrenado. A veces daba resultados previstos que eran estrictamente opuestos a los reales. Pero a veces seguía funcionando correctamente. Durante una prueba muy larga, mientras se entrenaba el modelo y se comprobaba en diferentes intervalos de tiempo, comprendí que, por término medio, era correcto alrededor del 50% de las veces, por lo que era inútil, se podía lanzar una moneda para predecir y obtener el mismo resultado. Después de eso comprobé y entendí correctamente, que el modelo debería dar un resultado correcto sin ninguna inversión, filtro, soluciones colectivas de muchos otros modelos. De lo contrario, podría quedar atrapado en el caos y el azar.

 
Dr.Trader:

¿Le funciona siempre este método, en cualquier plazo? Es extraño, por supuesto, pero lo principal es que funciona. Tuve observaciones similares con mi modelo no entrenado. A veces daba resultados previstos que eran estrictamente opuestos a los reales. Pero a veces seguía funcionando correctamente. Durante una prueba muy larga, mientras se entrenaba el modelo y se comprobaba en diferentes intervalos de tiempo, comprendí que, por término medio, era correcto alrededor del 50% de las veces, por lo que era inútil, se podía lanzar una moneda para predecir y obtener el mismo resultado. Después de eso comprobé y entendí correctamente, que el modelo debería dar un resultado correcto sin ninguna inversión, filtro, soluciones colectivas de muchos otros modelos. De lo contrario, se puede caer en una trampa en la que el caos y la aleatoriedad reinan.

Sí, siempre y en cualquier tramo de tiempo (pero hay matices con el muestreo), la salida es una copia casi exacta del precio, pero inversamente correlacionada. Con este método se puede ver cómo se entrena una red neuronal y qué se puede esperar de ella, se pueden sacar varias conclusiones

1) esta es la situación más típica - si una red está inversamente correlacionada, significa que está entrenada, de lo contrario no habría correlación inversa, ¿verdad?

2) es simplemente aleatorio - significa que la red no ha aprendido nada

3) Una red funciona junto con el mercado (he conseguido este efecto sólo en un objetivo no estándar) - significa que todo está bien

4) Y la conclusión más importante (esto es importante para ti, D. Trader) si construyes tus previsiones de red y va a ir en la dirección opuesta a la conclusión 1, ninguna optimización, genética, validación cruzada y otros encantos te ayudarán absolutamente nada - piénsalo, es lógico y obvio

 
mytarmailS:

1) Esta es la situación más típica: si la red está inversamente correlacionada, significa que está entrenada, de lo contrario no habría correlación inversa, ¿no?

4) Y la conclusión más importante (esto es importante para usted D. Trader) si usted hace sus pronósticos de red neuronal y va a ir en la dirección opuesta como en la conclusión 1, ninguna optimización, la genética, la validación cruzada y otros encantos le ayudará en absolutamente NADA, pensar en ello, es lógico y obvio

1) La correlación inversa estable en diferentes intervalos de entrenamiento es un poco extraña, pero la red ha aprendido algo, estoy de acuerdo en que el resultado es bueno.

4) No estoy de acuerdo con esto. Si se utiliza la clasificación binaria (variable objetivo "0" o "1"), entonces la función de fitness del genetista u optimizador cambia fácilmente para lograr el resultado "inverso", sólo hay que restar el resultado actual de 1.
Por ejemplo, la genética recoge un determinado conjunto de predictores. Entreno las neuronas en ellas, realizo una validación cruzada y encuentro el error medio. Obtengo un error de, por ejemplo, 0,4. El resultado "inverso" de la función de aptitud puede definirse como 1-0,4 = 0,6. La genética intentará disminuir el error de 0,6 a cero. El resultado será un conjunto de predictores con valor de función de aptitud 0. Pero significa que el error real de la red neuronal era 0+1 = 1. Es decir, la neuronka obtenida es errónea en el 100% de los casos, y esta es la correlación inversa.
En general, puedes usar el mismo algoritmo genético y la validación cruzada para entrenar una neurona que dé un resultado opuesto al deseado, lo obtendrás como lo hiciste, pero a propósito. Pero no está claro para qué. :)

También me gustaría añadir que en la clasificación binaria con las variables objetivo "0" y "1" el peor error es 0,5.
Error == 0 es bueno.
Error == 1 es tu neurona de correlación inversa, puedes voltear el resultado y estará bien. Pero es mejor averiguar por qué, es una situación muy atípica.
El error 0,5 significa que el resultado es completamente aleatorio y que el modelo no sirve para nada.

 

1

Razón de la queja: