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

 
Mihail Marchukajtes:
Sí, estaba haciendo lags porque en versiones anteriores aumentan la potencia de envolvimiento, ahora con el algoritmo de prefetching mejorado no es necesario, así que estoy intentando entrenar sin ellos. Veremos y observaremos. Informaré sobre mis resultados más adelante.

Si el truco no funciona, es decir, la capacidad de generalización sin rezagos no aumenta, entonces lo más probable es que las versiones 13 y 14 sean algún tipo de dirección no universal, personalizada para un rango estrecho de tareas?

En ese caso, tendrá que volver a hacer GIT para mover jPrediction de una manera diferente, más universal.

Aunque existe una segunda hipótesis: la presencia de rezagos en la muestra es una dirección estrecha y no universal, para la cual se afinaron las versiones anteriores?

 
Yury Reshetov:

Si el truco falla, es decir, la generalizabilidad sin rezagos no mejora, entonces lo más probable es que las versiones 13 y 14 sean alguna dirección no universal, afinada para un rango estrecho de tareas?

En ese caso, tendremos que volver a hacer el GIT para mover jPrediction de una manera diferente, más universal.

Aunque existe una segunda hipótesis: la presencia de rezagos en la muestra es una dirección estrecha y no universal, para la cual se afinaron las versiones anteriores?

Bueno, vamos a ver qué pasa... Informaré enseguida en cuanto practique...
 
Dr.Trader:

Entonces responderé aquí.

#пара строк из той таблицы, не буду я всё текстом копировать, потом первая строка повторена ещё дважды
dat <- data.frame(cluster1=c(24,2,13,23,6), cluster2=c(5,15,13,28,12), cluster3=c(18,12,16,22,20), cluster4=c(21,7,29,10,25), cluster5=c(16,22,24,4,11), target.label=c(1,1,0,1,0))
dat <- rbind(dat, dat[1,], dat[1,])
#результат последней строки поменян на 0 для эксперимента
dat[7,"target.label"]=0

library(sqldf)
#для sqldf точек в названиях колонок быть не должно
colnames(dat)[6] <- "target"

dat1 <- sqldf( "select cluster1, cluster2, cluster3, cluster4, cluster5, avg(target) as target_avg, count(target) as target_count from dat group by cluster1, cluster2, cluster3, cluster4, cluster5" )
dat1
dat1[ dat1$target_count>=10 & dat1$target_avg>0.63 , ]
dat1[ dat1$target_count>=10 & ( dat1$target_avg<0.37 | dat1$target_avg>0.63 ), ] #на случай если оба "0" или "1" встречаются чаще 70%

Gracias, ¡¡¡solución muy compacta!!!

Por favor, ayuda con un matiz más en la cadena


dat1 <- sqldf( "select cluster1, cluster2, cluster3, cluster4, cluster5, avg(target) as target_avg, count(target) as target_count from dat group by cluster1, cluster2, cluster3, cluster4, cluster5" )

¿Cómo puedo reemplazar los nombres de los clusters selectivos con una variable digamos

colnames_dat <- colnamed(dat) [-"target"]
dat1 <- sqldf( "select colnames_dat, avg(target) as target_avg, count(target) as target_count from dat group by colnames_dat" )

porque habrá 500 o quizás incluso 1000 clusters en la realidad, sería poco realista escribir el nombre de cada cluster manualmente, y la solución no funciona de frente

 
Mihail Marchukajtes:
Bueno, a ver cómo va... Ya os contaré en cuanto lo practique...

La cuestión es que antes de la versión 13, los predictores que estaban más cerca del principio de la muestra se procesaban con mayor probabilidad. Y los que estaban al final de la muestra (más cerca de la variable objetivo) se procesaron con menor probabilidad. Es decir, si los predictores más significativos se colocan de antemano a la izquierda en la muestra y los menos significativos a la derecha, se obtiene una buena capacidad de generalización. Si es al revés, entonces pobre. El problema era que esto requería saber de antemano qué predictores eran los más significativos, es decir, clasificarlos previamente en la muestra por su importancia. Pero en ese caso, el propio algoritmo de selección de predictores no era muy eficiente.

En la versión 14, la probabilidad de procesamiento de todos los predictores es prácticamente la misma. Pero esto crea otro problema. Al fin y al cabo, el algoritmo de ajuste del predictor funciona con un método de búsqueda de gradiente, desplazando un paso cada vez hacia el aumento de la generalización. Al mismo tiempo, tiene un riesgo no nulo de quedarse "atascado" en un extremo local, como otros métodos de gradiente. Antes de la versión 12, este riesgo se mitigaba mediante la preclasificación de los predictores en la muestra.

En general, hay problemas tanto en la primera como en la segunda versión del algoritmo y tenemos que analizarlos para eliminarlos. Por ejemplo, introducir en el algoritmo algunos saltos aleatorios durante varios pasos en diferentes direcciones desde el estado actual, para "saltar" los "barrancos".

 
mytarmailS:

> clusternames <- paste(colnames(dat)[-ncol(dat)], collapse=",")
>
clusternames
[1] "cluster1,cluster2,cluster3,cluster4,cluster5"
> sql_query <- paste0("select ", clusternames, ", avg(target) as target_avg, count(target) as target_count from dat group by ", clusternames)
>
sql_query
[1] "select cluster1,cluster2,cluster3,cluster4,cluster5, avg(target) as target_avg, count(target) as target_count from dat group by cluster1,cluster2,cluster3,cluster4,cluster5"
> dat1 <- sqldf( sql_query )
>
dat1

 
Yury Reshetov:

para "saltar" por encima de los "barrancos".

A veces, la optimización L-BFGS se incorpora a las neuronas, permite salir de los barrancos. El paquete neural nnet, por ejemplo.

Hay mucha matemática ahí, no sé cómo funciona, pero la idea es descender no por la pendiente, sino por la pendiente de la pendiente (derivada de la derivada).

 
Vizard_:
1) Ejemplo correcto y primitivo(si no hay redes o etc., empieza a "inventarlo"))
2) Sólo por qué buscar el 70%, cuando se puede encontrar y utilizar el 100 (no por el precio, por supuesto).

1) sí, sí, tienen ese pecado )) lo describí en párrafos sobre las ventajas de "mi" enfoque

2) Buscaré combinaciones en los retrocesos, no es sólo una dirección o color de la vela sino un retroceso hacia arriba, hacia abajo, no un retroceso

En principio tengo muchas menos observaciones de las que necesito, pero si todo funciona estaré contento con el 40% de los resultados, ni siquiera necesito el 70% ya que mi riesgo objetivo será de 1 a 5

Dr.Trader:

Muchas gracias, poco a poco prepararé los datos, luego los agruparé, luego buscaré los patrones y les haré saber los resultados

 
Dr.Trader:

A veces, la optimización L-BFGS está incorporada en neuronki, permite salir de los barrancos. El paquete neuronki nnet, por ejemplo.

BFGS y sus derivados, como L-BFGS, están diseñados para resolver el problema que jPrediction ya ha resuelto, es decir, encontrar los extremos locales. Es decir, estos algoritmos permiten "salir" de los "barrancos" en dirección a los extremos más cercanos en lugar de "saltar" sobre los barrancos para buscar extremos alternativos.

Necesitamos algoritmos "saltadores". Y es deseable que "salten" no al azar, sino en alguna dirección potencialmente prometedora. En teoría, esto puede llevarse a cabo a través de la genética, donde dichos "saltos" se realizan a través de mutaciones. Pero los algoritmos genéticos son muy lentos y son más adecuados para aquellas tareas en las que se puede comprobar la existencia de posibles descendientes con un consumo de tiempo mínimo. Entrenar una neurona para calcular su generalizabilidad lleva mucho tiempo, por lo que la genética sería demasiado lenta en este caso.

Bien, a falta de una mejor, actualmente estoy probando una variante con "saltos" aleatorios.

 

Otro libro de R. Lo voy a fijar aquí, ya que no está claro dónde más ir. Déjalo estar.

S.E. Mastitsky, V.K. Shitikov

ANÁLISIS ESTADÍSTICO Y VISUALIZACIÓN DE DATOS CON R

Archivos adjuntos:
 

Si busca patrones como mytarmailS, deslizando por barra, cada patrón contendrá información sobre el intervalo que pueden tener los valores de cada barra. Cuantos más patrones, menos intervalo se establecerá para cada barra.

A grandes rasgos, para que una determinada ventana con datos nuevos se incluya en algún patrón encontrado con anterioridad, debe caer dentro de esos límites veriticos inherentes a todo patrón.

Si vas a buscar 1000 patrones, el ancho del "canal" de cada patrón será pequeño. Y como los nuevos datos son siempre ligeramente diferentes de los de entrenamiento, será difícil entrar en un canal tan estrecho, lo que dará lugar a errores.

Yo me guiaría por el británico de Occam: si se puede reducir el número de patrones y obtener el mismo resultado sin deterioro, mejor hacerlo.