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

 
Dr. Trader:

Ya he puesto aquí ejemplos de neuronas, buscaré algo adecuado y lo reharé para tus datos (y con una comisión). No escribiré conferencias introductorias, pero añadiré más comentarios al código.


Lo siento, no entiendo el significado de la variable con(F,T) En el bucle

for(i in c(1:nrow(table))[c(F,T)]){
   ..... table[i,] ..... 
}

Es decir, este bucle va en las filas pares de la tabla, pero entonces ¿cómo hacerlo en las impares?

 

F y T son abreviaturas para los valores booleanos FALSO y VERDADERO, en principio no importa si se escribe c(T,F) o c(VERDADERO,FALSO), la primera variante es simplemente más corta.

Si la tabla tiene 10 filas, entonces c(1:nrow(table)) es sólo un vector de c(1,2,3,4,5,6,7,8,9,10).
Y los arrays con valores booleanos en este caso harán un bucle hasta la longitud requerida, se obtiene c(TRUE,FALSE,TRUE,FALSE,TRUE,FALSE,TRUE,FALSE).

es decir, c(1:nrow(table))[c(F,T)] R se entenderá como
c(1,2,3,4,5,6,7,8,9,10)[c(TRUE,FALSE,TRUE,FALSE,TRUE,FALSE]
y toma los elementos del vector que coinciden con TRUE en orden.

Por ejemplo, si queremos tomar uno de cada tres elementos, podemos escribirlo como
c(1,2,3,4,5,6,7,8,9,10)[c(FALSE,FALSE,TRUE,FALSE,FALSE,FALSE,TRUE,FALSE]
o abreviado
c(1:10)[c(F,F,T)]


Para los elementos impares basta con intercambiar T y F: c(1:nrow(table))[c(T,F)].

 
Dr. Trader:

F y T son abreviaturas para los valores booleanos FALSO y VERDADERO, en principio no importa si se escribe c(T,F) o c(VERDADERO,FALSO), la primera variante es simplemente más corta.

Si tienes 10 filas en la tabla, entonces c(1:nrow(table)) es simplemente el vector c(1,2,3,4,5,6,7,8,9,10).
Y los arrays con valores booleanos en este caso harán un bucle hasta la longitud requerida, se obtiene c(TRUE,FALSE,TRUE,FALSE,TRUE,FALSE,TRUE,FALSE).

es decir, c(1:nrow(table))[c(F,T)] R se entenderá como
c(1,2,3,4,5,6,7,8,9,10)[c(TRUE,FALSE,TRUE,FALSE,TRUE,FALSE]
y toma los elementos del vector que coinciden con TRUE en orden.

Por ejemplo, si queremos tomar uno de cada tres elementos, podemos escribirlo como
c(1,2,3,4,5,6,7,8,9,10)[c(FALSE,FALSE,TRUE,FALSE,FALSE,FALSE,TRUE,FALSE]
o abreviado
c(1:10)[c(F,F,T)]


para los elementos impares sólo hay que intercambiar T y F: c(1:nrow(table))[c(T,F)]

Gracias por no molestarse en escribir descripciones tan detalladas. De hecho, se aclaran muchas cosas. Me da vergüenza incluso preguntar, pero me decidiré. La esencia del problema es la siguiente.....

El archivo de formación consta del mismo número de clases por objetivo. En otras palabras, tengo 24 unos y 24 ceros en el objetivo. De nuevo, quiero hacer como Reshetov.....

He dividido la tabla de entrenamiento en dos tablas, una con todos los vectores donde el objetivo es 1 y la otra donde el objetivo es 0.

Tomo la tabla con el objetivo 1 y luego necesito crear dos subtablas, donde los vectores pares en el Tren1, y los impares en el Tren2.

Primero lo hacemos para los números pares.

for(i in c(1:nrow(Qwe_true))[c(F,T)]){
  Train1[i,]<-Qwe_true[i,]
  }

Pero entonces la tabla Train1 contendrá filas c NA, y la necesidad de Train1 fue creada con 12 filas, porque sólo 12 de 24 filas son pares. No tengo ni idea de cómo hacerlo....

 

Por favor.

Para R se necesita una forma diferente de pensar, hay que operar mentalmente los vectores, entonces el código es bastante sencillo de escribir. Los profesionales escriben tales cosas en una línea, que ni siquiera entiendo, y yo mismo escribiría ciclos en varias líneas.

Tren1 <- rbind(Qwe[which(Qwe[, "target"]==1)[c(T,F)], ], Qwe[which(Qwe[, "target"]==0)[c(T,F)], ])
Tren2 <- rbind(Qwe[which(Qwe[, "target"]==1)[c(F,T)], ], Qwe[which(Qwe[, "target"]==0)[c(F,T)], ])

en pasos -
which(Qwe[, "target"]==1) - el número de líneas con objetivo 1
which(Qwe[, "target"]==1)[c(T,F)] - número de líneas con target1, saltando 1
Qwe[which(Qwe[, "target"]==1)[c(T,F)], ] - la tabla obtenida de Qwe, con un objetivo 1 con un espacio en 1
rbind(... , ...) - fusiona dos tablas (con destino 1 y con destino 0)

 
Dr. Trader:

Por favor.

Para R se necesita una forma diferente de pensar, hay que operar mentalmente los vectores, entonces el código es bastante sencillo de escribir. Los profesionales escriben cosas en una línea que ni siquiera entiendo, y yo mismo escribiría ciclos de varias líneas.

Tren1 <- rbind(Qwe[which(Qwe[, "target"]==1)[c(T,F)], ], Qwe[which(Qwe[, "target"]==0)[c(T,F)], ])
Tren2 <- rbind(Qwe[which(Qwe[, "target"]==1)[c(F,T)], ], Qwe[which(Qwe[, "target"]==0)[c(F,T)], ])

Eres un monstruo. Dos líneas, eso te quita un peso de encima. Muy bien, seguiré trabajando en ello... Gracias.

 
El viernes por la noche... mi cabeza no se siente muy bien. ¿Qué tal si probamos la teoría juntos.... Con tus habilidades de escritura en R y mi capacidad de plantear problemas (precisión) podríamos haberlo comprobado todo en media hora? ¿Hay tiempo? Dr.Trader
 
No, sigue aprendiendo. Ayudaré si hay alguna pregunta.
 

A estas dos muestras hay que añadir dos más.

MLP1=Entrenamiento1+Prueba(Entrenamiento2)

MPL2=Entrenamiento2+Prueba(Entrenamiento1)

Si sumamos Test(Train2)+Test(Train1), obtendremos el resultado de toda la sección de entrenamiento, y esta sección será un test, para cada uno de los polinomios.

Tal vez se tome el tiempo, si no es posible en este momento. Pero es media hora y te has asegurado. Sólo quiero hacer un espejo. Tomaré el mismo archivo y lo enseñaré de dos maneras. Entonces lo lanzaremos todo en el sitio de control y lo veremos todo. ¿Qué dices?

 

puede combinar las tablas utilizando la función rbind()
MLP1 <- rbind(Train1, Test)

¿Qué es Test(Train2)? ¿Y por qué hay que combinar la tabla de entrenamiento y la tabla de pruebas? La prueba debe ser independiente, para probar el modelo entrenado en ella.

No todo saldrá tan fácil y rápido como usted quiere. En el modelo de Reshetov sólo hay que introducir los datos y el propio modelo seleccionará los predictores, determinará los pesos, el número de neuronas, etc. Pero no puedes hacerlo con una neurona normal, necesitas seleccionar los parámetros para la neurona por medio de una validación cruzada, por ejemplo como en el ejemplo que escribí hoy aquí, o como en los artículos de Vladimir Perervenko.


Mira de nuevo lo que escribí allí -https://www.mql5.com/ru/forum/86386/page753#comment_6821981
Sólo tienes que pegar en ese código tus datos como se describe y ejecutar. Si se toman todos los predictores uno por uno y no se eliminan, entonces desde la primera vez será probablemente demasiado malo. Después de ejecutar el código ejecute el comandomax(gaResult@fitness) adicionalmente, esto mostrará la puntuación R2 del mejor modelo encontrado por la genética. Si la estimación es cercana a 1 o inferior es buena, si es cercana a 0 o incluso negativa es mala.

A continuación, enPREDICTOR_COLUMNS especifique el número exacto de columnas que ha identificado como buenas y, una vez más, ejecute el código, el modelo se entrenará sólo con estos predictores. Lo ideal es que la mejor evaluación del modelo por parte de la genética sea cercana a 1 y que la precisión en la tabla de entrenamiento y prueba sea de 1,00.

La tabla de pruebas debe programarse estrictamente después de los datos de entrenamiento, como si este modelo ya estuviera operando en el mercado.

Si no ocurre nada bueno con ese código (incluso conKFOLDS=10) - entonces no es bueno. Si funciona, entonces hay una buena alternativa al modelo de Reshetov y podemos seguir ordenando el código y exportar el modelo a mql.

 

Lo que quiero decir es que si se hace algo como en el modelo de Reshetov, se añade algo extra, luego se toma una neurona ordinaria y se mezcla de alguna manera con los pasos anteriores, y se espera que todo funcione como en el de Reshetov - resultará un largo proceso inútil, que definitivamente no suscribo.

Si quiero el mismo resultado que el de Reshetov, pero en R, entonces tengo que reescribir todo el código java del modelo en R.

Pero hay muchas alternativas. Si funcionan incluso mejor que los de Reshetov, entonces es perfecto, no necesitas nada más, todo está listo.