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

 
SanSanych Fomenko:

No veo ninguna prueba de que NS haya superado nada.

El sobreaprendizaje es un mal mundial en la ciencia y en la construcción de modelos en particular.

Por lo tanto, se necesita un error para tres conjuntos:

  • conjuntos de aprendizaje. La forma en que Rattle lo entiende (OOB, prueba, validación) estará bien.
  • un conjunto que está fuera, en términos de fechas, del conjunto de entrenamiento.
  • Otro conjunto que está fuera, en el sentido de las fechas, del conjunto de entrenamiento.

Los dos últimos conjuntos están sin mezclar al llegar a la terminal, las bases detrás de la barra.

Debería haber más o menos el mismo error en los tres conjuntos. Al hacerlo, tendrá que fijar el conjunto de predictores que toma al entrenar el modelo.

Al principio no me planteé volver a formarme en esta tarea, no era necesario. La primera vez la neuronac fue con una sola neurona en la capa interna. Ahora lo he comprobado, el error durante el entrenamiento largo es de un 45% aproximadamente, y no baja. La red da a esas entradas 1,3,5,7,9,11 pesos más altos cuando entrena, pero no puede entrenar realmente por falta de neuronas. La idea era exprimir al máximo el resultado correcto, en condiciones muy limitadas, y ver a qué entradas da más peso.

Ahora, con el archivo de validación, puedo trabajar más seriamente. Ahora he dividido el archivo fuente en 2 partes (85% y 15%), he entrenado en la primera parte, a veces he dejado de entrenar y he medido el error en ambas partes. Esos ejemplos del archivo del 15% no entraron en el entrenamiento, pero el error en ellos disminuyó casi lo mismo que en la parte de entrenamiento. Cuando se convirtió en 0% en ambas partes del archivo, dejé de entrenar y probé las neuronas en el segundo archivo, el error allí fue ~0%. Resulta que para esta tarea ni siquiera se logró el sobreentrenamiento, es curioso.


Pero las neuronas en forex son peores que en este problema. Al principio, el error disminuye tanto en las muestras de entrenamiento como en las de validación. Entonces el error sigue bajando en la muestra de entrenamiento, pero empieza a crecer en la muestra de prueba, en este punto es el momento de parar el entrenamiento. A continuación, suelo probar el resultado en el historial anterior a la muestra y de nuevo en el historial posterior a la muestra. Para mí, son tres conjuntos de datos, como los tuyos. Pero el error en los tres conjuntos es diferente hasta ahora (y grande fuera del período de entrenamiento).

Tuve diferentes ideas para mejorar los resultados, por ejemplo, para suavizar los resultados o añadir un filtro (<0,1 - vender, >0,9 - comprar, y todo lo que está en el medio - período sin comercio). Se pueden mejorar los resultados añadiendo un filtro a la salida neural y optimizándolo también, pero para el fronttest no ayudó en absoluto. Otra buena idea fue que si la neurona fue entrenada en algún período de la historia, entonces se puede optimizar el filtro en la historia anterior a ese período. Porque un error antes del periodo de optimización está probablemente asociado a un error después del periodo de optimización. Pero no funcionó - si hay tres períodos de la historia - "antes de la neurona" - "aprendizaje de la neurona" - "después de la neurona", entonces los tres tendrán sus filtros óptimos que no están conectados de ninguna manera.

Hasta ahora he llegado a la conclusión de que el modelo debería tener un error pequeño (<10%) para las muestras de entrenamiento y de prueba. No aplique filtros a los resultados del modelo, y nada de conjeturas como "invertir el resultado cada cuatro semanas". No caer en períodos menores a M15. Pruebo diferentes ideas nuevas y es bueno que al menos una de cada diez mejore el resultado. Y de alguna manera esto debería resultar en un modelo rentable.

 
Dr.Trader:

Al principio no me planteé volver a formarme en esta tarea, no era necesario. La primera vez fue con una sola neurona en la capa interna. Ahora lo he comprobado, el error durante el entrenamiento largo es de alrededor del 45%, y no baja. La red da a esas entradas 1,3,5,7,9,11 pesos más altos cuando entrena, pero no puede entrenar realmente por falta de neuronas. La idea era exprimir al máximo el resultado correcto, en condiciones muy limitadas, y ver a qué entradas da más peso.

Ahora, con el archivo de validación, puedo trabajar más seriamente. Ahora he dividido el archivo fuente en 2 partes (85% y 15%), he entrenado en la primera parte, a veces he dejado de entrenar y he medido el error en ambas partes. Esos ejemplos del archivo del 15% no entraron en el entrenamiento, pero el error en ellos disminuyó casi lo mismo que en la parte de entrenamiento. Cuando se convirtió en 0% en ambas partes del archivo, dejé de entrenar y probé las neuronas en el segundo archivo, el error allí fue ~0%. Resulta que para esta tarea ni siquiera se logró el sobreentrenamiento, es curioso.


Pero las neuronas en forex son peores que en este problema. Al principio, el error disminuye tanto en las muestras de entrenamiento como en las de validación. Entonces el error sigue bajando en la muestra de entrenamiento, pero empieza a crecer en la muestra de prueba, en este punto es el momento de parar el entrenamiento. A continuación, suelo probar el resultado en el historial anterior a la muestra y de nuevo en el historial posterior a la muestra. Para mí, son tres conjuntos de datos, como los tuyos. Pero el error en los tres conjuntos es diferente hasta ahora (y grande fuera del período de entrenamiento).

Tuve diferentes ideas para mejorar los resultados, por ejemplo, para suavizar los resultados o añadir un filtro (<0,1 - vender, >0,9 - comprar, y todo lo que está en el medio - período sin comercio). Se pueden mejorar los resultados añadiendo un filtro a la salida neuronal y optimizándolo también, pero para el fronttest no sirvió de nada. Otra buena idea fue que si la neurona fue entrenada en algún período de la historia, entonces se puede optimizar el filtro en la historia anterior a ese período. Porque un error antes del periodo de optimización está probablemente asociado a un error después del periodo de optimización. Pero no funcionó - si hay tres períodos de la historia - "antes de la neurona" - "aprendizaje de la neurona" - "después de la neurona", entonces los tres tendrán sus filtros óptimos que no están conectados de ninguna manera.

Hasta ahora he llegado a la conclusión de que el modelo debería tener un error pequeño (<10%) para las muestras de entrenamiento y de prueba. No aplique filtros a los resultados del modelo, y nada de conjeturas como "invertir el resultado cada cuatro semanas". No caer en períodos menores a M15. Pruebo diferentes ideas nuevas y es bueno que al menos una de cada diez mejore el resultado. Y de alguna manera esto debería resultar en un modelo rentable.

Todo está en los datos )

Los datos de todos los conjuntos deben contener observaciones independientes entre sí. Pero incluso en este caso la validación dará el peor resultado.
 

Probé diferentes modelos de Rattle, el bosque también dio buenos resultados.

Paso 1 - el bosque ha entrenado algo, y en las estadísticas las entradas 1,3,5,7,9,11 parecen de alguna manera separadas. Error en el archivo de entrenamiento 0%, en el archivo de validación 46%.

Paso 2 - dejar sólo las entradas 1,3,5,7,9,11 en el archivo y el resultado. Entrené el bosque de nuevo en el nuevo archivo, ahora el error es del 0% tanto en el archivo de entrenamiento como en el de validación, todo está bien. El único matiz fue que Rattle para el segundo paso estableció el parámetro "Número de variables" a 2, probablemente porque el archivo es de menor tamaño. Lo he cambiado a 4 como en el primer paso.

 

Dr.Trader

Es agradable ver a un hermano en la mente basada en el traqueteo. Al menos podemos comparar los resultados.

Así como mi propia experiencia.

Tomamos el traqueteo y los modelos de ella.

En la pestaña de modelo aprendemos, obteniendo el valor del AOB, y en la pestaña de Evaluar evaluamos en los conjuntos de Validación y Prueba. Tenemos tres cifras.

Yo sostengo que los resultados obtenidos, si el conjunto de predictores no fue previamente limpiado de predictores de ruido - estos resultados son sobre nada, muy probablemente sólo un conjunto de números.

En la pestaña Evaluar, además de obtener los resultados listados, el conjunto debe ser puesto en la ventana R Dataset. Es muy importante que este conjunto se obtenga dividiendo mecánicamente el archivo original, es decir, el primer archivo para los tres dígitos, por ejemplo, del 1 de enero de 2014 al 1 de enero de 2015, pero el archivo en el

R Dataset necesariamente después del 1 de enero de 2015 sin ningún tipo de muestreo aleatorio y otros trucos utilizados en R. Es simplemente contundente, mecánico.

No reconozco ninguna otra forma de evaluar el éxito de separar los predictores significativos de los ruidosos, porque el método que propongo imita el comercio real.

¿Podría publicar las cuatro cifras? ¿Incluyendo el resultado en el archivo de la ventana R Dataset?

 
Dr.Trader:

Probé diferentes modelos de Rattle, el bosque también dio buenos resultados.

Paso 1 - el bosque ha entrenado algo, y en las estadísticas las entradas 1,3,5,7,9,11 parecen de alguna manera separadas. El error en el archivo de entrenamiento es del 0%, en el archivo de validación es del 46%.

Paso 2 - dejar sólo las entradas 1,3,5,7,9,11 en el archivo y el resultado. Entrené el bosque de nuevo en el nuevo archivo, ahora el error es del 0% tanto en el archivo de entrenamiento como en el de validación, todo está bien. El único matiz fue que Rattle para el segundo paso estableció el parámetro "Número de variables" a 2, probablemente porque el archivo es de menor tamaño. Lo he cambiado a 4 como en el primer paso.

Interesante... La profundidad tiene que ser ajustada a 6 variables para recoger todas las relevantes.
 
Dr.Trader:

Probé diferentes modelos de Rattle, el bosque también dio buenos resultados.

Paso 1 - el bosque ha entrenado algo, y en las estadísticas las entradas 1,3,5,7,9,11 parecen de alguna manera separadas. El error en el archivo de entrenamiento es del 0%, en el archivo de validación es del 46%.

Paso 2 - dejar sólo las entradas 1,3,5,7,9,11 en el archivo y el resultado. Entrené el bosque de nuevo en el nuevo archivo, ahora el error es del 0% tanto en el archivo de entrenamiento como en el de validación, todo está bien. El único matiz fue que Rattle para el segundo paso estableció el parámetro "Número de variables" a 2, probablemente porque el archivo es de menor tamaño. Lo he cambiado a 4 como en el primer paso.

En el primero, el bosque utilizó ruidos para el entrenamiento, lo que no es bueno.
 
SanSanych Fomenko:

¿Podría publicar las cuatro cifras? ¿Incluir el resultado en el archivo desde la ventana de R Dataset?

Hice esto con neuronka - dummy_set_features.csv está dividido en 3 partes 70%/15%/15%; dummy_set_validation.csv usado en la pestaña de evaluación como "archivo csv" (es esencialmente lo mismo que el conjunto de datos de R, solo que con diferente formato de archivo).

Tomé el registro de Rattle, eliminé esas dos limitaciones de la llamada neuronal, sobre la que escribí antes, lo ejecuté en R, pero el modelo sigue sin estar entrenado (35% de error en la muestra de entrenamiento). Por lo tanto, si se reduce la muestra de entrenamiento, el resultado del entrenamiento es peor. Pero si se puede aumentar el número de neuronas en la capa interna, debería mejorar el aprendizaje.

Cambié el número de neuronas de 10 a 20, volví a ejecutar el entrenamiento, ahora el error en el entrenamiento se ha convertido en 0%. El error en la muestra de validación es del 0,6%, el error en la muestra de prueba es del 0,1%. El error en el archivo dummy_set_validation.csv es del 0,3%. Todo bien, R en la aplicación.

Es interesante, resulta que los problemas de entrenamiento de las neuronas son muy diferentes de los problemas de los árboles. Para mí el problema con nn es tomar el número correcto de neuronas internas, y suspender el aprendizaje antes de que la red comience a reentrenarse. En principio, cuantas más neuronas mejor, pero esto afecta en gran medida a la RAM necesaria y al tiempo de entrenamiento. Los predictores superfluos no son un gran obstáculo para el aprendizaje, las neuronas suelen aprender igual de bien con ellos, pero aumentan el tiempo de entrenamiento, y es mejor deshacerse de ellos para hacerlo más rápido.

Una vez que usé la red mt4 auto-escrito, un EA podría aprender y el comercio de inmediato. Hubo problemas con la velocidad de aprendizaje, la inicialización de los pesos y los algoritmos de aprendizaje. Había demasiados pequeños problemas, era difícil conseguir buenos resultados incluso con una muestra de entrenamiento, así que finalmente me rendí y ahora trabajo en R. El paquete nnet puede entrenar mediante el algoritmo bfgs, elimina todos esos pequeños problemas. Pero el paquete tiene un límite de sólo una capa interior. Quiero tener al menos 3 capas internas, pero con el algoritmo bfgs, de lo contrario habrá muchos problemas con el aprendizaje de nuevo.

Archivos adjuntos:
r_nnet2.txt  10 kb
 
Dr.Trader:

Hice esto con la neurona - dummy_set_features.csv está dividido en 3 partes 70%/15%/15% como estándar; dummy_set_validation.csv usado en la pestaña de evaluación como "archivo csv" (esto es esencialmente lo mismo que el conjunto de datos de R, sólo diferente formato de archivo).

No, no es lo mismo.

Sorprendente, discuto este tema con mucha gente y NADIE lo hace como yo escribo. Y sé lo que escribo, porque me he pasado medio año con ejercicios como los tuyos, y fuera del traqueteo(). Lo que no pongo en el probador, me da un error completamente diferente. Entonces hice lo que describí arriba y el error en el probador prácticamente coincidió con el error en el archivo R Dataset.

Le di a Alexey tres archivos, que se obtienen dividiendo mecánicamente un archivo grande en tres partes. En la primera parte nos ejercitamos, aprendemos, evaluamos... Y en los otros dos, comprobamos los números que obtuvimos en el primero. Si los tres archivos tienen errores superiores al 20% (!), o más exactamente, cercanos al 40%, el modelo no se reentrena y se puede trabajar con él.

Los 3 archivos anteriores tienen 27 predictores y 6 variables objetivo. Los 27 predictores fueron seleccionados de entre 170 predictores por mis propios algoritmos. A día de hoy, estos 27 predictores no conducen a modelos sobreentrenados. Pero los 143 predictores restantes de mi conjunto son ruido y en este ruido se puede obtener fácilmente un error comparable al suyo, pero el modelo está sobreentrenado y no es apto para su uso posterior.

¿Por qué hay menos errores en los predictores de ruido que en los predictores significativos?

A mi modo de ver, como el algoritmo de ajuste del modelo tiende a reducir el error de ajuste, siempre es capaz de encontrar algo entre los valores aleatorios y ruidosos que sea mejor que los predictores significativos. En consecuencia, cuanto menor sea el error, menos predictores significativos intervienen en la construcción del modelo.

PS

A juzgar por el error, o bien NS está 100% sobreentrenado, o mirando hacia adelante.

 

El "archivo CSV" y el "conjunto de datos R" en la pestaña de evaluación son simplemente formas diferentes de especificar la fuente de datos. Si introduces los mismos datos en ellos, obtendrás el mismo resultado al probar el modelo.

Si antes del traqueteo se ejecuta

dataset_validate <- read.csv("file:///C:/dummy_set_validation.csv", na.strings=c(".", "NA", "", "?"), strip.white=TRUE, encoding="UTF-8")

entonces este dataset_validate estará ahora disponible en la pestaña evaluar como dataset R. Pero el resultado de la comprobación del modelo acabará siendo el mismo, ya que si sólo selecciona la opción de archivo csv y especifica el archivo C:/dummy_set_validation.csv, los datos para la prueba serán idénticos en ambos casos.

El entrenamiento en sí se realizó en un archivo diferente, dummy_set_features.csv, por lo que mirar hacia adelante es imposible aquí, porque los datos en ambos archivos son diferentes, y no dependen del tiempo en absoluto (sino de la fórmula). Creo que la neurona hizo un gran trabajo y encontró 6 entradas que determinan el resultado, redujo la influencia de otras entradas y describió la fórmula deseada con algo de lógica neuronal propia.

Por si acaso he comprobado ambos archivos para encontrar cadenas duplicadas si es que las hay. Aquí está el código en R:

#читаем  данные из файлов для обучения и валидации
dataset_train <- read.csv("file:///C:/dummy_set_features.csv", na.strings=c(".", "NA", "", "?"), strip.white=TRUE, encoding="UTF-8")
dataset_validate <- read.csv("file:///C:/dummy_set_validation.csv", na.strings=c(".", "NA", "", "?"), strip.white=TRUE, encoding="UTF-8")

anyDuplicated(dataset_train) #количество  повторных строк в первом файле - 567
anyDuplicated(dataset_validate) #количество  повторных строк во втором файле - 202
#  это покачто просто повторные строки в обоих файла по отдельности. Это не вредит, но и ничего не улучшает, лучше их убрать.
dataset_train <- unique(dataset_train)
dataset_validate <- unique(dataset_validate)

#Теперь  можно узнать сколько строк из dataset_train повторяются в dataset_validate
dataset_combined <- rbind(dataset_train, dataset_validate) #Объединяем  оба файла в один
nrow(dataset_combined) - nrow(dataset_combined[!duplicated(dataset_combined), ]) #количество  повторенных строк - 23. Таких повторов быть не должно, их надо удалить.
#Удаление  повторенных строк из dataset_validate
dataset_validate <- dataset_validate[!(tail(duplicated(dataset_combined), nrow(dataset_validate))), ]
#Удаление  из памяти объединённого файла, он больше не нужен
rm(dataset_combined)

Si esto se hace antes de rattle, las tablasdataset_train ydataset_validate estarán disponibles para el entrenamiento y la comprobación del modelo, y no habrá duplicados. Glory R.

el archivo de validación del modelo contenía 23 repeticiones de la muestra de entrenamiento, pero además tiene otras 3.000 filas únicas, por lo que la evaluación del modelo no pudo verse afectada de forma significativa.

 
Así es como debe ser. El archivo se genera con números aleatorios.

En general, he sobrestimado la complejidad de la tarea. De hecho, ya está resuelto por el bosque. Te preguntarás cómo es posible teniendo en cuenta el funcionamiento del bosque.
Razón de la queja: