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

 
mytarmailS:

1) Sí, puede que tengas razón, pero esta red es capaz de aprender a tomar decisiones, no es la clasificación habitual sin maestro, y por lo tanto puedes implementar en ella el concepto del que he hablado durante mucho tiempo - puedes enseñarle no el objetivo estándar en forma de compra-sel-compra o 0001110101011, sino de forma más abstracta, como una simple condición como: "¡Net! No me importa cómo operas, pero quiero que tu beneficio sea al menos el 1% de 0,5% de reducción por día, y buscará las reglas y combinaciones para este propósito. Si me equivoco y digo tonterías aquí, por favor, corríjanme por mi propio bien).

Cierto, no había pensado en eso, así es. Entonces es mejor condicionar la red neuronal para maximizar el sharpe ratio (o factor de recuperación), y hacer en R algo así como un simple forex tester sobre cotizaciones reales para probar el modelo y evaluar la evolución. Pero el milagro no se producirá por sí solo, el problema del reentrenamiento seguirá existiendo, los datos deben seguir dividiéndose en muestras de entrenamiento y de prueba, y deben realizarse validaciones cruzadas para la estimación final del modelo durante su evolución. Como trabajar con el ratio de sharpe en la validación cruzada no pude pensar rápidamente, en mi opinión no será posible eliminar barras al azar en la muestra de prueba, porque no es importante la precisión en cada barra, sino el comercio continuo en sí, con todos los drawdowns, spreads y comisiones para cada nuevo acuerdo.

Alexey Burnakov:

Parece que están preparando un paquete para R. Deberíamos tomar nota de ello.

Ya tengo el paquete, pero no sé en qué porcentaje está listo, por ahora en githab. He aquí un ejemplo más sencillo, continuación del artículo. Enseñan a la red a extraer la raíz.

http://gekkoquant.com/2016/07/17/rneat-square-root-neural-net-trained-using-augmenting-topologies-simple-example/

Lo terminé más tarde:

Hice una clasificación de iris, código en atachment por ejemplo (el modelo falló la clasificación, sustituí todas las clases con números para la regresión, y redondeado los resultados al nivel numérico más cercano. Probablemente se podría haber hecho de alguna manera más fácil).
Tomé sólo el 50% de los datos para el entrenamiento, en la validación el éxito fue del 95%, bastante bueno. A juzgar por el gráfico, el modelo incluso eliminó el primer predictor por sí mismo.

Forex es más complicado que Iris :) El resultado será mucho peor allí.

También me he dado cuenta de que las partes 3 y 4 del artículo utilizan funciones diferentes para entrenar el modelo.
La tercera parte consiste en simular cualquier proceso dinámico, por ejemplo, el modelo puede observar el gráfico de divisas y abrir/cerrar operaciones en tiempo real.
La cuarta parte consiste simplemente en entrenar el modelo con ejemplos listos y predecir el resultado

Archivos adjuntos:
 
Dr.Trader:

1) Cierto, no había pensado en eso, así es. Entonces es mejor dar a la red neuronal una condición para maximizar el ratio de sharpe (o factor de recuperación), y hacer en R algo así como un simple probador de divisas en cotizaciones reales

2) También he observado que las partes 3 y 4 del artículo utilizan funciones diferentes para entrenar el modelo.
La tercera parte consiste en simular algunos procesos dinámicos, por ejemplo, el modelo puede observar el gráfico de divisas y abrir/cerrar operaciones en tiempo real.
La cuarta parte consiste en entrenar el modelo con ejemplos listos y predecir el resultado

1) ¡Absolutamente correcto! eso es exactamente lo que quise decir, ganancia/pérdida sólo para el ejemplo, estaba pensando en tomar el factor de recuperación, pero el sharpe básicamente no es peor

2) Tienes razón, en el 4º artículo el autor ya ha hecho algo parecido a un paquete, para todos los estándares de "R", es máximo se tiene un modelo - un vector objetivo - predicción a través de "predict" - pero este enfoque no nos servirá, porque todas las funciones ya están ocultas en el paquete... Tenemos que entender el código fuente y escribir todo por nosotros mismos, por eso dije ayudar a entender ya que todo aquí es mucho más complicado que con el "paquete listo con ejemplos a él" Creo que incluso las funciones de la Parte 3 no será suficiente para lo que necesitamos. Así que sería fabuloso que todos nos pusiéramos de acuerdo

 
mytarmailS:

1) ¡Absolutamente cierto! Eso es exactamente lo que quería decir, la ganancia/pérdida es sólo un ejemplo, estaba pensando en tomar el factor de recuperación, pero el sharpe es básicamente lo mejor que hay

2) Tienes razón, en el 4º artículo el autor ya ha creado algo parecido a un paquete, según todos los estándares de "R", es sólo un modelo - un vector objetivo - predicción a través de "predict" - pero este enfoque no funcionará para nosotros, porque todas las funciones ya están ocultas en el paquete... Tenemos que entender el código fuente y escribir todo por nosotros mismos, por eso dije ayudar a entender ya que todo aquí es mucho más complicado que con el "paquete listo con ejemplos a él" Creo que incluso las funciones de la parte 3 no será suficiente para lo que necesitamos. Así que sería fabuloso que todos nos involucráramos

¿Quién os enseñará sino vosotros mismos? Consigue el código fuente. Estúdialo. Y también sobre la diferenciabilidad de la función. Necesitas alimentar una función suave en la red. Y tú nos lo dirás, y nosotros te daremos nuestros consejos.
 
Alexey Burnakov:
Necesitas alimentar una función suave en la red. Y tú nos dirás ), y nosotros te daremos nuestros consejos.

Perdona que me entrometa, pero no sólo suave, sino también normalizado.

Para que la NS nunca salga de sus zonas conocidas.

Algo así.

 

No puedo entender por qué se eligen estas redes.

¡Al fin y al cabo, han pasado de los paquetes cursis a la inmensidad de la R! Pero no, los viejos pecados siguen arrastrando y arrastrando ...

Por ejemplo, Caret. No sólo hay ciento cincuenta modelos, sino también un montón de útiles funciones de preprocesamiento y predicción...

Así que no, redes y redes...

 
SanSanych Fomenko:

No puedo entender por qué se eligen estas redes.

¡Al fin y al cabo, han pasado de los paquetes cursis a la inmensidad de la R! Pero no, los viejos pecados siguen arrastrando y arrastrando ...

Por ejemplo, Caret. No sólo hay ciento cincuenta modelos, sino también un montón de útiles funciones de preprocesamiento y predicción...

Así que no, redes y redes...

Así que, ¡muéstranos tu careto y ciento cincuenta modelos en acción! :)

 
Vadim Shishkin:

¡Así que muéstranos tu caret y ciento cincuenta modelos en acción pronto! :)

Por cierto, yo mismo uso caret y obtengo resultados satisfactorios en forex.

Tengo una muestra de código de mis experimentos:

####
##########
############## start experiment
##########
####

library(caret)
library(gbm)
library(doParallel)

        
# tuning GBM - перебор параметров обучения по сетке
gbmGrid <- expand.grid(interaction.depth = seq(from = 3, to = 9, by = 2)
                  , n.trees = seq(from = 600, to = 1200, by = 300)
                  , shrinkage = seq(from = 0.01, to = 0.02, by = 0.005)
                  , n.minobsinnode = seq(from = 30, to = 60, by = 30))

######################
# start training cycle - ввод основных переменных и массива для результатов

validating_arr <- data.frame()
max_best_models <- 1
counter <- 1
max_inputs <- 15
max_cv_folds <- 5
max_bag_fract <- 1
distributions <- c('gaussian', 'laplace')
start <- Sys.time()
        
for (best_inp_num in seq(from = 3, to = max_inputs, by = 3)){
        
        for (cv_folds in 2:max_cv_folds){
                
                for (bag_frac in seq(from = 0.2, to = max_bag_fract, by = 0.2)){

#########################
# prepare training scheme - параметры caret
                                        gbmControl <- trainControl(method = 'cv'
                                                                      , number = cv_folds
                                                                      , verboseIter = F
                                                                      , returnData = F
                                                                      , returnResamp = 'all'
                                                                      , savePredictions = 'none'
                                                                      , summaryFunction = mymetrics
                                                                      , search = 'grid'
                                                                      , allowParallel = T)

########################
# initiate paralleling
                        cores <- 4 #detectCores()
                        cl <- makePSOCKcluster(cores)
                        registerDoParallel(cl)
                        
                        # train the model - обучение моделей с кроссвалидацией. Используется GBM.
                        best_models <- train(training[, ncol(training)] ~.
                                                , data = training[, 1:(ncol(training) - 1)]
                                                , method = 'gbm'
                                                , distribution = distributions[2]
                                                , bag.fraction = bag_frac
                                                , metric = 'mae_improve'
                                                , maximize = T
                                                , trControl = gbmControl
                                                , tuneGrid = gbmGrid)
                        
                        # stop paralleling
                        stopCluster(cl)
                        
                        # summarize the model - сохранение n лучших моделей
                        best_models_arr <- as.data.frame(cbind(best_models[[4]][1]
                                                                    , best_models[[4]][2]
                                                                    , best_models[[4]][3]
                                                                    , best_models[[4]][4]
                                                                    , best_models[[4]][5]
                                                                    , best_models[[4]][6]
                                                                    , best_models[[4]][7]
                                                                    , best_models[[4]][8]))
                        
                        rm(best_models)
                        
                        best_models_arr_ordered <- best_models_arr[order(best_models_arr$mae_improve, decreasing = T), ]

# далее - обучение лучших моделей и их валидация


 
Gracias. :)
 
SanSanych Fomenko:

No puedo entender por qué se eligen estas redes.

¡Al fin y al cabo, han pasado de los paquetes cursis a la inmensidad de la R! Pero no, los viejos pecados siguen arrastrando y arrastrando ...

Por ejemplo, Caret. No sólo hay ciento cincuenta modelos, sino también un montón de útiles funciones de preprocesamiento y predicción...

Así que, no, redes y redes...

Por lo general, una biblioteca puede hacer mucho pero regular, o sólo una cosa con buena calidad. Caret es el primer caso, es fácil probar decenas de modelos y comparar resultados, pero es difícil mejorar algo para su tarea. Me he encontrado con grandes dificultades a la hora de seleccionar los predictores según mis reglas - caret puede simular el recocido para enumerarlos (y la genética), pero no puede tomar mi función de aptitud para la estimación. Tengo que crear un nuevo modelo para caret con funciones de entrenamiento, validación y fitness; pero caret seguirá controlando las muestras de datos de entrenamiento y de prueba mediante sus propias reglas, con sus propias validaciones cruzadas.
Es más fácil para mí tomar el paquete GA o GenSA para enumerar los predictores, y escribir sólo una función de fitness, que creará tanto el modelo como la validación cruzada de acuerdo con las reglas que necesito.

Neuronka no es peor que el bosque, mis resultados con él están en el plus, o en el peor de los casos sólo sin perder un depósito. Debido a los diferentes algoritmos, neuronka preferirá diferentes predictores que forest, pero todas las reglas de selección de predictores son completamente las mismas que para forest.

Para transferir el neuronc a mt5 EA es cuestión de un par de minutos (guardar los pesos de R en csv, leerlos en el EA). Transferir forest a mt5 será mucho más difícil, por eso prefiero neuronka.

 

Experimenté un poco más con RNeat y llegué a la conclusión de que no se puede manejar de la misma manera que las redes neuronales convencionales.

1) A diferencia de los modelos convencionales, el entrenamiento de RNeat no utiliza datos de entrada. El modelo se genera de forma aleatoria, se mejora y sólo al final se prueba con los datos brutos. Normalmente, los modelos utilizan datos brutos, construyen su lógica a partir de ellos y luego utilizan el muestreo de validación para ver si la lógica del modelo es correcta o si simplemente ha aprendido los ejemplos brutos. A diferencia de los demás, RNeat no es capaz de memorizar los datos brutos en absoluto, ya que no los conoce, todo lo que el modelo sabe son los resultados requeridos y lo cerca que está de ellos.

2) La validación cruzada no ayudará a mejorar los resultados del fronttest. Parece que todos estamos de acuerdo en que es posible entrenar un modelo normal, ejecutar un par de validaciones cruzadas y manejar de alguna manera los errores de todas las muestras para la puntuación final de aptitud del modelo. Como RNeat no conoce los datos en bruto, no le importa si los datos están en una muestra de entrenamiento o de prueba, ajustará su lógica al resultado deseado en cualquier caso. Teóricamente "aprenderá" (más exactamente mutará :) ) de todas las muestras que se utilizan en la función de fitness. Lo único que se puede hacer es entrenar el modelo con la precisión adecuada y esperar que no se sobreentrene, un enfoque bastante arriesgado para el mercado de divisas. La validación cruzada sólo se puede utilizar después del entrenamiento, como una estimación final del posible resultado en el fronttest, y de ninguna manera utilizar esta muestra de validación dentro de la función de fitness.

Razón de la queja: