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

 
SanSanych Fomenko:

Não vejo nenhuma prova de que a NS tenha lidado com alguma coisa.

O excesso de aprendizagem é um mal mundial na ciência e na construção de modelos, em particular.

Portanto, é necessário um erro para três conjuntos:

  • conjuntos de aprendizagem. A forma como o guizo o entende (OOB, teste, validação) vai funcionar muito bem.
  • um conjunto que está fora, em termos de datas, do conjunto de treino.
  • Outro conjunto que está fora, no sentido das datas, do conjunto de treino.

Os dois últimos conjuntos são desembaciados quando chegam ao terminal, bases atrás da barra.

Deve haver aproximadamente o mesmo erro em todos os três conjuntos. Ao fazer isso, você terá que consertar o conjunto de preditores que você toma ao treinar o modelo.

No início não considerei a hipótese de me reciclar nesta tarefa, não havia necessidade. A primeira vez que um neurônio foi com apenas um neurônio na camada interna. Verifiquei agora, o erro no treino longo é de cerca de 45%, e não vai mais baixo. A rede dá essas entradas 1,3,5,7,9,11 pesos mais altos quando se treina, mas não pode realmente treinar devido à falta de neurónios. Esta foi a idéia de espremer o máximo resultado correto para fora dele, em condições muito limitadas, e ver quais insumos ele dará mais peso.

Agora com o ficheiro de validação, posso trabalhar mais a sério. Agora eu dividi o arquivo fonte em 2 partes (85% e 15%), treinei na primeira parte, às vezes parei de treinar e medi erros em ambas as partes. Esses exemplos do arquivo de 15% não chegaram ao treinamento, mas o erro neles diminuiu aproximadamente o mesmo que na parte do treinamento. Quando o erro se tornou 0% em ambas as partes do arquivo, eu parei de treinar e testei os neurônios no segundo arquivo, o erro apareceu lá em ~0%. Acontece que para esta tarefa o sobretreinamento nem sequer foi alcançado, é engraçado.


Mas a neurônica no forex é pior do que neste problema. No início o erro cai tanto nas amostras de treinamento como nas de validação. Então o erro continua a cair na amostra de treinamento, mas começa a crescer na amostra de teste, neste momento é hora de parar o treinamento. Em seguida, eu geralmente testei o resultado no histórico pré-amostra e novamente no histórico pós-amostra. Para mim, são três conjuntos de dados, como o teu. Mas o erro em todos os três conjuntos é diferente até agora (e grande fora do período de treinamento).

Eu tinha idéias diferentes de como melhorar os resultados, por exemplo para suavizar os resultados ou adicionar um filtro (<0.1 - vender, >0.9 - comprar, e tudo no meio - período sem troca). Você pode melhorar os resultados adicionando filtro à saída neural e otimizando-a também, mas para testes iniciais não ajudou em nada. Outra boa idéia foi que se o neurônio foi treinado em algum período da história, então você pode otimizar o filtro no histórico anterior a esse período. Para um erro antes do período de optimização está provavelmente associado a um erro após o período de optimização. Mas não funcionou - se existem três períodos de história - "antes do neurônio" - "aprendendo neurônio" - "depois do neurônio", então todos os três terão seus filtros ideais que não estão conectados de forma alguma.

Até agora concluí que o modelo deve ter um pequeno erro (<10%) para o treinamento e as amostras de teste. Não aplicar filtros aos resultados dos modelos, e nenhum trabalho de adivinhação como "inverter o resultado a cada quarta semana". Não cair em períodos menores que M15. Tento novas ideias diferentes e é bom que pelo menos uma em cada dez melhore o resultado. E de alguma forma isso deve resultar em um modelo lucrativo.

 
Dr. Trader:

No início não considerei a possibilidade de me reciclar nesta tarefa, não havia necessidade. A primeira vez foi com apenas um neurónio na camada interior. Verifiquei agora, o erro durante o longo treinamento é de cerca de 45%, e não vai mais baixo. A rede dá essas entradas 1,3,5,7,9,11 pesos mais altos quando se treina, mas não pode realmente treinar devido à falta de neurónios. Esta foi a idéia de espremer o máximo resultado correto para fora dele, em condições muito limitadas, e ver quais insumos ele dará mais peso.

Agora com o ficheiro de validação, posso trabalhar mais a sério. Agora eu tenho arquivo fonte dividido em 2 partes (85% e 15%), treinado na primeira parte, às vezes parei de treinar e medi erros em ambas as partes. Esses exemplos do arquivo de 15% não chegaram ao treinamento, mas o erro neles diminuiu aproximadamente o mesmo que na parte do treinamento. Quando se tornou 0% em ambas as partes do arquivo, eu parei de treinar e testei a neurônica no segundo arquivo, o erro ali era de ~0%. Acontece que para esta tarefa o sobretreinamento nem sequer foi alcançado, é engraçado.


Mas a neurônica no forex é pior do que neste problema. No início o erro cai tanto nas amostras de treinamento como nas de validação. Então o erro continua a cair na amostra de treinamento, mas começa a crescer na amostra de teste, neste momento é hora de parar o treinamento. Em seguida, eu geralmente testei o resultado no histórico pré-amostra e novamente no histórico pós-amostra. Para mim, são três conjuntos de dados, como o teu. Mas o erro em todos os três conjuntos é diferente até agora (e grande fora do período de treinamento).

Eu tinha idéias diferentes de como melhorar os resultados, por exemplo para suavizar os resultados ou adicionar um filtro (<0.1 - vender, >0.9 - comprar, e tudo no meio - período sem troca). Você pode melhorar os resultados adicionando filtro à saída neural e otimizando-a também, mas para testes iniciais não ajudou em nada. Outra boa idéia foi que se o neurônio foi treinado em algum período da história, então você pode otimizar o filtro no histórico anterior a esse período. Para um erro antes do período de otimização está provavelmente associado a um erro após o período de otimização. Mas não funcionou - se existem três períodos de história - "antes do neurônio" - "aprendendo neurônio" - "depois do neurônio", então todos os três terão seus filtros ideais que não estão conectados de forma alguma.

Até agora concluí que o modelo deve ter um pequeno erro (<10%) para o treinamento e as amostras de teste. Nenhum filtro deve ser aplicado ao resultado do modelo, e nenhuma suposição como "inverter o resultado a cada quarta semana". Não cair em períodos menores que M15. Tento novas ideias diferentes e é bom que pelo menos uma em cada dez melhore o resultado. E de alguma forma isso deve resultar em um modelo lucrativo.

Está tudo nos dados )

Os dados em todos os conjuntos devem conter observações mutuamente independentes. Mas mesmo neste caso, a validação dará o pior resultado.
 

Eu tentei modelos diferentes do Rattle, a floresta também deu bons resultados.

Passo 1 - a floresta aprendeu algo, e nas entradas das estatísticas 1,3,5,7,9,11 parecem de alguma forma separadas. Erro no arquivo de treinamento 0%, no arquivo de validação 46%

Etapa 2 - deixou apenas as entradas 1,3,5,7,9,11 no arquivo e o resultado. Treinou a floresta novamente no novo arquivo, agora o erro é 0% tanto nos arquivos de treinamento quanto nos de validação, tudo é legal. A única nuance foi que Rattle para o segundo passo definiu o parâmetro "Número de variáveis" para 2, provavelmente porque o arquivo é menor em tamanho. Mudei-o para 4, como no primeiro passo.

 

Dr.Trader

É bom ver um irmão em mente baseado em chocalhos. Pelo menos podemos comparar resultados.

Assim como a minha própria experiência.

Tiramos o chocalho e os modelos dele.

No modelo de aba aprendemos, obtendo o valor da AOB, e na aba Avaliar avaliamos sobre os conjuntos de Validação e Teste. Temos três números.

Argumento que os resultados obtidos, se o conjunto de preditores não foi previamente limpo de preditores de ruído - estes resultados são sobre nada, muito provavelmente apenas um conjunto de números.

Na aba Avaliar, além de obter os resultados listados, o conjunto deve ser colocado na janela Dataset R. É muito importante que este conjunto seja obtido dividindo mecanicamente o arquivo original, ou seja, o primeiro arquivo para os três dígitos, por exemplo, de 1 de janeiro de 2014 a 1 de janeiro de 2015, mas o arquivo no

R Dataset necessariamente após 1 de janeiro de 2015 sem qualquer amostragem aleatória e outros truques utilizados em R. É apenas rombo, mecânico.

Eu não reconheço nenhuma outra forma de avaliar o sucesso de separar os preditores significativos dos ruidosos, porque o meu método proposto imita a negociação real.

Poderia publicar os quatro números, por favor? Incluindo o resultado no arquivo da janela do R Dataset?

 
Dr. Trader:

Eu tentei modelos diferentes do Rattle, a floresta também deu bons resultados.

Passo 1 - a floresta treinou algo, e nas entradas das estatísticas 1,3,5,7,9,11 parecem de alguma forma separadas. O erro no ficheiro de formação é 0%, no ficheiro de validação é de 46%.

Etapa 2 - deixou apenas as entradas 1,3,5,7,9,11 no arquivo e o resultado. Treinou a floresta novamente no novo arquivo, agora o erro é 0% tanto nos arquivos de treinamento quanto nos de validação, tudo é legal. A única nuance foi que Rattle para o segundo passo definiu o parâmetro "Número de variáveis" para 2, provavelmente porque o arquivo é menor em tamanho. Mudei-o para 4, como no primeiro passo.

Interessante... A profundidade tem de ser definida para 6 variáveis, a fim de captar todas as variáveis relevantes.
 
Dr. Trader:

Eu tentei modelos diferentes do Rattle, a floresta também deu bons resultados.

Passo 1 - a floresta treinou algo, e nas entradas das estatísticas 1,3,5,7,9,11 parecem de alguma forma separadas. O erro no ficheiro de formação é 0%, no ficheiro de validação é de 46%.

Etapa 2 - deixou apenas as entradas 1,3,5,7,9,11 no arquivo e o resultado. Treinou a floresta novamente no novo arquivo, agora o erro é 0% tanto nos arquivos de treinamento quanto nos de validação, tudo é legal. A única nuance foi que Rattle para o segundo passo definiu o parâmetro "Número de variáveis" para 2, provavelmente porque o arquivo é menor em tamanho. Mudei-o para 4, como no primeiro passo.

No primeiro, a floresta usou ruídos para o treinamento, o que não é bom.
 
SanSanych Fomenko:

Poderia publicar os quatro números, por favor? Incluindo o resultado em ficheiro da janela do R Dataset?

Fez isso com neuronka - dummy_set_features.csv é dividido em 3 partes 70%/15%/15%; dummy_set_validation.csv usado na aba de avaliação como "arquivo csv" (é essencialmente o mesmo que R Dataset, apenas um formato de arquivo diferente).

Tirei o registro do Rattle, removi essas duas limitações da chamada neurônica, sobre a qual escrevi anteriormente, executei-o em R, mas o modelo ainda está subtreinado (erro de 35% na amostra de treinamento). Então acontece, se você reduzir a amostra de treinamento, então o resultado do treinamento é pior. Mas você pode aumentar o número de neurônios na camada interna, isso deve melhorar a aprendizagem.

Mudei o número de neurónios de 10 para 20, voltei a correr o treino, agora o erro no treino tornou-se 0%. Erro na amostra de validação é de 0,6%, erro na amostra de teste é de 0,1%. Erro no arquivo dummy_set_validation.csv é 0,3%. Tudo bem, R na aplicação.

Interessante, acontece que os problemas de treinamento dos neurônios são muito diferentes dos problemas das árvores. Para mim o problema com nn é pegar o número certo de neurônios internos e suspender a aprendizagem antes que a rede comece a se reciclar. Basicamente, quanto mais neurônios, melhor, mas isso afeta muito a RAM necessária e o tempo de treinamento. Os preditores supérfluos não são um grande obstáculo para a aprendizagem, a neurônica geralmente aprende tão bem com eles, mas eles aumentam o tempo de treinamento, e é melhor se livrar deles para torná-lo mais rápido.

Uma vez que eu usei a rede mt4 auto-escrita, um EA poderia aprender e negociar imediatamente. Havia problemas com a velocidade de aprendizagem, inicialização de pesos, algoritmos de aprendizagem. Havia demasiados pequenos problemas, era difícil conseguir bons resultados mesmo com uma amostra de treino, por isso finalmente desisti e agora trabalho em R. O pacote nnet pode ser treinado pelo algoritmo bfgs, ele remove todos aqueles pequenos problemas. Mas o pacote tem um limite de apenas 1 camada interior. Eu quero ter pelo menos 3 camadas internas, mas com o algoritmo bfgs, caso contrário haverá muitos problemas com a aprendizagem novamente.

Arquivos anexados:
r_nnet2.txt  10 kb
 
Dr. Trader:

Fez isso com neurônio - dummy_set_features.csv é dividido em 3 partes 70%/15%/15% como padrão; dummy_set_validation.csv usado na aba de avaliação como "arquivo csv" (este é essencialmente o mesmo que R Dataset, apenas um formato de arquivo diferente).

Não, não é a mesma coisa.

Surpreendente, eu discuto este assunto com muitas pessoas e NENHUMA o faz da forma como escrevo. E sei o que estou escrevendo, porque passei meio ano em exercícios como o seu, e fora do chocalho(). O que não coloco no testador, recebo um erro completamente diferente. Então eu fiz o que descrevi acima e o erro no testador praticamente coincidiu com o erro no arquivo R Dataset.

Eu dei ao Alexey três arquivos, que são obtidos dividindo mecanicamente um grande arquivo em três partes. Na primeira parte exercitamos, aprendemos, avaliamos... E nos outros dois, verificamos os números que temos no primeiro. Se os três arquivos tiverem erros superiores a 20%(!), ou mais precisamente, mais perto de 40%, o modelo não é retrabalhado e você pode trabalhar com ele.

Os 3 arquivos acima têm 27 preditores e 6 variáveis alvo. Os 27 preditores foram selecionados entre 170 preditores pelos meus próprios algoritmos. A partir de hoje, estes 27 preditores não conduzem a modelos demasiado treinados. Mas os restantes 143 preditores do meu conjunto são ruído e sobre este ruído pode facilmente obter um erro comparável ao seu, mas o modelo está sobre-treinado e não é adequado para uso posterior.

Por que há menos erros nos preditores de ruído do que nos preditores significativos?

Do meu ponto de vista, como o algoritmo de ajuste do modelo tende a reduzir o erro de ajuste, ele é sempre capaz de encontrar algo entre os valores ruidosos e aleatórios que é melhor que os preditores significativos. Como resultado, quanto menor o erro, menos preditores significativos estão envolvidos na construção do modelo!

PS

A julgar pelo erro, ou a NS está 100% sobretreinada, ou a olhar para o futuro.

 

O "ficheiro CSV" e o "conjunto de dados R" no separador de avaliação são simplesmente formas diferentes de especificar a fonte de dados. Se você alimentar os mesmos dados com eles, você obterá o mesmo resultado ao testar o modelo.

Se antes do guizo executar

dataset_validate <- read.csv("file:///C:/dummy_set_validation.csv", na.strings=c(".", "NA", "", "?"), strip.white=TRUE, encoding="UTF-8")

então este conjunto de dados_validate estará agora disponível no separador avaliar como conjunto de dados R. Mas o resultado da verificação do modelo acabará sendo o mesmo que se você apenas selecionar a opção de arquivo csv e especificar o arquivo C:/dummy_set_validation.csv, os dados para o teste serão idênticos em ambos os casos.

O treinamento em si foi em um arquivo diferente, dummy_set_features.csv, então é impossível olhar para o futuro aqui, porque os dados em ambos os arquivos são diferentes, e não dependentes do tempo (mas dependentes da fórmula). Eu acho que a neurônica fez um ótimo trabalho e encontrou 6 inputs que determinam o resultado, reduziram a influência de outros inputs, e com alguma lógica neural descreveu a fórmula desejada.

Só para o caso de ter verificado os dois ficheiros para encontrar cordas duplicadas, se houver alguma. Aqui está o código em R:

#читаем  данные из файлов для обучения и валидации
dataset_train <- read.csv("file:///C:/dummy_set_features.csv", na.strings=c(".", "NA", "", "?"), strip.white=TRUE, encoding="UTF-8")
dataset_validate <- read.csv("file:///C:/dummy_set_validation.csv", na.strings=c(".", "NA", "", "?"), strip.white=TRUE, encoding="UTF-8")

anyDuplicated(dataset_train) #количество  повторных строк в первом файле - 567
anyDuplicated(dataset_validate) #количество  повторных строк во втором файле - 202
#  это покачто просто повторные строки в обоих файла по отдельности. Это не вредит, но и ничего не улучшает, лучше их убрать.
dataset_train <- unique(dataset_train)
dataset_validate <- unique(dataset_validate)

#Теперь  можно узнать сколько строк из dataset_train повторяются в dataset_validate
dataset_combined <- rbind(dataset_train, dataset_validate) #Объединяем  оба файла в один
nrow(dataset_combined) - nrow(dataset_combined[!duplicated(dataset_combined), ]) #количество  повторенных строк - 23. Таких повторов быть не должно, их надо удалить.
#Удаление  повторенных строк из dataset_validate
dataset_validate <- dataset_validate[!(tail(duplicated(dataset_combined), nrow(dataset_validate))), ]
#Удаление  из памяти объединённого файла, он больше не нужен
rm(dataset_combined)

Se isto for feito antes de chocalhar, então ambas as tabelasdataet_train edataet_validate estão disponíveis para treinamento e verificação do modelo, e não haverá duplicatas. Glory R.

o arquivo de validação do modelo continha 23 repetições da amostra de treinamento, mas além disso tem mais 3000 filas únicas, de modo que a avaliação do modelo não poderia ser significativamente afetada.

 
É assim que deve ser. O arquivo é gerado por números aleatórios.

Em geral, eu sobrestimei a complexidade da tarefa. Na verdade, já está resolvido pela floresta. Você pode se perguntar como isso é possível à luz da forma como a floresta funciona.