Aprendizado de máquina no trading: teoria, prática, negociação e não só - página 267
Você está perdendo oportunidades de negociação:
- Aplicativos de negociação gratuitos
- 8 000+ sinais para cópia
- Notícias econômicas para análise dos mercados financeiros
Registro
Login
Você concorda com a política do site e com os termos de uso
Se você não tem uma conta, por favor registre-se
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 ((
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
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
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
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(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),]
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?
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.
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.
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.
Obrigado.
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:
É 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
<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
<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.