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

 
mytarmailS:
Eu já fiz isso, a rede neural não aprende num horizonte maior com o alvo que lhe dei.

Eu sorrio para as tuas palavras.

Não é uma rede neural que não aprende, mas você a faz não aprender, literalmente. A rede neural aprenderá onde há sinal além do ruído, mas sua tarefa é separar esse sinal do ruído com a ajuda da Great Neural Network, sem deixar que ele reaprenda.

 
Alexey Burnakov:
Esta é uma resposta mais correcta). Tenho de tentar métodos diferentes.

Eu uma vez sugeri esta abordagem.

Nós aceitamos um Expert Advisor, pode ser da Kodobase. O principal é que deve ser de sangue puro e não importa se está a perder. É possível definir os requisitos preliminares. Por exemplo: tendência, três janelas, sem SL e TP, MM, recuperação de erros de estados...

Devemos olhar para a razão da perda e tentar resolvê-la usando R. Resolva os problemas nas janelas baixas extrapolando, na janela alta prevemos a próxima barra por classificação.

 
Alexey Burnakov:

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

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

Foi interessante de ler, obrigado pelo trabalho duro. Não entendo a experiência 6 - por que os preditores Y e Z foram selecionados no final? Z é a variável alvo, ela não deveria estar na lista de preditores.

Eu gosto da idéia de pegar um gráfico de coelho 3D e treinar o modelo sobre ele. Para ser honesto, a princípio eu pensei que "coelho" é algum tipo de dado pseudo-aleatória que fica bonito no gráfico e só faz sentido para um humano com sua habilidade de ver o coelho em uma variedade de números. Mas não há nenhuma função que descreva o coelho, para qualquer modelo é apenas um conjunto de pontos que formam clusters de formas especiais em espaço 3-d. Do meu ponto de vista, as três coordenadas de cada ponto não têm relações e dependências entre eles, eu esperava que nenhum algoritmo pudesse lidar com isso. No final do artigo, fiquei surpreendido.

Eu tentei a mesma experiência com a PCA, e os resultados são os seguintes:
Preciso de um componente para 95% de precisão, ele usa X e Y. Mas o algoritmo de previsão não funciona com um componente, eu preciso de pelo menos dois. Basicamente, ambos usam X e Y (não é mostrado no código, mas você pode vê-lo no gráfico), então está tudo bem.
Modelo de trem na amostraA, depois prever Z para a amostraA : R^2 = 0,04759303
Modelo de trem na amostraA, depois prever Z para a amostraB: R^2 = 0,05325888

Desenhei uma trama 3d do Z previsto para a amostra B, saiu mal. O modelo não encontrou realmente nenhuma dependência, apenas calculou a média de todos os Z's num só avião. O coelho saiu liso. Já tentou treinar alguns modelos, e desenhar um coelho previsto? Como será que funciona para modelos diferentes?

Anexei o código para o coelho e para o y-aware pca. Há um pequeno bug, o gráfico de previsão de carga está ordenando os componentes por alguma razão. São 1,10,11,12,2,3,4,5,... mas por ordem de importância devemos olhar nesta ordem: PC1, PC2, PC3,...

Arquivos anexados:
bunny_pca.txt  5 kb
 
mytarmailS:
Já fiz isto antes, a rede neural não aprende num horizonte maior com o objectivo a que eu o defini

Eu ainda não tentei treinar o neurônio além de um bar, mas presumo que o princípio será o mesmo. Eu trabalho com ele da seguinte forma:

1) recolher o máximo de dados brutos possível do mt5 - ohlc, tempo, indicadores. Como eu não sei o que é útil e o que não é, pego em tudo e tento peneirar o lixo. Não posso enviar tudo para os neurónios, porque os neurónios reciclam o lixo e, neste caso, cometem um erro de fachada. Não é fácil peneirar o lixo, na verdade todas as 28 páginas deste tópico são sobre como fazê-lo, e até agora tudo é ambíguo. Eu adiciono uma variável de destino aos dados - 0 ou 1 dependendo da queda/aumento no preço para a próxima barra.

2) Peneiração dos detritos propriamente dita. Deve haver uma função que analise os dados iniciais e lhe dê uma pontuação. Quanto maior a estimativa - menos lixo. Tentamos alimentar a função de avaliação com várias combinações de preditores de fonte (colunas da tabela de treinamento) e tentamos aumentar o resultado. Eventualmente, será encontrado um certo conjunto de preditores, o que em teoria não levará a um excesso de treino.

3) Suponha que o lixo seja eliminado. Agora é hora de treinar a rede neural. Eu uso o pacote nnet do R, ele tem vantagens na forma de ausência de hiperparâmetros como velocidade de treinamento, aceleração, retardamento, tipos de funções de treinamento. Menos hiperparâmetros significam menos problemas. Você precisa de treinar com validação cruzada. Eu pego a tabela inicial e a divido em três linhas com proporção 70%/15%/15% (as novas tabelas são chamadas de trem/teste/validado) (o código pode ser tirado do registro de chocalhos, eu comecei a partir dele). Então eu faço, por exemplo, 10 iterações de neurônios de treinamento na mesa do trem. Eu calculo o erro de previsão R^2. Eu prevejo resultados para testar e validar tabelas e cálculo R^2 para elas também. Faço mais 10 iterações de treino, repito a previsão para 3 tabelas e olho para o novo R^2. Pare de treinar quando R^2 em algumas das mesas começa a cair (sempre crescerá apenas na mesa do trem). Feito. Agora você pode repetir tudo isso novamente, usando um número diferente de neurônios ocultos e um número diferente de iterações de treinamento entre as validações cruzadas, na esperança de que o R^2 mínimo de três tabelas no final seja maior do que da última vez.

Tudo isto pode parecer um pouco complicado, mas na verdade é ainda mais complicado :), há um monte de problemas em cada uma destas etapas. Mas dá resultados consistentes.

 
SanSanych Fomenko:

Ainda bem que não aprendeste, porque ensinas sobre o barulho. Mas se o fizesses, aprenderias no graal, na verdadeira....

Aqui ocupado a tentar eliminar o barulho. É por isso que aceitamos tantos palpiteiros na esperança de que pelo menos algo permaneça.

Você está tentando usar o ruído como um treinador, você deve entender que se o estocástico (por exemplo) tivesse o número mágico 90 e o mercado caísse quando o indicador tivesse tal valor, não precisaríamos de nenhuma rede, ele seria visível aos olhos.

1) Na melhor das hipóteses, o que você faz é selecionar os 10 melhores indicadores entre 100 possíveis por alguns critérios, e o indicador tem um intervalo de valores - digamos 100 desses 100 valores apenas 3 funcionam e nem sempre, mas em algumas situaçõesapenas estes 3 valores não são ruído e apenas devem ser mantidos em vez do indicador, uma vez que os valores restantes são o mesmo ruído, pelo que todas estas rejeições não são qualitativamente profundas e, portanto, não são muito eficientes

2) Além disso, há uma noção como inconsistência de atributos, por exemplo, tomar o preço, é objetivo e não contraditório, ou seja, se o preço está subindo, está subindo e não há segundo (se ignorarmos as nuances da força da tendência, etc.), tomar o mesmo estocástico, pode tomar 90 valores quando a tendência é plana e para cima e para baixo, ou sejaPor outro lado, este indicador não ajuda a rede, pelo contrário, confunde sempre o mercado porque as suas leituras são inconsistentes, pelo que os indicadores normais não são aplicáveis ao mercado, e nem sequer se pensa nisso, basta encher tudo, e depois fala-me do barulho.

Eu não estou satisfeito com o horizonte de previsão como escrevi acima.

 
Dr. Trader:

Foi interessante de ler, obrigado pelo esforço. Não entendo a experiência 6 - por que os preditores Y e Z foram selecionados no final? Z é a variável alvo, ela não deveria estar na lista de preditores.

Eu gosto da idéia de pegar um gráfico de coelho 3D e treinar o modelo sobre ele. Para ser honesto, a princípio eu pensei que "coelho" é algum tipo de dado pseudo-aleatória que fica bonito no gráfico e só faz sentido para um humano com sua habilidade de ver o coelho em uma variedade de números. Mas não há nenhuma função que descreva o coelho, para qualquer modelo é apenas um conjunto de pontos que formam clusters de formas especiais em espaço 3-d. Do meu ponto de vista, as três coordenadas de cada ponto não têm relações e dependências entre eles, eu esperava que nenhum algoritmo pudesse lidar com isso. No final do artigo, fiquei surpreendido.

Tentei a mesma experiência com o PCA, os resultados são assim:
Um componente é necessário para uma precisão de 95%, ele usa X e Y. Mas o algoritmo de previsão não funciona com um componente, você precisa levar pelo menos dois. Basicamente, ambos usam X e Y (não é mostrado no código, mas você pode vê-lo no gráfico), então está tudo bem.
Modelo de trem na amostraA, depois prever Z para a amostraA : R^2 = 0,04759303
Modelo de trem na amostraA, depois prever Z para a amostraB: R^2 = 0,05325888

Desenhei uma trama 3d do Z previsto para a amostra B, saiu mal. O modelo não encontrou realmente nenhuma dependência, apenas calculou a média de todos os Z's num só avião. O coelho saiu liso. Já tentou treinar alguns modelos, e desenhar um coelho previsto? Como será que funciona para modelos diferentes?

Anexei o código para o coelho e para o y-aware pca. Há um pequeno bug, o gráfico de previsão de carga está ordenando os componentes por alguma razão. São 1,10,11,12,2,3,4,5,... mas por ordem de importância você deve olhar nesta ordem: PC1, PC2, PC3,...

Então, você tem X e Y nos componentes principais? Isso seria importante para entender.

Segundo, sobre a aproximação do coelho. Claro que deveria ser! É um modelo linear. Ele apenas desenhará um plano (se X e Y) com um pouco de inclinação, ou uma linha (se um preditor). Esse é todo o modelo de coelho linear ) É por isso que eu tento usar modelos não lineares.

Assim é como reconstruir o coelho usando outro método (baseado em valores discretos).

 
Alexey Burnakov:

Então, o X e o Y apareceram nos componentes principais? Seria importante compreender.

Sim, só X e Y. Eu ainda não descobri como fazer isso via código, todos os artigos sobre isso funcionam com gráficos. O número de componentes a serem tomados pode ser visualizado na variávelToUse componentes. Neste caso componentesToUse = 2, significa que você precisa tomar apenas aqueles preditores que têm linhas horizontais largas no gráfico para PC1 e PC2.

Nesse gráfico acima, observe as colunas PC1 e PC2 (o primeiro e segundo componentes principais), e depois as linhas horizontais verdes. Se a linha se afastar de 0 (seja positiva ou negativa), então esse preditor é usado no componente principal correspondente. PC1 utiliza y_clean ("_clean" é automaticamente adicionado ao escalar os dados para evitar confusão com o preditor original), PC2 utiliza x_clean. Este é o resultado da análise do componente PCA - você precisa tomar x_clean e y_clean.

Seguindo em frente, o PC3 usaria o input_noise_3_clean. Isto é apenas por exemplo, o PC3 não é necessário neste caso.

Isto funcionou mesmo muito bem. X e Y se destacam claramente no gráfico. Eu já postei anteriormente o mesmo gráfico para forex onde tudo é ruim.

 
Dr. Trader:

Sim, só X e Y. Ainda não descobri como fazer isto através do código, todos os artigos sobre isto funcionam com gráficos. O número de componentes a serem tomados pode ser visualizado na variávelToUse componentes. Neste caso componentesToUse = 2, significa que você precisa tomar apenas aqueles preditores que têm linhas horizontais largas no gráfico para PC1 e PC2.

Nesse gráfico acima, observe as colunas PC1 e PC2 (o primeiro e segundo componentes principais), e depois as linhas horizontais verdes. Se a linha se afastar de 0 (não importa se é positiva ou negativa), então esse preditor é usado no componente principal correspondente. PC1 utiliza y_clean ("_clean" é automaticamente adicionado ao escalar os dados para evitar confusão com o preditor original), PC2 utiliza x_clean.

Seguindo em frente, o PC3 usaria o input_noise_3_clean. Este é apenas um exemplo, o PC3 não precisa de ser usado neste caso.

Este funcionou mesmo muito bem. X e Y se destacam claramente no gráfico. Eu já postei o mesmo gráfico para o forex antes, mas não é tão bom lá.

A selecção do prognóstico aqui acabou por ser feita através do método linear. Bem, ainda bem que estás surpreendido. Significa que você viu algo novo )
 
Dr. Trader:

Eu ainda não tentei treinar o neurônio além de um bar, mas presumo que o princípio será o mesmo. Eu trabalho com ele da seguinte forma:

1) recolher o máximo de dados brutos possível do mt5 - ohlc, tempo, indicadores. Como eu não sei o que é útil e o que não é, pego em tudo e tento peneirar o lixo. Não posso enviar tudo para os neurónios, porque os neurónios reciclam o lixo e, neste caso, cometem um erro de fachada. Não é fácil peneirar o lixo, na verdade todas as 28 páginas deste tópico são sobre como fazê-lo, e até agora tudo é ambíguo. Eu adiciono uma variável de destino aos dados - 0 ou 1 dependendo da queda/elevação do preço para a próxima barra.

2) Peneiração dos detritos propriamente dita. Deve haver uma função que analise os dados iniciais e lhe dê uma pontuação. Quanto maior a estimativa - menos lixo. Tentamos alimentar a função de avaliação com várias combinações de preditores de fonte (colunas da tabela de treinamento) e tentamos aumentar o resultado. Eventualmente, será encontrado um certo conjunto de preditores, o que em teoria não levará a um excesso de treino.

3) Suponha que o lixo seja eliminado. Agora é hora de treinar a rede neural. Eu uso o pacote nnet do R, ele tem vantagens na forma de ausência de hiperparâmetros como velocidade de treinamento, aceleração, retardamento, tipos de funções de treinamento. Menos hiperparâmetros significam menos problemas. Você precisa de treinar com validação cruzada. Eu pego a tabela inicial e a divido em três linhas com proporção 70%/15%/15% (as novas tabelas são chamadas de trem/teste/validado) (o código pode ser tirado do registro de chocalhos, eu comecei a partir dele). Então eu faço, por exemplo, 10 iterações de neurônios de treinamento na mesa do trem. Eu calculo o erro de previsão R^2. Eu prevejo resultados para testar e validar tabelas e cálculo R^2 para elas também. Faço mais 10 iterações de treino, repito a previsão para 3 tabelas e olho para o novo R^2. Pare de treinar quando R^2 em algumas das mesas começa a cair (sempre crescerá apenas na mesa do trem). Feito. Agora você pode repetir tudo isso novamente, usando um número diferente de neurônios ocultos e um número diferente de iterações de treinamento entre as validações cruzadas, na esperança de que o R^2 mínimo de três tabelas no final seja maior do que da última vez.

Tudo isto pode parecer um pouco complicado, mas na verdade é ainda mais complicado :), há um monte de problemas em cada uma destas etapas. Mas dá resultados consistentes.

Eu tenho um ponto de vista diferente e tu não o entendes.
 

SanSanych Fomenko:
E se você pegar os primeiros 10 (mais ou menos) antes do passo, e descartar o resto?

Eu desenhei um gráfico de R^2 e percentagem de casos vencedores em função do número de componentes utilizados. O melhor resultado na frente foi com 41 componentes (ganho de cerca de 70%, muito bom). Mas não se pode dizer isso pelos gráficos de trás, eles continuam a subir o tempo todo. Se dependermos da importância dos componentes, teremos que tomar 73, o que não é o melhor resultado na frente.

R^2 de fronttest pode ser negativo mesmo quando se ganha >50% dos casos, devido ao desequilíbrio dos resultados requeridos, o número de classes "0" é diferente de "1", portanto sua média não é 0,5, e R^2 disso é ligeiramente pior.