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

 

A dimensionalidade da matriz X

> dim(X1)
[1] 7000    8
X <- array( c(X1,X2), dim=c(7000, 8, 2) )

No seu caso, seria

X <- array( c(X1,...X100), dim=c(7000, 8, 100) )
#или, что равнозначно
X <- array( c(X1,...X100), dim=c(dim(X1), 100) )

Naturalmente, se o número de exemplos for 7000 e o comprimento da conversão = 8.

 

Este pacote "rnn" é mais um exercício de programação do que um produto para usar. Veja o pacote "RSNNS" em seu lugar.

Há algumas redes recorrentes por aí. Bem, mais em profundidade, PyBrain, keras em Ruthon.

Boa sorte.

 
Obrigado! Vou ver isso.
 

Estou a ter alguns problemas estranhos com a validação cruzada do modelo treinado. Ou melhor, parece que sempre houve problemas, só não notei.

As minhas acções são, grosso modo, as seguintes: Existem diferentes indicadores para o eurusd para o ano. Eu divido os dados aleatoriamente por linhas na proporção de 70%/15%/15% para treinamento/validação/validação.

Além disso, estes dados contêm 9000 preditores. Eu procuro geneticamente as suas variantes, treino um modelo PCA baseado em cada subconjunto de preditores. Eu treino o modelo numa amostra de treino, determino o erro. Testar o mesmo modelo em ambas as amostras de validação, determinar o erro nelas.

Eu calculo o resultado final de uma função de fitness da seguinte forma:
max(error_train,error_validate1,error_validate2) - min(error_train,error_validate1,error_validate2)
A questão é que a diferença entre erros mínimos e máximos deve ser tão pequena quanto possível (o chamado "critério Fomenko" :) ).

Tudo parece bem, o modelo atinge um erro de cerca de 25% em todas as três amostras. Mas, na frente, o erro subitamente sobe para 40%. Pensei um pouco, mudei aleatoriamente.semente para gerar amostras de cordas (não preditores, apenas cordas), e para um conjunto previamente definido de preditores (o melhor) obtive erro de treinamento/validação/validação 25%/35%/35% em vez de 25%/25%/25%, e novamente os mesmos 40% para o fronttest. O erro nas amostras de validação aumentou em +10%, muito mau.

Assim, acontece que a genética encontra a melhor versão de preditores para um determinado treinamento e amostras de validação específicas. Se espalharmos as linhas sobre as amostras numa ordem diferente, o modelo preditivo treinado não está mais funcionando adequadamente com os mesmos preditores.

Há alguma maneira padrão de lidar com isso, de modo que o modelo treinado dê aproximadamente os mesmos erros para qualquer distribuição de linhas sobre as amostras? Isto é um problema sério. Eu posso, por exemplo, gerar amostras de treinamento e validação a cada geração de genética. Ou faça dois conjuntos diferentes de amostras de linha, treine dois modelos PCA neles e obtenha o pior resultado para a função fitness. Isto faz algum sentido?

 
Dr. Trader:

Estou a ter alguns problemas estranhos com a validação cruzada do modelo treinado. Mais precisamente, acontece que sempre houve problemas, só não reparei.

(o chamado "critério Fomenko" :) ).

Eu gostei muito do critério. Obrigado.

Mas não é completamente declarado por si.

O meu critério DEVE incluir o fronttest. Se você olhar para todos os meus posts, eu sempre escrevi exatamente sobre fronttest, sob o qual, de acordo com meu entendimento, deve ser conduzido em um pedaço de observações, que são separados por tempo (por índice) dos três primeiros conjuntos.

Encontrei isto de volta no guizo, o que divide o conjunto fornecido, como você fez. Você obtém bons dados, eu tenho menos de 10% nas três amostras, e então você pega um novo arquivo e seu erro de 40% ainda é um bom resultado! Eu já tive pior.

Portanto, o meu critério para o sobretreinamento é:

1. dividimos o conjunto original em duas partes, SEM qualquer truque aleatório, puramente mecânico, em ordem de índice ascendente

2. Dividimos a primeira parte por qualquer um dos métodos aleatórios em três partes: teste de aprendizagem e validação.

3. Se nestas três partes o erro for aproximadamente igual, então vá para o passo 4

4. Executa o modelo treinado na segunda parte. O erro, novamente, deve ser aproximadamente igual. Isto é fundamental, porque quando negociamos sempre negociamos fora da amostra de treinamento e obtemos de forma consistente (não aleatória) barra após barra.

Se obtivermos aproximadamente o mesmo erro em todos os 4 pontos, o modelo não é retrabalhado.

Se houver discrepâncias significativas, o modelo é requalificado. Não encontrei nenhuma ferramenta no R para me livrar do barulho. Eu tenho o meu próprio homebrew, aqui está outro artigo sobre o PCA.

 
mytarmailS:

Anton Zverev

Não vamos ter esse tipo de conversa, as pessoas que aprendem e compartilham suas experiências aqui estão dispostas a ajudar umas às outras, enquanto você toma a posição de que você é estúpido e eu sei tudo) É melhor ajudares-me a entender o que pensas e o que sabes que está certo.

Eu concordo com você que apenas dar BP não é suficiente, você precisa comprimir a informação e descartar coisas desnecessárias que impedem uma boa decisão, idealmente para 0 ou 1 aqueles comprar/vender, ou sejaSe tivermos 10 indicadores (que eu não acredito) e filtrarmos 9 deles, deixando apenas o RSI, isso não será suficiente, uma vez que o indicador tem um intervalo e acaba por não funcionar com valores de -70 a 70, então precisamos de os comprimir e assim por diante.. a questão é como fazê-lo?

Tenho ideias sobre isto, mas ainda não tenho conhecimentos suficientes para implementar tal selector...

Minha primeira tentativa foi há muito tempo atrás, eu voltei do preço atual e procurei uma situação quase idêntica no passado, então essas situações foram ordenadas pelo resultado, como elas acabaram, por exemplo, eu tenho uma situação atual, pois foram encontrados 10 análogos no passado 8 análogos acabaram em crescimento de preços, 2 acabaram em queda, então ele vai crescer ... Mas o horror ))) é que acabou por ser o contrário, o preço caiu muito frequente e fortemente nestas situações com uma forte tendência para a compra, e depois voltou a ser testado tique a tique...

Depois fiz uma espécie de indicador, tomei a soma acumulada de todos os preços de compra e também a soma para lucro, construí a sua diferença e obtive um certo índice, quando o comparei com o preço que acabou por ser oposto ao preço, a correlação foi de -0,7 a -0,9, então, simplesmente falando, o mercado vai contra as suas próprias estatísticas, isto é algo a pensar e reconsiderar

aoDr.Trader

Talvez isto o ajude a entender um pouco de .....

Encontrei uma maneira mais rápida e fácil de ver este efeito, se for interessante posso escrever mais sobre ele.

 
SanSanych Fomenko:

4. Executa o modelo treinado na segunda parte. O erro deve ser novamente aproximadamente igual. Isto é fundamental porque quando negociamos, sempre negociamos fora da amostra de treinamento e obtemos de forma consistente (e não aleatória) barra após barra.

Já está, obrigado. Acontece que não existem 2, mas sim 3 amostras de validação - uma delas é retirada estritamente das últimas entradas do ficheiro fonte sem aleatoriedade. As outras amostras são aleatórias. Vou tentar.

Uma vez tentei tomar a primeira parte do arquivo de treinamento para validação, também estritamente por índices, também sem aleatoriedade. A idéia era que se o modelo treinado mostrar um pequeno erro nos dados do período pré-treinamento, então ele mostrará o mesmo erro nos dados do período pós-treinamento. Acabou por ser errado, erros antes do período de treino e depois do período de treino não se correlacionaram de todo.

mytarmailS:

Depois implementei tal indicador, tomei a soma acumulada de todas as previsões de compra e venda, calculei a sua diferença e obtive um índice, e quando o comparei com o preço que indicou quase oposto ao preço, a correlação foi de -0,7 a -0,9, simplesmente falando o mercado move-se contra as suas próprias estatísticas,isto é algo a pensar e reconsiderar

Este método funciona sempre para si, em qualquer intervalo de tempo? Claro que parece estranho, mas o principal é que funciona. Tive observações semelhantes com o meu modelo não treinado. Por vezes deu resultados previstos que eram estritamente o oposto dos reais. Mas às vezes ainda funciona correctamente. Durante um teste muito longo, enquanto treinava o modelo e verificava-o em diferentes intervalos de tempo, entendi que em média estava correcto cerca de 50% do tempo, por isso era inútil, podia-se atirar uma moeda ao ar para prever e obter o mesmo resultado. Depois disso verifiquei e entendi corretamente, que o modelo deve dar o resultado certo sem qualquer inversão, filtragem, soluções coletivas de muitos outros modelos. Caso contrário, posso ficar preso no caos e ao acaso.

 
Dr. Trader:

Este método funciona sempre para si, em qualquer altura? É estranho, é claro, mas o principal é que funciona. Tive observações semelhantes com o meu modelo não treinado. Por vezes deu resultados previstos que eram estritamente o oposto dos reais. Mas às vezes ainda funciona correctamente. Durante um teste muito longo, enquanto treinava o modelo e o verificava em diferentes intervalos de tempo, entendi que em média estava correcto cerca de 50% do tempo, por isso era inútil, podia-se atirar uma moeda ao ar para prever e obter o mesmo resultado. Depois disso verifiquei e entendi corretamente, que o modelo deve dar o resultado certo sem qualquer inversão, filtragem, soluções coletivas de muitos outros modelos. Caso contrário, você pode entrar numa armadilha onde o caos e a aleatoriedade dominam.

Sim, sempre e em qualquer momento (mas há nuances com a amostragem), a saída é quase uma cópia exata do preço, mas inversamente correlacionada. Com este método você pode ver como um neurônio é treinado e o que você pode esperar dele, você pode fazer várias conclusões

1) esta é a situação mais típica - se uma rede está inversamente correlacionada, significa que está treinada, caso contrário não haveria correlação inversa, certo?

2) é apenas aleatório - significa que a rede não aprendeu nada

3) Uma rede funciona em conjunto com o mercado (só consegui atingir este efeito num alvo bastante atípico) - isto significa que tudo está bem

4) E a conclusão mais importante (isto é importante para você, D. Trader) se você construir suas previsões de rede e ela vai na direção oposta como na conclusão 1, nenhuma otimização, genética, validação cruzada e outros encantos vão ajudá-lo absolutamente nada - pense nisso, é lógico e óbvio

 
mytarmailS:

1) Esta é a situação mais típica - se a rede está inversamente correlacionada, significa que está treinada, caso contrário não haveria correlação inversa, certo?

4) E a conclusão mais importante (esta é importante para você D. Trader) se você fizer suas previsões de rede neural e ela vai na direção oposta como na conclusão 1, nenhuma otimização, genética, validação cruzada e outros encantos vão ajudá-lo em absolutamente NÃO, pense nisso, é lógico e óbvio

1) A correlação inversa estável em diferentes intervalos de treinamento é um pouco estranha, mas a rede aprendeu algo, eu concordo que o resultado é bom.

4) Eu discordo deste aqui. Se usar a classificação binária (variável alvo "0" ou "1"), então a função de aptidão do geneticista ou otimizador muda facilmente para alcançar o resultado "reverso", basta subtrair o resultado atual de 1.
Por exemplo, a genética capta um certo conjunto de preditores. Eu treino os neurónios neles, faço a validação cruzada e encontro o erro médio. Eu recebo um erro de, digamos, 0,4. O resultado "inverso" da função de adequação pode ser definido como 1-0,4 = 0,6. A genética vai tentar diminuir o erro de 0,6 para zero. O resultado será um conjunto de preditores com valor 0 da função fitness. Mas isso significa que o erro real da rede neural foi 0+1 = 1. Ou seja, a neuronka obtida está errada em 100% dos casos, e esta é a correlação inversa.
Em geral, você pode usar o mesmo algoritmo genético e validação cruzada para treinar um neurônio que dará um resultado oposto ao desejado, você terá o mesmo resultado que você teve, mas de propósito. Mas não é claro para quê. :)

Eu também acrescentaria que na classificação binária com as variáveis alvo "0" e "1" o pior erro é 0,5.
Erro == 0 é bom.
Erro == 1 é seu neurônio de correlação inversa, você pode simplesmente virar o resultado e ficará tudo bem. Mas é melhor descobrires porque é assim, é uma situação muito atípica.
Erro 0,5 significa que o resultado é completamente aleatório e que o modelo é inútil de todo.

 

1

Razão: