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

 
Mihail Marchukajtes:
Não, malta, o sistema desapareceu, nem sequer faz sentido mostrá-lo.

Poderá ser porque me esqueci de avisar que o classificador ternário mudou a sua lógica?

Binário tem a mesma lógica: se o valor de saída for inferior a zero, é como um 0 na amostra. Se for mais, é 1 na amostra.

E ternário se a saída for: 1 como 1 na amostra, 0 como 0 na amostra, -1 como "-" no jPrediction.

 


fez por interesse uma comissão de 8 modelos e simulou na validação uma sequência de 4000 negócios (5,5 anos de negociação). Esta é uma simulação de Monte Carlo para se ter uma idéia do possível escopo de crescimento dos depósitos, sem ajuste para os pontos de troca iniciais (o que dá uma corrida no testador de estratégia). Aqui o MO na validação é de 0.00026 pips. O quantil inferior está obviamente acima de zero, que é o que eu queria obter.

A seguir analisaremos a distribuição do fator de recuperação para estas séries.

Esta é a distribuição do fator de recuperação. A mediana de 3,7 é mais ou menos o valor-alvo (plano). O quantil inferior também não é mau...

Ainda temos de esperar por mais 80 amostras de treino e fazer um comité maior.

 
Yury Reshetov:

Poderá ser porque me esqueci de avisar que o classificador ternário mudou a sua lógica?

Binário tem a mesma lógica: se o valor de saída for inferior a zero, é como um 0 na amostra. Se for mais, é 1 na amostra.

E ternário se a saída for: 1 como 1 na amostra, 0 como 0 na amostra, -1 como "-" no jPrediction.

ҮNo Já percebi, está tudo bem com essa.... Há aqui outra coisa. A questão é que o Optimizer é muito bom em encontrar dados contendo informações de saída. Uma vez que os dados são encontrados com uma generalização acima de 80%. Estes dados podem ser utilizados com sucesso em qualquer outra topologia de rede e o resultado do treinamento será perfeito, sem necessidade de treinamento de novo treinamento, etc. Isto é para aqueles que não querem usar o otimizador diretamente na negociação. No meu caso, verificou-se que os dados utilizados para a classificação de saída não foram totalmente bem-sucedidos, por isso os resultados comerciais de sexta-feira não foram os que eu gostaria. No entanto, não desanimei e encontrei outro conjunto de previsões que, quando repetidamente construídas, não levaram a um estado de lixo na entrada e saída....... de qualquer forma aqui estão algumas recomendações para usar o classificador como um filtro de sinal inteligente para o seu TS (não a previsão)

1. Compra e venda separada de sinais separadamente. Se você usar dados de valores anteriores e tal separação confundir a ordem dos dados, então necessariamente um dos predicados deve ser o sinal do sinal. Buy=1, Sell=-1, ou seja, um dos predicados será a direção do sinal.

2. Os predicados devem estar de alguma forma relacionados com o sistema de previsão. Tenho-o como Zscore de sinal, Kelli de sinal, ordem de sinal (o sistema não é reversível, por isso pode haver vários sinais consecutivos numa direcção). Basicamente, a informação que de alguma forma está relacionada com o sistema. Você pode até pegar o Momentum, separadamente no otimizador MT4 eu selecionei um parâmetro que dá lucro em um período de teste, quando a negociação pelo sistema sinaliza. Isto é, o momento é otimizado para os sinais do sistema na área de treinamento, etc.

3. Saia. Esta é a parte mais importante, porque no meu caso a produção de 100 pips deu 50% de generalização do lucro, e mudou para 10 pips e a generalização cresceu para 65%. No TS da Demark é bastante difícil de fazer. Muitas vezes tenho que olhar para ele manualmente, porque a formalização da abordagem neste caso não passa........ Na área de treinamento é melhor cometer erros nos sinais, mas ainda assim obter um modelo com um alto nível de generalização. Digamos que o sinal ganhou 100 pips em treinamento e ainda o marcamos como 0 porque o mercado estava propenso ao lado oposto do sinal. Ou seja, deixamos o TS perder deliberadamente para aumentar o nível de generalização e assim fazer o TS funcionar melhor no futuro. Afinal, nossa saída é ideal, que seja um pouco não ideal, mas correta....

4) Usar os volumes de negociação da CME nas previsões. Isto realmente funciona e aumenta o nível de generalização do modelo SIGNIFICANTLY...... Eu retiro do grupo delta, por isso é assim.....

 
Alexey Burnakov:

Esta é uma simulação de Monte Carlo para se ter uma idéia da faixa possível de crescimento dos depósitos, sem ajuste para os pontos de troca iniciais (o que dá uma corrida no testador de estratégia).

Espero que não importa como você mova os pontos de partida dos ofícios, todos eles são após o período de treinamento. Por exemplo, se você treinou o modelo em dados de janeiro e março de 2015 (removendo dados de fevereiro), então você não deve fazer a validação final em fevereiro, mesmo que esses dados não estejam na amostra de treinamento, mas tais resultados não serão confiáveis. A validação só apresentará resultados adequados esperados na negociação real se a iniciar em abril de 2015, após todas as datas que poderiam ter sido utilizadas pelo modelo em treinamento ou validações cruzadas para se adequar aos parâmetros do modelo.

Minha segunda tentativa (regressão arredondada para [0;0.5;1]) em seus dados não foi bem sucedida. O modelo e a genética escolheram novamente a opção de classe constante "sem troca".
Aparentemente, para prever três classes o neurônio deve necessariamente ter 3 outputs, caso contrário ele não pode encaixar três classes em um output com níveis. Ou tive que remover a classe "não trocar" e deixar duas classes e trabalhar com elas.

A fim de verificar de alguma forma algo na frente eu peguei uma lista de preditores selecionados pela genética, treinei um neurônio sobre eles (tudo está correto, com três outputs e com fator na entrada) através de carpete com validações cruzadas (método = "repeatedcv"). Acabou por ser mais ou menos assim, a precisão mesmo nos dados de treino é de apenas 40%.
Acabei de notar agora que o ficheiro de validação tem números reais nas suas saídas, não classes. Acabei de substituí-los por +1 para todos os positivos e -1 para todos os negativos.
Além disso, tenho duas precisões para a frente:
1) dado que na previsão=0 o modelo não deve ser comercializado, então o resultado correto é irrelevante, pois o comércio não será aberto e não afetará as estatísticas finais. Nesse caso, as previsões -1 e 1 são correctas 51% das vezes (ignorando todos os exemplos em que a previsão=0).
2) Pegue todas as previsões, compare com todos os resultados corretos. Nesse caso precisão = 14%, ainda pior do que aleatório.

Estou me perguntando qual será o resultado do modelo de negociação em seu emulador de negociação, você poderia, por favor, fazer um gráfico como o acima, mas negociando com o modelo que eu anexei?
O ficheiro RData era demasiado grande e o fórum não o aceitou imediatamente. Fiz dois arquivos vinrar e coloquei-os separadamente em arquivos zip. Você precisa extrair ambos os arquivos zipados, depois abrir o primeiro arquivo zipado, extrair dados, o segundo arquivo zipado será ligado por si só e, o mais importante, eles devem estar na mesma pasta.
Ou você pode executar o r script em anexo, ele contém uma lista de preditores selecionados, e gerará um modelo com eles. Você deve ter o arquivo csv original que você postou, ele é usado.
O mesmo script também pode ser executado após abrir RData a partir do ataque, o script vai pegar o modelo pronto em vez de criar um novo, há um exemplo de previsão e estimativa de precisão no código. O arquivo RData que você postou anteriormente é necessário para o fronttest.

Dados os erros do passado, estou a começar a minha terceira tentativa.

 
Dr. Trader:

1) considerando que na previsão=0 o modelo não deve ser comercializado, então o resultado correto não importa, pois o comércio não será aberto e não afetará as estatísticas finais. Neste caso as previsões -1 e 1 estão correctas em 51% dos casos (ignorando todos os exemplos em que a previsão=0).

Para uma resposta incorreta eu daria -2 pontos, para nenhuma resposta -1, para uma resposta correta 1. A proporção de pontos atribuídos pelas respostas pode variar para um lado ou para o outro, mas é importante que a rede não se esgote desnecessariamente, por isso a abstenção deve ser penalizada.

O comitê de duas redes deu 1 sinal cada, -1 (ou 0) nenhum sinal, se os sinais fossem contraditórios o sinal final era 0. Então os sinais das redes foram combinados num sinal total de [-1, 0, 1].

 

Dr. Trader:

Espero que não importa como você mova os pontos de partida dos ofícios, todos eles estão após o período de treinamento. Por exemplo, se você treinou o modelo em dados de janeiro e março de 2015 (removendo dados de fevereiro), então você não deve fazer a validação final em fevereiro, mesmo que esses dados não estejam na amostra de treinamento, mas tais resultados não serão confiáveis. A validação só apresentará resultados adequados esperados na negociação real se a iniciar em abril de 2015, após todas as datas que poderiam ter sido utilizadas pelo modelo em treinamento ou validações cruzadas para se adequar aos parâmetros do modelo.


Sim, claro, você pode ser revestido a ferro. É exactamente uma validação. É que as seqüências de transações são amostradas aleatoriamente a partir de um grande volume de observações. Monte Carlo é necessário para entender onde a curva de comércio pode estar. Qualquer mudança de comércio por alguns minutos em uma direção ou outra gera suas próprias curvas. No testador de MT vejo uma curva - uma implementação. Se eu construir em uma condição com um gerador de números aleatórios em cada comércio e abrir com um número aleatório, eu posso executar o testador de estratégia 500 vezes e obter as mesmas curvas. Mas em MT demoraria muito tempo. E eu preciso dele em 30 segundos.

Então, quando eu fizer o EA no comitê, eu executarei a validação no testador de estratégia. A curva deve caber em um ventilador e eu terei um valor único de fator de recuperação e expectativa matemática. Mas não se pode tirar conclusões de uma só corrida. Não é desejável.

 
Dr.Trader:


Estou me perguntando qual será o resultado da troca do modelo em seu emulador de negociação, você poderia por favor fazer um gráfico como acima, mas trocando com o modelo que eu tenho anexado?
O ficheiro RData é demasiado grande e o fórum não o aceitou de imediato. Fiz dois arquivos vinrar e coloquei-os separadamente em arquivos zip. Você precisa extrair ambos os arquivos zipados, depois abrir o primeiro arquivo zipado, extrair dados, o segundo arquivo zipado será ligado por si só e, o mais importante, eles devem estar na mesma pasta.
Ou você pode executar o r script em anexo, ele contém uma lista de preditores selecionados, e gerará um modelo com eles. Você deve ter o arquivo csv original que você postou, ele é usado.
O mesmo script também pode ser executado após abrir RData a partir do ataque, o script vai pegar o modelo pronto em vez de criar um novo, há um exemplo de previsão e estimativa de precisão no código. O arquivo RData que você postou anteriormente é necessário para o fronttest.

Considerando os erros do passado, iniciar uma terceira tentativa.

E que modelo você está aprendendo, Neural Network?

Deixa-me tentar isso mais tarde. Tenho um modelo de aprendizagem em todos os núcleos a toda a hora.

Na verdade, eu pensei que você seria o juiz disso. Basta substituir as previsões do modelo no arquivo de validação que eu dei no link. Estas devem ser direções do formulário +1 / -1 / 0. Haverá uma nova coluna de previsão. Multiplique a coluna de previsão pela coluna de destino. Subtrair 0,0001 de spread. Eliminar as entradas em que a saída do modelo é 0. Assumir a função cumsum:

plot(cumsum(your_data$trades_simulated_after_spread), type = 'l')

 mean(your_data$trades_simulated_after_spread)

Mais ou menos isto irá representar o comércio sobre todas as observações e calcular o MO. É simples.

 
Alexey Burnakov:

E que modelo você está aprendendo, a Rede Neural?

...

Multiplique a coluna de previsão pela coluna de destino.

Sim, estou a aprender uma rede neural, o pacote nnet. Neste caso, estou treinando o modelo com carpete, que capta um par de parâmetros do modelo.

Eu olhei novamente para a coluna de resultados no seu arquivo RData, agora imediatamente vi que eram ganhos de preço. Da última vez pensei que era algum tipo de probabilidades.
Eu gostei de como você armazena o incremento de preço na variável alvo, se necessário você pode facilmente convertê-los em aulas para treinamento, ou calcular o lucro. Eu também vou fazer isso.

Consegui tudo, obrigado pelo esclarecimento, contei o lucro, fatoreiei no spread, desenhei o gráfico. Que pena, MO = -2.052423e-05, perda lenta mas segura.

Sobre o spread, ele só precisa ser considerado em 4 casos:
1, 2) Previsão para última barra = 0; previsão para nova barra = -1 ou 1. Abrir uma nova posição.
3) Previsão para a última barra = -1; previsão para a nova barra = 1. Inverter, a posição antiga é fechada, a nova posição é aberta.
4) Previsão para a barra anterior = 1; previsão para a nova barra = -1. Ao contrário, a posição antiga é fechada; a nova posição é aberta.
Em todos os outros casos, ou a posição antiga da última barra permanece ou a posição antiga é fechada, ou não há posição alguma. Tudo isto não requer uma propagação.

(Mais especificamente, os negócios de compra são abertos no bid+spread, e fechados no bid. Os negócios de venda são abertos ao contrário no bid+spread, e fechados no bid+spread. Lance é o preço que normalmente é mostrado no terminal. Mas, por conveniência, com uma propagação constante, basta considerá-lo simplesmente uma vez ao abrir uma nova posição - é mais fácil assim).

Tudo isso deve ser considerado em um EA para que ele não feche uma posição que é aberta imediatamente na mesma direção em uma nova barra. Uma vez cometi um erro destes quando pensei que ia receber descontos do meu corretor. Mas neste caso, a frequência das transacções para os descontos não compensa, tudo é pior.

 
Dr.Trader:

Sim, estou a aprender uma rede neural, o pacote nnet. Neste caso, estou treinando o modelo com carpete, que capta alguns parâmetros do modelo.

Olhei novamente para a coluna de resultados no vosso ficheiro RData, agora vi imediatamente que eram ganhos de preço. Da última vez pensei que era algum tipo de probabilidades.
Gostei de como você armazena o incremento de preço na variável de destino, se necessário você pode facilmente convertê-los em aulas para treinamento, ou calcular o lucro. Eu também vou fazer isso.

Consegui tudo, obrigado pelo esclarecimento, contei o lucro, fatoreiei no spread, desenhei o gráfico. Que pena, MO = -2.052423e-05, perda lenta mas segura.

Sobre o spread, ele só precisa ser considerado em 4 casos:
1, 2) Previsão para última barra = 0; previsão para nova barra = -1 ou 1. Abrir uma nova posição.
3) Previsão na última barra = -1; previsão na nova barra = 1. Inverter, a posição antiga é fechada, a nova posição é aberta.
4) Previsão para a barra anterior = 1; previsão para a nova barra = -1. Ao contrário, a posição antiga é fechada; a nova posição é aberta.
Em todos os outros casos, ou a posição antiga da última barra permanece ou a posição antiga é fechada, ou não há posição alguma. Tudo isto não requer uma propagação.

(Mais especificamente, os negócios de compra são abertos no bid+spread, e fechados no bid. Os negócios de venda são abertos inversamente em lances, e fechados em lances+spread. Lance é o preço que normalmente é mostrado no terminal. Mas, por conveniência, com uma propagação constante, basta considerá-lo simplesmente uma vez ao abrir uma nova posição - é mais fácil assim).

Tudo isso deve ser considerado em um EA para que ele não feche uma posição que é aberta imediatamente na mesma direção em um novo bar. Uma vez cometi um erro destes quando pensei que ia receber descontos do meu corretor. Mas a frequência das transações para descontos neste caso não compensa, só piora.

Em ordem.

MO É 0,00002. Isto já está mais do que - espalhado. Ou seja, o modelo aprendeu algo com o ruído, mas a força da previsão é insuficiente.

Segundo. Você já especificou de alguma forma qual parte dos dados deve ser inserida em uma determinada dobra? Se você simplesmente não tiver o CV (CV repetido), o modelo tomará observações selecionadas aleatoriamente para o teste. Não é a melhor opção no caso das séries cronológicas.

A seguir, a simulação da troca. Tenho um sinal simples para abrir e fechar após um certo número de minutos. E depois podes torná-lo mais complexo. Portanto, eu tenho um MO positivo ao levar em conta o spread em cada comércio. E isto é realista de se conseguir.

Faça algum trabalho com validação cruzada. É possível criar conjuntos de índices para incluir certas partes das séries cronológicas nos vaus.

E há muitos outros métodos para além da neurónica. Um dos melhores hoje é o GBM ou XGBOOST. Eu escolhi o primeiro até agora. Eu gosto disso.

 

Eu usei o método "repeatedcv" no trainControl, com uma divisão padrão. Recentemente eu mesmo escrevi código para a validação cruzada, tentei a validação cruzada tanto com barras tiradas aleatoriamente como com pedaços tirados consecutivamente, sem lacunas. Não vi nenhuma diferença na frente, deu aproximadamente o mesmo resultado em ambos os casos. Eu dividi os dados para treinamento/crossvalidação 50%/50%, talvez nessa proporção não tenha mais importância.
Vou fazer experiências com isso em carpete...

Lembro-me que naquele artigo que você postou há algum tempo atrás, a comparação principal foi o aumento de árvores com o método de Platt (algo parecido com isso). Tudo o que encontrei no google sobre este método é que você tem que passar a saída do modelo para sigmoid e pegar o seu resultado. O gbm ou o xgboost podem fazer isso? Esta abordagem parece ser melhor do que floresta, neuronka e algumas "árvores ensacadas", que vêm em segundo lugar.

Razão: