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

 
Dr. Trader:

Obrigado, eu tentei. Eu posso ver que você fez muito para selecionar os preditores, porque os neurônios facilmente treinados neles, e armazenou o resultado no conjunto de dados do teste também.

Os resultados abaixo referem-se ao treinamento em R1.F3

1) Rattle é um resultado interessante. HH com configuração padrão mostrou erros de trem/validado/teste de 30%/29%/33%. O erro em R2.F3 é de 35%. Mas tudo isto é apenas um caso de sorte, noutra configuração teria facilmente sub ou sobre-treinado, aqui apenas teve sorte.

2) Então eu fiz uma simples abordagem grosseira com aprendizagem não supervisionada, 200 neurônios escondidos, rede foi treinada até que parou de melhorar. Erros de treino/validação/teste/R2.F3 - 2%/30%/27%/45%. Claramente, a rede está a ser requalificada.

3) Aprendizagem supervisionada. Isso é diferente das árvores, mas você deve sempre fazer isso com um neurônio para não treiná-lo em excesso. A essência é pausar o treinamento de vez em quando e verificar os resultados do treinamento/validação/teste. Não conheço a regra de ouro da recolha de resultados, mas é bastante normal treinar no conjunto de dados do comboio, depois procurar erros na validação e teste dos conjuntos de dados, parar o treino quando os erros na validação/teste param de cair. Isto dá algum tipo de garantia contra o sobretreinamento. R2.F3 é considerado indisponível durante todo este processo, e o teste só é feito após o final do treinamento. Neste caso o comboio/validar/testar/R2.F3 erros são 27%/30%/31%/37%. Aqui novamente há sobretreinamento, mas não muito. Você poderia ter parado o processo de aprendizagem cedo após o erro do trem ter se tornado notavelmente menor do que validar/teste erros, mas isso é adivinhar... pode ou não ter ajudado.

R1.F1" variável alvo tem três valores, Rattle não pode fazer isso com neurônicos e você tem que escrever seu próprio código em R, eu pulei este conjunto de dados.

"R1.F4" "R1.F5" "R1.F6" deu aproximadamente os mesmos resultados para todos os 4 erros no neurônio Rattle, eu acho que uma abordagem adequada com neurônio também dará aproximadamente os mesmos resultados, eu não tenho lidado com eles mais.

Eu tenho números semelhantes para floresta e ada.

Agora, se voltarmos aos nossos "carneiros" - como descartar o ruído de uma lista arbitrária de preditores? Eu tenho algum algoritmo empírico que selecionou meus 27 preditores de 170. Também o usei para analisar os conjuntos de preditores de outras pessoas e também com sucesso. Com base nesta experiência, eu defendo que todos os métodos de R que usam variáveis de "importância" em seus algoritmos não conseguem limpar o conjunto preditor de ruído.

Apelo a todos os leitores do tópico: estou disposto a fazer a análise apropriada se os dados brutos forem apresentados como RData ou um arquivo Excel que não necessite de processamento.

Tirando isso.

Em anexo, anexei uma série de artigos que supostamente resolvem o problema de limpar o conjunto original de preditores do ruído, e com muito melhor qualidade. Infelizmente, não tenho tempo para experimentar de momento. Talvez alguém tente publicar o resultado?

Arquivos anexados:
 
SanSanych Fomenko:

Em anexo estão vários artigos que supostamente resolvem o problema de limpar o conjunto original de preditores do ruído, e com muito mais qualidade. Infelizmente, não tenho tempo para experimentar de momento. Talvez alguém experimente e afixe o resultado?

Obrigado, folheou o documento, mas não encontrou o que eu precisava. Estou a tentar treinar o meu modelo para forex, algures entre a M15 e a H4. Não é suficiente para mim simplesmente pegar os dados para a última barra, eu preciso pegá-los para dezenas de barras de uma vez e colocá-los um após o outro em uma longa matriz para as entradas do modelo. Por exemplo (open_bar1, close_bar1, hh_bar1, open_bar2, close_bar2, hh_bar2, open_bar3, close_bar3, hh_bar3,...). Se algum método de selecção me disser para remover o tempo da segunda barra, não me ajudará, o método deve dizer-me para remover, por exemplo, todos os dados sobre o tempo (índices 3,6,9...).

Acertei, no seu arquivo ALL_cod.RData, você pode usar Rat_DF1 também para treinamento (especificando o alvo necessário) e então usar Rat_DF2 e Rat_DF3 para verificação? Anexei meu código em R para os interessados, ele implementa o treinamento de rede neural controlada por erros. Para seleccionar outra variável de destino, pode simplesmente substituir "Short_Long.75" no ficheiro por algo de "Short_Long.35", "Flet_Long", "Short_Flet", "Flet_In". É mais conveniente do que a substituição de diferentes conjuntos de dados.

Arquivos anexados:
 
Dr. Trader:
Estou a tentar treinar o meu modelo para forex, algures na gama M15-H4. Não me basta pegar os dados para a última barra, preciso pegá-los para dezenas de barras de uma vez, e colocá-los um após o outro em uma longa matriz para as entradas do modelo. Por exemplo (open_bar1, close_bar1, hh_bar1, open_bar2, close_bar2, hh_bar2, open_bar3, close_bar3, hh_bar3,...). Se algum método de selecção me disser que preciso de remover o tempo da segunda barra, não me vai ajudar, o método deve dizer-me que posso remover, por exemplo, todos os dados de tempo (índices 3,6,9...).

mmm Os dados de tempo podem ser necessários, uma vez que os mercados funcionam de forma diferente por sessão.

Veja o meu conjunto de recursos forex:

> names(sampleA)

  [1] "lag_diff_2"        "lag_diff_3"        "lag_diff_4"        "lag_diff_6"        "lag_diff_8"        "lag_diff_11"       "lag_diff_16"     

  [8] "lag_diff_23"       "lag_diff_32"       "lag_diff_45"       "lag_diff_64"       "lag_diff_91"       "lag_diff_128"      "lag_diff_181"    

 [15] "lag_diff_256"      "lag_diff_362"      "lag_diff_512"      "lag_diff_724"      "lag_mean_diff_2"   "lag_mean_diff_3"   "lag_mean_diff_4" 

 [22] "lag_mean_diff_6"   "lag_mean_diff_8"   "lag_mean_diff_11"  "lag_mean_diff_16"  "lag_mean_diff_23"  "lag_mean_diff_32"  "lag_mean_diff_45"

 [29] "lag_mean_diff_64"  "lag_mean_diff_91"  "lag_mean_diff_128" "lag_mean_diff_181" "lag_mean_diff_256" "lag_mean_diff_362" "lag_mean_diff_512"

[36] "lag_mean_diff_724" "lag_max_diff_2"    "lag_max_diff_3"    "lag_max_diff_4"    "lag_max_diff_6"    "lag_max_diff_8"    "lag_max_diff_11" 

 [43] "lag_max_diff_16"   "lag_max_diff_23"   "lag_max_diff_32"   "lag_max_diff_45"   "lag_max_diff_64"   "lag_max_diff_91"   "lag_max_diff_128"

 [50] "lag_max_diff_181"  "lag_max_diff_256"  "lag_max_diff_362"  "lag_max_diff_512"  "lag_max_diff_724"  "lag_min_diff_2"    "lag_min_diff_3"  

 [57] "lag_min_diff_4"    "lag_min_diff_6"    "lag_min_diff_8"    "lag_min_diff_11"   "lag_min_diff_16"   "lag_min_diff_23"   "lag_min_diff_32" 

 [64] "lag_min_diff_45"   "lag_min_diff_64"   "lag_min_diff_91"   "lag_min_diff_128"  "lag_min_diff_181"  "lag_min_diff_256"  "lag_min_diff_362"

 [71] "lag_min_diff_512"  "lag_min_diff_724"  "lag_sd_2"          "lag_sd_3"          "lag_sd_4"          "lag_sd_6"          "lag_sd_8"        

 [78] "lag_sd_11"         "lag_sd_16"         "lag_sd_23"         "lag_sd_32"         "lag_sd_45"         "lag_sd_64"         "lag_sd_91"       

 [85] "lag_sd_128"        "lag_sd_181"        "lag_sd_256"        "lag_sd_362"        "lag_sd_512"        "lag_sd_724"        "lag_range_2"     

 [92] "lag_range_3"       "lag_range_4"       "lag_range_6"       "lag_range_8"       "lag_range_11"      "lag_range_16"      "lag_range_23"    

 [99] "lag_range_32"      "lag_range_45"      "lag_range_64"      "lag_range_91"      "lag_range_128"     "lag_range_181"     "lag_range_256"   

[106] "lag_range_362"     "lag_range_512"     "lag_range_724"     "symbol"            "month"             "day"               "week_day"        

[113] "hour"              "minute"            "future_lag_2"      "future_lag_3"      "future_lag_4"      "future_lag_6"      "future_lag_8"    

[120] "future_lag_11"     "future_lag_16"     "future_lag_23"     "future_lag_32"     "future_lag_45"     "future_lag_64"     "future_lag_91"   

[127] "future_lag_128"    "future_lag_181"    "future_lag_256"    "future_lag_362"    "future_lag_512"    "future_lag_724"

Eu pego tanto os dados das médias móveis, como os altos e baixos, e os spreads de preços na janela. E tempo, e dias e até meses).

Os meus algoritmos podem realisticamente deixar 10 ou mesmo 5 de 114 preditores. Isto é normal. Nesses dados existe uma forte correlação entre os PREDICTORES e, por conseguinte, existe uma forte redundância.

 

Vou dar-lhe uma breve visão geral do meu método para seleccionar as características informativas. O código está anexado.

Há dois lados da questão - como selecionar os subconjuntos e como medir a relevância dos preditores selecionados para a variável de saída.

A primeira pergunta. Resolvo-o por enumeração estocástica de combinações de preditores usando o método de recozimento simulado. Semelhante em resultados à genética e descendência de gradientes não determinísticos. O lado positivo é que ele seleciona a partir de mínimos locais e funciona de acordo com o princípio de que está na natureza. Pode funcionar com uma superfície de erro não lisa, mas aqui tudo é condicional.

Para muitos problemas os defensores do método consideram-no melhor do que a genética, por exemplo. Ele é implementado através de um pacote em R como um padrão quase. O truque é que é para dados contínuos, e eu tenho índices de preditores, então eu faço um vetor contínuo de comprimento em número total de preditores e quando qualquer escalar quebra o limite dado o índice de preditor se transforma em um.

A segunda pergunta é ainda mais sutil. Função Fitness.

Como medir que o preditor (e conjunto de preditores) afeta a produção. A dependência pode ser não-linear. A regressão padrão pode ter grandes atrasos em alguns problemas não lineares. Não estou a falar do treino da caixa negra e do uso de um estimador de importância incorporado. Estou a falar de um método separado.

Você tem que entender que a dependência pode ser muito complexa e envolver interações, redundâncias, não-linearidade novamente. Todas estas coisas podem ser aplicadas tanto a dados categóricos como a numéricos.

Optei por dados categóricos, pois existem boas ferramentas de Teoria da Informação para isso. Para simplificar: há um input e um output. Se o estado de saída depende pelo menos um pouco da entrada (probabilisticamente), então eles são dependentes. Há uma coisa chamada informação mútua. Mede isto.

Agora vai mais fundo. VI mede algo sobre a distribuição observada em uma amostra de tamanho finito. Isto é, claro, uma estimativa pontual.

Portanto, precisamos de estimar os limites estatísticos da informação no caso de um par input-output independente. Isto é feito por uma função autoescrita usando métodos numéricos.

Ainda mais fundo. Se tivermos dois ou mais preditores - o que fazer com eles?

Primeiro, eles próprios podem estar relacionados e quanto mais relacionados estiverem, mais redundância haverá no seu conjunto. Esta redundância é medida pela chamada multi-informação. Mas a informação multinformática também é uma estimativa pontual numa amostra. Para ele o quantil de distribuição também é calculado numericamente através de outra função auto-escrita.

Segundo, o número de níveis de categorias de preditores pode ser tão grande (digamos, 2 ^ 15) que nada pode ser dito sobre a dependência a esses níveis. Há muito poucas observações por nível.

Finalmente, quando tudo isso é feito e colocado em conjunto, podemos medir qualquer tipo de dependência de um número arbitrário de preditores e resultados, em uma amostra arbitrária com significância estatística predeterminada. As próprias funções subjacentes são retiradas do pacote de Teoria da Informação.

Está tudo no arquivo anexo. Claro, não é fácil entendê-lo sem 100 gramas. Há também um código completo para a criação de regras comerciais e sua validação. Tudo para sua informação e para aprofundar o seu conhecimento.

Basicamente, o resultado é o habitual:

[1] "1.69%"

> final_vector <- c((sao$par >= threshold), T)

> names(sampleA)[final_vector]

 [1] "lag_diff_23"      "lag_diff_45"      "lag_mean_diff_2"  "lag_mean_diff_8"  "lag_max_diff_11"  "lag_max_diff_181" "lag_min_diff_3"   "lag_min_diff_724"

 [9] "lag_sd_724"       "lag_range_32"     "symbol" "future_lag_181"  

Após um dia e meio de trabalho e uma enumeração de dezenas de milhares de combinações de preditores, a função produz um valor de função de aptidão - esta é uma informação mútua significativa penalizada por redundância no conjunto de preditores. E os próprios prognosticadores.

Tudo isto, repito, é categórico e permite a construção de regras legíveis pelo homem. Permite a interpretação do padrão encontrado.

Por exemplo, acima eu tenho 1,7% de determinismo completo (o que não é mau para o Forex) e muitos inputs que juntos significativamente no nível de confiança de 0,1 (coloco a experiência dessa forma) determinam o estado de saída (binário). Isto é, claramente a informação nos dados forex está presente. A questão - comprovada experimentalmente.

Depois disso, podemos avaliar na validação a rentabilidade e codificar o sistema comercial.

Alexey

Arquivos anexados:
 
Dr. Trader:


Entendi corretamente que no seu arquivo ALL_cod.RData você também pode usar Rat_DF1 para treinamento (especificando o alvo desejado) e então usar Rat_DF2 e Rat_DF3 para verificação? Anexei meu código em R para os interessados, ele implementa o treinamento de rede neural controlada por erros. Para seleccionar outra variável de destino, pode simplesmente substituir "Short_Long.75" no ficheiro por algo de "Short_Long.35", "Flet_Long", "Short_Flet", "Flet_In". Isto é mais conveniente do que a substituição de diferentes conjuntos de dados.

Sim. Exactamente por conveniência no guizo.

Mais uma nuance.

Todas as variáveis-alvo são derivadas de duas ZZs: ZZ(35) e ZZ(25). E aqui está uma nuance muito desagradável que ressoa com a sua.

A variável alvo é uma sequência de 0 e 1, que corresponde ao braço ZZ. Mas nós SEMPRE prevemos um único elemento do braço ZZ, não o braço em si. Portanto, é incorrecto dizer que estamos a prever tendências. É correto dizer que estamos prevendo um elemento de uma tendência. E se você somar todos os elementos de tendência previstos, a tendência provavelmente não vai funcionar.

 

Obrigado por feature_selector_modeller.zip, vou dar uma vista de olhos.

SanSanych Fomenko:

Dirijo-me a todos os leitores do ramo: estou pronto para fazer a análise correspondente, caso os dados iniciais sejam apresentados sob a forma de ficheiro RData ou Excel, que não necessita de processamento.

Eu anexei o arquivo, é um conjunto de dados de forex. Dentro da RData com dois conjuntos de dados, para formação e validação. Fisicamente os dados nos dois conjuntos de dados correm um atrás do outro, eles são divididos em dois arquivos apenas para a conveniência de testar o modelo. O modelo neste conjunto de dados pode ser treinado, eu peneirei manualmente os preditores e treinei o neurônio, no final o erro mínimo no conjunto de dados de validação foi de 46%, o que não é realmente rentável. Você pode pensar em um lucro real se o erro cair abaixo de 40%. Por favor, tente retirar os preditores deste arquivo.

SanSanych Fomenko:

A variável alvo é uma sequência de 0 e 1, que corresponde à alavancagem ZZ. Mas nós SEMPRE prevemos um elemento individual do braço ZZ, não o braço em si. Portanto, é incorrecto dizer que estamos a prever tendências. É correto dizer que estamos prevendo um elemento de uma tendência. E se você somar todos os elementos de tendência previstos, você provavelmente não terá nem mesmo uma tendência.

Eu tentei diferentes variáveis-alvo. Por um lado, você pode prever o preço uma barra à frente e depois a variável alvo será 1 ou 0, dependendo se o preço para a próxima barra for para cima ou para baixo. Nunca obtive qualquer resultado em prazos pequenos, o preço de fecho parece ser um número bastante aleatório. Mas no H1 e acima já há algum resultado positivo.

Outra variante é o ziguezague ou outros indicadores de tendência. Obtive alguns resultados positivos com ele mas na condição de passar o resultado através do filtro. Por exemplo, para tomar a média dos resultados das últimas barras ou utilizar os resultados apenas acima de um determinado valor limite. Na minha opinião, não vale a pena aplicar tudo isso, é mais um trabalho de adivinhação do que cálculos precisos. O problema é que o modelo é obrigado a dar apenas sinais de compra para as próximas 10-20 barras, enquanto às vezes dá sinais de venda entre elas. Nesse caso, o negócio é revertido, a comissão e o spread são pagos, e assim por diante, várias vezes por tendência. Portanto, devemos obter ou alta precisão ou suavizar os resultados para evitar tais reversões em apenas uma barra. Isto é, como você disse, apenas um elemento de uma tendência é previsto; a tendência em si não pode ser composta de tais elementos.

Arquivos anexados:
set56.RData.zip  525 kb
 
Dr. Trader:


Eu tentei diferentes variáveis-alvo. Por um lado, você pode prever o preço uma barra à frente e então a variável alvo será 1 ou 0, dependendo se o preço da próxima barra subiu ou caiu. Nunca obtive qualquer resultado em prazos pequenos, o preço de fecho parece ser um número bastante aleatório. Mas no H1 e acima já há algum resultado positivo.


Os meus resultados são consistentemente o oposto. Eu posso facilmente prever o movimento dos preços alguns minutos antes (até uma hora) com 55% de precisão (Ask to Ask). O melhor resultado durante 23 minutos. É uma classificação binária em amostras de validação.

E à medida que o horizonte de previsão aumenta, a precisão cai lentamente para 51% às 12 horas à frente. E esta correlação está presente em toda a história. Mas a precisão tem de ser ainda maior para chegar ao lado positivo (para ultrapassar a distância Ask - Bid).

Discutiremos isso mais tarde.

 
Dr. Trader:

Obrigado pelo feature_selector_modeller.zip, vai analisar o assunto.

Eu anexei o arquivo, é um conjunto de dados forex. Dentro da RData com dois conjuntos de dados, para formação e validação. Fisicamente os dados nos dois conjuntos de dados se sucedem, eles são divididos em dois arquivos apenas para a conveniência de testar o modelo. O modelo neste conjunto de dados pode ser treinado, eu peneirei manualmente os preditores e treinei o neurônio, no final o erro mínimo no conjunto de dados de validação foi de 46%, o que não é realmente rentável. Você pode pensar em um lucro real se o erro cair abaixo de 40%. Por favor, tente tirar os preditores deste arquivo.


Eu não encontrei um único preditor - todos são barulho. Os seus preditores não têm poder de previsão para a sua variável alvo. Algumas dicas 54,55,56. Talvez consigas arrancar algo deles... Caso contrário, no que me diz respeito, tudo pode ser deitado fora.
 
Estou a ver, obrigado, vou procurar outras entradas.
 
Dr. Trader:
Estou a ver, obrigado, vou procurar por outros dados em bruto.

Espera aí. Vou verificar os seus dados para as dependências também.

Uma pergunta antes de eu começar. Os seus dados incluem todas as barras em fila, ou houve um desbaste das barras antes de fazer as amostras?