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

 

O estado actual da minha experiência.

Depois de corrigir os erros no código, nos meus dados, eu, de facto, tenho os seguintes resultados na validação.

O gráfico está enumerando pares de moedas, horizontes de previsão e as chamadas zonas cinzentas - intervalos de valores na saída da máquina de previsão, quando não são tomadas decisões para entrar no mercado.

Como podem ver, já tenho um MO positivo para um número de pares. Para EURUSD o máximo. Ao mesmo tempo, faço a experiência ainda mais precisa, usando spreads reais para todos os pares (do meu CD):

spreads <- as.data.frame(cbind(

c('audusd'

, 'eurusd'

, 'gbpusd'

, 'usdcad'

, 'usdchf')

, c(0.00018

, 0.0001

, 0.00014

, 0.00013

, 0.00012)

)

)

Agora eu comecei uma experiência de generalização realmente poderosa, na qual ainda mais parâmetros serão verificados, e durará cerca de uma semana. Haverá cerca de 60 vezes mais estimativas. Mas então eu definitivamente terei alguns bons resultados para comparar. E, como prometi em algum lugar, vou colocar o Expert Advisor (treinado) com a lógica básica pronta para testes. Você pode desenvolvê-lo ainda mais. Vou melhorá-lo para mim mesmo, adicionando diferentes melhoradores diretamente ao código MQL.

Falo contigo em breve.

 
Alexey Burnakov:

Não, você certamente não entende a importância da não-estacionariedade. Não importa se é um modelo NS ou linear ou o meu modelo, se os seus dados não são estacionários, então as dependências encontradas sobre eles são garantidas de não ocorrer fora da amostra. Todos os dados que você tem são preço bruto, MA(preço bruto), abertura de barras(preço bruto) etc. devem ser removidos do modelo. Você tem que pegar a diferença deles em relação ao último preço conhecido.

A escala para o intervalo não é possível aqui.

Não é assim tão mau. Se você considerar cada exemplo de treinamento separadamente (ou seja, se você normalizar por uma linha da tabela de treinamento), você pode normalizar todos os dados por grupos, separadamente em cada exemplo de treinamento. Por exemplo, pegue as colunas o,h,l,c para todas as 100 barras (400 no total) dentro de um exemplo de treinamento, encontre o mínimo e o máximo delas, e faça um scan. Isto deve ser repetido para cada exemplo de treinamento separadamente. Esta normalização garantirá que o preço na tabela de treinamento para cada linha estará sempre na faixa [0...1]. Agora, se no futuro tivermos um novo exemplo, cujo preço tenha ido muito além dos preços durante o treinamento, a normalização o retornará à faixa [0...1] e não será uma nova região desconhecida de dados para a rede neural. O modelo treinado pode muito bem encontrar e reconhecer algumas regras como "o preço pelo menos uma vez durante as últimas N barras foi superior a 0,8" e esta regra será aplicada a qualquer novo dado, mesmo que o preço tenha caído pela metade.

Se normalizarmos cada coluna separadamente, como costumamos fazer, os resultados do modelo na frente de batalha serão piores. As dependências entre preditores do mesmo tipo dentro de um exemplo de treinamento são perdidas. (por exemplo, Open[1], Open[2], Open[3]... do mesmo exemplo de treinamento serão digitalizados em intervalos diferentes, de acordo com todos os exemplos de treinamento). Além disso, há outro problema - durante o treinamento faremos a normalização com base em milhares de exemplos de treinamento, enquanto no comércio real teremos apenas uma linha que deve ser escalada em ondas consigo mesma, o que não é claro e estranho.

Se você não fizer nenhuma normalização, você pode se safar com isso. Mas se o preço cair / subir além do intervalo disponível para treinamento - será uma nova e absolutamente desconhecida região de dados para o modelo. Não vai puxá-lo para fora e vai cair.

Tudo isto é estritamente para a rede neural, por experiência.

 

Fiz mais algum trabalho com o APC de escala Y. Encontrei um bom artigo com fórmulas de dispersãohttp://www.chemometrics.ru/materials/textbooks/pca.htm, feito um em R.

Código básico do mesmo artigohttp://www.r-bloggers.com/principal-components-regression-pt-2-y-aware-methods/
Precisamos executar o código"princ <- prcomp(dmTrain, center = FALSE, scale. = FALSE)" e parar. seguinte:

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

A essência é a seguinte: O objeto princ contém uma matriz de notas (princ$x) e uma matriz de cargas (princ$rotation). Se multiplicarmos estas duas matrizes princ$x %*% t(princ$rotation), recuperamos a tabela original com os dados dmTrain (escalonados por Y, sem variável alvo).

É possível limitar o número de componentes principais, e então os dados originais serão determinados com alguma margem de erro. Se você se lembrar de imagens lentas de internet e jpeg especiais que ficam mais nítidas quando você as carrega, então você obtém algo semelhante, mais componentes principais darão um ajuste exato aos dados iniciais.

Para o número de componentes N, os dados iniciais são definidos da seguinte forma: princ$x[,1:N] %*% t(princ$rotation[,1:N]). O erro pode ser calculado subtraindo a matriz resultante do dmTrain, obtém-se a Matriz de Resíduos. Estes são os erros, o quanto os dados reais diferem dos dados encontrados. TRV é a média dos quadrados de erro. ERV é algo como o erro médio. Se ERV=0,8, os dados da fonte serão diferentes dos encontrados em ~20% em cada célula da tabela. Isto é, se você encontrou um número 10, então os dados originais eram muito provavelmente de 8 a 12. Esta é uma definição muito aproximada, mas faz mais sentido. E o ERV deve ser de pelo menos 0,95 para o modelo PCA para conter componentes suficientes.

O que é que ganhas com isso? Você pode adicionar um novo parâmetro tol ao princ <- prcomp(dmTrain, centro = FALSO, escala. = FALSO, tol=0.01), assim você não irá gerar milhares de componentes principais e a geração irá parar quando sdev do novo componente será < sdev(PC1) * tol. Depois disso, o número de componentes usados pode ser ajustado com a função acima, começando com 2 e aumentando gradualmente em 1.

Tentando descobrir como aplicá-lo para peneirar os preditores, ainda nada me vem à mente. Você pode, por exemplo, substituir carga por 0 para um preditor em princ$rotation, recalcular ERV e ver o quanto pior será o resultado. No entanto, não vejo o sentido desta acção, não é claro como aplicar este resultado. Talvez para que possamos encontrar preditores correlacionados que não contenham nenhuma informação nova e, portanto, a sua eliminação provavelmente não irá piorar o resultado. Eu gostaria de encontrar preditores de ruído, mas nestas matrizes não há conexão com as variáveis alvo, ou seja, não há critério algum para o que é ruído e o que não é.

 
Dr. Trader:

Fiz mais algum trabalho com o APC de escala Y. Encontrou um bom artigo com fórmulas de dispersãohttp://www.chemometrics.ru/materials/textbooks/pca.htm, fez isto em R.

Código básico do mesmo artigohttp://www.r-bloggers.com/principal-components-regression-pt-2-y-aware-methods/

Revistei o artigo novamente. Parece que você não está tentando repetir o exemplo no artigo, apenas ponto por ponto, substituindo-o pelos seus dados. Ou será que me escapou alguma coisa? Se não, porque não?
 

Eu repeti o exemplo. Substitui-o pelos meus próprios dados, consegui mais de 100 componentes principais para uma variação de 0,95. Eu olhei para as parcelas de madeira, não vi nenhum bom preditor que se destacasse. Isto é, enquanto o autor vê nos seus dados que pode manter 2 componentes principais e 5 preditores - vejo nos meus dados mais de 100 componentes e mais de 1000 preditores (lowadings decrescentes passo a passo, nem sequer é claro qual é o valor limite para a eliminação dos lowadings).

No entanto, devo dar y-aware pca crédito, eu apenas substituí meus dados sem pré-triagem, construí um modelo Y-Aware PCA sobre ele, e tive um erro de 45% na frente. Ainda não é lucrativo para forex, mas o artigo termina aí, então se eu vou usar o y-aware pca então eu preciso pensar em outra coisa.

De outras formas posso deixar apenas uma dúzia de preditores, treinar nnet, e obter um erro de frontest de apenas 30%. Eu gostaria de obter um resultado semelhante com o y-aware pca.
 
Dr. Trader:

Eu repeti o exemplo. Substitui-o pelos meus próprios dados, consegui mais de 100 componentes principais para uma variação de 0,95. Eu olhei para as parcelas de madeira, não vi nenhum bom preditor que se tenha destacado. Isto é, enquanto o autor vê nos seus dados que pode manter 2 componentes principais e 5 preditores - eu vejo nos meus dados mais de 100 componentes e mais de 1000 preditores (lowadings decrescentes passo a passo, nem sequer é claro qual o valor limite de lowadings que deve ser removido).

No entanto, devo dar y-aware pca crédito, eu apenas substituí meus dados sem pré-triagem, construí um modelo Y-Aware PCA sobre ele, e tive um erro de 45% na frente. Para forex ainda não é lucrativo, mas o artigo termina aí, então se eu usar o y-aware pca então eu preciso inventar algo mais.

De outras formas posso deixar apenas uma dúzia de preditores, treinar nnet, e obter um erro de frontest de apenas 30%. Eu gostaria de obter um resultado semelhante com o y-aware pca.
Acho que precisa de ser repetido letra por letra. Há pacotes usados excepto o pca, que eu não vi contigo.
 

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

Aqui está o código R do artigo, arquivos _03.txt e _04.txt, eu já executei tudo isso nos meus dados antes. Até adicionou uma verificação nos dados do fronttest em _04.txt. A única diferença que eu vejo é o pacote etal oferecido no final do artigo. Mas nem sequer há exemplos, apenas sugerem que se tente comparar o resultado com o que a ameixa de vtreat faz.

 
Dr. Trader:

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

Aqui está o código R do artigo, arquivos _03.txt e _04.txt, eu já executei tudo isso nos meus dados antes. Até adicionou uma verificação nos dados do fronttest em _04.txt. A única diferença que eu vejo é o pacote etal oferecido no final do artigo. Mas não há nem mesmo exemplos, basta oferecer para tentar comparar o resultado com o que a ameixa de vtreat faz.

Parece bastante sólido.

Então, nenhum resultado útil?

 

O meu artigo sobre selecção de características.

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

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

Olá!

Tenho uma ideia, quero verificar, mas não conheço a ferramenta para a implementar... Preciso de um algoritmo capaz de prever para alguns pontos à frente, digamos para 3 ou 5 (de preferência uma rede neural)

Já trabalhei apenas com classificações antes, por isso nem sequer entendo como deve ser, aconselhar alguém a fazê-lo ou recomendar um pacote em R

p.s. Grande artigo Alexey

Razão: