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

 
Alexey Burnakov:
Está bem, podes pensar. Imagine, por exemplo, que a cada iteração a rede neural não faz uma propagação de erro padrão de volta com base no desvio do alvo da previsão, mas obtém dados que na versão anterior do peso real do comércio difere do ideal por tantos pontos. E actualiza os pesos com base nesta informação. Ou seja, a informação deve ser um fluxo paralelo à máquina. Talvez, pode ser feito.

Porque é que precisas de pesos? Porque estás a falar deles em primeiro lugar?

Eu entendi que você precisa de pesos anteriores, agora eu entendo que eu não entendo nada)

 
mytarmailS:

Porque é que precisas de pesos? Porque estás a falar deles em primeiro lugar?

Eu entendi que você precisa de pesos anteriores, agora eu entendo que eu não entendi nada)

Bem, parece que sim ))

Não precisamos dos pesos. Eu só os mencionei para que fique claro para VOCÊ. Precisamos de saber como é que o sistema negociava com os pesos anteriores. Precisamos do resultado do comércio de alguma forma integrada. Tudo.

Os pesos são actualizados pelo algoritmo.

 

Aqui, uma função simples funciona. Um mais complexo precisa de ser experimentado. Ainda precisa de ser diferenciado, essa é a parte complicada.

library(neuralnet)


y <- as.data.frame(matrix(runif(n = 10000, min = -15, max = 15), ncol = 2))

y$V3 <- runif(n = 5000,  min = -15, max = 15)

y$V4 <- runif(n = 5000,  min = -15, max = 15)

y$V5 <- runif(n = 5000,  min = -15, max = 15)

y$V6 <- runif(n = 5000,  min = -15, max = 15)

y$V7 <- runif(n = 5000,  min = -15, max = 15)

y$V8 <- y$V1 ^ 2 + y$V2 ^ 2

colnames(y) <- c('input_1', 'input_2', 'noise_1', 'noise_2', 'noise_3', 'noise_4', 'noise_5', 'output')


f_f <- function(x, y){

1/2*(y-x)^2

}


print(

nn_model <- neuralnet(formula = output ~ input_1 + input_2 + noise_1

, data = y

, hidden = 1

, threshold = 0.01

, stepmax = 1e+05

, rep = 100

, startweights = NULL

, learningrate.limit = NULL

, learningrate.factor = list(minus = 0.5, plus = 1.2)

, learningrate=NULL

, lifesign = "none"

, lifesign.step = 10

, algorithm = "rprop+"

, err.fct = f_f #"sse"

, act.fct = "logistic"

, linear.output = F

, exclude = NULL

, constant.weights = NULL

, likelihood = FALSE

)

)

 

f_f <- function(x, y) 1/2*(y-x)^2

f_f - conta o erro para a rede, certo?

x é o que o valor deve ser (curva ideal)

y é como deve ser (a curva real)

A diferença entre eles é o erro

preciso de um vector de comércio por velas anteriores, preciso das regras para abrir os negócios, preciso das regras de abertura do comércio, preciso do aspecto geral dos dados de entrada

 
mytarmailS:

f_f <- function(x, y) 1/2*(y-x)^2

f_f - conta o erro para a rede, certo?

x é o que o valor deve ser (curva ideal)

y é como deve ser (a curva real)

A diferença entre eles é o erro

Acho que preciso de um vector de trocas por velas, mas não entendo como abrir trocas por que regras, como devem ser estes dados de entrada

Quase isso. X é um vector de ns predições. Ygrek é o vetor de aumento de preços por barra a frente (por exemplo ), que é o que a rede prevê. E toda a função é o que o algoritmo NS vai ver em cada iteração. Não há resultados até agora. Eles precisam de ser modelados .

Como. Devemos descrever a lógica de abertura das posições e inserir o spread diretamente no corpo da função. Escreva o resultado das posições abertas no vector e calcule as características intrínsecas sobre o vector.

Por exemplo: buy<-(y-spread)[x>0]. Este será um vector de longa duração. Então todos<-append(comprar, vender).

Mas provavelmente não vai funcionar. Há muitas restrições quanto ao tipo de função (.
 
Entretanto, eu continuo a minha experiência. Treinei a máquina apenas no eurusd e tive um pequeno MO positivo na validação.

Em anexo encontra-se uma captura de ecrã do teste do modelo actual no MT4. A fase de treino ainda está em curso... Os resultados completos não estarão disponíveis até amanhã. Os cálculos são bastante longos em conjunto com R e em cada minuto se não houver negociações abertas. Começou em 1999. A validação terá início a partir de 2010.09. O gráfico atual é de 2003.

Estou a usar 10 pontos de cinco dígitos espalhados. Espere 7-8 pips na validação do MO. Not dense.... Mas agora você já pode encontrar DC onde o spread é de 10 pips, é por isso que eu acho que o resultado é quase significativo.
Arquivos anexados:
 

Um colega enviou-me um link para um curso sobre aprendizagem de máquinas, gostaria de dar uma vista de olhos? É grátis, mas está em Python por alguma razão ((

https://www.udacity.com/course/machine-learning-for-trading--ud501

 
Alexey Volchanskiy:

Um colega enviou-me um link para um curso sobre aprendizagem de máquinas, gostaria de dar uma vista de olhos? É grátis, mas está em Python por alguma razão ((

https://www.udacity.com/course/machine-learning-for-trading--ud501

O mais eficaz:

1. você coloca em R - 5 minutos.

2. download do pacote do guizo, que é projetado como uma GUI, assim não requer nenhum conhecimento de R.

3. Para reduzir os seus custos iniciais, pode usar o meu artigo. Ele contém explicações e, o que é mais importante, tem um arquivo pronto anexado. Uma vez que você viu meu arquivo, você pode facilmente preparar o seu.

4. Você tem seis modelos.

5. O principal no guizo você pode ver o ciclo completo de aprendizagem da máquina:

  • preparação inicial dos dados (data mining)
  • modelação
  • avaliação de resultados
  • como um texto de bónus no R de todas as suas actividades de chocalhar. Este texto pode então ser usado fora do guizo.

Tudo isso lhe dará alguma base sem lacunas, e o mais importante, uma experiência concreta de aprendizagem da máquina ligada ao forex.

PS.

O guizo será muito útil não só nos primeiros passos, mas também mais tarde: custos mínimos, para estimar algo, para experimentar...

PSPS

Claro, não se pode passar sem livros. Há muitos deles aqui. A busca funciona perfeitamente.

 
mytarmailS:

Obrigado pelo esclarecimento detalhadoDr.Trader!

Você sabe, provavelmente o melhor e mais correto seria ensinar as reversões, mesmo o mesmo ziguezague, ou seja, dar três estados 1) U-turn para cima

2) reversão para baixo

3) não uma inversão de marcha

Mas, seja para ensinar, é bastante difícil captar reversões, mais o enviesamento no número de observações, as aulas "não reversão" serão dezenas ou talvez centenas de vezes mais

E que preditores você usa e quais são os resultados?

Comecei agora a usar a análise espectral, os primeiros testes revelaram-se muito melhores do que com os indicadores, passei-os pelo chocalho, o erro de treino e testes foi de cerca de 6%, mas quando comecei a usar R o erro subiu para 30% se não estou enganado, San San Sanich diz que está a re-treinar, por isso ainda não percebo muito

Há também uma maneira de descobrir quais os períodos que dominam no mercado através da análise espectral e então você pode usar esses períodos em indicadores. Eu vou obter indicadores adaptativos, não ajustados ao histórico.

Eu uso indicadores padrão como base para a criação de preditores. Ainda estou experimentando com eles eu mesmo, experimentando as idéias deste tópico do fórum.

Tenho feito isso nas últimas semanas, agora o melhor resultado é o seguinte: (muitos cálculos, estou tentando usar o tempo D1 para cálculos mais rápidos, mais tarde vou usar um tempo menor)

1) exportação do mt5 para csv: ohlc, tempo, indicadores, tudo para as últimas 10 barras. Comecei recentemente a tirar tempo apenas do bar mais recente, acredito que o tempo dos outros bares é calculável e, portanto, não traz nenhuma informação nova. Várias centenas de preditores "primários" estão saindo. O resultado necessário da aprendizagem é "1" ou "0" - subida ou descida do preço na barra seguinte. O meu método com ziguezagues não é estável e complexo, agora sou melhor a trabalhar com preços próximos. Quando eu trabalhar com um algoritmo completo para treinamento de modelos a partir do zero, posso começar a trabalhar em ziguezagues e previsão de tendências.

2) Em R I estou fazendo diferentes operações matemáticas com dados disponíveis - adição, deltas, min, max, etc. Já sai mais de mil preditores.

3) Obviamente há mais lixo após o segundo passo do que o necessário. Eu estou peneirando pelo método do artigo sobre componentes básicoshttp://www.r-bloggers.com/principal-components-regression-pt-2-y-aware-methods/, SanSanych escreveu sobre isso antes. Eu não estou ensinando o modelo PCR em si e me acomodei à função de pré-triagem dos preditores por enquanto:

library('vtreat')
PrunePredictors <- function(srcTable, pruneSig = -1) {
        targetName <- tail(colnames(srcTable), 1)
        
        treatmentsN <- designTreatmentsN(srcTable,setdiff(colnames(srcTable),targetName),targetName, verbose=FALSE)
        if(pruneSig<0){
                pruneSig = 1.0/(ncol(srcTable)-1)
        }

        scoreFrameSorted <- treatmentsN$scoreFrame[,c("origName", "psig", "code")]
        scoreFrameSorted <- subset( scoreFrameSorted, code == "clean")[,1:2]
        scoreFrameSorted <- scoreFrameSorted[with(scoreFrameSorted, order(psig)), ]
        
        scoreFrameSortedPruned <- subset( scoreFrameSorted, psig < pruneSig)
        scoreFrameSortedPruned <- scoreFrameSortedPruned[,1] 
        
        cat("Minimal psig:", scoreFrameSorted[1,2], "\n")
        cat("Maximal psig:", scoreFrameSorted[nrow(scoreFrameSorted),2], "\n")
        cat("Threshold:", pruneSig, "\n")
        cat("Good predictors:", nrow(subset( scoreFrameSorted, psig < pruneSig)), "\n")
        
        return(scoreFrameSortedPruned)
}

srcTable é uma tabela com preditores, a última coluna deve ser o resultado do treinamento necessário.pruneSig é melhor deixar -1.

Como resultado, a função retornará uma lista com os nomes das colunas da tabela que contêm algumas informações úteis. Ou uma lista vazia se nada de útil for encontrado. Este método é mencionado no artigo como não sendo muito significativo, mas acaba por ser bastante adequado, ele peneia muito bem o lixo. Além disso, a lista de resultados será ordenada por relevância, de mais útil para menos útil.

4) Se a função retorna lista vazia - executo novamente o segundo passo, gerando novamente diferentes combinações matemáticas sobre os dados disponíveis, depois o terceiro passo para peneirar. Tenho de repetir este passo 3-4 vezes. O volume de dados cresce a cada repetição, por isso é melhor limitar de alguma forma o volume de novos dados gerados. Podemos alterar esta função para peneirar, de modo que se a lista sair vazia, ela retorne uma centena ou dois melhores resultados e gere novos preditores apenas a partir deles.

5) Em seguida, de acordo com o artigo, precisamos treinar o modelo componente principal em si. Tenho problemas com isso - até agora o melhor r-quadrado para o modelo treinado é 0,1, não é suficiente, o artigo diz que eu preciso de pelo menos 0,95. Mas eu posso treinar algum outro modelo R sobre os preditores obtidos e isso dará um resultado melhor. Eu tenho mais experiência com a neurônica, o melhor resultado na frente com ele sai com um erro de cerca de 37%. O modelo PCE é suposto ser mais estável, sem reconversão, etc., mas até agora não consegui obter nenhum prognóstico para ele.

Se você tiver um erro de 30% na frente, então é um modelo bastante rentável, faça o Expert Advisor para mt5 e confira-o no testador de estratégia.

 
Alexey Volchanskiy:

Um colega enviou-me um link para um curso sobre aprendizagem de máquinas, gostaria de dar uma vista de olhos? É grátis, mas está em Python por alguma razão ((

https://www.udacity.com/course/machine-learning-for-trading--ud501

Comecei a assistir a este curso, ele presta muita atenção à estrutura de Pandas em Python. As primeiras lições parecem mais um tutorial sobre este mesmo enquadramento do que sobre a análise de dados. Mas o tutorial parece adequado, sem o típico "Eu sou um guru Forex, eu vou abrir seus olhos e você vai ganhar milhões", como em muitos outros treinamentos inúteis, dá esperança de que eles vão contar coisas adequadas até o fim. Mas também vale a pena notar que este curso é projetado para negociação de ações e não forex, eu não sei se os processos de aprendizagem do modelo são semelhantes nestas duas áreas.
Razão: