Sunday, 22 April 2018

Opção de aprendizado de máquina de negociação


Forex Mecânico


Negociação no mercado de câmbio usando estratégias de negociação mecânicas.


Machine Learning em Forex Trading: Por que muitos acadêmicos estão fazendo tudo errado.


Construir estratégias de aprendizado de máquina que podem obter resultados decentes sob condições reais de mercado sempre foi um desafio importante na negociação algorítmica. Apesar do grande interesse e das incríveis recompensas em potencial, ainda não há publicações acadêmicas capazes de mostrar um bom aprendizado de máquina. modelos que podem resolver com sucesso o problema de negociação no mercado real (para o melhor de meu conhecimento, postar um comentário se você tiver um e eu vou ser mais do que feliz em lê-lo). Embora muitos artigos publicados pareçam mostrar resultados promissores, é frequente que esses artigos caiam em uma variedade de problemas de viés estatístico que tornam o real sucesso de mercado de suas estratégias de aprendizado de máquina altamente improvável. No post de hoje, vou falar sobre os problemas que vejo na pesquisa acadêmica relacionada ao aprendizado de máquina no Forex e como acredito que essa pesquisa poderia ser melhorada para fornecer informações muito mais úteis para as comunidades acadêmica e comercial.


A maioria das armadilhas no projeto de estratégia de aprendizado de máquina ao fazer operações de Forex é inevitavelmente herdada do mundo dos problemas determinísticos de aprendizagem. Ao construir um algoritmo de aprendizado de máquina para algo como reconhecimento de face ou reconhecimento de letras, há um problema bem definido que não muda, que geralmente é resolvido construindo um modelo de aprendizado de máquina em um subconjunto de dados (um conjunto de treinamento) e testando se O modelo foi capaz de resolver corretamente o problema usando o lembrete dos dados (um conjunto de testes). É por isso que você tem alguns conjuntos de dados famosos e bem estabelecidos que podem ser usados ​​para estabelecer a qualidade das técnicas de aprendizado de máquina recém-desenvolvidas. O ponto chave aqui, no entanto, é que os problemas inicialmente enfrentados pelo aprendizado de máquina eram, em grande parte, determinísticos e independentes do tempo.


Ao entrar na negociação, a aplicação dessa mesma filosofia gera muitos problemas relacionados tanto ao caráter parcialmente não determinístico do mercado quanto à sua dependência temporal. O simples ato de tentar selecionar conjuntos de treinamento e testes introduz uma quantidade significativa de viés (um viés de seleção de dados) que cria um problema. Se a seleção for repetida para melhorar os resultados no conjunto de testes & # 8211; o que você deve assumir acontece em pelo menos alguns casos & # 8211; então o problema também adiciona uma grande quantidade de viés de mineração de dados. Toda a questão de se fazer um único exercício de treinamento / validação também gera um problema relacionado à maneira como esse algoritmo deve ser aplicado na negociação ao vivo. Por definição, a negociação ao vivo será diferente, já que a seleção de conjuntos de treinamento / teste precisa ser reaplicada a dados diferentes (já que o conjunto de testes é realmente um dado desconhecido). O viés inerente à seleção inicial do período in-sample / out-of-sample e a falta de quaisquer regras testadas para negociação sob dados desconhecidos faz com que tais técnicas falhem comumente na negociação ao vivo. Se um algoritmo for treinado com dados de 2000-2012 e tiver sido validado com dados de 2012-2015, não há razão para acreditar que o mesmo sucesso ocorrerá se treinado em dados de 2003-2015 e depois negociado de 2015 a 2017, os conjuntos de dados são muito diferentes na natureza.


O sucesso do algoritmo de medição também é um problema muito relevante aqui. Inevitavelmente, os algoritmos de aprendizado de máquina usados ​​para o comércio devem ser medidos em termos de mérito por sua capacidade de gerar retornos positivos, mas alguma literatura mede o mérito de novas técnicas algorítmicas, tentando avaliar sua capacidade de obter previsões corretas. As previsões corretas não são necessariamente iguais às negociações lucrativas, como você pode ver facilmente ao criar classificadores binários. Se você tentar prever a direção da próxima vela, ainda poderá sofrer uma perda se estiver quase certo em pequenas velas e errado em velas maiores. De fato, a maior parte desse tipo de classificadores & # 8211; a maioria daqueles que não trabalham & # 8211; acabam prevendo a direcionalidade com uma precisão acima de 50%, ainda não acima do nível necessário para superar as comissões que permitiriam a lucrativa troca de opções binárias.


Para construir estratégias que estejam quase totalmente livres dos problemas acima, sempre defendi uma metodologia na qual o algoritmo de aprendizado de máquina é retreinado antes de tomar qualquer decisão de treinamento. Usando uma janela móvel para treinamento e nunca tomando mais de uma decisão sem reciclar todo o algoritmo, podemos nos livrar do viés de seleção inerente à escolha de um único conjunto dentro da amostra / fora da amostra. Dessa maneira, todo o teste é uma série de exercícios de treinamento / validação que garantem que o algoritmo de aprendizado de máquina funcione mesmo sob conjuntos de dados de treinamento tremendamente diferentes. Eu também defendo a medição do desempenho real do backtesting para medir o mérito de um algoritmo de aprendizado de máquina e, além disso, eu diria até que nenhum algoritmo pode valer seu sal sem ser provado em condições reais fora da amostra. . Desenvolver algoritmos dessa maneira é muito mais difícil e eu não encontrei um único artigo acadêmico que siga este tipo de abordagem (se eu perdi, fique à vontade para postar um link para que eu possa incluir um comentário!).


Isto não significa que esta metodologia seja completamente livre de problemas, no entanto, ainda está sujeita aos problemas clássicos relevantes para todos os exercícios de construção de estratégia, incluindo viés de ajuste de curva e viés de mineração de dados. É por isso que também é importante usar uma grande quantidade de dados (eu uso mais de 25 anos para testar sistemas, sempre treinando novamente após cada decisão derivada de aprendizado de máquina) e para realizar testes adequados de avaliação de viés de mineração de dados para determinar a confiança com a qual nós Podemos dizer que os resultados não vêm do acaso. Meu amigo AlgoTraderJo & # 8211; que também passa a ser um membro da minha comunidade de negociação & # 8211; Atualmente, está crescendo um segmento no ForexFactory seguindo este mesmo tipo de filosofia para o desenvolvimento de aprendizado de máquina, enquanto trabalhamos em alguns novos algoritmos de aprendizado de máquina para minha comunidade comercial. Você pode consultar o tópico dele ou postagens anteriores no meu blog para vários exemplos de algoritmos de aprendizado de máquina desenvolvidos dessa maneira.


Se você gostaria de aprender mais sobre nossos desenvolvimentos em aprendizado de máquina e como você também pode desenvolver suas próprias estratégias de aprendizado de máquina usando a estrutura F4, considere juntar-se a Asirikuy, um site repleto de vídeos educacionais, sistemas de negociação, desenvolvimento e e abordagem transparente para negociação automatizada.


5 Responses to & # 8220; Machine Learning em Forex Trading: Por que muitos acadêmicos estão fazendo tudo errado & # 8221;


Ótimo artigo, os problemas que você destaca são certamente válidos para a robustez do sistema!


Uma pergunta que eu tenho, é normal dizer que um EA faz muito bem em um certo par e se dá mal em todos os outros?


Ou, se um EA robusto se sair bem em pelo menos vários pares, sem qualquer alteração nas configurações!


Obrigado por seus grandes pensamentos.


Essa pergunta é interessante, o). Eu acredito que a pergunta é melhor formulada como "pode ​​um sistema que sobrevive em apenas um par gerar retornos quando negociado ao vivo? & # 8221; a resposta é sim (tanto da teoria quanto da minha própria experiência). Ter retornos em apenas um par não significa que o sistema seja "ruim". Significa simplesmente que explora uma ineficiência histórica que só está presente em um instrumento. Desde que você cuide de fontes de viés (como viés de mineração de dados e viés de ajuste de curva), não há motivo para que isso não funcione.


Agora, se você tiver um sistema que funcione com muitos símbolos, o viés de mineração de dados será exponencialmente menor para um sistema igual que só funciona em um símbolo e o viés de ajuste de curva também será menor devido ao uso de mais dados. Então, eu diria que é melhor, mas definitivamente não é obrigatório.


Mas lembre-se, meça seus preconceitos estatísticos!


Estou tão feliz que você disse que não tem que lucrar com todos os pares! Também ajuste a curva, como se sabe o limite de ajustes permitido antes de ser montado?


Finalmente, eu fiz um teste muito simples usando o pântano padrão Moving Average EA no MT4, para ver quais pares reagiriam mais amplamente aos MAs. Eu backtested 52 pares para ver quantos "Moving Period" entre (1-20) faria um lucro, independentemente do levantamento. Eu me perguntei o que você faz dos resultados!


* Período de teste de 5 anos.


* Drawdown não medido.


* 52 pares testados.


* Configurações testadas (Períodos de 1 a 20).


1 23 pares, não teve nenhum lucro em qualquer configuração de barra 1-20.


2 6 pares, só poderia fazer lucro em 1 configuração.


3 14 pares apenas, retornaram um lucro em 5 ou mais configurações diferentes.


4 5 pares apenas, retornaram um lucro em 10 ou mais configurações diferentes.


1 BTCUSD 19 Configurações de 20, fez um lucro.


É preciso fazer uma distinção entre o viés de ajuste de curva e o viés de mineração de dados (ou, pelo menos, esses dois tipos diferentes de polarização, no entanto, você pode chamá-los). O viés de ajuste de curva é um viés criado por encontrar uma ineficiência em um conjunto de dados. Ele responde à pergunta: o sistema está encontrando algo geral ou algo específico nos dados que estou usando? O viés da mineração de dados responde à pergunta: o meu sistema está encontrando uma ineficiência histórica real ou os resultados são apenas por causa do meu processo de mineração (que vem do acaso aleatório)?


Ao aumentar os espaços de parâmetro e os graus de liberdade, você está aumentando o viés de mineração de dados (é mais provável que você encontre um sistema apenas por acaso, em vez de um sistema que comercializa uma ineficiência histórica real). Você pode medir o viés de mineração de dados usando um teste como o de realidade da White. Fazer esse tipo de teste é fundamental para o design de estratégia confiável.


Leia mais sobre essa distinção entre vieses aqui:


Leia também este artigo sobre o assunto:


Antes de me debruçar sobre as complexidades do design do sistema de negociação e encontrar estratégias para negociar, aconselho vivamente a obter uma formação sólida em estatística (os cursos de estatística Coursera são um excelente começo gratuito). As estatísticas darão a você o poder de analisar seus próprios resultados e abordar metodicamente questões como essas;


Aprendizado de máquina em Forex Trading: Por que muitos acadêmicos estão fazendo tudo errado [Mechanical Forex] Construir estratégias de aprendizado de máquina que podem obter resultados decentes sob condições de mercado ao vivo sempre foi um desafio importante no comércio algorítmico. Apesar da grande quantidade de interesse e das incríveis recompensas em potencial, ainda não há publicações acadêmicas que sejam capazes de mostrar bons modelos de aprendizado de máquina que possam enfrentar com sucesso o problema do comércio no mercado real [& # 8230;]


Melhores estratégias 4: Machine Learning.


Deep Blue foi o primeiro computador que ganhou um campeonato mundial de xadrez. Isso foi em 1996, e levou 20 anos até que outro programa, AlphaGo, pudesse derrotar o melhor jogador de Go humano. O Deep Blue era um sistema baseado em modelos com regras de xadrez hardwired. O AlphaGo é um sistema de mineração de dados, uma rede neural profunda treinada com milhares de jogos Go. Não melhorou hardware, mas um avanço no software foi essencial para a etapa de bater os melhores jogadores de xadrez para bater os melhores jogadores de Go.


Nesta quarta parte da minissérie, analisaremos a abordagem de mineração de dados para o desenvolvimento de estratégias de negociação. Este método não se preocupa com os mecanismos de mercado. Ele apenas verifica curvas de preços ou outras fontes de dados para padrões preditivos. Aprendizado de máquina ou & # 8220; Inteligência Artificial & # 8221; nem sempre está envolvido em estratégias de mineração de dados. Na verdade, o mais popular # 8211; e surpreendentemente rentável & # 8211; O método de mineração de dados funciona sem nenhuma rede neural sofisticada ou máquina de vetores de suporte.


Princípios de aprendizado de máquina.


Um algoritmo de aprendizagem é alimentado com amostras de dados, normalmente derivadas de algum modo dos preços históricos. Cada amostra consiste em n variáveis ​​x 1 .. x n, comumente chamadas de preditores, recursos, sinais ou simplesmente input. Esses preditores podem ser os retornos de preço das últimas n barras, ou uma coleção de indicadores clássicos, ou quaisquer outras funções imagináveis ​​da curva de preço (eu mesmo vi os pixels de uma imagem do gráfico de preços usados ​​como preditores de um gráfico neural). rede!). Cada amostra também inclui normalmente uma variável-alvo y, como o retorno da transação seguinte após a amostra, ou o próximo movimento de preço. Na literatura você pode encontrar y também chamado rótulo ou objetivo. Em um processo de treinamento, o algoritmo aprende a predizer o alvo y a partir dos preditores x 1 .. x n. A memória erudita & # 8216; & # 8217; é armazenado em uma estrutura de dados denominada model que é específica para o algoritmo (não confundir com um modelo financeiro para estratégias baseadas em modelos!). Um modelo de aprendizado de máquina pode ser uma função com regras de predição no código C, geradas pelo processo de treinamento. Ou pode ser um conjunto de pesos de conexão de uma rede neural.


Os preditores, recursos ou o que quer que você os chame, devem conter informações suficientes para prever a meta com alguma precisão. Eles também geralmente cumprem dois requisitos formais. Primeiro, todos os valores de previsão devem estar no mesmo intervalo, como -1 .. +1 (para a maioria dos algoritmos R) ou -100 .. +100 (para algoritmos Zorro ou TSSB). Então você precisa normalizá-los de alguma forma antes de enviá-los para a máquina. Em segundo lugar, as amostras devem ser equilibradas, isto é, igualmente distribuídas por todos os valores da variável alvo. Portanto, deve haver tantos vencendo quanto perdendo amostras. Se você não observar esses dois requisitos, ficará imaginando por que está obtendo resultados ruins com o algoritmo de aprendizado de máquina.


Os algoritmos de regressão predizem um valor numérico, como a magnitude e o sinal do próximo movimento de preço. Algoritmos de classificação preveem uma classe de amostra qualitativa, por exemplo, se ela precede uma vitória ou uma perda. Alguns algoritmos, como redes neurais, árvores de decisão ou máquinas de vetores de suporte, podem ser executados em ambos os modos.


Alguns algoritmos aprendem a dividir amostras em classes sem precisar de nenhum destino. Isso é aprendizagem não supervisionada, ao contrário da aprendizagem supervisionada usando um alvo. Em algum lugar entre os dois está o aprendizado por reforço, em que o sistema se treina executando simulações com os recursos dados e usando o resultado como alvo de treinamento. AlphaZero, o sucessor do AlphaGo, usou o aprendizado de reforço ao jogar milhões de jogos Go contra si mesmo. Em finanças, há poucas aplicações para aprendizado não supervisionado ou de reforço. 99% das estratégias de aprendizado de máquina usam o aprendizado supervisionado.


Seja qual for o sinal que estamos usando para os preditores em finanças, eles provavelmente conterão muito ruído e pouca informação, e serão não-estacionários em cima dele. Portanto, a previsão financeira é uma das tarefas mais difíceis no aprendizado de máquina. Algoritmos mais complexos não atingem necessariamente melhores resultados. A seleção dos preditores é fundamental para o sucesso. Não é uma boa ideia usar muitos preditores, pois isso simplesmente causa overfitting e falha na operação de amostra. Portanto, as estratégias de mineração de dados geralmente aplicam um algoritmo de pré-seleção que determina um pequeno número de preditores de um conjunto de muitos. A pré-seleção pode se basear na correlação entre preditores, no significado, no conteúdo da informação ou simplesmente no sucesso da previsão com um conjunto de testes. Experimentos práticos com seleção de recursos podem ser encontrados em um artigo recente no blog Robot Wealth.


Aqui está uma lista dos métodos mais populares de mineração de dados usados ​​em finanças.


1. Sopa indicadora.


A maioria dos sistemas de negociação que estamos programando para clientes não é baseada em um modelo financeiro. O cliente queria apenas sinais comerciais de determinados indicadores técnicos, filtrados com outros indicadores técnicos em combinação com indicadores mais técnicos. Quando perguntado como essa miscelânea de indicadores poderia ser uma estratégia lucrativa, ele normalmente respondia: "Confie em mim." Eu estou trocando isso manualmente, e isso funciona. & # 8221;


Isso realmente aconteceu. Pelo menos às vezes. Embora a maioria desses sistemas não tenham passado no teste WFA (e alguns nem mesmo um simples backtest), um número surpreendentemente grande foi o que aconteceu. E esses também eram frequentemente lucrativos em negociações reais. O cliente tinha sistematicamente experimentado indicadores técnicos até encontrar uma combinação que funcionasse na negociação ao vivo com certos ativos. Essa forma de análise técnica de tentativa e erro é uma abordagem clássica de mineração de dados, executada apenas por um ser humano e não por uma máquina. Eu não posso realmente recomendar este método & # 8211; e muita sorte, para não falar de dinheiro, está provavelmente envolvida & # 8211; mas posso testemunhar que às vezes leva a sistemas lucrativos.


2. Padrões de vela.


Não deve ser confundido com aqueles Padrões Japoneses de Vela que tiveram seu melhor encontro antes, há muito tempo. O equivalente moderno é a negociação de ações de preço. Você ainda está olhando para as velas abertas, altas, baixas e fechadas. Você ainda está esperando encontrar um padrão que preveja uma direção de preço. Mas agora você está analisando as curvas de preços contemporâneas para coletar esses padrões. Existem pacotes de software para esse fim. Eles pesquisam padrões que são lucrativos por algum critério definido pelo usuário e os utilizam para criar uma função específica de detecção de padrões. Poderia se parecer com este (do analisador de padrões do Zorro):


Esta função C retorna 1 quando os sinais correspondem a um dos padrões, caso contrário, 0. Você pode ver no longo código que essa não é a maneira mais rápida de detectar padrões. Um método melhor, usado pelo Zorro quando a função de detecção não precisa ser exportada, está classificando os sinais pela sua magnitude e verificando a ordem de classificação. Um exemplo de tal sistema pode ser encontrado aqui.


O preço da negociação de ações realmente funciona? Assim como a sopa indicadora, ela não é baseada em nenhum modelo financeiro racional. Pode-se imaginar, na melhor das hipóteses, que sequências de movimentos de preços fazem com que os participantes do mercado reajam de uma determinada maneira, estabelecendo assim um padrão preditivo temporário. No entanto, o número de padrões é bastante limitado quando você olha apenas sequências de algumas velas adjacentes. O próximo passo é comparar velas que não são adjacentes, mas arbitrariamente selecionadas dentro de um período de tempo mais longo. Dessa forma, você está obtendo um número quase ilimitado de padrões & # 8211; mas ao custo de finalmente deixar o reino do racional. É difícil imaginar como um movimento de preço pode ser previsto por alguns padrões de velas de semanas atrás.


Ainda assim, muito esforço está sendo feito. Um colega blogueiro, Daniel Fernandez, administra um site de assinatura (Asirikuy) especializado em padrões de velas de mineração de dados. Ele refinou o padrão de negociação até os menores detalhes, e se alguém conseguisse algum lucro dessa maneira, seria ele. Mas para seus assinantes & # 8217; decepção, trocando seus padrões ao vivo (QuriQuant) produziu resultados muito diferentes dos seus maravilhosos backtests. Se realmente existem sistemas de ações lucrativas, aparentemente ninguém os encontrou ainda.


3. Regressão linear


A base simples de muitos algoritmos complexos de aprendizado de máquina: Preveja a variável de destino y por uma combinação linear dos preditores x 1 .. x n.


Os coeficientes a n são o modelo. Eles são calculados para minimizar a soma das diferenças quadráticas entre os valores verdadeiros de y das amostras de treinamento e seus y previstos da fórmula acima:


Para amostras distribuídas normais, a minimização é possível com alguma aritmética de matriz, portanto, nenhuma iteração é necessária. No caso n = 1 & # 8211; com apenas uma variável preditora x & # 8211; a fórmula de regressão é reduzida para.


que é a regressão linear simples, em oposição à regressão linear multivariada em que n & gt; 1 Regressão linear simples está disponível na maioria das plataformas de negociação, f. i. com o indicador LinReg no TA-Lib. Com y = preço e x = tempo, ele é frequentemente usado como alternativa a uma média móvel. A regressão linear multivariada está disponível na plataforma R através da função lm (..) que acompanha a instalação padrão. Uma variante é a regressão polinomial. Como a regressão simples, ele usa apenas uma variável preditora x, mas também seu quadrado e graus mais altos, de modo que x n == x n:


Com n = 2 ou n = 3, a regressão polinomial é freqüentemente usada para prever o próximo preço médio dos preços suavizados das últimas barras. A função polyfit do MatLab, R, Zorro e muitas outras plataformas podem ser usadas para a regressão polinomial.


4. Perceptron.


Muitas vezes referida como uma rede neural com apenas um neurônio. De fato, um perceptron é uma função de regressão como acima, mas com um resultado binário, chamado de regressão logística. Não é a regressão, é um algoritmo de classificação. A função de aviso do Zorro (PERCEPTRON, & # 8230;) gera o código C que retorna 100 ou -100, dependendo se o resultado previsto está acima de um limite ou não:


Você pode ver que a matriz de caracteres é equivalente aos recursos x n na fórmula de regressão e os fatores numéricos são os coeficientes a n.


5. Redes nacionais.


A regressão linear ou logística só pode resolver problemas lineares. Muitos não se enquadram nesta categoria & # 8211; Um exemplo famoso é prever a saída de uma função XOR simples. E provavelmente também prevê preços ou retornos comerciais. Uma rede neural artificial (RNA) pode lidar com problemas não-lineares. É um monte de perceptrons que estão conectados em uma matriz de camadas. Qualquer perceptron é um neurônio da rede. Sua saída vai para as entradas de todos os neurônios da próxima camada, assim:


Como o perceptron, uma rede neural também aprende determinando os coeficientes que minimizam o erro entre a previsão da amostra e o alvo da amostra. Mas isso requer agora um processo de aproximação, normalmente com retropropagação do erro da saída para as entradas, otimizando os pesos em seu caminho. Este processo impõe duas restrições. Primeiro, as saídas dos neurônios devem agora ser funções continuamente diferenciáveis, em vez do simples limiar do perceptron. Em segundo lugar, a rede não deve ser muito profunda & # 8211; não deve ter muitas & # 8216; camadas ocultas & # 8217; de neurônios entre entradas e saídas. Essa segunda restrição limita a complexidade dos problemas que uma rede neural padrão pode resolver.


Ao usar uma rede neural para prever negociações, você tem muitos parâmetros com os quais você pode brincar e, se você não for cuidadoso, produzirá um grande viés de seleção:


Número de camadas ocultas Número de neurônios por camada oculta Número de ciclos de retropropagação, épocas nomeadas Taxa de aprendizado, a largura do passo de uma época Momentum, um fator de inércia para a adaptação de pesos Função de ativação.


A função de ativação emula o limiar do perceptron. Para a retropropagação você precisa de uma função continuamente diferenciável que gere um & # 8216; soft & # 8217; passo em um determinado valor x. Normalmente, uma função sigmoid, tanh ou softmax é usada. Às vezes, também é uma função linear que apenas retorna a soma ponderada de todas as entradas. Nesse caso, a rede pode ser usada para regressão, para prever um valor numérico em vez de um resultado binário.


As redes neurais estão disponíveis na instalação padrão R (nnet, uma única rede de camada oculta) e em muitos pacotes, por exemplo, RSNNS e FCNN4R.


6. Aprendizagem profunda.


Os métodos de aprendizagem profunda usam redes neurais com muitas camadas ocultas e milhares de neurônios, que não poderiam ser efetivamente treinados pela retropropagação convencional. Vários métodos se tornaram populares nos últimos anos para o treinamento de redes tão grandes. Eles costumam pré-treinar as camadas de neurônios ocultos para alcançar um processo de aprendizado mais efetivo. Uma máquina restrita de Boltzmann (RBM) é um algoritmo de classificação não supervisionado com uma estrutura de rede especial que não tem conexões entre os neurônios ocultos. Um Autoencoder Escasso (SAE) usa uma estrutura de rede convencional, mas pré-treina as camadas ocultas de maneira inteligente, reproduzindo os sinais de entrada nas saídas da camada com o mínimo possível de conexões ativas. Esses métodos permitem redes muito complexas para lidar com tarefas de aprendizagem muito complexas. Tal como bater o melhor jogador humano do mundo.


Redes de aprendizagem profunda estão disponíveis nos pacotes R deep e darch. A Deepnet fornece um autoencoder, Darch uma máquina Boltzmann restrita. Eu ainda não experimentei o Darch, mas aqui está um exemplo do script R usando o autoencoder do Deepnet com 3 camadas ocultas para sinais de negociação através da função neural () do Zorro:


7. Máquinas de vetores de suporte.


Como uma rede neural, uma máquina de vetores de suporte (SVM) é outra extensão da regressão linear. Quando olhamos novamente para a fórmula de regressão,


podemos interpretar os recursos x n como coordenadas de um espaço de recurso n-dimensional. Definir a variável de destino y como um valor fixo determina um plano nesse espaço, chamado de hiperplano, pois possui mais de duas dimensões (na verdade, n-1). O hiperplano separa as amostras com y & gt; o das amostras com y & lt; 0 Os coeficientes an podem ser calculados de forma que as distâncias do plano às amostras mais próximas & # 8211; que são chamados os vetores de suporte & # 8216; & # 8217; do avião, daí o nome do algoritmo & # 8211; é o máximo. Desta forma, temos um classificador binário com separação ideal de amostras vencedoras e perdedoras.


O problema: normalmente essas amostras não são linearmente separáveis ​​& # 8211; eles estão espalhados irregularmente no espaço de recursos. Nenhum plano plano pode ser espremido entre vencedores e perdedores. Se pudesse, nós tínhamos métodos mais simples para calcular esse plano, f. i. análise discriminante linear. Mas, para o caso comum, precisamos do truque do SVM: Adicionar mais dimensões ao espaço do recurso. Para isso, o algoritmo SVM produz mais recursos com uma função kernel que combina quaisquer dois preditores existentes para um novo recurso. Isso é análogo ao passo acima da regressão simples à regressão polinomial, onde também mais características são adicionadas, tomando o único preditor da enésima potência. Quanto mais dimensões você adicionar, mais fácil será separar as amostras com um hiperplano plano. Este plano é então transformado de volta ao espaço n-dimensional original, ficando enrugado e amassado no caminho. Ao selecionar inteligentemente a função kernel, o processo pode ser executado sem realmente computar a transformação.


Como as redes neurais, as SVMs podem ser usadas não apenas para classificação, mas também para regressão. Eles também oferecem alguns parâmetros para otimizar e possivelmente sobrecarregar o processo de previsão:


Função de kernel. Você normalmente usa um kernel RBF (função de base radial, um kernel simétrico), mas você também tem a escolha de outros kernels, como sigmoid, polynomial e linear. Gama, a largura do parâmetro de Custo do kernel RBF C, a penalidade & # 8216; & # 8217; para classificações erradas nas amostras de treinamento.


Um SVM frequentemente usado é a biblioteca libsvm. Também está disponível em R no pacote e1071. Na próxima e última parte desta série pretendo descrever uma estratégia de negociação usando este SVM.


8. K-vizinho mais próximo.


Comparado com as coisas pesadas de ANN e SVM, é um algoritmo simples e agradável com uma propriedade única: ele não precisa de treinamento. Então as amostras são o modelo. Você poderia usar este algoritmo para um sistema de negociação que aprende permanentemente simplesmente adicionando mais e mais amostras. O algoritmo do vizinho mais próximo calcula as distâncias no espaço de feições a partir dos valores atuais do recurso para as amostras k mais próximas. Uma distância no espaço n-dimensional entre dois conjuntos de recursos (x 1 .. x n) e (y 1 .. y n) é calculada exatamente como em 2 dimensões:


O algoritmo simplesmente prevê o alvo a partir da média das k variáveis-alvo das amostras mais próximas, ponderadas pelas suas distâncias inversas. Pode ser usado para classificação, bem como para regressão. Os truques de software emprestados da computação gráfica, como uma árvore binária adaptativa (ABT), podem tornar o vizinho mais próximo bastante rápido. Na minha vida passada como programador de jogos de computador, usamos esses métodos em jogos para tarefas como a inteligência inimiga de autoaprendizagem. Você pode chamar a função knn em R para a previsão do vizinho mais próximo & # 8211; ou escreva uma função simples em C para esse propósito.


Este é um algoritmo de aproximação para classificação não supervisionada. Tem alguma semelhança, não apenas seu nome, com o vizinho mais próximo. Para classificar as amostras, o algoritmo primeiro coloca k pontos aleatórios no espaço de recurso. Em seguida, ele atribui a qualquer um desses pontos todas as amostras com as menores distâncias a ele. O ponto é então movido para a média dessas amostras mais próximas. Isso gerará uma nova atribuição de amostras, pois algumas amostras estão agora mais próximas de outro ponto. O processo é repetido até que a atribuição não mude mais movendo os pontos, ou seja, cada ponto fica exatamente na média de suas amostras mais próximas. Agora temos k classes de amostras, cada uma na vizinhança de um dos k pontos.


Esse algoritmo simples pode produzir resultados surpreendentemente bons. Em R, a função kmeans faz o truque. Um exemplo do algoritmo k-means para classificar os padrões de vela pode ser encontrado aqui: Classificação não-supervisionada de castiçal para diversão e lucro.


10. Naive Bayes.


Este algoritmo usa Bayes & # 8217; Teorema para classificar amostras de recursos não numéricos (ou seja, eventos), como os padrões de velas mencionados acima. Suponha que um evento X (por exemplo, que o Open da barra anterior esteja abaixo do Open da barra atual) apareça em 80% de todas as amostras vencedoras. Qual é então a probabilidade de que uma amostra esteja ganhando quando ela contém o evento X? Não é 0,8, como você pode pensar. A probabilidade pode ser calculada com Bayes & # 8217; Teorema:


P (Y | X) é a probabilidade de que o evento Y (f. i. ganhar) ocorra em todas as amostras contendo o evento X (no nosso exemplo, Open (1) & lt; Open (0)). De acordo com a fórmula, é igual à probabilidade de X ocorrer em todas as amostras vencedoras (aqui, 0,8), multiplicada pela probabilidade de Y em todas as amostras (em torno de 0,5 quando você estava seguindo o meu conselho de amostras balanceadas) e dividido por a probabilidade de X em todas as amostras.


Se somos ingênuos e assumimos que todos os eventos X são independentes uns dos outros, podemos calcular a probabilidade geral de que uma amostra está ganhando, simplesmente multiplicando as probabilidades P (X | ganhando) para cada evento X. Desta forma, acabamos com esta fórmula:


com um fator de escala s. Para que a fórmula funcione, as características devem ser selecionadas de forma que sejam tão independentes quanto possível, o que impõe um obstáculo ao uso de Naive Bayes na negociação. Por exemplo, os dois eventos Close (1) & lt; Close (0) e Open (1) & lt; Open (0) provavelmente não é independente um do outro. Os preditores numéricos podem ser convertidos em eventos dividindo o número em intervalos separados.


O algoritmo Naive Bayes está disponível no pacote onipresente R e1071.


11. Árvores de decisão e regressão.


Essas árvores predizem um resultado ou um valor numérico com base em uma série de decisões sim / não, em uma estrutura como os ramos de uma árvore. Qualquer decisão é a presença de um evento ou não (no caso de recursos não numéricos) ou uma comparação de um valor de recurso com um limite fixo. Uma típica função de árvore, gerada pelo construtor de árvores do Zorro, se parece com isto:


Como essa árvore é produzida a partir de um conjunto de amostras? Existem vários métodos; O Zorro usa a entropia de informação de Shannon, que já apareceu neste blog no artigo Scalping. No começo, ele verifica um dos recursos, digamos x 1. Ele coloca um hiperplano com a fórmula de plano x 1 = t no espaço de recurso. Este hiperplano separa as amostras com x 1 & gt; t das amostras com x 1 & lt; t. O limiar de divisão t é selecionado para que as informações ganhem & # 8211; a diferença de entropia de informação de todo o espaço, para a soma das entropias de informação dos dois sub-espaços divididos & # 8211; é o máximo. Esse é o caso quando as amostras nos subespaços são mais semelhantes entre si do que as amostras em todo o espaço.


Este processo é então repetido com o próximo recurso x 2 e dois hiperplanos dividindo os dois subespaços. Cada divisão é equivalente a uma comparação de um recurso com um limite. Por meio da divisão repetida, logo obtemos uma árvore enorme com milhares de comparações de limites. Em seguida, o processo é executado ao contrário, podando a árvore e removendo todas as decisões que não levam a um ganho substancial de informações. Finalmente acabamos com uma árvore relativamente pequena como no código acima.


As árvores de decisão possuem uma ampla variedade de aplicativos. Eles podem produzir previsões excelentes superiores às de redes neurais ou máquinas de vetores de suporte. Mas elas não são uma solução única, já que seus planos de divisão são sempre paralelos aos eixos do espaço de recursos. Isso limita um pouco suas previsões. Eles podem ser usados ​​não apenas para classificação, mas também para regressão, por exemplo, retornando a porcentagem de amostras que contribuem para um determinado ramo da árvore. A árvore do Zorro é uma árvore de regressão. O algoritmo de árvore de classificação mais conhecido é o C5.0, disponível no pacote C50 para R.


Para melhorar ainda mais a previsão ou superar a limitação do eixo paralelo, um conjunto de árvores pode ser usado, chamado de floresta aleatória. A previsão é então gerada pela média ou votação das previsões das árvores individuais. Florestas aleatórias estão disponíveis nos pacotes R randomForest, ranger e Rborist.


Conclusão.


Existem muitos métodos diferentes de mineração de dados e aprendizado de máquina à sua disposição. A questão crítica: o que é melhor, uma estratégia baseada em modelos ou em aprendizado de máquina? Não há dúvida de que o aprendizado de máquina tem muitas vantagens. Você não precisa se preocupar com a microestrutura do mercado, a economia, a psicologia do trader ou o material leve similar. Você pode se concentrar em matemática pura. O aprendizado de máquina é uma maneira muito mais elegante e atraente de gerar sistemas de comércio. Tem todas as vantagens do seu lado, mas um. Apesar de todos os tópicos entusiasmados em fóruns de trader, ele tende a falhar misteriosamente em negociações ao vivo.


A cada segunda semana, um novo artigo sobre negociação com métodos de aprendizado de máquina é publicado (alguns podem ser encontrados abaixo). Por favor, leve todas aquelas publicações com um grão de sal. De acordo com alguns documentos, taxas de ganho fantásticas na faixa de 70%, 80% ou mesmo 85% foram alcançadas. Embora a taxa de ganho não seja o único critério relevante & # 8211; você pode perder mesmo com uma alta taxa de vitória & # 8211; A exatidão de 85% em prever negócios é normalmente equivalente a um fator de lucro acima de 5. Com tal sistema, os cientistas envolvidos devem ser bilionários enquanto isso. Infelizmente, nunca consegui reproduzir as taxas de ganho com o método descrito e nem sequer cheguei perto. Então, talvez muitos preconceitos de seleção tenham entrado nos resultados. Ou talvez eu seja muito burro.


Em comparação com estratégias baseadas em modelos, não vi muitos sistemas de aprendizado de máquina bem-sucedidos até agora. E a partir do que se ouve sobre os métodos algorítmicos de fundos de hedge bem-sucedidos, o aprendizado de máquina parece ainda ser raramente usado. Mas talvez isso mude no futuro com a disponibilidade de mais poder de processamento e o surgimento de novos algoritmos para aprendizado profundo.


Classificação usando redes neurais profundas: Dixon. et. al.2016 Previsão da direção do preço usando ANN & amp; SVM: Kara. et. al.2011 Comparação empírica de algoritmos de aprendizagem: Caruana. et. al.2006 Tendência do mercado de ações de mineração usando GA & amp; SVM: Yu. Wang. Lai.2005.


A próxima parte desta série tratará do desenvolvimento prático de uma estratégia de aprendizado de máquina.


30 pensamentos sobre "Melhor Estratégias 4: Aprendizado de Máquina", rdquo;


Bela postagem. Há muito potencial nessa abordagem em relação ao mercado.


Btw você está usando o editor de código que vem com zorro? como é possível obter essa configuração de cores?


O script colorido é produzido pelo WordPress. Você não pode alterar as cores no editor do Zorro, mas pode substituí-lo por outros editores que suportem cores individuais, como o Notepad ++.


É possível então que o bloco de notas detecte as variáveis ​​zorro nos scripts? Quero dizer que o BarPeriod é observado como é com o editor do zorro?


Teoricamente sim, mas para isso você tinha que configurar o realce de sintaxe do Notepad ++, e inserir todas as variáveis ​​na lista. Até onde sei, o Notepad ++ também não pode ser configurado para exibir a descrição da função em uma janela, como o editor Zorro faz. Não existe uma ferramenta perfeita & # 8230;


Concordo com o parágrafo final. Eu tentei muitas técnicas de aprendizado de máquina depois de ler várias revisões por pares & # 8217; papéis. Mas reproduzir seus resultados permanece indefinido. Quando vivo o teste com ML, não consigo ultrapassar a entrada aleatória.


ML falha ao vivo? Talvez o treinamento do ML tenha que ser feito com dados de preços que incluem também histórico de spread, roll, tick e assim por diante?


Eu acho que o motivo # 1 para falha ao vivo é o viés de mineração de dados, causado pela seleção tendenciosa de entradas e parâmetros para o algoritmo.


Obrigado ao autor pela grande série de artigos.


No entanto, deve-se notar que não precisamos restringir nossa visão com a previsão apenas do próximo movimento de preço. Pode acontecer que o próximo passo vá contra o nosso comércio em 70% dos casos, mas ainda vale a pena fazer uma troca. Isso acontece quando o preço finalmente chega à direção certa, mas antes disso pode dar alguns passos contra nós. Se atrasarmos a negociação por uma única etapa de preço, não entraremos nos 30% mencionados de negócios, mas para isso aumentaremos o resultado dos 70% restantes em uma única etapa de preço. Portanto, o critério é qual valor é maior: N * average_result ou 0.7 * N * (avergae_result + price_step).


Bela postagem. Se você quer apenas brincar com algum aprendizado de máquina, eu implementei uma ferramenta ML muito simples em python e adicionei uma GUI. É implementado para prever séries temporais.


Obrigado JCL eu achei muito interessante o seu artigo. Gostaria de lhe perguntar, a partir de sua experiência em negociação, onde podemos fazer o download de dados históricos confiáveis ​​de forex? Eu considero muito importante devido ao fato de que o mercado Forex é descentralizado.


Desde já, obrigado!


Não há dados Forex realmente confiáveis, já que todo corretor Forex cria seus próprios dados. Todos eles diferem um pouco dependendo de quais provedores de liquidez eles usam. O FXCM tem relativamente bons dados de M1 e tick com poucas lacunas. Você pode baixá-lo com o Zorro.


Obrigado por escrever uma ótima série de artigos JCL & # 8230; uma leitura muito agradável!


No entanto, devo dizer que não vejo estratégias baseadas em modelos e aprendizado de máquina como sendo mutuamente exclusivas; Eu tive algum sucesso OOS usando uma combinação dos elementos que você descreve.


Para ser mais exato, eu começo o processo de geração do sistema, desenvolvendo um & # 8216; tradicional & # 8217; modelo matemático, mas, em seguida, use um conjunto de algoritmos de aprendizado de máquina on-line para prever os próximos termos das várias séries temporais diferentes (não o próprio preço) que são usados ​​dentro do modelo. As regras de negociação reais são então derivadas das interações entre essas séries temporais. Então, em essência, não estou apenas lançando cegamente os dados de mercado recentes em um modelo de ML em um esforço para prever a direção da ação de preço, mas desenvolvo uma estrutura baseada em sólidos princípios de investimento para apontar os modelos na direção certa. Eu, então, dados meus os parâmetros e medir o nível de viés de mineração de dados, como você também descreveu.


Vale a pena mencionar, no entanto, que nunca tive muito sucesso com o Forex.


De qualquer forma, boa sorte com sua negociação e mantenha os ótimos artigos!


Obrigado por postar este ótimo mini-série JCL.


Recentemente, estudei alguns artigos mais recentes sobre negociação em ML, especialmente em aprendizado profundo. No entanto, descobri que a maioria deles avaliava os resultados sem um índice ajustado ao risco, ou seja, eles geralmente usavam a curva ROC, PNL para apoiar o experimento em vez do índice de Sharpe, por exemplo.


Além disso, raramente mencionaram a frequência de negociação nos resultados de experimentos, dificultando a avaliação da rentabilidade potencial desses métodos. Por que é que? Você tem alguma sugestão boa para lidar com essas questões?


Os papéis ML normalmente visam alta precisão. A variação da curva de capital não é de nenhum interesse. Isso é justificado porque a qualidade de previsão de ML determina a precisão, não a variância.


É claro que, se você quiser realmente negociar esse sistema, a variação e o rebaixamento são fatores importantes. Um sistema com menor precisão e pior previsão pode, de fato, ser preferível quando é menos dependente das condições de mercado.


"De fato, o mais popular - e surpreendentemente lucrativo - método de mineração de dados funciona sem qualquer rede neural ou máquinas de vetores de suporte."


Você poderia, por favor, nomear os mais populares & amp; surpreendentemente rentáveis. Então eu poderia usá-los diretamente.


Eu estava me referindo às estratégias da sopa de indicadores. Por razões óbvias, não posso divulgar detalhes de tal estratégia e nunca desenvolvi tais sistemas. Estamos simplesmente codificando-os. Mas posso dizer que criar uma lucrativa sopa de indicadores requer muito trabalho e tempo.


Bem, eu estou apenas começando um projeto que usa EMAs simples para prever o preço, basta selecionar os EMAs corretos com base no desempenho passado e na seleção de algoritmos que produzem algum grau rústico de inteligência.


Jonathan. orrego@gmail oferece serviços como programador MT4 EA.


Obrigado pelo bom writeup. Na realidade costumava ser uma conta de lazer.


Olhe complicado para mais entregues agradável de você!


Falando nisso, como podemos entrar em contato?


Existem os seguintes problemas com o ML e com os sistemas de negociação em geral, que são baseados na análise de dados históricos:


1) Dados históricos não codificam informações sobre movimentos futuros de preços.


O movimento futuro dos preços é independente e não está relacionado ao histórico de preços. Não há absolutamente nenhum padrão confiável que possa ser usado para extrair sistematicamente os lucros do mercado. Aplicar métodos de ML neste domínio é simplesmente inútil e fadado ao fracasso e não funcionará se você procurar um sistema lucrativo. É claro que você pode adaptar-se a qualquer período anterior e criar um sistema lucrativo para ele.


A única coisa que determina o movimento dos preços é a demanda e a oferta, e estes são frequentemente o resultado de fatores externos que não podem ser previstos. Por exemplo: uma guerra irrompe em algum lugar ou outras grandes catástrofes ou alguém só precisa comprar uma grande quantidade de moeda estrangeira para algum propósito de negócio / investimento. Esse tipo de evento causará mudanças significativas na estrutura de oferta de demanda do mercado de câmbio. Como conseqüência, os preços começam a se mover, mas ninguém se preocupa com o histórico de preços apenas sobre a execução das ordens recebidas. Um sistema de negociação automatizado só pode ser rentável se monitorar uma parte significativa do mercado e levar em conta a oferta e a demanda para tomar uma decisão comercial. Mas este não é o caso de nenhum dos sistemas discutidos aqui.


2) Corrida para o fundo.


Mesmo se (1) não fosse verdade e houvesse informações valiosas codificadas em dados históricos de preços, você ainda enfrentaria o seguinte problema: há milhares de escavadores de ouro por aí, todos usando métodos semelhantes e até mesmo o mesmo ferramentas para procurar sistemas rentáveis ​​e analisar os mesmos dados históricos de preços. Como resultado, muitos deles descobrirão o mesmo ou muito semelhante & # 8220; lucrativo & # 8221; sistemas de negociação e quando eles realmente começarem a negociar esses sistemas, eles se tornarão cada vez menos lucrativos devido à natureza do mercado.


Os únicos vencedores certos neste cenário serão os fornecedores de tecnologia e ferramentas.


Eu ainda estarei de olho nos seus posts, pois gosto da sua abordagem e do vigor científico que você aplica. Seu blog é o melhor desse tipo & # 8211; continue o bom trabalho!


Uma dica: existem sistemas automatizados lucrativos, mas eles não são baseados em dados de preços históricos, mas em conhecimento proprietário sobre a estrutura de mercado e as operações das principais instituições que controlam esses mercados. Digamos que existem muitas ineficiências no sistema atual, mas você não tem absolutamente nenhuma chance de encontrar as informações sobre elas analisando dados históricos de preços. Em vez disso, você precisa saber quando e como as instituições executarão ordens de movimentação de mercado e as executarão.


Obrigado pelo extenso comentário. Muitas vezes ouço esses argumentos e eles soam realmente intuitivos, o único problema é que eles são facilmente provados errados. O caminho científico é experimento, não intuição. Testes simples mostram que os preços passados ​​e futuros são frequentemente correlacionados & # 8211; de outra forma, cada segundo experimento neste blog teve um resultado muito diferente. Muitos fundos bem-sucedidos, por exemplo, o fundo Renaissance de Jim Simon, baseiam-se principalmente na previsão algorítmica.


Mais uma coisa: no meu comentário, tenho me referido implicitamente ao lado da compra (hedge funds, traders, etc.) e não ao lado da venda (market makers, bancos). O segundo tem sempre a vantagem, porque eles vendem no pedido e compram na oferta, embolsando o spread como um lucro adicional para qualquer estratégia que eles possam estar executando. Em relação ao Jim Simon's Renaissance: não tenho tanta certeza se eles não fizeram a transição ao longo do tempo para o lado de venda, a fim de permanecer rentável. Não há absolutamente nenhuma informação disponível sobre a natureza de seus negócios além da declaração vaga de que eles estão usando apenas modelos quantitativos de negociação algorítmica & # 8230;


Obrigado pelo post informativo!


Em relação ao uso de alguns desses algoritmos, uma queixa comum citada é que os dados financeiros são não-estacionários. Você acha que isso é um problema? Não era possível usar apenas os dados de retorno, o que é (eu acho) estacionário?


Sim, isso é um problema com certeza. Se os dados financeiros estivessem parados, todos ficaríamos ricos. Receio que tenhamos de viver com o que é. Os retornos não são mais estacionários do que outros dados financeiros.


Olá senhor, eu desenvolvi um conjunto de regras para minha negociação que identifica as zonas de demanda de fornecimento do que o volume e todos os outros critérios. Você pode me ajudar a entrar no sistema automatizado? Se eu vou fazer isso sozinho, então pode levar muito tempo. Por favor contacte-me em svadukia @ gmail se estiver interessado.


Claro, entre em contato com meu empregador em info@opgroup. de. Eles vão ajudar.


Percebi que você não monetiza sua página, não desperdice seu tráfego,


você pode ganhar dinheiro extra todo mês porque tem conteúdo de alta qualidade.


Se você quiser saber como fazer um extra, procure: Mrdalekjd methods for $$$


A análise técnica sempre foi rejeitada e desprezada por quants, acadêmicos ou qualquer pessoa que tenha sido treinada por teorias tradicionais de finanças. Eu trabalhei para uma mesa de negociação proprietária de um banco de primeira linha por boa parte da minha carreira, e rodeado por essas elites da liga de hera com experiência em finanças, matemática ou engenharia financeira. Eu devo admitir que nenhum desses caras sabia como trocar de direção. Eles eram bons em criação de mercado, estruturas de produto, índice de arbitragem, mas quase nenhum pode fazer direções de negociação de dinheiro. Por quê? Porque nenhum desses caras acreditava em análise técnica. Então, novamente, se você já está fazendo seus milhões, por que se preocupar em assumir o risco de direção de negociação com seu próprio dinheiro. Para mim, felizmente, meus anos de treinamento em análise técnica permitiram que eu realmente me aposentasse depois de me afastar da grande recessão. Eu olho apenas para EMA, Slow Stochastics e MACD; e eu ganhei dinheiro todos os anos desde que começou em 2009. Trabalhos de análise técnica, você só tem que saber como usá-lo !!


Melhores estratégias 5: um sistema de aprendizado de máquina de curto prazo.


É hora da quinta e última parte da série Build Better Strategies. Na parte 3, discutimos o processo de desenvolvimento de um sistema baseado em modelo e, consequentemente, concluiremos a série com o desenvolvimento de um sistema de mineração de dados. Os princípios de mineração de dados e aprendizado de máquina têm sido o tópico da parte 4. Para nosso exemplo de negociação de curto prazo, usaremos um algoritmo de aprendizado profundo, um autoencoder empilhado, mas funcionará da mesma maneira com muitas outras máquinas. algoritmos de aprendizagem. Com as ferramentas de software de hoje, apenas cerca de 20 linhas de código são necessárias para uma estratégia de aprendizado de máquina. Eu tentarei explicar todas as etapas em detalhes.


Nosso exemplo será um projeto de pesquisa & # 8211; um experimento de aprendizado de máquina para responder a duas perguntas. Faz um algoritmo mais complexo & # 8211; como, por exemplo, mais neurônios e aprendizado mais profundo & # 8211; produzir uma previsão melhor? E os movimentos de preço de curto prazo são previsíveis pelo histórico de preços de curto prazo? A última questão surgiu devido ao meu ceticismo sobre a negociação de ações de preço na parte anterior desta série. Eu recebi vários e-mails perguntando sobre os geradores de sistema de negociação & # 8220; & # 8221; ou ferramentas de ação de preço semelhantes que são elogiadas em alguns sites. Não há provas concretas de que tais ferramentas tenham produzido algum lucro (exceto para seus fornecedores) & # 8211; mas isso significa que todos eles são lixo? Nós veremos.


Nosso experimento é simples: coletamos informações das últimas velas de uma curva de preços, as alimentamos em uma rede neural de aprendizagem profunda e as usamos para prever as próximas velas. Minha hipótese é que algumas velas não contêm nenhuma informação preditiva útil. É claro que um resultado não previsto do experimento não significa que estou certo, já que eu poderia ter usado parâmetros errados ou preparado mal os dados. Mas um resultado preditivo seria um indício de que eu estou errado e a negociação de ações de preço pode, de fato, ser lucrativa.


Desenvolvimento de estratégia de aprendizado de máquina.


Etapa 1: a variável de destino.


Para recapitular a parte anterior: um algoritmo de aprendizado supervisionado é treinado com um conjunto de recursos para prever uma variável de destino. Então, a primeira coisa a determinar é qual deve ser essa variável alvo. Um alvo popular, usado na maioria dos jornais, é o sinal do retorno de preço na próxima barra. Mais adequado para previsão, já que menos suscetível à aleatoriedade, é a diferença de preço para um horizonte de previsão mais distante, como 3 barras a partir de agora, ou mesmo dia na próxima semana. Como quase qualquer coisa nos sistemas de negociação, o horizonte de previsão é um compromisso entre os efeitos da aleatoriedade (menos barras são piores) e previsibilidade (menos barras são melhores).


Às vezes você não está interessado em prever diretamente o preço, mas em prever algum outro parâmetro & # 8211; como a perna atual de um indicador Zigzag & # 8211; que de outra forma só poderia ser determinado em retrospectiva. Ou você quer saber se uma certa ineficiência do mercado estará presente na próxima vez, especialmente quando você estiver usando aprendizado de máquina não diretamente para negociação, mas para filtrar negociações em um sistema baseado em modelo. Ou você quer prever algo totalmente diferente, por exemplo, a probabilidade de um crash no mercado amanhã. Tudo isso é geralmente mais fácil de prever do que o retorno popular de amanhã.


Em nosso experimento de ação de preço, usaremos o retorno de uma negociação de ação de preço de curto prazo como variável de destino. Uma vez que o alvo é determinado, o próximo passo é selecionar os recursos.


Etapa 2: os recursos.


Uma curva de preço é o pior caso para qualquer algoritmo de aprendizado de máquina. Não só transporta pouco sinal e principalmente ruído, como também é não-estacionário e a relação sinal / ruído muda o tempo todo. A relação exata de sinal e ruído depende do significado de "sinal", mas normalmente é muito baixo para qualquer algoritmo de aprendizado de máquina conhecido produzir algo útil. Portanto, devemos derivar recursos da curva de preço que contêm mais sinal e menos ruído. O sinal, nesse contexto, é qualquer informação que possa ser usada para prever o alvo, seja ele qual for. Todo o resto é barulho.


Assim, selecionar os recursos é fundamental para o sucesso & # 8211; muito mais crítico do que decidir qual algoritmo de aprendizado de máquina você vai usar. Existem duas abordagens para selecionar recursos. O primeiro e mais comum é extrair tanta informação da curva de preços quanto possível. Como você não sabe onde as informações estão ocultas, você apenas gera uma coleção selvagem de indicadores com uma ampla gama de parâmetros e espera que pelo menos alguns deles contenham as informações de que o algoritmo precisa. Esta é a abordagem que você normalmente encontra na literatura. O problema deste método: Qualquer algoritmo de aprendizado de máquina é facilmente confundido por preditores não preditivos. Então, ele não vai jogar apenas 150 indicadores nele. Você precisa de algum algoritmo de pré-seleção que determine quais delas contêm informações úteis e quais podem ser omitidas. Sem reduzir os recursos dessa maneira para talvez oito ou dez, até mesmo o algoritmo de aprendizado mais profundo não produziu nada de útil.


A outra abordagem, normalmente para experimentos e pesquisas, está usando apenas informações limitadas da curva de preços. Esse é o caso aqui: Como queremos examinar a negociação de ações de preço, usamos apenas os últimos preços como entradas e descartamos todo o restante da curva. Isso tem a vantagem de não precisarmos de nenhum algoritmo de pré-seleção, já que o número de recursos é limitado de qualquer maneira. Aqui estão as duas funções preditoras simples que usamos em nosso experimento (em C):


As duas funções devem conter as informações necessárias para a ação do preço: movimento por barra e volatilidade. A função de modificação é a diferença do preço atual para o preço de n barras antes, dividido pelo preço atual. A função range é a distância total alta-baixa das últimas n velas, também dividida pelo preço atual. E a função de escala centraliza e comprime os valores para o intervalo de +/- 100, então nós os dividimos por 100 para deixá-los normalizados para +/- 1. Lembramos que a normalização é necessária para algoritmos de aprendizado de máquina.


Etapa 3: preditores de pré-seleção / pré-processamento.


Quando você selecionou um grande número de indicadores ou outros sinais como recursos para o seu algoritmo, você deve determinar qual deles é útil e quais não. Existem muitos métodos para reduzir o número de recursos, por exemplo:


Determine as correlações entre os sinais. Remova aqueles com uma correlação forte a outros sinais, desde que não contribuam à informação. Compare o conteúdo de informação de sinais diretamente, com algoritmos como entropia de informação ou árvores de decisão. Determine o conteúdo da informação indiretamente, comparando os sinais com sinais aleatórios; Existem algumas bibliotecas de software para isso, como o pacote R Boruta. Use um algoritmo como Análise de Componentes Principais (PCA) para gerar um novo conjunto de sinais com dimensionalidade reduzida. Use a otimização genética para determinar os sinais mais importantes apenas pelos resultados mais lucrativos do processo de previsão. Ótimo para ajuste de curva se você deseja publicar resultados impressionantes em um trabalho de pesquisa.


Para nossa experiência, não precisamos pré-selecionar ou pré-processar os recursos, mas você pode encontrar informações úteis sobre isso nos artigos (1), (2) e (3) listados no final da página.


Etapa 4: selecione o algoritmo de aprendizado de máquina.


R oferece muitos pacotes ML diferentes, e qualquer um deles oferece muitos algoritmos diferentes com muitos parâmetros diferentes. Mesmo se você já decidiu sobre o método & # 8211; aqui, aprendizagem profunda & # 8211; você ainda tem a escolha entre diferentes abordagens e diferentes pacotes R. A maioria é bem nova e você não encontra muitas informações empíricas que ajudem na sua decisão. Você tem que experimentá-los todos e ganhar experiência com métodos diferentes. Para nossa experiência, escolhemos o pacote Deepnet, que é provavelmente o mais simples e fácil de usar biblioteca de aprendizagem profunda. Isso mantém nosso código curto. Estamos usando o algoritmo do Autoencoder Stacked (SAE) para pré-treinamento da rede. A Deepnet também oferece uma Máquina Boltzmann Restrita (RBM) para pré-treinamento, mas eu não consegui obter bons resultados com ela. Existem outros pacotes de aprendizado mais complexos para o R, então você pode gastar muito tempo conferindo todos eles.


Como funciona o pré-treinamento é facilmente explicado, mas por que funciona é uma questão diferente. Até onde sei, ninguém ainda apresentou uma prova matemática sólida de que funcione. Enfim, imagine uma grande rede neural com muitas camadas ocultas:


Treinar a rede significa configurar os pesos de conexão entre os neurônios. O método usual é a retropropagação de erro. Mas acontece que quanto mais camadas ocultas você tem, pior funciona. Os termos de erro backpropagated ficam menores e menores de camada para camada, fazendo com que as primeiras camadas da rede não aprendam quase nada. O que significa que o resultado previsto se torna cada vez mais dependente do estado inicial aleatório dos pesos. Isso limitou severamente a complexidade das redes neurais baseadas em camadas e, portanto, as tarefas que eles podem resolver. Pelo menos até 10 anos atrás.


Em 2006, cientistas em Toronto publicaram pela primeira vez a idéia de pré-treinar os pesos com um algoritmo de aprendizado não supervisionado, uma máquina restrita de Boltzmann. Isso resultou em um conceito revolucionário. Isso impulsionou o desenvolvimento da inteligência artificial e permitiu que todos os tipos de novas aplicações, desde máquinas de brincar, até carros autônomos. No caso de um autoencoder empilhado, funciona assim:


Selecione a camada oculta para treinar; comece com a primeira camada oculta. Conecte suas saídas a uma camada de saída temporária que tenha a mesma estrutura que a camada de entrada da rede. Alimente a rede com as amostras de treinamento, mas sem as metas. Treine-o para que a primeira camada oculta reproduza o sinal de entrada & # 8211; os recursos & # 8211; em suas saídas, o mais exatamente possível. O resto da rede é ignorado. Durante o treinamento, aplique um termo de penalidade de peso & # 8216; & # 8217; de modo que o menor número possível de pesos de conexão seja usado para reproduzir o sinal. Agora, alimente as saídas da camada oculta treinada para as entradas da próxima camada oculta não treinada e repita o processo de treinamento para que o sinal de entrada seja agora reproduzido nas saídas da próxima camada. Repita este processo até que todas as camadas ocultas sejam treinadas. Temos agora uma rede esparsa & # 8217; com muito poucas conexões de camada que podem reproduzir os sinais de entrada. Agora treine a rede com retropropagação para aprender a variável de destino, usando os pesos pré-treinados das camadas ocultas como ponto de partida.


A esperança é que o processo de pré-treinamento não supervisionado produza uma abstração interna de ruído reduzido dos sinais de entrada que possam ser usados ​​para facilitar o aprendizado do alvo. E isso realmente parece funcionar. Ninguém sabe realmente porque, mas várias teorias & # 8211; veja o papel (4) abaixo & # 8211; tente explicar esse fenômeno.


Etapa 5: gerar um conjunto de dados de teste.


Primeiro, precisamos produzir um conjunto de dados com recursos e metas, para que possamos testar nosso processo de previsão e testar os parâmetros. As características devem basear-se nos mesmos dados de preço que na negociação ao vivo e, para o alvo, devemos simular uma negociação de curto prazo. Portanto, faz sentido gerar os dados não com R, mas com nossa plataforma de negociação, que é de qualquer maneira muito mais rápida. Aqui está um pequeno script do Zorro para isso, DeepSignals. c:


Estamos gerando 2 anos de dados com recursos calculados por nossas funções de variação e alcance definidas acima. Nosso objetivo é o resultado de um trade com 3 barras de tempo de vida. Os custos de negociação são definidos como zero, portanto, neste caso, o resultado é equivalente ao sinal da diferença de preço em 3 barras no futuro. A função adviseLong é descrita no manual do Zorro; é uma função poderosa que lida automaticamente com treinamento e previsão e permite usar qualquer algoritmo de aprendizado de máquina baseado em R como se fosse um indicador simples.


Em nosso código, a função usa o próximo retorno de troca como destino e as variações de preço e os intervalos das últimas 4 barras como recursos. O sinalizador SIGNALS diz para não treinar os dados, mas para exportá-los para um arquivo. csv. A bandeira BALANCED garante que obtemos tantos retornos positivos quanto negativos; isso é importante para a maioria dos algoritmos de aprendizado de máquina. Execute o script no modo [Train] com nosso ativo de teste usual EUR / USD selecionado. Ele gera um arquivo de planilha chamado DeepSignalsEURUSD_L. csv que contém os recursos nas oito primeiras colunas e o retorno de troca na última coluna.


Etapa 6: Calibre o algoritmo.


Algoritmos complexos de aprendizado de máquina têm muitos parâmetros para ajustar. Alguns deles oferecem grandes oportunidades para ajustar o algoritmo para publicações. Ainda assim, devemos calibrar os parâmetros, pois o algoritmo raramente funciona bem com suas configurações padrão. Para isso, aqui está um script R que lê o conjunto de dados criado anteriormente e o processa com o algoritmo de aprendizado profundo (DeepSignal. r):


Nós definimos três funções neural. train, neural. predict e neural. init para treinar, prever e inicializar a rede neural. Os nomes das funções não são arbitrários, mas seguem a convenção usada pela função de recomendação do Zorro (NEURAL.). Isso não importa agora, mas será importante mais tarde, quando usarmos o mesmo script R para treinar e negociar a estratégia de aprendizagem profunda. Uma quarta função, TestOOS, é usada para testar fora da amostra nossa configuração.


A função neural. init sementes o gerador aleatório R com um valor fixo (365 é o meu número de sorte pessoal). Caso contrário, obteríamos um resultado ligeiramente diferente a qualquer momento, já que a rede neural é inicializada com pesos aleatórios. Ele também cria uma lista R global chamada "Modelos". A maioria dos tipos de variáveis ​​R não precisa ser criada antecipadamente, alguns fazem (não me pergunte por quê). O & # 8216; & lt; & lt; - & # 8216; operador é para acessar uma variável global de dentro de uma função.


A função neural. train toma como entrada um número de modelo e o conjunto de dados a ser treinado. O número do modelo identifica o modelo treinado na & # 8220; Modelos & # 8221; Lista. Uma lista não é realmente necessária para este teste, mas precisaremos dela para estratégias mais complexas que treinam mais de um modelo. A matriz que contém os recursos e o destino é passada para a função como segundo parâmetro. Se os dados XY não são uma matriz apropriada, o que freqüentemente acontece em R dependendo de como você os gerou, eles são convertidos em um. Em seguida, ele é dividido em recursos (X) e destino (Y) e, finalmente, o destino é convertido em 1 para um resultado comercial positivo e 0 para um resultado negativo.


Os parâmetros de rede são então configurados. Alguns são óbvios, outros são livres para brincar com:


A estrutura da rede é dada pelo vetor oculto: c (50.100,50) define 3 camadas ocultas, a primeira com 50, a segunda com 100 e a terceira com 50 neurônios. Esse é o parâmetro que mais tarde modificaremos para determinar se o nível mais profundo é melhor. A função de ativação converte a soma dos valores de entrada do neurônio na saída do neurônio; mais frequentemente utilizados são sigmóides que saturam a 0 ou 1, ou tanh que satura a -1 ou +1.


Nós usamos tanh aqui já que nossos sinais também estão na faixa +/- 1. A saída da rede é uma função sigmóide, pois queremos uma previsão na faixa 0..1. Mas a saída SAE deve ser & # 8220; linear & # 8221; para que o Autoencoder Empilhado possa reproduzir os sinais de entrada analógicos nas saídas.


A taxa de aprendizado controla o tamanho do passo para a descida de gradiente no treinamento; uma taxa mais baixa significa passos mais precisos e previsão possivelmente mais precisa, mas um tempo de treinamento mais longo. Momentum adiciona uma fração do passo anterior ao atual. Isso evita que a descida de gradiente fique presa em um minúsculo ponto local ou no ponto de sela. A escala de taxa de aprendizado é um fator de multiplicação para alterar a taxa de aprendizado após cada iteração (não tenho certeza do que isso é bom, mas pode haver tarefas em que uma baixa taxa de aprendizado em épocas mais altas melhora o treinamento). Uma época é uma iteração de treinamento sobre todo o conjunto de dados. O treinamento parará quando o número de épocas for atingido. Mais épocas significam melhor previsão, mas maior tempo de treinamento. O tamanho do lote é um número de amostras aleatórias & # 8211; um mini lote & # 8211; retirado do conjunto de dados para uma única execução de treinamento. A divisão dos dados em mini lotes acelera o treinamento, pois o gradiente de peso é calculado a partir de menos amostras. Quanto maior o tamanho do lote, melhor será o treinamento, mas mais tempo ele levará. O dropout é um número de neurônios selecionados aleatoriamente que são desativados durante um mini lote. Desta forma, a rede aprende apenas com uma parte de seus neurônios. Isso parece uma ideia estranha, mas pode efetivamente reduzir o overfitting.


Todos esses parâmetros são comuns para redes neurais. Brinque com eles e verifique o efeito deles no resultado e no tempo de treinamento. A calibração adequada de uma rede neural não é trivial e pode ser o tópico de outro artigo. Os parâmetros são armazenados no modelo juntamente com a matriz de pesos de conexão treinados. Então eles não precisam ser dados novamente na função de previsão, neural. predict. Ele pega o modelo e um vetor X de feições, executa-o pelas camadas e retorna a saída da rede, o alvo previsto Y. Comparado com o treinamento, a previsão é bastante rápida, pois precisa de apenas algumas milhares de multiplicações. Se X for um vetor de linha, ele será transposto e, dessa forma, convertido em um vetor de coluna, caso contrário, a função nn. predict não o aceitará.


Use o RStudio ou algum ambiente semelhante para trabalhar convenientemente com R. Edite o caminho para os dados. csv no arquivo acima, fonte-lo, instale os pacotes R necessários (deepnet, e1071 e caret), em seguida, chame a função TestOOS do comando linha. Se tudo funcionar, deve imprimir algo assim:


O TestOOS lê primeiro o nosso conjunto de dados da pasta Data do Zorro. Divide os dados em 80% para treinamento (XY. tr) e 20% para testes fora da amostra (XY. ts). O conjunto de treinamento é treinado e o resultado é armazenado na lista Modelos no índice 1. O conjunto de testes é dividido em recursos (X) e destinos (Y). Y é convertido em binário 0 ou 1 e armazenado em Y. ob, nosso vetor de alvos observados. Em seguida, prevemos os destinos do conjunto de testes, convertemo-los novamente em 0 ou 1 binários e armazená-los em Y. pr. Para comparar a observação com a previsão, usamos a função confusionMatrix do pacote caret.


Uma matriz de confusão de um classificador binário é simplesmente uma matriz 2 que informa quantos 0 e quantos 1 s foram preditos de forma incorreta e correta. Muitas métricas são derivadas da matriz e impressas nas linhas acima. O mais importante no momento é a precisão de previsão de 62%. Isso pode indicar que eu acabei com a negociação de ações de preço um pouco prematuramente. But of course the 62% might have been just luck. We’ll see that later when we run a WFO test.


A final advice: R packages are occasionally updated, with the possible consequence that previous R code suddenly might work differently, or not at all. This really happens, so test carefully after any update.


Step 7: The strategy.


Now that we’ve tested our algorithm and got some prediction accuracy above 50% with a test data set, we can finally code our machine learning strategy. In fact we’ve already coded most of it, we just must add a few lines to the above Zorro script that exported the data set. This is the final script for training, testing, and (theoretically) trading the system ( DeepLearn. c ):


We’re using a WFO cycle of one year, split in a 90% training and a 10% out-of-sample test period. You might ask why I have earlier used two year’s data and a different split, 80/20, for calibrating the network in step 5. This is for using differently composed data for calibrating and for walk forward testing. If we used exactly the same data, the calibration might overfit it and compromise the test.


The selected WFO parameters mean that the system is trained with about 225 days data, followed by a 25 days test or trade period. Thus, in live trading the system would retrain every 25 days, using the prices from the previous 225 days. In the literature you’ll sometimes find the recommendation to retrain a machine learning system after any trade, or at least any day. But this does not make much sense to me. When you used almost 1 year’s data for training a system, it can obviously not deteriorate after a single day. Or if it did, and only produced positive test results with daily retraining, I would strongly suspect that the results are artifacts by some coding mistake.


Training a deep network takes really a long time, in our case about 10 minutes for a network with 3 hidden layers and 200 neurons. In live trading this would be done by a second Zorro process that is automatically started by the trading Zorro. In the backtest, the system trains at any WFO cycle. Therefore using multiple cores is recommended for training many cycles in parallel. The NumCores variable at -1 activates all CPU cores but one. Multiple cores are only available in Zorro S, so a complete walk forward test with all WFO cycles can take several hours with the free version.


In the script we now train both long and short trades. For this we have to allow hedging in Training mode, since long and short positions are open at the same time. Entering a position is now dependent on the return value from the advise function, which in turn calls either the neural. train or the neural. predict function from the R script. So we’re here entering positions when the neural net predicts a result above 0.5.


The R script is now controlled by the Zorro script (for this it must have the same name, DeepLearn. r , only with different extension). It is identical to our R script above since we’re using the same network parameters. Only one additional function is needed for supporting a WFO test:


The neural. save function stores the Models list – it now contains 2 models for long and for short trades – after every training run in Zorro’s Data folder. Since the models are stored for later use, we do not need to train them again for repeated test runs.


This is the WFO equity curve generated with the script above (EUR/USD, without trading costs):


EUR/USD equity curve with 50-100-50 network structure.


Although not all WFO cycles get a positive result, it seems that there is some predictive effect. The curve is equivalent to an annual return of 89%, achieved with a 50-100-50 hidden layer structure. We’ll check in the next step how different network structures affect the result.


Since the neural. init , neural. train , neural. predict , and neural. save functions are automatically called by Zorro’s adviseLong/adviseShort functions, there are no R functions directly called in the Zorro script. Thus the script can remain unchanged when using a different machine learning method. Only the DeepLearn. r script must be modified and the neural net, for instance, replaced by a support vector machine. For trading such a machine learning system live on a VPS, make sure that R is also installed on the VPS, the needed R packages are installed, and the path to the R terminal set up in Zorro’s ini file. Otherwise you’ll get an error message when starting the strategy.


Step 8: The experiment.


If our goal had been developing a strategy, the next steps would be the reality check, risk and money management, and preparing for live trading just as described under model-based strategy development. But for our experiment we’ll now run a series of tests, with the number of neurons per layer increased from 10 to 100 in 3 steps, and 1, 2, or 3 hidden layers (deepnet does not support more than 3). So we’re looking into the following 9 network structures: c(10), c(10,10), c(10,10,10), c(30), c(30,30), c(30,30,30), c(100), c(100,100), c(100,100,100). For this experiment you need an afternoon even with a fast PC and in multiple core mode. Here are the results (SR = Sharpe ratio, R2 = slope linearity):


We see that a simple net with only 10 neurons in a single hidden layer won’t work well for short-term prediction. Network complexity clearly improves the performance, however only up to a certain point. A good result for our system is already achieved with 3 layers x 30 neurons. Even more neurons won’t help much and sometimes even produce a worse result. This is no real surprise, since for processing only 8 inputs, 300 neurons can likely not do a better job than 100.


Conclusão.


Our goal was determining if a few candles can have predictive power and how the results are affected by the complexity of the algorithm. The results seem to suggest that short-term price movements can indeed be predicted sometimes by analyzing the changes and ranges of the last 4 candles. The prediction is not very accurate – it’s in the 58%..60% range, and most systems of the test series become unprofitable when trading costs are included. Still, I have to reconsider my opinion about price action trading. The fact that the prediction improves with network complexity is an especially convincing argument for short-term price predictability.


It would be interesting to look into the long-term stability of predictive price patterns. For this we had to run another series of experiments and modify the training period ( WFOPeriod in the script above) and the 90% IS/OOS split. This takes longer time since we must use more historical data. I have done a few tests and found so far that a year seems to be indeed a good training period. The system deteriorates with periods longer than a few years. Predictive price patterns, at least of EUR/USD, have a limited lifetime.


Where can we go from here? There’s a plethora of possibilities, for instance:


Use inputs from more candles and process them with far bigger networks with thousands of neurons. Use oversampling for expanding the training data. Prediction always improves with more training samples. Compress time series f. i. with spectal analysis and analyze not the candles, but their frequency representation with machine learning methods. Use inputs from many candles – such as, 100 – and pre-process adjacent candles with one-dimensional convolutional network layers. Use recurrent networks. Especially LSTM could be very interesting for analyzing time series – and as to my knowledge, they have been rarely used for financial prediction so far. Use an ensemble of neural networks for prediction, such as Aronson’s “oracles” and “comitees”.


Papers / Articles.


(3) V. Perervenko, Selection of Variables for Machine Learning.


I’ve added the C and R scripts to the 2016 script repository. You need both in Zorro’s Strategy folder. Zorro version 1.474, and R version 3.2.5 (64 bit) was used for the experiment, but it should also work with other versions.


75 thoughts on “Better Strategies 5: A Short-Term Machine Learning System”


I’ve tested your strategy using 30min AAPL data but “sae. dnn. train” returns all NaN in training.


(It works just decreasing neurons to less than (5,10,5)… but accuracy is 49%)


Can you help me to understand why?


Desde já, obrigado.


If you have not changed any SAE parameters, look into the. csv data. It is then the only difference to the EUR/USD test. Maybe something is wrong with it.


Another fantastic article, jcl. Zorro is a remarkable environment for these experiments. Thanks for sharing your code and your approach – this really opens up an incredible number of possibilities to anyone willing to invest the time to learn how to use Zorro.


The problem with AAPL 30min data was related to the normalizing method I used (X-mean/SD).


The features range was not between -1:1 and I assume that sae. dnn need it to work…


Anyway performances are not comparable to yours 🙂


I have one question:


why do you use Zorro for creating the features in the csv file and then opening it in R?


why not create the file with all the features in R in a few lines and do the training on the file when you are already in R? instead of getting inside Zorro and then to R.


When you want R to create the features, you must still transmit the price data and the targets from Zorro to R. So you are not gaining much. Creating the features in Zorro results usually in shorter code and faster training. Features in R make only sense when you need some R package for calculating them.


Really helpful and interesting article! I would like to know if there are any English version of the book:


“Das Börsenhackerbuch: Finanziell unabhängig durch algorithmische Handelssysteme”


I am really interested on it,


Not yet, but an English version is planned.


Thanks JCL! Please let me now when the English version is ready, because I am really interested on it.


Works superbly (as always). Muito Obrigado. One small note, if you have the package “dlm” loaded in R, TestOOS will fail with error: “Error in TestOOS() : cannot change value of locked binding for ‘X'”. This is due to there being a function X in the dlm package, so the name is locked when the package is loaded. Easily fixed by either renaming occurrences of the variable X to something else, or temporarily detaching the dlm package with: detach(“package:dlm”, unload=TRUE)


Thanks for the info with the dlm package. I admit that ‘X’ is not a particular good name for a variable, but a function named ‘X’ in a distributed package is even a bit worse.


Results below were generated by revised version of DeepSignals. r – only change was use of LSTM net from the rnn package on CRAN. The authors of the package regard their LSTM implementation as “experimental” and do not feel it is as yet learning properly, so hopefully more improvement to come there. (Spent ages trying to accomplish the LSTM element using the mxnet package but gave up as couldn’t figure out the correct input format when using multiple training features.)


Will post results of full WFO when I have finished LSTM version of DeepLearn. r.


Confusion Matrix and Statistics.


95% CI : (0.5699, 0.5956)


No Information Rate : 0.5002.


P-Value [Acc > NIR] : <2e-16.


Mcnemar's Test P-Value : 0.2438.


Pos Pred Value : 0.5844.


Neg Pred Value : 0.5813.


Detection Rate : 0.2862.


Detection Prevalence : 0.4897.


Balanced Accuracy : 0.5828.


Results of WFO test below. Again, only change to original files was the use of LSTM in R, rather than DNN+SAE.


Walk-Forward Test DeepLearnLSTMV4 EUR/USD.


Simulated account AssetsFix.


Bar period 1 hour (avg 87 min)


Simulation period 15.05.2014-07.06.2016 (12486 bars)


Test period 04.05.2015-07.06.2016 (6649 bars)


Lookback period 100 bars (4 days)


WFO test cycles 11 x 604 bars (5 weeks)


Training cycles 12 x 5439 bars (46 weeks)


Monte Carlo cycles 200.


Assumed slippage 0.0 sec.


Spread 0.0 pips (roll 0.00/0.00)


Contracts per lot 1000.0.


Gross win/loss 3628$ / -3235$ (+5199p)


Average profit 360$/year, 30$/month, 1.38$/day.


Max drawdown -134$ 34% (MAE -134$ 34%)


Total down time 95% (TAE 95%)


Max down time 5 weeks from Aug 2015.


Max open margin 40$


Max open risk 35$


Trade volume 5710964$ (5212652$/year)


Transaction costs 0.00$ spr, 0.00$ slp, 0.00$ rol.


Capital required 262$


Number of trades 6787 (6195/year, 120/week, 25/day)


Percent winning 57.6%


Max win/loss 16$ / -14$


Avg trade profit 0.06$ 0.8p (+12.3p / -14.8p)


Avg trade slippage 0.00$ 0.0p (+0.0p / -0.0p)


Avg trade bars 1 (+1 / -2)


Max trade bars 3 (3 hours)


Time in market 177%


Max open trades 3.


Max loss streak 17 (uncorrelated 11)


Annual return 137%


Profit factor 1.12 (PRR 1.08)


Sharpe ratio 1.79.


Kelly criterion 2.34.


R2 coefficient 0.435.


Ulcer index 13.3%


Prediction error 152%


Confidence level AR DDMax Capital.


Portfolio analysis OptF ProF Win/Loss Wgt% Cycles.


EUR/USD .219 1.12 3907/2880 100.0 XX/\//\X///


EUR/USD:L .302 1.17 1830/1658 65.0 /\/\//\////


EUR/USD:S .145 1.08 2077/1222 35.0 \//\//\\///


Interessante! For a still experimental LSTM implementation that result looks not bad.


Sorry for being completely off topic but could you please point me to the best place where i can learn to code trend lines?? I’m a complete beginner, but from trading experience i see them as an important part of what i would like to build…


Robot Wealth has an algorithmic trading course for that – you can find details on his blog robotwealth/.


I think you misunderstand the meaning pretrening. See my articles mql5/ru/articles/1103.


I think there is more fully described this stage.


I don’t think I misunderstood pretraining, at least not more than everyone else, but thanks for the links!


You can paste your LTSM r code please ?


Could you help me answering some questions?


I have few question below:


1.I want to test Commission mode.


If I use interactive broker, I should set Commission = ? in normal case.


2.If I press the “trade” button, I see the log the script will use DeepLearn_EURUSD. ml.


So real trade it will use DeepLearn_EURUSD. ml to get the model to trade?


And use neural. predict function to trade?


3.If I use the slow computer to train the data ,


I should move DeepLearn_EURUSD. ml to the trade computer?


I test the real trade on my interactive brokers and press the result button.


Can I use Commission=0.60 to train the neural and get the real result?


Result button will show the message below:


Trade Trend EUR/USD.


Bar period 2 min (avg 2 min)


Trade period 02.11.2016-02.11.2016.


Spread 0.5 pips (roll -0.02/0.01)


Contracts per lot 1000.0.


Commission should be normally not set up in the script, but entered in the broker specific asset list. Otherwise you had to change the script every time when you want to test it with a different broker or account. IB has different lot sizes and commissions, so you need to add the command.


to the script when you want to test it for an IB account.


Yes, DeepLearn_EURUSD. ml is the model for live trading, and you need to copy it to the trade computer.


Do I write assetList(“AssetsIB. csv”) in the right place?


So below code’s result includes Commission ?


I test the result with Commission that seems pretty good.


Annual +93% +3177p.


BarPeriod = 60; // 1 hour.


WFOPeriod = 252*24; // 1 year.


NumCores = -1; // use all CPU cores but one.


Spread = RollLong = RollShort = Commission = Slippage = 0;


if(Train) Hedge = 2;


I run the DeepLearn. c in the IB paper trade.


The code “LifeTime = 3; // prediction horizon” seems to close the position that you open after 3 bars(3 hours).


But I can’t see it close the position on third bar close.


I see the logs below:


Closing prohibited – check NFA flag!


[EUR/USD::L4202] Can’t close 1@1.10995 at 09:10:51.


In my IB paper trade, it the default order size is 1k on EUR/USD.


How to change the order size in paper trade?


Muito obrigado.


IB is an NFA compliant broker. You can not close trades on NFA accounts. You must set the NFA flag for opening a reverse position instead. And you must enable trading costs, otherwise including the commission has no effect. I don’t think that you get a positive result with trading costs.


Those account issues are not related to machine learning, and are better asked on the Zorro forum. Or even better, read the Zorro manual where all this is explained. Just search for “NFA”.


I do some experiment to change the neural’s parameter with commission.


The code is below:


BarPeriod = 60; // 1 hour.


WFOPeriod = 252*24; // 1 year.


NumCores = -1; // use all CPU cores but one.


Spread = RollLong = RollShort = Slippage = 0;


if(Train) Hedge = 2;


I get the result with commission that Annual Return is about +23%.


But I don’t complete understand the zorro’s setting and zorro’s report.


Walk-Forward Test DeepLearn EUR/USD.


Simulated account AssetsIB. csv.


Bar period 1 hour (avg 86 min)


Simulation period 15.05.2014-09.09.2016 (14075 bars)


Test period 23.04.2015-09.09.2016 (8404 bars)


Lookback period 100 bars (4 days)


WFO test cycles 14 x 600 bars (5 weeks)


Training cycles 15 x 5401 bars (46 weeks)


Monte Carlo cycles 200.


Simulation mode Realistic (slippage 0.0 sec)


Spread 0.0 pips (roll 0.00/0.00)


Contracts per lot 20000.0.


Gross win/loss 24331$ / -22685$ (+914p)


Average profit 1190$/year, 99$/month, 4.58$/day.


Max drawdown -1871$ 114% (MAE -1912$ 116%)


Total down time 92% (TAE 41%)


Max down time 18 weeks from Dec 2015.


Max open margin 2483$


Max open risk 836$


Trade volume 26162350$ (18916130$/year)


Transaction costs 0.00$ spr, 0.00$ slp, 0.00$ rol, -1306$ com.


Capital required 5239$


Number of trades 1306 (945/year, 19/week, 4/day)


Percent winning 52.5%


Max win/loss 375$ / -535$


Avg trade profit 1.26$ 0.7p (+19.7p / -20.3p)


Avg trade slippage 0.00$ 0.0p (+0.0p / -0.0p)


Avg trade bars 2 (+2 / -3)


Max trade bars 3 (3 hours)


Time in market 46%


Max open trades 3.


Max loss streak 19 (uncorrelated 10)


Annual return 23%


Profit factor 1.07 (PRR 0.99)


Sharpe ratio 0.56.


Kelly criterion 1.39.


R2 coefficient 0.000.


Ulcer index 20.8%


Confidence level AR DDMax Capital.


10% 29% 1134$ 4153$


20% 27% 1320$ 4427$


30% 26% 1476$ 4656$


40% 24% 1649$ 4911$


50% 23% 1767$ 5085$


60% 22% 1914$ 5301$


70% 21% 2245$ 5789$


80% 19% 2535$ 6216$


90% 16% 3341$ 7403$


95% 15% 3690$ 7917$


100% 12% 4850$ 9625$


Portfolio analysis OptF ProF Win/Loss Wgt% Cycles.


EUR/USD .256 1.07 685/621 100.0 /X/XXXXXXXXXXX.


The manual is your friend:


Great read…I built this framework to use XGB to analyze live ETF price movements. Let me know what you think:


Hi, deep learning researcher and programmer here. 🙂


Great blog and great article, congratulations! I have some comments:


& # 8211; if you use ReLUs as activation functions, pretraining is not necessary.


& # 8211; AE is genarraly referred to as networks with same input and output, I would call the proposed network rather a MLP (multi-layer perceptron).


Do you think it is possible to use Python (like TensorFlow) or LUA (like Torch7) based deep learing libraries with Zorro?


I have also heard that ReLUs make a network so fast that you can brute force train it in some cases, with no pretraining. But I have not yet experimented with that. The described network is commonly called ‘SAE’ since it uses autoencoders, with indeed the same number of inputs and outputs, for the pre-training process. & # 8211; I am not familiar with Torch7, but you can theoretically use Tensorflow with Zorro with a DLL based interface. The network structure must still be defined in Python, but Zorro can use the network for training and prediction.


Would you do YouTube Tutorials to your work, this series of articles. And where can I subscribe this kinda of algorithmic trading tutorials. Obrigado pela sua contribuição.


I would do YouTube tutorials if someone payed me very well for them. Until then, you can subscribe this blog with the link on the right above.


Why not feed economic data from a calendar like forexfactory into the net as well? I suggested that several times before. This data is what makes me a profitable manual trader (rookie though), if there is any intelligence in these neuronal networks it should improve performance greatly. input must be name (non farm payrolls for example or some unique identifier) , time left to release, predicted value (like 3-5 days before) last value and revision. Some human institutional traders claim its possible to trade profitably without a chart from this data alone. Detecting static support and resistance areas (horizontal lines) should be superior to any simple candle patterns. It can be mathematically modeled, as the Support and Resistance indicator from Point Zero Trading proves. Unfortunately i dont have a clue how Arturo the programmer did it. I imagine an artificial intelligence actually “seeing” what the market is focussed on (like speculation on a better than expected NFP report based on other positive Data in the days before, driving the dollar up into the report). “seeing” significant support and resistance levels should allow for trading risk, making reasonable decisions on where to place SL and TP.


We also made the experience that well chosen external data, not derived from the price curve, can improve the prediction. There is even a trading system based on Trump’s twitter outpourings. I can’t comment on support and resistance since I know no successful systems that use them, and am not sure that they exist at all.


thank you very much for everything that you did so far.


I read the book (German here, too) and am working through your blog articles right now.


I already learnt a lot and still am learning more and more about the really important stuff (other than: Your mindset must be perfect and you need to have well-defined goals. I never was a fan of such things and finally I found someone that is on the same opinion and actually teaches people how to correctly do it).


So, thank you very much and thanks in advance for all upcoming articles that I will read and you will post.


As a thank you I was thinking about sending you a corrected version of your book (there are some typos and wrong articles here and there…). Would you be interested in that?


Again thank you for everything and please keep up the good work.


Obrigado! And I’m certainly interested in a list of all my mistakes.


Thank you for this interesting post. I ran it on my pc and obtained similar results as yours. Then I wanted to see if it could perform as well when commission and rollover and slippage were included during test. I used the same figures as the ones used in the workshops and included in the AssetFix. csv file. The modifications I did in your DeepLearn. c file are as follows:


Spread = RollLong = RollShort = Commission = Slippage = 0;


The results then were not as optimistic as without commission:


Walk-Forward Test DeepLearn_realistic EUR/USD.


Simulated account AssetsFix.


Bar period 1 hour (avg 86 min)


Simulation period 09.05.2014-27.01.2017 (16460 bars)


Test period 22.04.2015-27.01.2017 (10736 bars)


Lookback period 100 bars (4 days)


WFO test cycles 18 x 596 bars (5 weeks)


Training cycles 19 x 5367 bars (46 weeks)


Monte Carlo cycles 200.


Simulation mode Realistic (slippage 5.0 sec)


Spread 0.5 pips (roll -0.02/0.01)


Contracts per lot 1000.0.


Gross win/loss 5608$ / -6161$ (-6347p)


Average profit -312$/year, -26$/month, -1.20$/day.


Max drawdown -635$ -115% (MAE -636$ -115%)


Total down time 99% (TAE 99%)


Max down time 85 weeks from Jun 2015.


Max open margin 40$


Max open risk 41$


Trade volume 10202591$ (5760396$/year)


Transaction costs -462$ spr, 46$ slp, -0.16$ rol, -636$ com.


Capital required 867$


Number of trades 10606 (5989/year, 116/week, 24/day)


Percent winning 54.9%


Max win/loss 18$ / -26$


Avg trade profit -0.05$ -0.6p (+11.1p / -14.8p)


Avg trade slippage 0.00$ 0.0p (+1.5p / -1.7p)


Avg trade bars 1 (+1 / -2)


Max trade bars 3 (3 hours)


Time in market 188%


Max open trades 3.


Max loss streak 19 (uncorrelated 12)


Annual return -36%


Profit factor 0.91 (PRR 0.89)


Sharpe ratio -1.39.


Kelly criterion -5.39.


R2 coefficient 0.737.


Ulcer index 100.0%


Confidence level AR DDMax Capital.


Portfolio analysis OptF ProF Win/Loss Wgt% Cycles.


EUR/USD .000 0.91 5820/4786 100.0 XX/\XX\X\X/X/\\X\\


I am a very beginner with Zorro, maybe I did a mistake ? O que você acha ?


No, your results look absolutely ok. The predictive power of 4 candles is very weak. This is just an experiment for finding out if price action has any predictive power at all.


Although it apparently has, I have not yet seen a really profitable system with this method. From the machine learning systems that we’ve programmed so far, all that turned out profitable used data from a longer price history.


Thank you for the great article, it’s exactly what I needed in order to start experimenting with ML in Zorro.


I’ve noticed that the results are slightly different each time despite using the random seed. Here it doesn’t matter thanks to the large number of trades but for example with daily bars the performance metrics fluctuate much more. My question is: do you happen to know from where does the randomness come? Is it still the training process in R despite the seed?


It is indeed so. Deepnet apparently uses also an internal function, not only the R random function, for randomizing some initial value.


any idea about how to use machine learning like in this example with indicators? you could do as better strategy 6.


would be very interesting.


Is it grid search inside the neural. train function allowed? I get error when I try it.


Besides Andy, how did you end up definining the LSTM structure using rnn? Is it not clear for me after reading inside the package.


where is the full code?(or where is the repository?)


You said” Use genetic optimization for determining the most important signals just by the most profitable results from the prediction process. Great for curve fitting” How about after using genetic optimization process for determining the most profitable signals , match and measure the most profitable signals with distance metrics/similarity analysis(mutual information, DTW, frechet distance algorithm etc…) then use the distance metrics/similarity analysis as function for neural network prediction? Does that make sense ?


Distance to what? To each other?


Yes find similar profitable signal-patterns in history and find distance between patterns/profitable signals then predict the behavior of the profitable signal in the future from past patterns.


Was wondering about this point you made in Step 5:


“Our target is the return of a trade with 3 bars life time.”


But in the code, doesn’t.


mean that we are actually predicting the SIGN of the return, rather than the return itself?


Sim. Only the binary win/loss result, but not the magnitude of the win or loss is used for the prediction.


“When you used almost 1 year’s data for training a system, it can obviously not deteriorate after a single day. Or if it did, and only produced positive test results with daily retraining, I would strongly suspect that the results are artifacts by some coding mistake.”


There is an additional trap to be aware of related to jcl’s comment above that applies to supervised machine learning techniques (where you train a model against actual outcomes). Assume you are trying to predict the return three bars ahead (as in the example above – LifeTime = 3;). In real time you obviously don’t have access to the outcomes for one, two and three bars ahead with which to retrain your model, but when using historical data you do. With frequently retrained models (especially if using relatively short blocks of training data) it is easy to train a model offline (and get impressive results) with data you will not have available for training in real time. Then reality kicks in. Therefore truncating your offline training set by N bars (where N is the number of bars ahead you are trying to predict) may well be advisable…


Amazing work, could you please share the WFO code as well. I was able to run the code till neural. save but unable to generate the WFO results.


Muito obrigado.


The code above does use WFO.


Dear jcl, in the text you mentioned that you could predict the current leg of zig-zag indicator, could you please elaborate on how to do that? what features and responses would you reccomend?


I would never claim that I could predict the current leg of zigzag indicator. But we have indeed coded a few systems that attempted that. For this, simply use not the current price movement, but the current zigzag slope as a training target. Which parameters you use for the features is completely up to you.


Bom trabalho. I was wondering if you ever tried using something like a net long-short ratio of the asset (I. e. the FXCM SSI index – real time live data) as a feature to improve prediction?


Not with the FXCM SSI index, since it is not available as historical data as far as I know. But similar data of other markets, such as order book content, COT report or the like, have been used as features to a machine learning system.


I see, thanks, and whats’s the experience on those? do they have any predictive power? if you know any materials on this, I would be very interested to read it. (fyi, the SSI index can be exported from FXCM Trading Station (daily data from 2003 for most currency pairs)


Thanks for the info with the SSI. Yes, additional market data can have predictive power, especially from the order book. But since we gathered this experience with contract work for clients, I’m not at liberty to disclose details. However we plan an own study with ML evaluation of additional data, and that might result in an article on this blog.


Thanks jcl, looking forward to it! there is a way to record SSI ratios in a CSV file from a LUA Strategy script (FXCM’s scripting language) for live evaluation. happy to give you some details if you decide to evaluate this. (drop me an email) MyFxbook also has a similar indicator, but no historical data on that one unfortunately.


Does random forest algorithm have any advantage over deep net or neural networks for classification problems in financial data? I make it more clear ; I use number of moving averages and oscillators slope colour change for trading decision(buy - sell-hold).Sometimes one oscillator colour change is lagging other is faster etc..There is no problem at picking tops and bottoms but It is quite challenging to know when to hold. Since random forest doesnt’ need normalization, do they have any advantage over deep net or neural networks for classification? Thanks.


This depends on the system and the features, so there is no general answer. In the systems we did so far, a random forest or single decision tree was sometimes indeed better than a standard neural network, but a deep network beats anything, especially since you need not care as much about feature preselection. We meanwhile do most ML systems with deep networks.


I see thank you. I have seen some new implementations of LSTM which sounds interesting. One is called phased LSTM another one is from Yarin Gaal. He is using Bayesian technique(gaussian process) as dropout cs. ox. ac. uk/people/yarin. gal/website/blog_2248.html.


I hooked up the news flow from forexfactory into this algo and predictive power has improved by 7%.


I downloaded forexfactory news history from 2010. Used a algo to convert that into a value of -1 to 1 for EUR. This value becomes another parameter into the neural training network. I think there is real value there …let me see if we can get the win ratio to 75% and then I thik we have a real winner on hands here. …..


The neural training somehow only yields results with EURUSD.


Anyone tried GBPUSD or EURJPY.


That’s also my experience. There are only a few asset types with which price pattern systems seem to really work, and that’s mainly EUR/USD and some cryptos. We also had pattern systems with GBP/USD und USD/JPY, but they work less well and need more complex algos. Most currencies don’t expose patterns at all.


JCL, you are saying “The R script is now controlled by the Zorro script (for this it must have the same name, NeuralLearn. r, only with different extension).”


…same name as what ? Shouldn’t it say DeepLearn. r (instead of NeuralLearn. r) ? Where is the name “NeuralLearn” coming from, we don’t seem to have used it anywhere else. Sorry I am not sure what I am missing here, could you please clarify?


That’s right, DeepLearn. r it is. That was a wrong name in the text. The files in the repository should be correctly named.


Thanks for your reply jcl, much appreciated.


Eu amo o seu trabalho. And I have got lots to learn.


Hope you don’t mind me asking another question …


Further down you are saying “The neural. save function stores the Models list – it now contains 2 models for long and for short trades – after every training run in Zorro’s Data folder”.


Again, I am not sure why, but I don’t seem to be able to locate that Models list file in the Data folder. In fact it does not seem to make any difference if the neural. save function is there or not. When I [Train] DeepLearn, only the files DeepLearn_EURUSD_x. ml and signals0.csv are being created regardless of whether the function exist or not.


The *.ml files contain the models list.


Do you have any experience with generative adversarial networks (GANs)?Are they suitable for financial time series ?


We have not yet done a GAN based system. AFAIK GANs are best suited for a different class of problems, not for trading, except maybe in special cases where no immediate success function is available.


Gekko Quant - Negociação Quantitativa.


Negociação Quantitativa, Arbitragem Estatística, Aprendizado de Máquina e Opções Binárias.


Pós-navegação.


Investigation into the Power of Co-integration / mean reversion tests.


O termo arbitragem estatística (stat-arb) engloba uma ampla variedade de estratégias de investimento que normalmente visam explorar uma relação de equilíbrio entre dois ou mais valores mobiliários. O princípio geral é que qualquer divergência do equilíbrio é um efeito temporário e que as apostas devem ser colocadas no processo, revertendo para o seu equilíbrio.


A principal ressalva das estratégias do tipo stat-arb / pairs trading é que à medida que a divergência do equilíbrio cresce, o comércio se torna mais desejável, porém em algum ponto a divergência crescerá tanto que é preciso admitir que a relação de equilíbrio não existe mais modelo está quebrado. Naturally it is desirable to estimate the power of the statistical tools used to determine these relationships and to asses the duration of any observed equilibrium out of sample.


This post will investigate the power of the statistical tests in relation to pairs-trading for the following statistical tests ADF, BVR, HURST, PP, PGFF,


The general principal is that for two stocks and they form a stationary, and by definition, mean reverting pair if the following equation holds:


If is between and then and are co-integrated,


é o coeficiente de reversão à média. A statistical test must be performed to check if , this is known as a unit root test. If the series contains a unit root it isn’t suitable for pairs trading. There are multiple unit root tests, each running a different test on the residual process. One might be tempted to estimate the AR(1) residual model and check for using the conventional linear regression method calculating the standard t-ratio. However it was shown by Dicky and Fuller [1979] that the t-ratio does not follow the t-distribution, hence non-standard significance tests are needed known as unit root tests.


As with every model there are trade off when determining the training window size, too long a window and the model may contain irrelevant data and be slow to adjust to recent events, too short a window and the model only responds to recent events and forgets about past events quickly. Este trade off é problemático em testes de cointegração, foi demonstrado em Clegg, M., janeiro de 2014. Sobre a persistência da cointegração em pares, negociando que, para um tamanho de janela fixo, o poder da maioria dos testes de raiz unitária diminui como.


tends to 1 from below, for 250 data points with.


the barrage of co-integration tests only detect co-integration less than 25% of the time!


Intuitivamente isso faz sentido, quanto mais lento o processo for para reverter, mais pontos de dados serão necessários para ver a reversão. It is somewhat undesirable that the power of the unit root tests vary depending upon the properties of the underlying process, however it is not required for successful pairs trading that all co-integrated pairs are identified as such the varying power property of unit root tests is largely irrelevant.


What is more interesting is the false positive rate, so pairs identified as mean reverting when they are not, and how persistent the results are.


Generate 1000 co-integrated time series with and uniformly distributed in the set , and in the set according to Clegg this is similar to the types of stock pairs encountered in reality. Repita isso para diferentes comprimentos de série temporal e teste para ver quantas séries temporais são classificadas corretamente como reversão co-integrada / média usando vários testes para diferentes pValues.


In the majority of tests PP and PGFF outperform the other methods. Quando o processo foi fortemente revertido com menos de 0,85, os testes PP, PGFF, JO-E e JO-T identificaram corretamente o processo como co-integrado / média, revertendo mais de 75% do tempo em pValue 0,01. Para alguns dos pares de reversão mais fracos com mais de 0,95, o desempenho dos testes estatísticos é lamentável, com apenas 250 pontos de dados.


It is worth bearing in mind that 250 data points is approximatlythe number of trading days in a year, and perhaps gives an indication of how much historical data is needed in a pairs trading strategy.


Follow the same procedure outlined for the accuracy test but chose in the set to generate time series that isn’t co-integrated. See what percentage of the paths get falsely reported as co-integrated / mean reverting.


I’ve never seen this chart in a text book and was surprised at the results, both HURST and BVR report more false positives as increases! The more the process explodes the more likely the test was to show a false positive!


Felizmente os outros testes se comportam de maneira razoável com poucos falsos positivos.


Evolving Neural Networks through Augmenting Topologies – Part 4 of 4 – Estratégia de Negociação.


This post explores applying NEAT to trading the S&P. The learned strategy significantly out performs buying and holding both in and out of sample.


A key part of any machine learning problem is defining the features and ensuring that they’re normalised in some fashion.


The features will be rolling percentiles of the following economic data, a rolling percentile takes the last n data points and calculates what % of data point the latest data point is greater than.


The fitness function is final equity, and aims to maximise the final equity.


Any genome that has a 20% draw down, or attempts to use a leverage greater than +/- 2 is terminated. In practise you wouldn’t want to make your system machine learn the risk controls as there is potential that they don’t get learned. The reason they are embedded inside the strategy is to speed up the learning process as we can kill genomes early before the simulation is complete based upon breaking the risk rules.


Plot of all data / features.


It appears that when non-farms fall to their lower percentiles / unemployment reaches it’s highest percentiles the day to day returns in the S&P become more volatile. It is hoped that the learning can take advantage of this.


The learning has identified a strategy that out performs simply buying and holding. The proposed strategy has a max drawdown around 20% vs the buy and hold having a draw down of 40%. Additionally the strategy shorted the index between 2000-2003 as it was selling off before going long to 2007. Generating a return of 80% vs buy and hold of 7%!


In the out of sample data (not used during the training) the strategy significantly out performed buying and holding, approx 250% return vs 50% with a max drawdown close to 20% vs buy and hold draw down of 50%.


RNeat – Square Root Neural Net trained using Augmenting Topologies – Simple Example.


A simple tutorial demonstrating how to train a neural network to square root numbers using a genetic algorithm that searches through the topological structure space. The algorithm is called NEAT (Neuro Evolution of Augmenting Topologies) available in the RNeat package (not yet on CRAN).


The training is very similar to other machine learning / regression packages in R. The training function takes a data frame and a formula. The formula is used to specify what columns in the data frame are the dependent variables and which are the explanatory variable. The code is commented and should be simple enough for new R users.


The performance of the network can be seen in the bottom left chart of the image above, there is considerable differences between the expected output and the actual output. It is likely that with more training the magnitude of these errors will reduce, it can be seen in the bottom right chart that the maximum, mean and median fitness are generally increasing with each generation.


Evolving Neural Networks through Augmenting Topologies – Part 3 of 4.


This part of the NEAT tutorial will show how to use the RNeat package (not yet on CRAN) to solve the classic pole balance problem.


The simulation requires the implementation of 5 functions:


processInitialStateFunc – This specifies the initial state of the system, for the pole balance problem the state is the cart location, cart velocity, cart acceleration, force being applied to the cart, pole angle, pole angular velocity and pole angular acceleration. processUpdateStateFunc – This specifies how to take the current state and update it using the outputs of the neural network. In this example this function simulates the equations of motion and takes the neural net output as the force that is being applied to the cart. processStateToNeuralInputFunc – Allows for modifying the state / normalisation of the state before it is passed as an input to the neural network fitnessUpdateFunc – Takes the old fitness, the old state and the new updated state and determines what the new system fitness is. For the pole balance problem this function wants to reward the pendulum being up right, and reward the cart being close to the middle of the track. terminationCheckFunc – Takes the state and checks to see if the termination should be terminated. Can chose to terminate if the pole falls over, the simulation has ran too long or the cart has driven off of the end of the track. plotStateFunc – Plots the state, for the pole balance this draws the cart and pendulum.


Evolving Neural Networks through Augmenting Topologies – Part 2 of 4.


This part of the tutorial on using NEAT algorithm explains how genomes are crossed over in a meaningful way maintaining their topological information and how speciation (group genomes into species) can be used to protect weak genomes with new topological information from prematurely being eradicated from the gene pool before their weight space can be optimised.


The first part of this tutorial can be found here.


Tracking Gene History through Innovation Numbers.


Part 1 showed two mutations, link mutate and node mutate which both added new genes to the genome. Each time a new gene is created (through a topological innovation) a global innovation number is incremented and assigned to that gene.


The global innovation number is tracking the historical origin of each gene. If two genes have the same innovation number then they must represent the same topology (although the weights may be different). This is exploited during the gene crossover.


Genomes crossover takes two parent genomes (lets call them A and B) and creates a new genome (lets call it the child) taking the strongest genes from A and B copying any topological structures along the way.


During the crossover genes from both genomes are lined up using their innovation number. For each innovation number the gene from the most fit parent is selected and inserted into the child genome. If both parent genomes are the same fitness then the gene is randomly selected from either parent with equal probability. If the innovation number is only present in one parent then this is known as a disjoint or excess gene and represents a topological innovation, it too is inserted into the child.


The image below shows the crossover process for two genomes of the same fitness.


Speciation takes all the genomes in a given genome pool and attempts to split them into distinct groups known as species. The genomes in each species will have similar characteristics.


A way of measuring the similarity between two genomes is required, if two genomes are “similar” they are from the same species. A natural measure to use would be a weighted sum of the number of disjoint & excess genes (representing topological differences) and the difference in weights between matching genes. If the weighted sum is below some threshold then the genomes are of the same species.


The advantage of splitting the genomes into species is that during the genetic evolution step where genomes with low fitness are culled (removed entirely from the genome pool) rather than having each genome fight for it’s place against every other genome in the entire genome pool we can make it fight for it’s place against genomes of the same species . This way species that form from a new topological innovation that might not have a high fitness yet due to not having it’s weights optimised will survive the culling.


Summary of whole process.


Create a genome pool with n random genomes Take each genome and apply to problem / simulation and calculate the genome fitness Assign each genome to a species In each species cull the genomes removing some of the weaker genomes Breed each species (randomly select genomes in the species to either crossover or mutate) Repeat all of the above.


Aprendizado de Máquina para Negociação.


Oferecido na Georgia Tech como CS 7646.


Programa de Nanodegree.


Learn Unreal VR.


Learn the fundamentals of building vr applications using unreal engine.


Acelere sua carreira com a credencial que leva você rapidamente ao sucesso no trabalho.


Sobre este curso.


This course introduces students to the real world challenges of implementing machine learning based trading strategies including the algorithmic steps from information gathering to market orders. O foco está em como aplicar abordagens de aprendizado de máquina probabilísticas às decisões de negociação. We consider statistical approaches like linear regression, KNN and regression trees and how to apply them to actual stock trading situations.


Custo do Curso


Aprox. 4 months.


Nível de habilidade.


Incluído no curso.


Conteúdo rico de aprendizado.


Ministrado por profissionais da indústria.


Comunidade de Suporte ao Aluno.


Junte-se ao caminho para a grandeza.


This free course is your first step towards a new career with the Learn Unreal VR Nanodegree Program.


Free Course.


Aprendizado de Máquina para Negociação.


Enhance your skill set and boost your hirability through innovative, independent learning.


Programa de Nanodegree.


Learn Unreal VR.


Acelere sua carreira com a credencial que leva você rapidamente ao sucesso no trabalho.


Leads do curso.


Tucker Balch.


Arpan Chakraborty.


O que você aprenderá


This course is composed of three mini-courses :


Mini-curso 1: Manipulando Dados Financeiros em Python Mini-curso 2: Investimento Computacional Mini-curso 3: Algoritmos de Aprendizado de Máquina para Negociação.


Cada mini-curso consiste em cerca de 7 a 10 lições curtas. Atribuições e projetos são intercalados.


Queda 2015 Estudantes da OMS: Haverá dois testes - um de meio de aula após o minicurso 2 e um exame final.


Pré-requisitos e requisitos.


Students should have strong coding skills and some familiarity with equity markets. Nenhuma experiência financeira ou de aprendizado de máquina é assumida.


Note que este curso atende estudantes com foco em ciência da computação, assim como alunos de outras áreas, como engenharia de sistemas industriais, gerenciamento ou matemática, que têm experiências diferentes. Todos os tipos de estudantes são bem vindos!


Os tópicos do ML podem ser & quot; revisão & quot; para alunos do CS, enquanto partes de finanças serão revisadas para estudantes de finanças. However, even if you have experience in these topics, you will find that we consider them in a different way than you might have seen before, in particular with an eye towards implementation for trading.


A programação será principalmente em Python. Vamos fazer uso pesado de bibliotecas de computação numérica como o NumPy e o Pandas.


Por que fazer este curso?


No final deste curso, você deve ser capaz de:


Entenda as estruturas de dados usadas para negociação algorítmica. Saiba como construir software para acessar dados de patrimônio ao vivo, avaliá-lo e tomar decisões comerciais. Compreender 3 algoritmos de aprendizado de máquina populares e como aplicá-los a problemas de negociação. Entenda como avaliar o desempenho de um algoritmo de aprendizado de máquina para dados de séries temporais (dados de preço de ações). Saiba como e por que as técnicas de mineração de dados (aprendizado de máquina) falham. Construa um sistema de software de negociação de ações que usa dados diários atuais.


Algumas limitações / restrições:


We use daily data. This is not an HFT course, but many of the concepts here are relevant. Nós não interagimos (negociamos) diretamente com o mercado, mas vamos gerar alocações de ações que você poderia negociar se quisesse.


O que eu ganho?


Vídeos de instrutor Aprender fazendo exercícios Ensinados por profissionais da indústria.


Cursos relacionados.


Computational Photography.


Sistemas Embarcados.


Cyber-Physical Systems Security.


High Performance Computer Architecture.


Big Data Analytics in Healthcare.


Software Analysis & Testando


Cursos Populares.


Display Advertising.


Learn Swift Programming Syntax.


Featured Programs.


Apenas no Udacity.


Programs.


O negócio.


"Nanodegree" é uma marca registrada da Udacity. &cópia de; 2011 & ndash; 2018 Udacity, Inc.


Udacity não é uma universidade credenciada e não conferimos graus.


Jesse Spaulding.


Como ganhei $ 500k com aprendizado de máquina e HFT (negociação de alta frequência)


Este post irá detalhar o que eu fiz para fazer aprox. 500k de negociação de alta frequência de 2009 a 2010. Desde que eu estava negociando de forma totalmente independente e não estou mais executando o meu programa, estou feliz em dizer tudo. Minha negociação foi principalmente em contratos de futuros Russel 2000 e DAX.


A chave do meu sucesso, acredito, não estava em uma equação financeira sofisticada, mas sim no design geral do algoritmo, que unia muitos componentes simples e usava o aprendizado de máquina para otimizar a máxima rentabilidade. Você não precisa conhecer nenhuma terminologia sofisticada aqui, porque quando eu configurei meu programa, tudo foi baseado na intuição. (O surpreendente curso de aprendizado de máquina de Andrew Ng ainda não estava disponível - se você clicar nesse link, você será levado ao meu projeto atual: CourseTalk, um site de revisão para MOOCs)


Primeiro, quero apenas demonstrar que meu sucesso não foi simplesmente o resultado da sorte. Meu programa fazia de 1000 a 4000 negociações por dia (meio longo, meio curto) e nunca ocupava posições de mais do que alguns contratos por vez. Isso significava que a sorte aleatória de qualquer negociação em particular era muito rápida. O resultado foi que eu nunca perdi mais de US $ 2000 em um dia e nunca tive um mês perdido:


(EDIT: Estes números são depois de pagar comissões)


E aqui está um gráfico para lhe dar uma noção da variação diária. Note que isso exclui os últimos 7 meses porque - à medida que os números pararam de subir - perdi minha motivação para entrar neles.


Antes de configurar o meu programa de negociação automatizado, eu tinha 2 anos de experiência como "manual" e "& rdquo; comerciante do dia. Isso foi em 2001 - eram os primeiros dias do comércio eletrônico e havia oportunidades para os "cambistas". fazer um bom dinheiro. Eu só posso descrever o que eu estava fazendo como se fosse jogar videogames / jogos de azar com uma suposta vantagem. Ser bem-sucedido significa ser rápido, ser disciplinado e ter uma boa capacidade intuitiva de reconhecimento de padrões. Consegui ganhar cerca de US $ 250 mil, pagar meus empréstimos estudantis e ter dinheiro sobrando. Ganhar!


Nos próximos cinco anos, eu lançaria duas startups, adquirindo algumas habilidades de programação ao longo do caminho. Não seria até o final de 2008 que eu voltaria a negociar. Com o dinheiro acabando com a venda da minha primeira startup, a negociação oferecia esperanças de algum dinheiro rápido enquanto eu descobria o meu próximo movimento.


Em 2008, eu era "manualmente" e "rdquo; dia negociando futuros usando software chamado T4. Eu estava querendo algumas teclas de atalho de entrada de pedidos personalizadas, então depois de descobrir que o T4 tinha uma API, aceitei o desafio de aprender C # (a linguagem de programação necessária para usar a API) e fui em frente e desenvolvi algumas teclas de atalho.


Depois de molhar os pés com a API, logo tive aspirações maiores: queria ensinar o computador a trocar por mim. A API forneceu um fluxo de dados de mercado e uma maneira fácil de enviar pedidos para a troca - tudo o que eu tinha que fazer era criar a lógica no meio.


Abaixo está uma imagem de uma janela de negociação T4. O que foi legal é que quando eu comecei meu programa trabalhando eu pude assistir o comércio de computador exatamente nesta mesma interface. Assistir ordens reais entrando e saindo (por conta própria com meu dinheiro real) era ao mesmo tempo emocionante e assustador.


O design do meu algoritmo.


Desde o início, meu objetivo era configurar um sistema de modo que eu pudesse estar razoavelmente confiante de que ganharia dinheiro antes de fazer qualquer negociação ao vivo. Para conseguir isso, eu precisava construir uma estrutura de simulação de negociação que simulasse a negociação ao vivo, com a maior precisão possível.


Enquanto a negociação no modo ao vivo exigia atualizações do mercado de processamento transmitidas pela API, o modo de simulação exigia a leitura das atualizações do mercado a partir de um arquivo de dados. Para coletar esses dados, configurei a primeira versão do meu programa para simplesmente conectar-me à API e registrar as atualizações do mercado com registros de data e hora. Acabei usando 4 semanas de dados de mercado recentes para treinar e testar meu sistema.


Com uma estrutura básica em vigor, ainda tinha a tarefa de descobrir como criar um sistema comercial lucrativo. Como se vê, meu algoritmo se dividiria em dois componentes distintos, que eu exploraria por sua vez:


Previsão de movimentos de preços; e Fazendo negócios lucrativos.


Previsão de movimentos de preços.


Talvez um componente óbvio de qualquer sistema de negociação seja a capacidade de prever onde os preços irão se mover. E o meu não foi exceção. Eu defini o preço atual como a média do lance interno e da oferta interna e estabeleci a meta de prever onde o preço estaria nos próximos 10 segundos. Meu algoritmo precisaria apresentar essa previsão momento a momento ao longo do dia de negociação.


Criando & amp; otimização de indicadores.


Eu criei um punhado de indicadores que provaram ter uma capacidade significativa de prever movimentos de preços de curto prazo. Cada indicador produziu um número que foi positivo ou negativo. Um indicador era útil se, na maior parte dos casos, um número positivo correspondesse ao aumento do mercado e um número negativo correspondesse à queda do mercado.


Meu sistema me permitiu determinar rapidamente a capacidade preditiva de qualquer indicador, por isso pude experimentar muitos indicadores diferentes para ver o que funcionava. Muitos dos indicadores tinham variáveis ​​nas fórmulas que os produziam e eu consegui encontrar os valores ótimos para essas variáveis, fazendo comparações lado a lado dos resultados obtidos com valores variáveis.


Os indicadores que foram mais úteis foram todos relativamente simples e foram baseados em eventos recentes no mercado em que eu estava negociando, bem como nos mercados de títulos correlacionados.


Fazendo previsões precisas de movimentação de preços.


Ter indicadores que simplesmente previam uma alta ou baixa no preço não era suficiente. Eu precisava saber exatamente quanto movimento de preço era previsto por cada valor possível de cada indicador. Eu precisava de uma fórmula que convertesse um valor de indicador em uma previsão de preço.


Para conseguir isso, acompanhei as movimentações de preço previstas em 50 buckets que dependiam do intervalo em que o valor do indicador caiu. Isso gerou previsões exclusivas para cada bucket que eu era capaz de representar graficamente no Excel. Como você pode ver, a mudança de preço esperada aumenta à medida que o valor do indicador aumenta.


Com base em um gráfico como esse, consegui fazer uma fórmula para ajustar a curva. No começo eu fiz isso "ajuste de curva". manualmente, mas logo escrevi algum código para automatizar esse processo.


Note que nem todas as curvas do indicador tinham a mesma forma. Observe também que os buckets foram distribuídos logaritmicamente para distribuir os dados de maneira uniforme. Por fim, observe que os valores dos indicadores negativos (e suas previsões de preços descendentes correspondentes) foram invertidos e combinados com os valores positivos. (Meu algoritmo tratado para cima e para baixo exatamente o mesmo.)


Combinando indicadores para uma única previsão.


Uma coisa importante a considerar era que cada indicador não era totalmente independente. Eu não poderia simplesmente somar todas as previsões que cada indicador fez individualmente. A chave era descobrir o valor preditivo adicional que cada indicador tinha além do que já estava previsto. Isso não era difícil de implementar, mas significava que se eu estivesse "ajustando a curva", vários indicadores ao mesmo tempo, tive que ser cuidadoso; a mudança de um efetuaria as previsões de outro.


Para ajustar a curva & rdquo; Todos os indicadores ao mesmo tempo eu configurei o otimizador para pisar apenas 30% do caminho para as novas curvas de previsão com cada passagem. Com esse salto de 30%, descobri que as curvas de previsão se estabilizariam em poucas passagens.


Com cada indicador nos dando agora a previsão adicional de preço, eu poderia simplesmente adicioná-los para produzir uma única previsão de onde o mercado estaria em 10 segundos.


Por que prever preços não é suficiente.


Você pode pensar que com essa vantagem no mercado eu era de ouro. Mas você precisa ter em mente que o mercado é composto de ofertas e ofertas - não é apenas um preço de mercado. Sucesso na negociação de alta freqüência se resume a obter bons preços e não é assim tão fácil.


Os fatores a seguir dificultam a criação de um sistema lucrativo:


Com cada negócio eu tive que pagar comissões ao meu corretor e à bolsa. O spread (diferença entre oferta mais alta e oferta mais baixa) significava que se eu simplesmente comprasse e vendesse aleatoriamente, estaria perdendo uma tonelada de dinheiro. A maior parte do volume do mercado era de outros bots que só fariam uma troca comigo se achassem que tinham alguma vantagem estatística. Vendo uma oferta não garante que eu poderia comprá-lo. No momento em que minha ordem de compra chegou à bolsa, era muito possível que essa oferta tivesse sido cancelada. Como um pequeno participante do mercado, não havia como competir sozinho com a velocidade.


Construindo uma simulação de negociação completa.


Então eu tive uma estrutura que me permitiu backtest e otimizar os indicadores. Mas eu tive que ir além disso - eu precisava de um framework que me permitisse fazer backtest e otimizar um sistema de negociação completo; aquele em que eu estava mandando pedidos e ficando em posições. Neste caso, eu estaria otimizando para P & amp; L total e, em certa medida, P & amp; L médio por negociação.


Isso seria mais complicado e, de certa forma, impossível modelar exatamente, mas eu fiz o melhor que pude. Aqui estão alguns dos problemas que eu tive que lidar:


Quando um pedido foi enviado ao mercado na simulação, tive que modelar o tempo de atraso. O fato de meu sistema ter visto uma oferta não significa que ela poderia comprá-la imediatamente. O sistema enviaria o pedido, aguardaria aproximadamente 20 milissegundos e somente se a oferta ainda estivesse lá era considerado como um negócio executado. Isso era inexato porque o tempo real de atraso era inconsistente e não relatado. Quando eu fiz lances ou ofertas, tive que olhar para o fluxo de execução de negociação (fornecido pela API) e usá-los para avaliar quando meu pedido seria executado. Para fazer isso direito eu tive que rastrear a posição do meu pedido na fila. (É um sistema first-in first-out). Novamente, eu não pude fazer isso perfeitamente, mas fiz uma melhor aproximação.


Para refinar minha simulação de execução de pedidos, o que fiz foi extrair meus arquivos de log da negociação ao vivo pela API e compará-los aos arquivos de log produzidos pela negociação simulada no mesmo período de tempo. Consegui obter minha simulação ao ponto de ser bastante precisa e, para as partes que eram impossíveis de modelar exatamente, certifiquei-me de, pelo menos, produzir resultados que fossem estatisticamente semelhantes (nas métricas que julguei importantes).


Fazendo negócios lucrativos.


Com um modelo de simulação de pedidos, agora eu poderia enviar pedidos no modo de simulação e ver um P & amp; Mas como meu sistema saberia quando e onde comprar e vender?


As previsões do movimento de preços foram um ponto de partida, mas não toda a história. O que eu fiz foi criar um sistema de pontuação para cada um dos 5 níveis de preço na oferta e oferta. Estes incluíram um nível acima da oferta interna (para uma ordem de compra) e um nível abaixo da oferta interna (para uma ordem de venda).


Se a pontuação de um determinado nível de preço estiver acima de um determinado limite, isso significa que o meu sistema deve ter um lance / oferta ativa - abaixo do limite, então qualquer pedido ativo deve ser cancelado. Com base nisso, não era incomum que meu sistema exibisse um lance no mercado e o cancelasse imediatamente. (Embora eu tentei minimizar isso, é irritante para quem olha para a tela com olhos humanos - inclusive eu.)


As pontuações do nível de preços foram calculadas com base nos seguintes fatores:


A previsão do movimento de preços (que discutimos anteriormente). O nível de preços em questão. (Níveis internos significavam que grandes previsões de movimentação de preço eram necessárias.) O número de contratos na frente do meu pedido na fila. (Menos foi melhor.) O número de contratos por trás do meu pedido na fila. (Mais foi melhor.)


Essencialmente, esses fatores serviram para identificar "seguro". lugares para licitar / oferecer. A previsão do movimento de preços, por si só, não era adequada porque não levava em conta o fato de que, ao fazer uma oferta, eu não era preenchido automaticamente - só fui preenchido se alguém me vendesse lá. A realidade era que o simples fato de alguém me vender a um certo preço mudava as probabilidades estatísticas do negócio.


As variáveis ​​usadas nesta etapa foram todas sujeitas a otimização. Isso foi feito exatamente da mesma maneira que eu otimizei as variáveis ​​nos indicadores de preço, exceto neste caso eu estava otimizando para a linha de fundo P & amp; L.


Quando negociamos como seres humanos, muitas vezes temos emoções e vieses poderosos que podem levar a decisões menos que ótimas. Obviamente, não queria codificar esses vieses. Aqui estão alguns fatores que meu sistema ignorou:


O preço em que uma posição foi inserida - Em um escritório comercial, é bastante comum ouvir conversas sobre o preço em que alguém é comprido ou baixo, como se isso pudesse afetar sua futura tomada de decisão. Embora isso tenha alguma validade como parte de uma estratégia de redução de riscos, ela realmente não tem relação com o curso futuro dos eventos no mercado. Portanto, meu programa ignorou completamente essa informação. É o mesmo conceito que ignorar os custos irrecuperáveis. Indo curto vs. saindo de uma posição longa - Tipicamente um trader teria critérios diferentes que determinam onde vender uma posição comprada versus onde ir short. No entanto, da minha perspectiva de algoritmos, não havia razão para fazer uma distinção. Se meu algoritmo esperava um movimento descendente, a venda era uma boa ideia, independentemente de ser atualmente longa, curta ou plana. A & ldquo; dobrando & rdquo; estratégia - Esta é uma estratégia comum, onde os comerciantes vão comprar mais ações no caso de que o comércio original vai contra eles. Isso faz com que o preço médio de compra seja menor e isso significa que quando (ou se) a ação girar, você estará pronto para recuperar seu dinheiro rapidamente. Na minha opinião, esta é realmente uma estratégia horrível, a menos que você esteja Warren Buffet. Você é levado a pensar que está indo bem porque a maioria de seus negócios será vencedora. O problema é quando você perde você perde grande. O outro efeito é que torna difícil julgar se você realmente tem uma vantagem no mercado ou está apenas tendo sorte. Ser capaz de monitorar e confirmar que meu programa realmente tinha uma vantagem era um objetivo importante.


Como meu algoritmo tomava decisões da mesma forma, independentemente de onde ele entrasse em uma negociação ou se era atualmente longo ou curto, ocasionalmente ele fazia parte (e tomava) de algumas grandes negociações perdedoras (além de algumas grandes negociações vitoriosas). Mas, você não deve pensar que não houve nenhum gerenciamento de risco.


Para gerenciar o risco, impus um tamanho máximo de posição de dois contratos por vez, ocasionalmente aumentado em dias de alto volume. Eu também tinha um limite máximo de perda diária para proteger contra condições inesperadas de mercado ou um bug no meu software. Esses limites foram aplicados no meu código, mas também no backend por meio do meu corretor. Aconteceu que nunca encontrei problemas significativos.


A partir do momento em que comecei a trabalhar no meu programa, demorei cerca de 6 meses até atingir o ponto de rentabilidade e comecei a executá-lo ao vivo. Embora, para ser justo, uma quantidade significativa de tempo foi aprender uma nova linguagem de programação. Enquanto trabalhei para melhorar o programa, vi um aumento nos lucros para cada um dos próximos quatro meses.


Toda semana eu reciclaria meu sistema com base nas 4 semanas anteriores de dados. Descobri que isso estabelecia o equilíbrio certo entre captar tendências comportamentais recentes do mercado e garantir que meu algoritmo tivesse dados suficientes para estabelecer padrões significativos. Como o treinamento começou a tomar mais e mais tempo, eu o dividi para que pudesse ser executado por 8 máquinas virtuais usando o amazon EC2. Os resultados foram então reunidos na minha máquina local.


O ponto alto da minha negociação foi em outubro de 2009, quando fiz quase 100k. Depois disso, continuei a passar os próximos quatro meses tentando melhorar meu programa, apesar do lucro reduzido a cada mês. Infelizmente, a essa altura, acho que implementei todas as minhas melhores ideias, porque nada do que tentei parecia ajudar muito.


Com a frustração de não poder fazer melhorias e não ter senso de crescimento, comecei a pensar em uma nova direção. Eu enviei um e-mail para 6 diferentes empresas de negociação de alta frequência para ver se eles estariam interessados ​​em comprar meu software e me contratar para trabalhar para eles. Ninguém respondeu. Eu tive algumas novas idéias de inicialização que eu queria trabalhar, então eu nunca dei continuidade.


ATUALIZAÇÃO - Eu postei isso no Hacker News e tem recebido muita atenção. Eu só quero dizer que eu não defendo ninguém tentando fazer algo assim agora. Você precisaria de uma equipe de pessoas realmente inteligentes com uma variedade de experiências para ter qualquer esperança de competir. Mesmo quando eu estava fazendo isso, acredito que era muito raro para as pessoas alcançarem o sucesso (embora eu já tivesse ouvido falar de outras pessoas).


Há um comentário no topo da página que menciona "estatísticas manipuladas" e se refere a mim como um investidor de varejo & rdquo; que quants iria "alegremente escolher". Este é um comentário bastante infeliz que simplesmente não se baseia na realidade. Deixando isso de lado, há alguns comentários interessantes: news. ycombinator / item? Id = 4748624.


ATUALIZAÇÃO # 2 - Fiz uma FAQ de acompanhamento que responde a algumas perguntas comuns que recebi de traders sobre essa postagem.


carlosspicyweiner111 gostou disto.


Oi, eu sou Jesse, fundador do Thinklab. Eu moro e toco em São Francisco. Você encontrou minha casa na web .. Bem-vindo!

No comments:

Post a Comment