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

 
mytarmailS:

Bien, si en lugar de añadir NA al final de"Y" y luego borrar el mismo NA, simplemente borro la última línea en SomeData, ¿no será lo mismo?

Realmente no entiendo la diferencia, tal vez ya me he sobrecalentado completamente ((

Exactamente lo mismo. Es que no lo hago así y no entendí tu solución.
 
mytarmailS:
No lo siento, pero no sé cómo, simplemente no funciona, cuántas veces lo he intentado, inténtalo a tu manera, que objetivo hice ya sabes, y dime cómo lo haces
Empaquetas todo con cualquier empaquetadora y adjuntas el archivo
 
SanSanych Fomenko:
Empaquetas todo con cualquier empaquetadora y adjuntas el archivo

Lo he intentado muchas veces, no funciona, me echa del foro y ya está...

Tome mis códigos, he publicado todo, el primer código es la creación de características, el segundo es el entrenamiento del modelo, usted será exactamente el mismo, hacer el entrenamiento y mostrar lo que tienes

 
mytarmailS:

Lo he intentado muchas veces, no funciona, me echa del foro y ya está...

Tome mis códigos, he publicado todo, el primer código es la creación de características, el segundo es el entrenamiento del modelo, usted será exactamente el mismo, hacer el entrenamiento y mostrar lo que tienes

Bien. Déjalo estar. Probaré el mío. Mañana
 
mytarmailS:

Al diferenciar, el desplazamiento es automático, ya que la serie se acorta en un elemento, por lo que basta con acortar la muestra (tabla con observaciones) en el último elemento

Hay dos cosas en el código que me inquietan:

1) dado que se utiliza ohlc para la predicción, no se puede utilizar la última barra para la predicción, ya que haremos la predicción al principio de la barra, y el hlc cambiará durante el tiempo de vida de toda la barra. Así que enseñamos el modelo usando la última barra completamente formada y luego predecimos usando la no formada. Eso no es correcto. Deberíamos desplazar el objetivo 2 barras en lugar de 1.
Un cambio de objetivo a 1 barra sería aceptable, si se utiliza sólo el precio de apertura para la predicción, haciendo caso omiso de alta, baja, cierre.

2) Está utilizando Cerrar en lugar de Abrir para el objetivo. ¿Es importante para algún tipo de estrategia, o sólo por diversión? Al fin y al cabo, solemos entrar en una operación al principio de una barra, y en la siguiente barra nueva o bien damos la vuelta, o bien salimos, o bien salimos. Y es importante que el modelo entrenado prediga el aumento de precios desde la apertura actual hasta la siguiente.
El cierre de la barra actual no tiene por qué coincidir con la apertura de la barra siguiente, es decir, si se toma el cierre como objetivo, se puede evitar el primer error, pero quizá se obtengan incrementos erróneos. Ahora lo he mirado, normalmente el cierre en la tabla de precios no coincide con la Apertura de la siguiente barra, por lo que tus valores objetivo son muy dudosos.

Si el candelabro está sobredimensionado, hay que sortearlo.
Tome una ventana móvil, las primeras cien barras (100 es sólo un número aleatorio, para su código el número mínimo de barras = 23, y si menos de ese candelabro comete errores), encontrar los valores de los indicadores, dejar sólo el último de ellos, encontrar objetivo relevante, añadir todo a la tabla final. Desplazamos la ventana hacia delante 1 compás, repetimos. Todo esto es decenas de veces más lento que contar todo de una vez, pero es más seguro. A continuación, se pueden comparar ambos resultados y sacar una conclusión sobre si existe o no un vuelco.

Sería bueno cambiar el tamaño de la ventana deslizante, y ver si los resultados cambian. Si cambian - entonces el indicador utiliza sus propios valores anteriores para el cálculo de los nuevos, en este caso el ancho de la ventana funcionará como algo así como un período exponencial dentro del propio indicador. Si el resultado va a cambiar, hay que aumentar la anchura de la ventana hasta que los resultados no cambien. El indicador puede tener su propio límite interno en cuanto al número de barras utilizadas, por ejemplo el zigzag en mt5 tiene este valor = 100 barras, es decir, un ancho de ventana superior a cien no afecta al resultado.

En primer lugar, pruebe este código para crear una tabla de entrenamiento/prueba. Compárelo con su tabla, si es 100% congruente, no verá ninguna sobrecarga, puede confiar en que Candlestick utilice los valores anteriores para identificar los nuevos
A continuación, intente aumentar indicatorDepth - anchura de la ventana deslizante, ver si cambia el resultado, y si usted puede encontrar un valor de indicatorDepth, cuando incluso el aumento no afecta el resultado.

if(!require(quantmod)){ install.packages("quantmod", dependencies = TRUE); library(quantmod) }
if(!require(rusquant)){ install.packages("rusquant", repos="http://r-forge.r-project.org", dependencies = TRUE); library(rusquant) }
if(!require(candlesticks)){ install.packages("candlesticks", repos="http://r-forge.r-project.org", dependencies = TRUE); library(candlesticks) }


tryCatch({
  load("SPFB.RTS.rdata")
}, error = function(e){
  getSymbols("SPFB.RTS", src = "Finam", period="5min", from = Sys.Date()-500)
  save(SPFB.RTS, finam.stock.list, file = "SPFB.RTS.rdata")
  SPFB.RTS <<- SPFB.RTS
  finam.stock.list <<- finam.stock.list
})

chart_Series(tail(SPFB.RTS, 100))


indicatorDepth <- 23

tryCatch({
  load("trainData.rdata")
}, error=function(e){
  trainData <<- matrix(NA, ncol=60, nrow = nrow(SPFB.RTS)-2)
  for(i in (indicatorDepth+1):(nrow(SPFB.RTS)-2)){
    X1  <- as.numeric(tail(CandleBodyLength(SPFB.RTS[max(1, i-indicatorDepth):i,]), 1))
    X2  <- as.numeric(tail(CandleLength(SPFB.RTS[max(1, i-indicatorDepth):i,]), 1))
    X3  <- as.numeric(tail(CSPDarkCloudCover(SPFB.RTS[max(1, i-indicatorDepth):i,]), 1))
    X4  <- as.numeric(tail(CSPDoji(SPFB.RTS[max(1, i-indicatorDepth):i,]), 1))
    X5  <- as.numeric(tail(CSPEngulfing(SPFB.RTS[max(1, i-indicatorDepth):i,]), 1))
    X6  <- as.numeric(tail(CSPGap(SPFB.RTS[max(1, i-indicatorDepth):i,]), 1))
    X7  <- as.numeric(tail(CSPHammer(SPFB.RTS[max(1, i-indicatorDepth):i,]), 1))
    X8  <- as.numeric(tail(CSPHarami(SPFB.RTS[max(1, i-indicatorDepth):i,]), 1))
    X9  <- as.numeric(tail(CSPInsideDay(SPFB.RTS[max(1, i-indicatorDepth):i,]), 1))
    X10 <- as.numeric(tail(CSPInvertedHammer(SPFB.RTS[max(1, i-indicatorDepth):i,]), 1))
    X11 <- as.numeric(tail(CSPKicking(SPFB.RTS[max(1, i-indicatorDepth):i,]), 1))
    X12 <- as.numeric(tail(CSPLongCandle(SPFB.RTS[max(1, i-indicatorDepth):i,]), 1))
    X13 <- as.numeric(tail(CSPLongCandleBody(SPFB.RTS[max(1, i-indicatorDepth):i,]), 1))
    X14 <- as.numeric(tail(CSPMarubozu(SPFB.RTS[max(1, i-indicatorDepth):i,]), 1))
    X15 <- as.numeric(tail(CSPNHigherClose(SPFB.RTS[max(1, i-indicatorDepth):i,],N = 3), 1))
    X16 <- as.numeric(tail(CSPNLowerClose(SPFB.RTS[max(1, i-indicatorDepth):i,],N = 3), 1))
    X17 <- as.numeric(tail(CSPOutsideDay(SPFB.RTS[max(1, i-indicatorDepth):i,]), 1))
    X18 <- as.numeric(tail(CSPPiercingPattern(SPFB.RTS[max(1, i-indicatorDepth):i,]), 1))
    X19 <- as.numeric(tail(CSPShortCandle(SPFB.RTS[max(1, i-indicatorDepth):i,]), 1))
    X20 <- as.numeric(tail(CSPShortCandleBody(SPFB.RTS[max(1, i-indicatorDepth):i,]), 1))
    X21 <- as.numeric(tail(CSPStar(SPFB.RTS[max(1, i-indicatorDepth):i,]), 1))
    X22 <- as.numeric(tail(CSPStomach(SPFB.RTS[max(1, i-indicatorDepth):i,]), 1))
    X23 <- as.numeric(tail(CSPTasukiGap(SPFB.RTS[max(1, i-indicatorDepth):i,]), 1))
    X24 <- as.numeric(tail(CSPThreeInside(SPFB.RTS[max(1, i-indicatorDepth):i,]), 1))
    X25 <- as.numeric(tail(CSPThreeMethods(SPFB.RTS[max(1, i-indicatorDepth):i,]), 1))
    X26 <- as.numeric(tail(CSPThreeOutside(SPFB.RTS[max(1, i-indicatorDepth):i,]), 1))
    X27 <- as.numeric(head(tail(nextCandlePosition(SPFB.RTS[max(1, i-indicatorDepth):i,]), 2), 1))
    X28 <- as.numeric(tail(TrendDetectionChannel(SPFB.RTS[max(1, i-indicatorDepth):i,]), 1))
    X29 <- as.numeric(tail(TrendDetectionSMA(SPFB.RTS[max(1, i-indicatorDepth):i,]), 1))
    target <- as.numeric(SPFB.RTS[i+2,"SPFB.RTS.Open"]) - as.numeric(SPFB.RTS[i+1,"SPFB.RTS.Open"])
    trainData[i,] <<- c(X1,X2,X3,X4,X5,X6,X7,X8,X9,X10,X11,X12,X13,X14,X15,X16,X17,X18,X19,X20,X21,X22,X23,X24,X25,X26,X27,X28,X29,target)
    cat(i, "/", nrow(SPFB.RTS)-2, "\n")
  }
  colnames(trainData)[-ncol(trainData)] <- paste0("pred",1:(ncol(trainData)-1))
  colnames(trainData)[ncol(trainData)] <- "target"
  save(trainData, file="trainData.rdata")
})

# trainData <- trainData[-(1:indicatorDepth),]
 
Dr.Trader:

Me preocupan dos cosas del código:

1) Dado que utilizamos ohlc para la predicción, la última barra no puede ser utilizada para hacer una predicción porque haremos la predicción al principio de la barra y hlc cambiará durante la vida de la barra. Así que enseñamos el modelo usando la última barra completamente formada y luego predecimos usando la no formada. Eso no es correcto. Deberíamos desplazar el objetivo 2 barras en lugar de 1.
Si usted cambia el objetivo a 1 barra, puede usar sólo el precio de apertura para hacer un pronóstico ignorando el alto, el bajo y el cierre.

No entiendo el problema: predecimos la posición del cierre actual respecto al cierre anterior, no conocemos la vela actual, conocemos la anterior porque ya está cerrada, por lo que es la anterior, luego todos los precios OHLC ya se han formado, no entiendo cuál es la cautela, cuál es el error

2) Está utilizando Cerrar en lugar de Abrir para el objetivo. ¿Es importante para algún tipo de estrategia o sólo por diversión? ........

Tomado absolutamente para nada, para la velocidad y la conveniencia

Si el candelabro está sobregirado, hay que sortearlo........

no entiendo esta pieza, ¿qué hace? ¿qué esSPFB.RTS.rdata?

¿de dónde viene? ¿y por qué se sobreescribe? ni idea(


tryCatch({
  load("SPFB.RTS.rdata")
}, error = function(e){
  getSymbols("SPFB.RTS", src = "Finam", period="5min", from = Sys.Date()-500)
  save(SPFB.RTS, finam.stock.list, file = "SPFB.RTS.rdata")
  SPFB.RTS <<- SPFB.RTS
  finam.stock.list <<- finam.stock.list
})

Y lo más importante, seguramente has intentado enseñar algo con los datos, ¿por qué no lo mencionas?

 
mytarmailS:

Y lo más importante, debes haber intentado entrenar algo con los datos, ¿por qué no lo mencionas?

El avance de la tabla de formación es de 16527 sobre 55857. En cuanto se cree, intentaré enseñarlo.

mytarmailS:

Predicción de la posición del cloze actual con respecto al cloze anterior

Eso depende de ti. Es simplemente extraño, ya que las estrategias habituales toman decisiones y abren operaciones al comienzo de una nueva barra.
Y entonces tienes que hacer una predicción y abrir una operación justo al final de la barra. Un poco incómodo, un nuevo bar en la terminal es fácil de coger. Pero "abrir la operación al final de la barra actual, un segundo antes de la apertura de una nueva barra, con la esperanza de que el precio de cierre actual sea ya definitivo" es demasiado vago para mí.

mytarmailS:

No entiendo esta pieza, ¿qué hace? ¿Qué esSPFB.RTS.rdata?

Citas descargadas. Descargado, guardado en rdata para no tirar a la basura cada vez que ejecutamos este script y no esperar segundos hasta que se descarguen. Si se descargaron antes y se guardaron en el archivo rdata, entonces se toman de él.

 
Dr.Trader:

Gracias

 
Dr.Trader:

Hay dos cosas en el código que me inquietan:

1) como usamos ohlc para la predicción, no podemos usar la última barra para la predicción, porque lo haremos al principio de la barra y hlc cambiará durante la vida de la barra. Así que enseñamos el modelo usando la última barra completamente formada y luego predecimos usando la no formada. Eso no es correcto. Deberíamos desplazar el objetivo 2 barras en lugar de 1.
Un cambio de objetivo a 1 barra sería aceptable, si se utiliza sólo el precio de apertura para la predicción, haciendo caso omiso de alta, baja, cierre.

2) Está utilizando Cerrar en lugar de Abrir para el objetivo. ¿Es importante para algún tipo de estrategia, o sólo por diversión? Al fin y al cabo, solemos entrar en una operación al principio de una barra, y en la siguiente barra nueva o bien damos la vuelta, o bien salimos, o bien salimos. Y es importante que el modelo entrenado prediga el aumento de precios desde la apertura actual hasta la siguiente.
El cierre de la barra actual no tiene por qué coincidir con la apertura de la barra siguiente, es decir, si se toma el cierre como objetivo, se puede evitar el primer error, pero quizá se obtengan incrementos erróneos. Ahora lo he mirado, normalmente el cierre en la tabla de precios no coincide con la apertura de la siguiente barra, por lo que los valores objetivo son muy dudosos.

Me parece que estás complicando las cosas.

1. El primer problema está estrechamente relacionado con el segundo. Si utilizamos Cerrar como objetivo, los otros tres precios se forman y no cambian. Cuando se pronostica con un paso de antelación, el objetivo debe desplazarse una posición.

2. Tampoco puedo aceptar sus argumentos sobre la diferencia de precios de cierre y apertura. Es en qué TF o día de la semana. Si tomamos H1, entonces tenemos tres variantes diferentes:

  • Lo normal es que estos valores coincidan o difieran en unos pocos pips. ¿Qué porcentaje de los beneficios queremos obtener?
  • El caso de la brecha, que puede ser fácilmente 100 puntos. ¿Tiene que ser entre el cierre y la apertura? El 7 de octubre, hubo un movimiento frenético unos minutos antes de que terminara la hora.
  • un caso de viernes a lunes. Así que ese es un caso totalmente diferente.

Eso es lo que se me ocurre. Y podría haber muchas más situaciones. Todos dicen que el comercio real es muy diferente del modelo. De momento, es más útil centrarse en alguna versión idealizada, y programar el resto de arrastres y otros por separado.

3. Sobre el tema de la sobrepuja.

Vaca sagrada del AT. Se considera una verdad inmutable desde hace mucho tiempo.

¿En qué se basa?

Para todos los profesionales del ANÁLISIS, es inaceptable que se cambien los datos sobre los que sacan sus conclusiones epocales sobre el pasado. Una vez más: el pasado es inaceptable.

Estamos en el negocio de la previsión, y nuestra visión del pasado no sólo puede, sino que debe, cambiar en función de los nuevos datos disponibles. Los datos que no se redibujan tienen un precio: el retraso.

Aquí viene una nueva barra, que es el heraldo de una inversión del mercado. Pero nosotros, sin dejar de alimentar a la vaca sagrada, no cambiamos nuestra visión de la historia en aras de alguna idea sacada de la sección de "análisis".

No debemos tener miedo a los cambios de indicadores.

Ha llegado un nuevo bar. Y a su llegada tenemos que tomar decisiones en las condiciones que este nuevo bar ha creado. Tenemos que predecir el futuro hasta la siguiente previsión con un error mínimo. No he visto ninguna publicación que relacione la magnitud del error de predicción con los cambios en el tipo de indicadores en la historia.

Todo esto es un discurso teórico. Deberíamos construir un modelo y obtener su estimación. Eso es lo que voy a hacer.

 

Hice un pequeño conjunto de datos de 5000 precios

El script no ha funcionado correctamente.

Cuando todo estaba contado, recibí una advertencia.

....
....
....
5677 / 5688
5678 / 5688
5679 / 5688
5680 / 5688
5681 / 5688
5682 / 5688
5683 / 5688
5684 / 5688
5685 / 5688
5686 / 5688
5687 / 5688
5688 / 5688
Warning message:
In readChar(con, 5L, useBytes = TRUE) :
  cannot open compressed file 'trainData.rdata', probable reason 'No such file or directory'

los datos en sí mismos

head(trainData)
     <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA>
[1,]   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA
[2,]   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA
[3,]   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA
[4,]   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA
[5,]   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA
[6,]   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA
     <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA>
[1,]   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA
[2,]   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA
[3,]   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA
[4,]   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA
[5,]   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA
[6,]   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA
     <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA>
[1,]   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA
[2,]   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA
[3,]   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA
[4,]   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA
[5,]   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA
[6,]   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA
     <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> target
[1,]   NA   NA   NA   NA   NA   NA   NA   NA     NA
[2,]   NA   NA   NA   NA   NA   NA   NA   NA     NA
[3,]   NA   NA   NA   NA   NA   NA   NA   NA     NA
[4,]   NA   NA   NA   NA   NA   NA   NA   NA     NA
[5,]   NA   NA   NA   NA   NA   NA   NA   NA     NA
[6,]   NA   NA   NA   NA   NA   NA   NA   NA     NA


tail(trainData)
                <NA> <NA>         <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA>
[5683,] 8.621061e-05   10 0.0016378604  190    0    1    0    0    0    0    0    0    0
[5684,] 6.036304e-04   70 0.0010346611  120    0    0    0    0    0    1    0    0    0
[5685,] 1.208355e-03  140 0.0018122977  210    0    0    0    0    0    0    0    0    0
[5686,] 6.911447e-04   80 0.0019009764  220    0    0    0    0    0    0    0    0    0
[5687,] 2.592577e-04   30 0.0007778402   90    0    0    0    0    0    0    0    0    0
[5688,] 9.501188e-04  110 0.0016415396  190    0    0    0    0    0    0    0    0    0
        <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA>
[5683,]    0    0    0    0    0    0    1    0    0    0    0    0    0    0    0    0
[5684,]    0    0    1    0    0    0    0    0    0    1    0    0    0    0    0    0
[5685,]    0    0    0    0    0    0    0    1    0    1    0    0    0    0    0    0
[5686,]    0    0    0    0    0    0    0    1    0    1    0    0    0    1    0    0
[5687,]    0    0    1    0    0    0    0    0    0    0    0    0    0    0    0    0
[5688,]    0    0    0    0    0    0    1    0    1    0    0    0    0    0    1    0
        <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA>
[5683,]    0    0    1    0    0    0    0    0    0    0    0    0    0    0    0    0
[5684,]    0    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0
[5685,]    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    1
[5686,]    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0
[5687,]    1    0    1    0    0    0    0    0    0    0    0    0    0    0    0    0
[5688,]    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0
        <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> target
[5683,]   NA   NA   NA   NA   NA   NA    0    1    0    0    0    0    1   -1    -70
[5684,]   NA   NA   NA   NA   NA   NA    0    1    0    0    0    0    1   -1   -140
[5685,]   NA   NA   NA   NA   NA   NA    0    0    1   -1    0    0    1   -1    -90
[5686,]   NA   NA   NA   NA   NA   NA    0    0    1   -1    0    0    1   -1     20
[5687,]   NA   NA   NA   NA   NA   NA    0    0    1   -1    0    0    1   -1    100
[5688,]   NA   NA   NA   NA   NA   NA    0    0    1   -1    0    0    1   -1     50

Siempre hay NA en los datos, aunque no excluyo que lo haya hecho yo mismo