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

 

El estado actual de mi experimento.

Después de arreglar los errores en el código, en mis datos, de hecho, tengo los siguientes resultados en la validación.

El gráfico enumera los pares de divisas, los horizontes de previsión y las llamadas zonas grises, es decir, los intervalos de valores a la salida de la máquina de previsión, cuando no se toman decisiones de entrada en el mercado.

Como puedes ver ya tengo una MO positiva para varios pares. Para el EURUSD el máximo. Al mismo tiempo, hago el experimento aún más preciso, utilizando spreads reales para todos los pares (de mi CC):

spreads <- as.data.frame(cbind(

c('audusd'

, 'eurusd'

, 'gbpusd'

, 'usdcad'

, 'usdchf')

, c(0.00018

, 0.0001

, 0.00014

, 0.00013

, 0.00012)

)

)

Ahora he empezado un experimento de generalización muy potente, en el que se van a comprobar aún más parámetros, y que durará aproximadamente una semana. Habrá unas 60 veces más estimaciones. Pero entonces seguro que tendré buenos resultados para comparar. Y, como prometí en algún sitio, colgaré el Asesor Experto (entrenado) con la lógica básica lista para probar. Puedes seguir desarrollándolo. Voy a mejorarlo para mí añadiendo diferentes potenciadores directamente al código MQL.

Hablamos pronto.

 
Alexey Burnakov:

No, ciertamente no entiendes la importancia de la no estacionalidad. No importa si es un modelo NS o lineal o mi modelo, si sus datos son no estacionarios entonces las dependencias encontradas en ellos están garantizadas para no ocurrir fuera de la muestra. Todos los datos que tiene en forma de: precio bruto, MA(precio bruto), apertura de barra(precio bruto), etc. deben ser eliminados del modelo. Hay que tomar la diferencia con el último precio conocido.

En este caso no es posible escalar en un intervalo.

No es tan malo. Si considera cada ejemplo de entrenamiento por separado (es decir, si normaliza por una fila de la tabla de entrenamiento), puede normalizar todos los datos por grupos, por separado en cada ejemplo de entrenamiento. Por ejemplo, tome las columnas o,h,l,c para todas las 100 barras (400 en total) dentro de un ejemplo de entrenamiento, encuentre su mínimo y máximo, y escanéelos. Esto debe repetirse para cada ejemplo de entrenamiento por separado. Esta normalización asegurará que el precio en la tabla de entrenamiento para cada fila estará siempre en el rango [0...1]. Ahora bien, si en el futuro obtenemos un nuevo ejemplo, cuyo precio ha ido mucho más allá de los precios durante el entrenamiento, la normalización lo devolverá al rango [0..1] y no será una nueva región de datos desconocida para la red neuronal. El modelo entrenado puede encontrar y reconocer algunas reglas como "el precio al menos una vez durante las últimas N barras fue superior a 0,8" y esta regla se aplicará a cualquier dato nuevo, incluso si el precio ha caído a la mitad.

Si normalizamos cada columna por separado, como solemos hacer, los resultados del modelo en el fronttest serán peores. Las dependencias entre los predictores del mismo tipo dentro de un ejemplo de entrenamiento se pierden. (por ejemplo Abrir[1], Abrir[2], Abrir[3]... del mismo ejemplo de entrenamiento se escaneará en diferentes intervalos, según todos los ejemplos de entrenamiento). Además, existe el problema de que la normalización durante el entrenamiento se basará en miles de ejemplos de entrenamiento, mientras que en el comercio real sólo tendremos una línea que deberá ser escalada en ondas consigo misma, lo cual no es claro y es extraño.

Si no haces ninguna normalización, puedes salirte con la tuya. Pero si el precio cae/sube más allá del intervalo disponible para el entrenamiento - será una región de datos nueva y absolutamente desconocida para el modelo. No lo sacará y se estrellará.

Todo esto es estrictamente para la red neuronal, desde la experiencia.

 

Hice un poco más de trabajo con la pca de escala Y. Encontré un buen artículo con fórmulas de dispersiónhttp://www.chemometrics.ru/materials/textbooks/pca.htm, hice una en R.

Código básico del mismo artículohttp://www.r-bloggers.com/principal-components-regression-pt-2-y-aware-methods/
Tenemos que ejecutar el código"princ <- prcomp(dmTrain, center = FALSE, scale. = FALSE)" y parar. siguiente:

extractProjection <- function(ndim,princ) {
  return(princ$rotation[,1:ndim]) #Эта функция уже была определена ранее, но в этот раз нельзя менять знаки в матрицах как раньше
}
countOfComponentsToUse <- ncol(princ$x) # сюда можно в цикле подставлять числа от 2 до ncol(princ$x), увеличивая число компонент до необходимой точности
PCnameList <- colnames(princ$x)[1:countOfComponentsToUse]
proj <- extractProjection(countOfComponentsToUse, princ)
residualsMatrix <- dmTrain - ((princ$x[,1:countOfComponentsToUse]) %*% (t(proj)))
V0 <- sum(residualsMatrix*residualsMatrix)/nrow(dmTrain)
TRV <- V0/ncol(dmTrain)                           #полная дисперсия остатков (средний квадрат ошибок)
ERV <- 1-nrow(dmTrain)*V0/sum(dmTrain*dmTrain)    #объяснённая дисперсия остатков, нужно увеличивать число компонент если ERV < 0.95

Lo esencial es lo siguiente: el objeto princ contiene una matriz de billetes (princ$x) y una matriz de cargas (princ$rotación). Si multiplicamos estas dos matrices princ$x %*% t(princ$rotación), obtenemos de nuevo la tabla original con los datos de dmTrain (escalados por Y, sin variable objetivo).

Es posible limitar el número de componentes principales, y entonces se determinarán los datos originales con cierto margen de error. Si recuerdas el internet lento y las imágenes jpeg especiales que se agudizan al cargarlas, entonces obtienes algo similar, más número de componentes principales darán un ajuste exacto a los datos iniciales.

Para el número de componentes N, los datos iniciales se definen como sigue: princ$x[,1:N] %*% t(princ$rotación[,1:N]). El error se puede calcular restando la matriz resultante de dmTrain, se obtiene la matriz residualsMatrix. Estos son los errores, cuánto difieren los datos reales de los datos encontrados. TRV es la media de los cuadrados de error. ERV es algo así como el error medio. Si ERV=0,8, los datos de origen diferirán de los encontrados en un ~20% en cada celda de la tabla. Es decir, si encuentras un número 10, lo más probable es que los datos originales fueran del 8 al 12. Esta es una definición muy aproximada, pero tiene más sentido. Y el ERV debe ser al menos 0,95 para que el modelo PCA contenga suficientes componentes.

¿Qué se consigue con ello? Puede añadir un nuevo parámetro tol a princ <- prcomp(dmTrain, center = FALSE, scale. = FALSE, tol=0.01), así no generará miles de componentes principales y la generación se detendrá cuando el sdev del nuevo componente sea < sdev(PC1) * tol. A continuación, el número de componentes utilizados puede ajustarse con la función anterior, empezando por 2 y aumentando gradualmente en 1.

He intentado averiguar cómo aplicarlo para cribar los predictores, pero aún no se me ocurre nada. Puede, por ejemplo, sustituir la carga por 0 para un predictor en princ$rotation, recalcular ERV y ver cuánto empeora el resultado. Sin embargo, no veo el sentido de esta acción, no está claro cómo aplicar este resultado. Tal vez así podamos encontrar predictores correlacionados que no aporten ninguna información nueva y, por tanto, su eliminación probablemente no empeore el resultado. Me gustaría encontrar predictores de ruido, pero en estas matrices no hay ninguna conexión con las variables objetivo, es decir, no hay ningún criterio para saber qué es ruido y qué no.

 
Dr.Trader:

Hice un poco más de trabajo con la pca de escala Y. Encontré un buen artículo con fórmulas de dispersiónhttp://www.chemometrics.ru/materials/textbooks/pca.htm, hice una en R.

Código básico del mismo artículohttp://www.r-bloggers.com/principal-components-regression-pt-2-y-aware-methods/

He vuelto a leer el artículo. Parece que no intentas repetir el ejemplo del artículo, sólo punto por punto, sustituyéndolo por tus datos. ¿O me he perdido algo? Si no, ¿por qué no?
 

Repetí el ejemplo. Reemplazado con mis propios datos, obtuve más de 100 componentes principales para una varianza de 0,95. He mirado los gráficos de registro, no he visto ningún buen predictor que destaque. Es decir, mientras que el autor ve en sus datos que puede mantener 2 componentes principales y 5 predictores, yo veo en mis datos más de 100 componentes y más de 1000 predictores (los lowadings disminuyen paso a paso, ni siquiera está claro cuál es el valor del umbral para la eliminación de los lowadings).

Sin embargo, debo reconocer el mérito de Y-Aware PCA, ya que sustituí mis datos sin preevaluación, construí un modelo Y-Aware PCA con ellos y obtuve un error del 45% en la prueba frontal. Todavía no es rentable para el forex, pero el artículo termina ahí, así que si voy a usar el pca de y, entonces tengo que inventar algo más.

De otras maneras puedo dejar sólo una docena de predictores, entrenar nnet, y obtener un error fronttest de sólo el 30%. Me gustaría obtener un resultado similar con el pca y-aware.
 
Dr.Trader:

Repetí el ejemplo. Reemplazado con mis propios datos, obtuve más de 100 componentes principales para una varianza de 0,95. He mirado los gráficos de registro y no he visto ningún buen predictor que destaque. Es decir, mientras que el autor ve en sus datos que puede mantener 2 componentes principales y 5 predictores, yo veo en mis datos más de 100 componentes y más de 1000 predictores (los lowadings disminuyen paso a paso, ni siquiera está claro qué valor de umbral de lowadings debe eliminarse).

Sin embargo, debo reconocer el mérito de Y-Aware PCA, ya que sustituí mis datos sin preevaluación, construí un modelo Y-Aware PCA con ellos y obtuve un error del 45% en la prueba frontal. Para el forex no es rentable todavía, pero el artículo termina ahí, así que si utilizo el pca de y entonces tengo que idear otra cosa.

De otras maneras puedo dejar sólo una docena de predictores, entrenar nnet, y obtener un error fronttest de sólo el 30%. Me gustaría obtener un resultado similar con el pca y-aware.
Creo que hay que repetirlo letra por letra. Hay paquetes utilizados excepto pca, que no he visto con usted.
 

https://c.mql5.com/3/97/Principal_Components_Regression__1.zip

Aquí está el código R del artículo, los archivos _03.txt y _04.txt, he ejecutado todo esto en mis datos antes. Incluso se ha añadido una comprobación de los datos de fronttest en _04.txt. La única diferencia que veo es el paquete etal que se ofrece al final del artículo. Pero ni siquiera hay ejemplos, sólo sugieren probar y comparar el resultado con lo que hace vtreat prune.

 
Dr.Trader:

https://c.mql5.com/3/97/Principal_Components_Regression__1.zip

Aquí está el código R del artículo, los archivos _03.txt y _04.txt, he ejecutado todo esto en mis datos antes. Incluso se ha añadido una comprobación de los datos de fronttest en _04.txt. La única diferencia que veo es el paquete etal que se ofrece al final del artículo. Pero ni siquiera hay ejemplos, sólo se ofrecen para tratar de comparar el resultado con lo que hace vtreat prune.

Parece bastante sólido.

Entonces, ¿no hay ningún resultado útil?

 

Mi artículo sobre la selección de características.

https://habrahabr.ru/company/aligntechnology/blog/303750/

Методические заметки об отборе информативных признаков (feature selection)
Методические заметки об отборе информативных признаков (feature selection)
  • habrahabr.ru
Всем привет! Меня зовут Алексей. Я Data Scientist в компании Align Technology. В этом материале я расскажу вам о подходах к feature selection, которые мы практикуем в ходе экспериментов по анализу данных. В нашей компании статистики и инженеры machine learning анализируют большие объемы клинической информации, связанные с лечением пациентов...
 

¡Hola!

Tengo una idea, quiero comprobarla, pero no conozco la herramienta para ponerla en práctica... Necesito un algoritmo que sea capaz de predecir para unos pocos puntos por delante, digamos para 3 o 5 (preferiblemente una red neuronal)

Sólo he trabajado con clasificaciones, así que ni siquiera entiendo cómo debería ser, aconsejar a alguien cómo hacerlo o recomendar un paquete en R

p.d. Gran artículo Alexey

Razón de la queja: