Aprendizado de máquina no trading: teoria, prática, negociação e não só - página 267

 
mytarmailS:

Bem, se em vez de adicionar NA no final do"Y" e depois apagar o mesmo NA, eu simplesmente apagar a última linha em SomeData, não será a mesma coisa?

Eu realmente não entendo a diferença, talvez eu já tenha sobreaquecido completamente ((

Exactamente o mesmo. Só não o faço dessa maneira e não percebi a sua solução.
 
mytarmailS:
Não lamento, mas não sei como, simplesmente não funciona, quantas vezes tentei, tenta à tua maneira, qual o alvo que eu conhecia, e diz-me como o fazes.
Você embala tudo com qualquer empacotador e anexa o arquivo
 
SanSanych Fomenko:
Você embala tudo com qualquer empacotador e anexa o arquivo

Já tentei muitas vezes, não funciona, expulsa-me do fórum e é isso...

Pegue meus códigos, eu postei tudo, o primeiro código é a criação de funcionalidades, o segundo é o treinamento do modelo, você será exatamente o mesmo, faça o treinamento e mostre o que você tem

 
mytarmailS:

Já tentei muitas vezes, não funciona, expulsa-me do fórum e é isso...

Pegue meus códigos, eu postei tudo, o primeiro código é a criação de funcionalidades, o segundo é o treinamento do modelo, você será exatamente o mesmo, faça o treinamento e mostre o que você tem

Está bem. Deixa estar. Eu vou tentar o meu. Amanhã
 
mytarmailS:

Ao diferenciar, o deslocamento é automático, pois a série se torna um elemento mais curto, então tudo o que você precisa é encurtar a amostra (tabela com observações) pelo último elemento

Há duas coisas no código que me deixam inquieto:

1) como ohlc é usado para a previsão, a última barra não pode ser usada para a previsão, já que faremos a previsão no início da barra, e o hlc mudará durante o tempo de vida da barra inteira. Então nós ensinamos o modelo usando a última barra totalmente formada e depois prevemos usando a não-formada. Isso não está certo. Devíamos mudar o alvo por 2 barras em vez de 1.
Uma mudança de alvo para 1 barra seria aceitável, se você usar apenas preço aberto para previsão, ignorando alto, baixo, fechar.

2) Você está usando Fechar ao invés de Abrir para o alvo. É importante para algum tipo de estratégia ou apenas para diversão? Afinal de contas, normalmente entramos numa profissão no início de um bar, e depois no próximo novo bar ou viramos, ou saímos, ou saímos. E é importante para o modelo treinado prever o aumento do preço do actual aberto para o próximo aberto.
O fecho da barra actual não coincide necessariamente com a abertura da barra seguinte, ou seja, ao tomar o fecho como um alvo, pode evitar o primeiro erro, mas talvez, em vez disso, obter incrementos errados. Agora eu procurei, normalmente fechar na tabela de preços não coincide com o Open do próximo bar, então seus valores alvo são muito duvidosos.

Se o candelabro está a rastejar demais, tens de o contornar.
Pegue uma janela móvel, as primeiras cem barras (100 é apenas um número aleatório, para o seu código mínimo de barras = 23, e se menos do que esse castiçal cometer erros), encontre valores indicadores, deixe apenas o último deles, encontre o alvo relevante, adicione tudo à tabela final. Deslocamos a janela para a frente por 1 barra, repito. Tudo isto é dezenas de vezes mais lento do que contar tudo de uma só vez, mas é mais seguro. Então ambos os resultados podem ser comparados e pode-se tirar uma conclusão sobre se há ou não um rollover.

Seria bom mudar o tamanho da janela deslizante, e ver se os resultados mudam. Se eles mudarem - então o indicador usa seus próprios valores anteriores para calcular novos valores, neste caso a largura da janela funcionará como uma espécie de período exponencial dentro do próprio indicador. Se o resultado for alterado, então a largura da janela deve ser aumentada até que os resultados não mudem. O indicador pode ter seu próprio limite interno no número de barras utilizadas, por exemplo, ziguezague em mt5 tem este valor = 100 barras, ou seja, a largura da janela maior que cem não afeta o resultado.

Primeiro, tente este código para criar uma tabela de treinamento/teste. Compare com sua tabela, se for 100% congruente, você não verá nenhum overrendering, você pode confiar no candlestick para usar valores anteriores para identificar novos valores
Em seguida, tente aumentar indicatorDepth - largura da janela deslizante, ver se o resultado é alterado e se pode encontrar tal valor de indicatorDepth, quando mesmo aumentando não afeta o 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:

Estou preocupado com duas coisas no código:

1) Como usamos ohlc para a previsão, a última barra não pode ser usada para fazer uma previsão porque faremos a previsão no início da barra e o hlc mudará durante a vida útil da barra. Então ensinamos o modelo usando a última barra totalmente formada e depois prevemos usando a não-formada. Isso não está certo. Devíamos mudar o alvo por 2 barras em vez de 1.
Se você mudar a meta para 1 barra você pode usar apenas o preço aberto para fazer uma previsão ignorando alto, baixo e fechar.

Não entendo o problema: prevemos a posição do fechamento atual em relação ao fechamento anterior, não conhecemos a vela atual, conhecemos a anterior porque já está fechada, então é a anterior, então todos os preços OHLC já foram formados, não entendo qual é a cautela, qual é o erro

2) Você está usando Fechar ao invés de Abrir para o alvo. É importante para algum tipo de estratégia ou apenas para diversão? ........

Levado absolutamente para nada, para rapidez e conveniência.

Se o candelabro estiver a descoberto, tens de o contornar........

Eu não entendo esta peça, o que ela faz? o que éSPFB.RTS.rdata ?

De onde é que isso vem? e porque é que está escrito por cima? não faz ideia nenhuma(


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
})

E o mais importante, certamente você tentou ensinar algo usando os dados, por que não mencioná-lo?

 
mytarmailS:

E o mais importante, você deve ter tentado ensinar algo usando os dados, por que não menciona isso?

O progresso da tabela de formação é de 16527 de 55857. Assim que for criado, vou tentar ensiná-lo.

mytarmailS:

Previsão da posição do actual cotovelo em relação ao cotovelo anterior

Isso depende de ti. É estranho, como de costume, as estratégias tomam decisões e abrem negócios no início de um novo bar.
E depois tens de fazer uma previsão e abrir um negócio mesmo no fim do bar. Um pouco inconveniente, um novo bar no terminal é fácil de apanhar. Mas "comércio aberto no final do bar actual, um segundo antes da abertura de um novo bar, com a esperança de que o actual preço fechado já seja final" é demasiado vago para mim.

mytarmailS:

Não entendo esta peça, o que faz? O que éSPFB.RTS.rdata ?

Download das citações. Descarregado, guardado em rdata para não desperdiçar cada vez que executamos este script e para não esperar segundos até que sejam descarregados. Se eles foram baixados antes e salvos em um arquivo rdata - então eles são tirados dele.

 
Dr. Trader:

Obrigado.

 
Dr. Trader:

Há duas coisas no código que me deixam inquieto:

1) porque usamos ohlc para previsão, não podemos usar a última barra para previsão, porque o faremos no início da barra e o hlc mudará durante a vida útil da barra. Então ensinamos o modelo usando a última barra totalmente formada e depois prevemos usando a não-formada. Isso não está certo. Devíamos mudar o alvo por 2 barras em vez de 1.
Uma mudança de alvo para 1 barra seria aceitável, se você usar apenas preço aberto para previsão, ignorando alto, baixo, fechar.

2) Você está usando Fechar ao invés de Abrir para o alvo. É importante para algum tipo de estratégia ou apenas para diversão? Afinal de contas, normalmente entramos numa profissão no início de um bar, e depois no próximo novo bar ou viramos, ou saímos, ou saímos. E é importante para o modelo treinado prever o aumento do preço do actual aberto para o próximo aberto.
O fecho da barra actual não coincide necessariamente com a abertura da barra seguinte, ou seja, ao tomar o fecho como um alvo, pode evitar o primeiro erro, mas talvez, em vez disso, obter incrementos errados. Agora procurei, normalmente o fechamento na tabela de preços não coincide com a abertura do próximo bar, por isso os valores alvo são muito duvidosos.

Parece-me que estás a complicar as coisas.

1. O primeiro problema está intimamente relacionado com o segundo. Se usarmos Fechar como meta, todos os outros três preços são formados e não mudam. Ao prever um passo à frente, você tem que deslocar o alvo por 1 posição.

2. Também não posso aceitar os seus argumentos sobre a diferença de preços entre Fechar e Abrir. É em que TF ou dia da semana. Se tomarmos o H1, então temos três variantes diferentes:

  • O caso normal quando estes valores coincidem ou diferem por alguns pips. É esta a percentagem do lucro que estamos a tentar obter?
  • O caso da lacuna, que pode facilmente ser de 100 pontos. Tem de ser entre o Fechado e o Aberto? Em 7 de outubro, houve um movimento frenético alguns minutos antes do final da hora.
  • um caso de sexta-feira a segunda-feira. Então esse é um caso completamente diferente.

É isso mesmo que me vem à cabeça. E pode haver muitas mais situações. Todos eles dizem que a negociação real é muito diferente do modelo. No momento, é mais útil focar em alguma versão idealizada, e programar o resto dos arrastamentos e outros separadamente.

3. Sobre o assunto da sobrelicitação.

Vaca sagrada de TA. É considerado como uma verdade imutável há séculos.

Com base em quê?

Para todos os praticantes de ANÁLISE, mudar os dados sobre os quais eles tiram suas conclusões epocais sobre o passado é inaceitável. Mais uma vez: porque o passado é inaceitável.

Estamos no negócio da previsão, e nossa visão do passado não só pode, mas deve, mudar com base nos novos dados disponíveis. Há um preço a ser pago por dados que não redesenha: lag.

Aí vem um novo bar, que é o arauto de uma inversão do mercado. Mas nós, enquanto continuamos a alimentar a vaca sagrada, não mudamos nossa visão da história por causa de alguma idéia tirada da seção "análise".

Não devemos ter medo de mudanças de indicadores.

Chegou um novo bar. E na sua chegada precisamos de tomar decisões sob as condições que este novo bar criou. Precisamos de prever o futuro até à próxima previsão com um erro mínimo. Não vi nenhuma publicação ligando a magnitude do erro de previsão a mudanças no tipo de indicadores na história.

Isto é tudo conversa teórica. Devíamos construir um modelo e obter a sua estimativa. É isso que eu vou fazer.

 

Fez um pequeno conjunto de dados de 5000 preços

O guião não funcionou correctamente.

Quando tudo foi contado, recebi um aviso.

....
....
....
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'

os próprios dados

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

Há sempre NA nos dados, embora eu não exclua que eu mesmo o tenha feito.