Aprendizado de máquina no trading: teoria, prática, negociação e não só - página 26
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
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.
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:
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 é.
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/
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.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.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.
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/
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