четверг, 26 апреля 2018 г.

Aprendizado da máquina de troca de opções


Jesse Spaulding.


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


Esta publicação detalhará o que fiz para fazer aprox. 500k de negociação de alta freqüência de 2009 a 2010. Desde que eu estava negociando completamente de forma independente e não estou mais executando meu programa, eu estou feliz em contar tudo. Minha negociação foi principalmente em contratos de futuros Russel 2000 e DAX.


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


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


(EDITAR: estes números são depois de pagar comissões)


E aqui é um gráfico para dar uma sensação de variação diária. Observe que isso exclui os últimos 7 meses porque - à medida que os números pararam de subir - eu perdi minha motivação para inseri-los.


Antes de configurar meu programa de negociação automatizado I & rsquo; d tinha 2 anos de experiência como um & ldquo; manual & rdquo; comerciante do dia. Isso foi de volta em 2001 - foram os primeiros dias do comércio eletrônico e houve oportunidades para & ldquo; scalpers & rdquo; para ganhar dinheiro. Eu só posso descrever o que eu estava fazendo como semelhante a jogar um jogo de vídeo / jogo com uma suposta vantagem. Ser bem-sucedido significou ser rápido, ser disciplinado e possuir boas habilidades de reconhecimento de padrões intuitivas. Eu consegui fazer cerca de US $ 250 mil, pagar meus empréstimos estudantis e ter dinheiro restante. Ganhar!


Nos próximos cinco anos, eu lançaria duas startups, pegando 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 escorrendo da venda da minha primeira inicialização, a negociação ofereceu esperanças de algum dinheiro rápido enquanto eu descobri minha próxima jogada.


Em 2008 eu estava & ldquo; manualmente & rdquo; dia comercializando futuros usando o software chamado T4. Eu estava desejando algumas teclas de atalho de entrada de pedidos personalizadas, então, depois de descobrir que a T4 tinha uma API, assumi o desafio de aprender C # (a linguagem de programação necessária para usar a API) e segui adiante e me criei algumas teclas rápidas.


Depois de ficar com os pés molhados 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 ordens para a troca - tudo o que eu tinha que fazer era criar a lógica no meio.


Abaixo está uma captura de tela de uma janela de negociação T4. O que foi legal é que, quando trabalhei, consegui assistir o comércio de computadores nesta mesma interface. Ver as ordens reais que aparecem dentro e fora (por si com meu dinheiro real) foram emocionantes e assustadoras.


O design do meu algoritmo.


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


Embora a negociação no modo ao vivo exigisse o processamento de atualizações de mercado transmitidas através da API, o modo de simulação exigia a leitura de atualizações de mercado a partir de um arquivo de dados. Para coletar esses dados, configurei a primeira versão do meu programa para simplesmente conectar-se à API e registrar as atualizações do mercado com timestamps. Acabei usando 4 semanas de dados de mercado recentes para treinar e testar meu sistema.


Com um quadro básico no local, eu ainda tinha a tarefa de descobrir como criar um sistema comercial lucrativo. Como se verifica, meu algoritmo seria dividido em dois componentes distintos, que eu explorarei por sua vez:


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


Previsão de movimentos de preços.


Talvez um componente óbvio de qualquer sistema comercial seja capaz de prever onde os preços se moverão. E o meu não foi exceção. Eu definei o preço atual como a média da oferta interna e oferta interna e eu estabeleci o objetivo de prever onde o preço seria nos próximos 10 segundos. Meu algoritmo precisaria apresentar esta previsão momento a momento ao longo do dia de negociação.


Criando & amp; indicadores de otimização.


Eu criei um punhado de indicadores que provaram ter uma habilidade significativa para prever movimentos de preços de curto prazo. Cada indicador produziu um número que era positivo ou negativo. Um indicador era útil se, com maior frequência, um número positivo correspondesse com o mercado subindo e um número negativo correspondia ao mercado descer.


Meu sistema me permitiu determinar rapidamente a capacidade preditiva de qualquer indicador, então eu consegui experimentar muitos indicadores diferentes para ver o que funcionou. Muitos dos indicadores tinham variáveis ​​nas fórmulas que os produziam e 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 que negociei, bem como os mercados de títulos correlacionados.


Fazendo previsões de movimento de preço exato.


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


Para realizar isso, rastreei os movimentos de preços previstos em 50 baldes que dependiam do alcance em que o valor do indicador caiu. Isso produziu previsões únicas para cada balde que eu então consegui representar no Excel. Como você pode ver, a variação esperada do preço 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 & ldquo; curve fitting & rdquo; manualmente, mas logo escrevi algum código para automatizar esse processo.


Observe que nem todas as curvas indicadoras tiveram a mesma forma. Observe também que os baldes foram distribuídos logaritticamente de modo a espalhar os dados de forma uniforme. Finalmente, note que os valores de indicadores negativos (e as respectivas previsões de preços descendentes correspondentes) foram invertidos e combinados com os valores positivos. (Meu algoritmo tratado de forma ascendente e exata 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 resumir todas as previsões que cada indicador faz individualmente. A chave era descobrir o valor preditivo adicional que cada indicador tinha além do que já estava previsto. Isso não era muito difícil de implementar, mas isso significava que se eu fosse & ldquo; curve fitting & rdquo; vários indicadores ao mesmo tempo eu tive que ter cuidado; mudar um afetaria as previsões de outro.


A fim de & ldquo; curve fit & rdquo; Todos os indicadores ao mesmo tempo eu configurei o otimizador para passar apenas 30% do caminho para as novas curvas de previsão com cada passagem. Com este salto de 30%, descobri que as curvas de previsão se estabilizariam dentro de algumas passagens.


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


Por que a previsão de preços não é suficiente.


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


Os seguintes fatores tornam difícil a criação de um sistema lucrativo:


Com cada troca eu tinha que pagar comissões para o meu corretor e a troca. O spread (diferença entre oferta mais alta e oferta mais baixa) significava que, se eu fosse simplesmente comprar e vender aleatoriamente, eu estaria perdendo uma tonelada de dinheiro. A maior parte do volume do mercado eram outros bots que só executariam um comércio comigo se achassem que tinham alguma vantagem estatística. Ver uma oferta não garantiu que eu pudesse comprá-la. No momento em que minha ordem de compra chegou ao intercâmbio, era muito possível que essa oferta tivesse sido cancelada. Como um pequeno jogador do mercado, não havia nenhuma maneira de eu competir sozinho na velocidade.


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


Então eu tive uma estrutura que me permitiu backtest e otimizar indicadores. Mas eu tinha que ir além disso - eu precisava de uma estrutura que me permitisse fazer backtest e otimizar um sistema comercial completo; um onde eu estava mandando ordens e entrando em posições. Neste caso, I & rsquo; d seja otimizado para P & amp; L total e, em certa medida, P & amp; L médio por comércio.


Isso seria mais complicado e, de certa forma, impossível modelar exatamente, mas eu fiz o melhor que pude. Aqui estão algumas das questões que eu tive que lidar com:


Quando um pedido foi enviado ao mercado em simulação, tive que modelar o tempo de atraso. O fato de meu sistema ter visto uma oferta não significava que pudesse comprá-lo imediatamente. O sistema enviaria o pedido, espere aproximadamente 20 milissegundos e, em seguida, apenas se a oferta ainda fosse considerada como um comércio executado. Isso foi inexato porque o tempo de atraso real foi inconsistente e não relatado. Quando eu coloquei lances ou ofertas, tive que olhar para o fluxo de execução comercial (fornecido pela API) e usá-los para avaliar quando minha ordem teria sido executada contra. Para fazer isso, tive que rastrear a posição do meu pedido na fila. (É um sistema de primeira saída em primeiro lugar). Mais uma vez, não consegui fazer isso perfeitamente, mas fiz uma melhor aproximação.


Para refinar a simulação de execução do meu pedido, fiz os meus arquivos de log da negociação ao vivo através da API e comparei-os aos arquivos de log produzidos por negociação simulada do mesmo período. Eu consegui minha simulação até o ponto de ser bastante preciso e, para as partes que eram impossíveis de modelar exatamente, me assegurei pelo menos de produzir resultados estatisticamente similares (nas métricas que achava importantes).


Faz negócios lucrativos.


Com um modelo de simulação de ordem no local, agora eu poderia enviar ordens no modo de simulação e ver uma P & amp; L simulada. Mas como saberia o meu sistema quando e onde comprar e vender?


As previsões de 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 um pedido de compra) e um nível abaixo da oferta interna (para uma ordem de venda).


Se a pontuação em qualquer nível de preço fosse superior a um certo limite que significaria que meu sistema deveria ter uma oferta / oferta ativa - abaixo do limite, então todas as ordens ativas deveriam ser canceladas. Com base nisso, não era incomum que meu sistema iria mostrar uma oferta no mercado e, em seguida, cancelá-lo imediatamente. (Embora eu tentei minimizar isso, como é irritante, como diabos para quem olha a tela com olhos humanos - inclusive eu.)


Os escores do nível de preços foram calculados com base nos seguintes fatores:


A previsão do movimento do preço (que discutimos anteriormente). O nível de preços em questão. (Os níveis internos significaram que foram necessárias maiores previsões de movimento de preços). 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 & ldquo; safe & rdquo; lugares para oferecer / oferecer. A previsão de movimento de preço por si só não era adequada porque não explicava o fato de que ao colocar uma oferta eu não estava preenchido automaticamente - eu só cheguei se alguém me vendesse lá. A realidade era que o simples fato de alguém me vender a um certo preço alterou as probabilidades estatísticas do comércio.


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


Ao negociar como seres humanos, muitas vezes temos poderosas emoções e desvios que podem levar a decisões menos do que ótimas. Claramente, não queria codificar esses preconceitos. Aqui estão alguns fatores que meu sistema ignorou:


O preço que uma posição foi inserida - Em um escritório de negociação, é muito comum ouvir a conversa sobre o preço no qual alguém é longo ou curto, como se isso pudesse afetar a futura tomada de decisões. Embora isso tenha alguma validade como parte de uma estratégia de redução de risco, ele realmente não tem influência no futuro dos eventos no mercado. Portanto, meu programa ignorou completamente essa informação. É o mesmo conceito que ignorar custos irrecuperáveis. Ir a curto vs. sair de uma posição longa - Normalmente, um comerciante teria critérios diferentes que determinam onde vender uma posição longa versus onde ficar curto. No entanto, da minha perspectiva de algoritmos não havia motivo para fazer uma distinção. Se o meu algoritmo esperava que uma venda de movimento descendente fosse uma boa idéia, independentemente de ser atualmente longa, curta ou plana. A & ldquo; dobrando para cima & rdquo; estratégia - Esta é uma estratégia comum em que os comerciantes comprarão mais ações no caso de o comércio original ir contra elas. Isso resulta em um preço de compra médio menor e significa que quando (ou se) o estoque se virar, você estará configurado para fazer o seu dinheiro de volta em nenhum momento. Na minha opinião, esta é realmente uma estratégia horrível, a menos que você seja o Warren Buffet. Você está enganado para pensar que você está indo bem porque a maioria de seus negócios serão vencedores. O problema é quando você perde você perder grande. O outro efeito é que dificilmente julgar se você realmente tem uma vantagem no mercado ou está apenas tendo sorte. Ser capaz de monitorar e confirmar que o meu programa de fato teve uma vantagem foi um objetivo importante.


Uma vez que meu algoritmo tomou decisões do mesmo modo, independentemente de onde ele entrou em um comércio ou se fosse atualmente longo ou curto, ocasionalmente sentava-se (e aceitou) alguns grandes negócios perdidos (além de alguns grandes negócios vencedores). Mas, você não deveria pensar que não havia nenhum gerenciamento de riscos.


Para gerenciar o risco, apliquei um tamanho máximo de posição de 2 contratos por vez, ocasionalmente acumulado em dias de alto volume. Eu também tive um limite máximo de perda diária para proteger contra quaisquer condições de mercado inesperadas ou um erro no meu software. Esses limites foram aplicados no meu código, mas também no backend através do meu corretor. Como aconteceu, nunca encontrei problemas significativos.


Desde o momento em que comecei a trabalhar no meu programa, demorei cerca de 6 meses antes de chegar ao ponto de rentabilidade e começar a executá-lo ao vivo. Embora seja justo, uma quantidade significativa de tempo foi aprender uma nova linguagem de programação. Enquanto trabalhava para melhorar o programa, vi maiores lucros para cada um dos próximos quatro meses.


Todas as semanas, eu treinaria o sistema com base nas 4 semanas anteriores de dados. Eu achei que isso atingiu o equilíbrio certo entre a captura de tendências comportamentais recentes do mercado e garantir que meu algoritmo tivesse dados suficientes para estabelecer padrões significativos. À medida que o treinamento começou a tomar mais e mais tempo, eu o separei para que ele possa ser executado por 8 máquinas virtuais usando o Amazon EC2. Os resultados foram então agrupados na minha máquina local.


O ponto alto da minha negociação foi outubro de 2009, quando eu fiz quase 100k. Depois disso, continuei a gastar os próximos quatro meses tentando melhorar meu programa, apesar da diminuição do lucro a cada mês. Infelizmente, neste ponto, acho que eu implementei todas as minhas melhores idéias, porque nada que tentei pareceu ajudar muito.


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


UPDATE - Posteci isso no Hacker News e tem tido muita atenção. Eu só quero dizer que 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 alguma esperança de competir. Mesmo quando eu estava fazendo isso, eu acreditava que era muito raro que os indivíduos conseguissem sucesso (embora eu tivesse ouvido falar de outros).


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


UPDATE # 2 - I & rsquo; postou um FAQ de seguimento que responde algumas perguntas comuns que eu recebi dos comerciantes sobre esta publicação.


Delhideviant gostou disto.


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


Forex Mecânico.


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


Aprendizado de máquinas no comércio de Forex: por que muitos acadêmicos estão fazendo tudo errado.


Construir estratégias de aprendizado de máquinas que pode obter resultados decentes em condições de mercado ao vivo sempre foi um desafio importante na negociação algorítmica. Apesar da grande quantidade de interesse e das incríveis recompensas em potencial, ainda não há publicações acadêmicas que possam mostrar uma boa aprendizagem de máquinas modelos que podem resolver com sucesso o problema de negociação no mercado real (no melhor de meus conhecimentos, publique um comentário se você tiver um e eu ficarei mais do que feliz em lê-lo). Embora muitos artigos publicados parecem mostrar resultados promissores, muitas vezes é o caso que esses documentos se enquadram em uma variedade de diferentes problemas de tendência estatística que tornam o sucesso do mercado real de suas estratégias de aprendizagem de máquinas altamente improváveis. Na publicação de hoje, vou falar sobre os problemas que vejo na pesquisa acadêmica relacionada com o aprendizado de máquinas no Forex e como acredito que essa pesquisa poderia ser melhorada para produzir informações muito mais úteis para as comunidades acadêmicas e comerciais.


A maioria das armadilhas no projeto de estratégia de aprendizado de máquinas ao fazer o comércio de Forex é inevitavelmente herdada do mundo de problemas de aprendizagem deterministas. Ao construir um algoritmo de aprendizagem de máquina para algo como o reconhecimento de face ou o reconhecimento de letras, existe um problema bem definido que não muda, o que geralmente é abordado através da construção de um modelo de aprendizado de máquina em um subconjunto dos dados (um conjunto de treinamento) e depois teste 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áquinas recentemente desenvolvidas. O ponto chave aqui, no entanto, é que os problemas abordados inicialmente pela aprendizagem por máquinas foram na sua maioria deterministas e independentes do tempo.


Ao se mudar para a negociação, aplicar esta mesma filosofia produz muitos problemas relacionados com o caráter parcialmente não-determinista do mercado e sua dependência temporal. O simples ato de tentar selecionar conjuntos de treinamento e teste 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 fazer um único exercício de treinamento / validação também gera um problema relacionado à forma como esse algoritmo deve ser aplicado quando a negociação ao vivo. Por definição, a negociação ao vivo será diferente uma vez que a seleção de conjuntos de treinamento / teste precisa ser reaplicada a dados diferentes (como agora o conjunto de testes é dados verdadeiramente desconhecidos). O viés inerente à seleção inicial do período inicial na amostra / fora da amostra e a falta de regras testadas para negociação em dados desconhecidos tornam essas técnicas comuns falhar na negociação ao vivo. Se um algoritmo for treinado com dados 2000-2012 e foi validado por cruzamento com os dados de 2012-2015, não há motivos para acreditar que o mesmo sucesso acontecerá se for treinado em dados de 2003-2015 e depois comercializado de 2015 a 2017, os conjuntos de dados são de natureza muito diferente.


O sucesso do algoritmo de medição também é um problema muito relevante aqui. Inevitavelmente, os algoritmos de aprendizado da máquina utilizados para negociação devem ser medidos pelo mérito por sua capacidade de gerar retornos positivos, mas algumas medidas medem o mérito de novas técnicas algorítmicas, tentando comparar suas habilidades para obter as previsões corretas. As previsões corretas não são, necessariamente, iguais às negociações lucrativas, como você pode facilmente ver ao criar classificadores binários. Se você tentar prever a próxima direção da vela, você ainda pode fazer uma perda se você estiver na maior parte direita em pequenas velas e errado em velas maiores. Na verdade, a maioria desses tipos de classificadores e # 8211; a maioria daqueles que não trabalham & # 8211; acabar por prever 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 negociação de opções binárias rentáveis.


Para construir estratégias que estão na maior parte livres dos problemas acima, sempre defendai uma metodologia em que o algoritmo de aprendizado da máquina é treinado antes da tomada de qualquer decisão de treinamento. Ao usar uma janela em movimento para treinar e nunca tomar mais de uma decisão sem reconquistar todo o algoritmo, podemos livrar-se do viés de seleção que é inerente à escolha de um único conjunto na amostra / fora da amostra. Desta forma, todo o teste é uma série de exercícios de treinamento / validação que acabam garantindo que o algoritmo de aprendizagem da máquina funcione mesmo em conjuntos de dados de treinamento tremendamente diferentes. Eu também defendo a medição do desempenho real de backtesting para medir o mérito de um algoritmo de aprendizado de máquina e, além disso, eu chegaria a dizer que nenhum algoritmo pode valer o seu sal sem ser comprovado em condições reais de fora da amostra . O desenvolvimento de algoritmos dessa maneira é muito mais difícil e não encontrei um único documento acadêmico que acompanhe esse tipo de abordagem (se perdi, sinto-me livre para postar um link para que eu possa incluir um comentário!).


Isso 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 depois de cada aprendizado aprendendo a decisão derivada) e realizar exames adequados de avaliação de viés de mineração de dados para determinar a confiança com que nós pode dizer que os resultados não provêm de chance aleatória. Meu amigo AlgoTraderJo & # 8211; que também é membro da minha comunidade comercial # 8211; Atualmente, está crescendo um tópico no ForexFactory seguindo esse mesmo tipo de filosofia para desenvolvimento de aprendizagem em máquina, enquanto trabalhamos em alguns novos algoritmos de aprendizado de máquinas para minha comunidade comercial. Você pode se referir ao seu tópico ou postagens no meu blog para vários exemplos de algoritmos de aprendizado de máquinas desenvolvidos dessa maneira.


Se você quiser saber mais sobre os nossos desenvolvimentos na aprendizagem de máquinas e como você também pode desenvolver suas próprias estratégias de aprendizagem de máquinas usando o framework F4, considere se juntar ao Asirikuy, um site cheio de vídeos educacionais, sistemas de negociação, desenvolvimento e um som, honesto e uma abordagem transparente para negociação automatizada.


5 Respostas para a "Aprendizagem de Máquinas em Forex Trading": por que muitos acadêmicos estão fazendo tudo errado e # 8221;


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


Uma pergunta que tenho, é normal dizer uma EA para fazer muito bem em um certo par e fazer terrível em todos os outros?


Ou, se uma EA robusta faça bem em pelo menos vários pares, sem qualquer alteração nas configurações!


Obrigado, por seus grandes pensamentos.


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


Agora, se você tem um sistema que funciona em vários 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 é necessário.


Mas lembre-se, mire seus preconceitos estatísticos!


Estou tão feliz que você disse que não precisa lucrar com todos os pares! Também o ajuste de curva, como se conhece o limite de ajustes permitido antes de se ajustar?


Finalmente, fiz um teste muito simples usando o padrão de média móvel em MT4, para ver quais pares reagiriam mais amplamente às MAs. Eu testei 52 pares para ver quantos & # 8216; Moving Period & # 8217; entre (1-20) obteriam lucro, independentemente da redução. 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 1-20).


1 23 pares, não obteve lucro em nenhuma configuração de barra de 1-20.


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


Apenas 3 pares, obteve lucro em 5 ou mais configurações diferentes.


Apenas 4 5 pares, obteve lucro em 10 ou mais configurações diferentes.


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


Você precisa fazer uma distinção entre viés de ajuste de curva e viés de mineração de dados (ou, pelo menos, esses dois tipos diferentes de viés, no entanto, você pode querer chamá-los). Curvar-ajuste bias é um viés criado por encontrar uma ineficiência em um conjunto de dados, ele responde a pergunta: meu sistema está encontrando algo geral ou algo específico para os dados que estou usando ?. O viés de mineração de dados responde a pergunta: o meu sistema está encontrando uma verdadeira ineficiência histórica ou são os resultados apenas por causa do meu processo de mineração (ou seja, provenientes de chance aleatória)?


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


Leia mais sobre esta distinção entre os preconceitos aqui:


Leia também este artigo sobre o assunto:


Antes de abordar as complexidades do design do sistema de negociação e encontrar estratégias de negociação, recomendo fortemente obter uma sólida formação em estatísticas (os cursos de estatística de cours são um excelente início gratuito). As estatísticas lhe darão o poder de analisar seus próprios resultados e abordar metodicamente tais questões: o)


[& # 8230;] Aprendizagem de máquinas no comércio de Forex: por que muitos acadêmicos estão fazendo tudo errado [Forex mecânico] Construir estratégias de aprendizagem de máquinas que podem obter resultados decentes em condições de mercado ao vivo sempre foi um desafio importante na negociação algorítmica. Apesar da grande quantidade de interesse e das incríveis recompensas em potencial, ainda não há publicações acadêmicas que possam mostrar bons modelos de aprendizagem de máquinas que possam solucionar com sucesso o problema comercial no real m [& # 8230;]


Melhores estratégias 4: Aprendizado de máquinas.


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, o AlphaGo, pudesse derrotar o melhor jogador Go humano. Deep Blue era um sistema baseado em modelo com regras de xadrez hardwired. O AlphaGo é um sistema de mineração de dados, uma rede neural profunda treinada com milhares de jogos Go. Hardware não melhorado, mas um avanço no software foi essencial para o passo de vencer os melhores jogadores de xadrez para vencer os melhores jogadores Go.


Nesta 4ª parte da mini-série, analisaremos a abordagem de mineração de dados para o desenvolvimento de estratégias comerciais. 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. Aprendizagem de máquina ou "Inteligência Artificial" e # 8221; nem sempre está envolvido em estratégias de mineração de dados. Na verdade, o mais popular & # 8211; e surpreendentemente lucrativo & # 8211; O método de mineração de dados funciona sem redes neurais sofisticadas ou máquinas de vetor de suporte.


Princípios de aprendizado da máquina.


Um algoritmo de aprendizagem é alimentado com amostras de dados, normalmente derivadas de algum modo de preços históricos. Cada amostra consiste em n variáveis ​​x 1 .. x n, comumente designadas preditores, recursos, sinais ou simplesmente entrada. Esses preditores podem ser os retornos de preços das últimas barras n, ou uma coleção de indicadores clássicos, ou qualquer outra função imaginável da curva de preços (I & # 8217; até mesmo visto os pixels de uma imagem de gráfico de preços usada como preditor para uma neural rede!). Cada amostra também inclui normalmente uma variável alvo y, como o retorno do próximo comércio depois de tirar a amostra, ou o próximo movimento de preços. Na literatura, você pode encontrar também o nome do rótulo ou objetivo. Em um processo de treinamento, o algoritmo aprende a prever o alvo y a partir dos preditores x 1 .. x n. A memória aprendida & # 8216; & # 8217; é armazenado em uma estrutura de dados chamada modelo que é específico para o algoritmo (não deve ser confundido com um modelo financeiro para estratégias baseadas em modelos!). Um modelo de aprendizagem de máquina pode ser uma função com regras de predição no código C, gerado pelo processo de treinamento. Ou pode ser um conjunto de pesos de conexão de uma rede neural.


Os preditores, características, ou o que quer que você os chama, devem conter informações suficientes para prever o alvo e com alguma precisão. Eles também cumprem com freqüência dois requisitos formais. Primeiro, todos os valores de preditores 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, ou seja, distribuídas igualmente em todos os valores da variável alvo. Então, deve haver quase tantos como ganhar amostras. Se você não observar estes dois requisitos, você se perguntará por que você está obtendo resultados ruins do algoritmo de aprendizado da máquina.


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


Alguns algoritmos aprendem a dividir amostras em classes sem necessidade de qualquer alvo y. A aprendizagem sem supervisão desse tipo, em oposição à aprendizagem supervisionada usando um alvo. Somewhere inbetween é o aprendizado de reforço, onde o sistema se treina executando simulações com os recursos fornecidos e usando o resultado como alvo de treinamento. AlphaZero, o sucessor do AlphaGo, usou a aprendizagem de reforço ao jogar milhões de jogos Go contra si. Em finanças, há poucas aplicações para aprendizagem sem supervisão ou reforço. 99% das estratégias de aprendizagem de máquinas usam a aprendizagem supervisionada.


Independentemente dos sinais que usamos para preditores em finanças, eles provavelmente contêm muito ruído e pouca informação, e não serão estacionários além disso. Portanto, a previsão financeira é uma das tarefas mais difíceis na aprendizagem por máquinas. Algoritmos mais complexos não conseguem necessariamente melhores resultados. A seleção dos preditores é fundamental para o sucesso. Não é bom usar muitos preditores, uma vez que isso simplesmente causa superação e falha na operação da amostra. Portanto, as estratégias de mineração de dados geralmente aplicam um algoritmo de pré-eleição que determina um pequeno número de preditores de um grupo de muitos. A pré-seleção pode basear-se na correlação entre preditores, na significância, 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 sobre o blog Robot Wealth.


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


1. Sopa indicadora.


A maioria dos sistemas de negociação que nós estamos programando para clientes não são baseados em um modelo financeiro. O cliente só queria sinais comerciais de certos indicadores técnicos, filtrado com outros indicadores técnicos em combinação com indicadores mais técnicos. Quando perguntado como essa mistura de indicadores poderia ser uma estratégia rentável, ele normalmente respondeu: "Confie em mim". Eu negocie-o manualmente e funciona. & # 8221;


Certamente. Pelo menos às vezes. Embora a maioria desses sistemas não tenha passado um teste WFA (e alguns nem mesmo um backtest simples), um número surpreendentemente grande. E esses também foram geralmente lucrativos no comércio real. O cliente havia experimentado sistematicamente indicadores técnicos até encontrar uma combinação que funcionasse em negociação ao vivo com certos ativos. Esta maneira de análise técnica de teste e erro é uma abordagem clássica de mineração de dados, apenas executada por um ser humano e não por uma máquina. Eu realmente não posso recomendar este método # 8211; e muita sorte, para não falar de dinheiro, provavelmente está envolvido & # 8211; mas posso testemunhar que às vezes leva a sistemas lucrativos.


2. Padrões de velas.


Não deve ser confundido com os padrões japoneses de velas que tiveram a melhor data antes, há muito tempo. O equivalente moderno é a negociação de ações de preço. Você ainda está olhando o aberto, alto, baixo e fechado de velas. Você ainda espera encontrar um padrão que preveja uma direção de preço. Mas você agora está curando curvas de preços contemporâneas para coleta desses padrões. Existem pacotes de software para esse fim. Eles procuram padrões que são lucrativos por algum critério definido pelo usuário, e usá-los para criar uma função de detecção de padrões específica. Poderia parecer este (do analisador de padrão Zorro & # 8217; s):


Esta função C retorna 1 quando os sinais correspondem a um dos padrões, caso contrário, você pode ver do longo código que esta 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, é classificar os sinais por sua magnitude e verificar a ordem de classificação. Um exemplo desse sistema pode ser encontrado aqui.


O preço das ações de ações pode realmente funcionar? Assim como a sopa de indicadores, ela não é baseada em nenhum modelo financeiro racional. Pode-se, na melhor das hipóteses, imaginar que as seqüências de movimentos de preços levem os participantes do mercado a reagirem de uma certa maneira, estabelecendo assim um padrão preditivo temporário. No entanto, o número de padrões é bastante limitado quando você olha apenas as seqüê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. Desta forma, você está obtendo um número quase ilimitado de padrões & # 8211; mas à custa de deixar finalmente o reino do racional. É difícil imaginar como um movimento de preços pode ser previsto por alguns padrões de velas de semanas atrás.


Ainda assim, há muito esforço para isso. Um colega de blogueiro, Daniel Fernandez, administra um site de inscrição (Asirikuy) especializado em padrões de vela de dados minerados. Ele refinou o padrão de negociação até os menores detalhes, e se alguém conseguisse algum lucro desta forma, seria ele. Mas para seus assinantes & # 8217; desapontamento, trocando seus padrões ao vivo (QuriQuant) produziu resultados muito diferentes do que seus maravilhosos backtests. Se os sistemas de ação de preço rentáveis ​​realmente existem, aparentemente ninguém já os encontrou.


3. Regressão linear.


A base simples de muitos algoritmos complexos de aprendizagem de máquina: Prever a variável alvo 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 de diferenças quadradas entre os valores verdadeiros de y das amostras de treino e seus i preditos a partir da fórmula acima:


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


que é uma regressão linear simples, em oposição à regressão linear multivariada onde n & gt; 1. A 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, muitas vezes usado como alternativa para uma média móvel. A regressão linear multivariada está disponível na plataforma R através da função lm (...) que vem com a instalação padrão. Uma variante é a regressão polinomial. Como regressão simples, ele usa apenas uma variável preditor x, mas também seus graus quadrados e superiores, 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 a partir dos preços suavizados das últimas barras. A função polyfit de MatLab, R, Zorro e muitas outras plataformas podem ser usadas para regressão polinomial.


4. Perceptron.


Muitas vezes referido como uma rede neural com apenas um neurônio. Na verdade, um perceptron é uma função de regressão como acima, mas com um resultado binário, assim chamado de regressão logística. Não é regressão, é um algoritmo de classificação. A função de recomendação do Zorro (PERCEPTRON, & # 8230;) gera 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 sig é equivalente às características 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 nessa categoria & # 8211; um exemplo famoso é prever a saída de uma função XOR simples. E provavelmente também previsão de preços ou retornos comerciais. Uma rede neural artificial (ANN) pode enfrentar problemas não-lineares. É um monte de perceptrons que estão conectados em uma série 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, como esta:


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 exige agora um processo de aproximação, normalmente com backpropagating o erro da saída para as entradas, otimizando os pesos a caminho. Este processo impõe duas restrições. Primeiro, as saídas do neurônio devem agora ser continuamente funções diferenciáveis ​​em vez do limiar de perceptron simples. Em segundo lugar, a rede não deve ser muito profunda e # 8211; não deve ter muitas camadas escondidas & # 8217; de neurônios entre entradas e saída. Esta segunda restrição limita a complexidade dos problemas que uma rede neural padrão pode resolver.


Ao usar uma rede neural para previsão de negociações, você tem muitos parâmetros com os quais você pode brincar e, se você não for cuidadoso, produza muitos tipos de seleção:


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


A função de ativação emula o limite de perceptron. Para o backpropagation você precisa de uma função continuamente diferenciável que gere um & # 8216; soft & # 8217; passo com um certo valor x. Normalmente, é utilizada uma função sigmoide, tanh ou softmax. À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 R padrão (nnet, uma única rede de camada oculta) e em muitos pacotes, por exemplo RSNNS e FCNN4R.


6. Aprendizagem profunda.


Métodos de aprendizado profundo usam redes neurais com muitas camadas ocultas e milhares de neurônios, que não podem ser treinados de forma efetiva por backpropagation convencional. Vários métodos tornaram-se populares nos últimos anos para treinar tais redes enormes. Eles costumam pré-treinar as camadas do neurônio escondido para alcançar um processo de aprendizagem mais eficaz. Uma Máquina Boltzmann Restrita (RBM) é um algoritmo de classificação não supervisionado com uma estrutura de rede especial que não possui conexões entre os neurônios ocultos. Um auto-codificador esparso (SAE) usa uma estrutura de rede convencional, mas pré-treina as camadas ocultas de forma inteligente, reproduzindo os sinais de entrada nas saídas da camada com o menor número possível de conexões ativas. Esses métodos permitem redes muito complexas para lidar com tarefas de aprendizagem muito complexas. Como bater o melhor jogador humano do mundo.


As redes de aprendizagem profunda estão disponíveis nos pacotes Deepnet e Darch R. Deepnet fornece um autoencoder, Darch uma máquina Boltzmann restrito. Eu ainda não experimentei com o Darch, mas aqui é um exemplo de script R usando o autoencoder Deepnet com 3 camadas ocultas para sinais comerciais através da função neural () do Zorro & # 8217;


7. Suporte máquinas vetoriais.


Como uma rede neural, uma máquina de vetor 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 recursos n-dimensional. Definir a variável de destino y para um valor fixo determina um plano nesse espaço, chamado de hiperplane, pois possui mais de duas dimensões (na verdade, n-1). O hiperplane separa as amostras com y & gt; o das amostras com y & lt; 0. Os coeficientes a n podem ser calculados de forma a que as distâncias do plano para as amostras mais próximas # 8211; que são chamados de & # 8216; vetores de suporte & # 8217; do plano, daí o nome do algoritmo & # 8211; é o máximo. Desta forma, temos um classificador binário com a separação ideal de amostras vencedoras e perdidas.


O problema: normalmente, essas amostras não são linearmente separáveis ​​e # 8211; Eles estão espalhados irregularmente no espaço de recursos. Nenhum avião plano pode ser espremido entre vencedores e perdedores. Se pudesse, tínhamos métodos mais simples para calcular esse avião, f. i. análise discriminante linear. Mas, no caso comum, precisamos do truque SVM: adicionando mais dimensões ao espaço de recursos. Para isso, o algoritmo SVM produz mais recursos com uma função kernel que combina dois preditores existentes para um novo recurso. Isso é análogo ao passo acima, desde a regressão simples até a regressão polinomial, onde também são adicionados mais recursos, levando o único preditor ao n-ésimo poder. Quanto mais dimensões você adiciona, mais fácil é separar as amostras com um hiperplano plano. Este plano é então transformado de volta para o espaço n-dimensional original, ficando enrugado e amassado no caminho. Através da seleção inteligente da função kernel, o processo pode ser executado sem realmente calcular a transformação.


À semelhança das redes neurais, os SVMs podem ser utilizados não apenas para classificação, mas também para regressão. Eles também oferecem alguns parâmetros para otimizar e possivelmente superar o processo de previsão:


Função 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. Gamma, a largura do kernel RBF Custo parâmetro C, & # 8216; penalidade & # 8217; para classificações erradas nas amostras de treino.


Um SVM usado frequentemente é a biblioteca libsvm. Ele também está disponível em R no pacote e1071. Na próxima e última parte desta série, planejo descrever uma estratégia comercial usando este SVM.


8. K-vizinho mais próximo.


Comparado com as coisas pesadas de ANN e SVM, esse é um bom algoritmo simples com uma propriedade única: não precisa de treinamento. Então as amostras são o modelo. Você poderia usar esse algoritmo para um sistema comercial que aprenda permanentemente simplesmente adicionando mais e mais amostras. O algoritmo vizinho mais próximo calcula as distâncias no espaço de recursos dos valores de recurso atuais para as amostras mais próximas do k. 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 prediz o alvo da média das k variáveis ​​alvo das amostras mais próximas, ponderadas por suas distâncias inversas. Pode ser usado para classificação, bem como para regressão. Os truques de software emprestados a partir de gráficos de computador, como uma árvore binária adaptativa (ABT), podem fazer com que o vizinho mais próximo busque muito rápido. Na minha vida passada como programador de jogos de computador, usamos esses métodos em jogos para tarefas como inteligência inimiga de auto-aprendizagem. Você pode chamar a função knn em R para a previsão do vizinho mais próximo e # 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 com o nome, com o vizinho mais próximo. Para classificar as amostras, o algoritmo primeiro coloca k pontos aleatórios no espaço de recursos. Em seguida, 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, uma vez que algumas amostras estão agora mais próximas de outro ponto. O processo é repetido até a atribuição não mudar mais movendo os pontos, isto é, cada ponto está exatamente na média das amostras mais próximas. Agora temos k classes de amostras, cada uma na vizinhança de um dos pontos k.


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


10. Naive Bayes.


Este algoritmo usa Bayes & # 8217; Teorema para classificar amostras de características não numéricas (isto é, eventos), como os padrões de vela acima mencionados. Suponha que um evento X (por exemplo, que o Open da barra anterior esteja abaixo do Open da barra atual) aparece em 80% de todas as amostras vencedoras. Qual é então a probabilidade de uma amostra estar ganhando quando contém evento X? Não é 0.8 como você pensa. A probabilidade pode ser calculada com Bayes & # 8217; Teorema:


P (Y | X) é a probabilidade de que o evento Y (f. i. winning) ocorra em todas as amostras contendo evento X (no nosso exemplo, Abrir (1) & lt; Abrir (0)). De acordo com a fórmula, é igual à probabilidade de X ocorrer em todas as amostras vencedoras (aqui, 0,8), multiplicado pela probabilidade de Y em todas as amostras (cerca de 0,5 quando você seguiu meu conselho acima de amostras equilibradas) 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 um do outro, podemos calcular a probabilidade geral de que uma amostra ganhe simplesmente multiplicando as probabilidades P (X | winning) para cada evento X. Desta forma, acabamos com esta fórmula:


com um fator de escala s. Para que a fórmula funcione, os recursos devem ser selecionados de forma que sejam o mais independentes possível, o que impõe um obstáculo ao uso de Naive Bayes na negociação. Por exemplo, os dois eventos fecham (1) & lt; Fechar (0) e Abrir (1) & lt; Open (0) provavelmente não são independentes 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 omnipresente pacote e1071 R.


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 características não numerais) ou uma comparação de um valor de recurso com um limite fixo. Uma função de árvore típica, gerada pelo construtor de árvores do Zorro & # 8217; parece assim:


Como uma tal árvore é produzida a partir de um conjunto de amostras? Existem vários métodos; Zorro usa a entropia Shannon i nformation, que já teve uma aparição neste blog no artigo Scalping. No começo, verifica um dos recursos, digamos x 1. Coloca um hiperplano com a fórmula plana x 1 = t no espaço da característica. Este hiperplato separa as amostras com x 1 & gt; t das amostras com x 1 & lt; t. O limite de divisão t é selecionado de modo que o ganho de informação & # 8211; a diferença de entropia de informação de todo o espaço, a soma das entropias de informação dos dois sub-espaços divididos e # 8211; é o máximo. Este é o caso quando as amostras nos subespaços são mais parecidas entre si 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 fraccionamento repetido, logo obteremos uma enorme árvore com milhares de comparações de limiar. Em seguida, o processo é executado para trás pela poda da árvore e remoção de todas as decisões que não levam a um aumento substancial de informações. Finalmente, acabamos com uma árvore relativamente pequena como no código acima.


As árvores de decisão possuem uma ampla gama de aplicações. Eles podem produzir excelentes previsões superiores às das redes neurais ou às máquinas de vetor de suporte. Mas eles 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 só 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 é C5.0, disponível no pacote C50 para R.


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


Conclusão.


Existem vários métodos diferentes de mineração de dados e aprendizagem de máquinas à sua disposição. A questão crítica: o que é melhor, uma estratégia de aprendizagem baseada em modelos ou a máquina? Não há dúvida de que o aprendizado automático da máquina tem muitas vantagens. Você não precisa se preocupar com a microestrutura do mercado, a economia, a psicologia do comerciante ou coisas suaves semelhantes. Você pode se concentrar na matemática pura. O aprendizado de máquina é uma maneira muito mais elegante e atraente de gerar sistemas de comércio. Ele tem todas as vantagens do seu lado, mas um. Apesar de todos os tópicos entusiasmados nos fóruns de comerciantes, ele tende a falhar misteriosamente na negociação ao vivo.


A cada segunda semana, um novo artigo sobre comércio com métodos de aprendizagem de máquinas é publicado (alguns podem ser encontrados abaixo). Pegue todas essas publicações com um grão de sal. De acordo com alguns papéis, as taxas de ganhos fantásticos na faixa de 70%, 80% ou mesmo 85% foram alcançadas. Embora a taxa de ganhos não seja o único critério relevante & # 8211; você pode perder mesmo com uma alta taxa de vitória e # 8211; 85% de precisão na previsão de trades é normalmente equivalente a um fator de lucro acima de 5. Com esse sistema, os cientistas envolvidos devem ser bilionários enquanto isso. Infelizmente, eu nunca consegui reproduzir as taxas de vitórias com o método descrito, e nem chegou perto. Então, talvez um monte de viés de seleção tenha entrado nos resultados. Ou talvez eu seja muito estúpido.


Em comparação com as estratégias baseadas em modelos, eu não vi muitos sistemas de aprendizado de máquina bem sucedidos até agora. E do que se ouve sobre os métodos algorítmicos por hedge funds bem-sucedidos, a aprendizagem por máquinas parece ainda raramente ser usada. Mas talvez isso mude no futuro com a disponibilidade de mais poder de processamento e a próxima de novos algoritmos para aprendizagem profunda.


Classificação usando redes neurais profundas: Dixon. et. al.2016 Previsão de direção de preço usando ANN & amp; SVM: Kara. et. al.2011 Comparação empírica dos algoritmos de aprendizagem: Caruana. et. al.2006 Tendência do mercado de ações da mineração com 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áquinas.


30 pensamentos sobre & ldquo; Better Strategies 4: Machine Learning & rdquo;


Bela postagem. Existe uma grande quantidade de 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 cor?


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


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


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


Conforme o último parágrafo. Eu tentei muitas técnicas de aprendizado de máquina depois de ler vários & # 8216; peer reviewed & # 8217; papéis. Mas reproduzir seus resultados permanece indescritível. Quando eu vivo teste com ML, eu não posso parecer melhorar a entrada aleatória.


ML falha ao vivo? Talvez o treinamento do ML tenha que ser feito com dados de preços que incluam também o spread histórico, 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 por seleção tendenciosa de entradas e parâmetros para o algo.


Obrigado ao autor pela grande série de artigos.


No entanto, deve-se notar que não precisamos restringir nossa visão ao prever apenas o próximo movimento de preços. Pode acontecer que o próximo movimento vá contra o nosso comércio em 70% dos casos, mas ainda vale a pena fazer um comércio. Isso acontece quando o preço finalmente vai para a direção certa, mas antes disso pode fazer alguns passos contra nós. Se atrasarmos o comércio por um passo de preço, não entraremos nos 30% mencionados das negociações, mas para isso aumentamos o resultado do passo de preço de 70% por um preço. Portanto, o critério é qual o valor mais alto: N * average_result ou 0.7 * N * (avergae_result + price_step).


Bela postagem. Se você quiser apenas brincar com alguma aprendizagem de máquinas, implementei uma ferramenta ML muito simples em python e adicionei uma GUI. É implementado para prever séries temporais.


Obrigado JCL Achei muito interessante o seu artigo. Gostaria de perguntar-lhe, a partir da sua experiência em negociação, onde podemos transferir dados históricos confiáveis ​​de forex? Eu considero isso muito importante devido ao fato de o mercado Forex estar descentralizado.


Desde já, obrigado!


Não há dados de Forex realmente confiáveis, uma vez que todo corretor de Forex cria seus próprios dados. Todos eles diferem ligeiramente dependentes de quais provedores de liquidez eles usam. FXCM tem relativamente bom M1 e marca dados com poucas lacunas. Você pode baixá-lo com o Zorro.


Obrigado por escrever uma série tão grande de artigos JCL & # 8230; uma leitura completamente agradável!


Tenho que dizer, porém, que não considero as estratégias de aprendizado de máquinas baseadas em modelo e mutuamente exclusivas; Eu tive algum sucesso de 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 aprendizagem de máquinas on-line para prever os próximos termos das várias séries temporais diferentes (e não o próprio preço) que são usadas dentro do modelo. As regras de negociação reais são então derivadas das interações entre essas séries temporais. Então, na essência, não estou apenas atirando cegamente os dados de mercado recentes em um modelo de ML em um esforço para prever a direção de ação de preço, mas sim desenvolver uma estrutura baseada em princípios de investimento sólidos para apontar os modelos na direção certa. Então, os dados minam os parâmetros e medem o nível de viés de mineração de dados como você também descreveu.


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


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


Obrigado por publicar esta ótima série mini JCL.


Recentemente, estudei alguns últimos artigos sobre ML trading, profundamente aprendendo especialmente. No entanto, descobri que a maioria deles avaliou os resultados sem índice ajustado ao risco, ou seja, eles costumavam usar a curva ROC, PNL para suportar sua experiência, em vez de Sharpe Ratio, por exemplo.


Além disso, raramente mencionaram a frequência comercial nos resultados da experiência, tornando difícil avaliar a rentabilidade potencial desses métodos. Por que é que? Você tem boas sugestões para lidar com essas questões?


Os papéis ML normalmente visam uma alta precisão. A variação da curva de capital não é de interesse. Isso é justificado porque a qualidade de predição ML determina a precisão, e não a variação.


Claro, se você quer realmente negociar esse sistema, a variação e a retirada 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.


& # 8220; De fato, o método de mineração de dados mais popular e surpreendentemente lucrativo funciona sem redes neurais sofisticadas ou máquinas de vetor de suporte. & # 8221;


Você gostaria de nomear aqueles mais populares? surpreendentemente lucrativos. Então eu poderia usá-los diretamente.


Eu estava me referindo às estratégias de sopa de indicadores. Por razões óbvias, não posso divulgar detalhes de tal estratégia e nunca desenvolvi esses sistemas. Nós simplesmente codificamos. Mas eu posso dizer que chegar com uma sopa Indicadora rentável requer muito trabalho e tempo.


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


Jonathan. orregogmail 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?


Há problemas a seguir com ML e com sistemas de negociação em geral baseados na análise de dados históricos:


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


O movimento futuro dos preços é independente e não está relacionado com o histórico de preços. Não há absolutamente nenhum padrão confiável que possa ser usado para extrair os lucros do mercado de maneira sistemática. Aplicar métodos ML neste domínio é simplesmente inútil e condenado ao fracasso e não vai funcionar se você procurar um sistema lucrativo. Claro que você pode ajustar a curva em qualquer período passado e criar um sistema lucrativo para isso.


The only thing which determines price movement is demand and supply and these are often the result of external factors which cannot be predicted. For example: a war breaks out somewhere or other major disaster strikes or someone just needs to buy a large amount of a foreign currency for some business/investment purpose. These sort of events will cause significant shifts in the demand supply structure of the FX market . As a consequence, prices begin to move but nobody really cares about price history just about the execution of the incoming orders. An automated trading system can only be profitable if it monitors a significant portion of the market and takes the supply and demand into account for making a trading decision. But this is not the case with any of the systems being discussed here.


2) Race to the bottom.


Even if (1) wouldn’t be true and there would be valuable information encoded in historical price data, you would still face following problem: there are thousands of gold diggers out there, all of them using similar methods and even the same tools to search for profitable systems and analyze the same historical price data. As a result, many of them will discover the same or very similar “profitable” trading systems and when they begin actually trading those systems, they will become less and less profitable due to the nature of the market.


The only sure winners in this scenario will be the technology and tool vendors.


I will be still keeping an eye on your posts as I like your approach and the scientific vigor you apply. Your blog is the best of its kind – keep the good work!


One hint: there are profitable automated systems, but they are not based on historical price data but on proprietary knowledge about the market structure and operations of the major institutions which control these markets. Let’s say there are many inefficiencies in the current system but you absolutely have no chance to find the information about those by analyzing historical price data. Instead you have to know when and how the institutions will execute market moving orders and front run them.


Thanks for the extensive comment. I often hear these arguments and they sound indeed intuitive, only problem is that they are easily proven wrong. The scientific way is experiment, not intuition. Simple tests show that past and future prices are often correlated – otherwise every second experiment on this blog had a very different outcome. Many successful funds, for instance Jim Simon’s Renaissance fund, are mainly based on algorithmic prediction.


One more thing: in my comment I have been implicitly referring to the buy side (hedge funds, traders etc) not to the sell side (market makers, banks). The second one has always the edge because they sell at the ask and buy at the bid, pocketing the spread as an additional profit to any strategy they might be running. Regarding Jim Simon’s Renaissance: I am not so sure if they have not transitioned over the time to the sell side in order to stay profitable. There is absolutely no information available about the nature of their business besides the vague statement that they are using solely quantitative algorithmic trading models…


Thanks for the informative post!


Regarding the use of some of these algorithms, a common complaint which is cited is that financial data is non-stationary…Do you find this to be a problem? Couldn’t one just use returns data instead which is (I think) stationary?


Yes, this is a problem for sure. If financial data were stationary, we’d all be rich. I’m afraid we have to live with what it is. Returns are not any more stationary than other financial data.


Hello sir, I developed some set of rules for my trading which identifies supply demand zones than volume and all other criteria. Can you help me to make it into automated system ?? If i am gonna do that myself then it can take too much time. Please contact me at svadukiagmail if you are interested.


Sure, please contact my employer at infoopgroup. de. They’ll help.


I have noticed you don’t monetize your page, don’t waste your traffic,


Você pode ganhar bucks extra todos os meses porque você tem conteúdo de alta qualidade.


If you want to know how to make extra $$$, search for: Mrdalekjd methods for $$$


Technical analysis has always been rejected and looked down upon by quants, academics, or anyone who has been trained by traditional finance theories. I have worked for proprietary trading desk of a first tier bank for a good part of my career, and surrounded by those ivy-league elites with background in finance, math, or financial engineering. I must admit none of those guys knew how to trade directions. They were good at market making, product structures, index arb, but almost none can making money trading directions. Por quê? Because none of these guys believed in technical analysis. Then again, if you are already making your millions why bother taking the risk of trading direction with your own money. For me luckily my years of training in technical analysis allowed me to really retire after laying off from the great recession. I look only at EMA, slow stochastics, and MACD; and I have made money every year since started in 2009. Technical analysis works, you just have to know how to use it!!


Aprendizado de máquinas para negociação.


Oferecido no Georgia Tech como CS 7646.


Programa Nanodegree.


Inteligência artificial.


Aprenda a construir o impossível.


Acelere sua carreira com a credencial que o acompanha rapidamente ao sucesso do trabalho.


Sobre este curso.


Este curso apresenta os alunos aos desafios do mundo real de implementar estratégias de negociação baseadas em aprendizado de máquinas, incluindo os passos algorítmicos da coleta de informações para pedidos de mercado. O foco é sobre como aplicar abordagens de aprendizado de máquina probabilística para decisões de negociação. Consideramos abordagens estatísticas como regressão linear, KNN e árvores de regressão e como aplicá-las a situações reais de negociação de ações.


Custo do curso.


Aprox. 4 meses.


Nível de habilidade.


Incluído no curso.


Rich Learning Content.


Ensinado por profissionais da indústria.


Comunidade de apoio ao aluno.


Junte-se ao caminho da grandeza.


Este curso gratuito é o seu primeiro passo para uma nova carreira com o Programa Nanodegree de Inteligência Artificial.


Curso gratuito.


Aprendizado de máquinas para negociação.


Melhore o seu conjunto de habilidades e aumente a sua hirabilidade através de uma aprendizagem inovadora e independente.


Programa Nanodegree.


Inteligência artificial.


Acelere sua carreira com a credencial que o acompanha rapidamente ao sucesso do trabalho.


Leads do curso.


Tucker Balch.


Arpan Chakraborty.


O que você aprenderá.


Este curso é composto por três mini-cursos:


Mini-curso 1: manipulação de dados financeiros no Python Mini-curso 2: Investimento computacional Mini-curso 3: Algoritmos de Aprendizado de Máquinas para Negociação.


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


Estudantes da OMS em queda de 2015: haverá dois testes - um meio de meio após mini-curso 2 e um exame final.


Pré-requisitos e requisitos.


Os estudantes devem ter fortes habilidades de codificação e alguma familiaridade com os mercados de ações. Nenhuma experiência financeira ou de aprendizado de máquina é assumida.


Observe que este curso atende estudantes que se concentram em ciência da computação, bem como estudantes de outras especialidades, como engenharia de sistemas industriais, gerenciamento ou matemática que tenham experiências diferentes. Todos os tipos de alunos são bem-vindos!


Os tópicos ML podem ser "revisar" para estudantes de CS, enquanto peças de finanças serão revisadas para estudantes de finanças. No entanto, mesmo se você tiver experiência nesses tópicos, você achará que os consideramos de uma maneira diferente da que você já viu antes, em particular com o objetivo de implementar para negociação.


A programação será principalmente em Python. Utilizaremos inúmeras bibliotecas numéricas como NumPy e Pandas.


Por que tomar este curso.


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


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


Algumas limitações / restrições:


Usamos dados diários. Este não é um curso HFT, mas muitos dos conceitos aqui são relevantes. Nós não interagimos (negociamos) diretamente com o mercado, mas vamos gerar alocações de capital que você poderia negociar se quisesse.


O que eu ganho?


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


Cursos relacionados.


Aprendizado de máquinas: Aprendizagem não supervisionada.


Informática de saúde na nuvem.


Big Data Analytics em Saúde.


AI baseada no conhecimento: sistemas cognitivos.


Tecnologia Educacional.


Time Series Forecasting.


Cursos populares.


Artificial Intelligence - Search and Optimization.


Passwordless Login Solutions for iOS.


Programas em destaque.


Somente na Udacidade.


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.


Better Strategies 5: A Short-Term Machine Learning System.


It’s time for the 5th and final part of the Build Better Strategies series. In part 3 we’ve discussed the development process of a model-based system, and consequently we’ll conclude the series with developing a data-mining system. The principles of data mining and machine learning have been the topic of part 4. For our short-term trading example we’ll use a deep learning algorithm , a stacked autoencoder, but it will work in the same way with many other machine learning algorithms. With today’s software tools, only about 20 lines of code are needed for a machine learning strategy. I’ll try to explain all steps in detail.


Our example will be a research project – a machine learning experiment for answering two questions. Does a more complex algorithm – such as, more neurons and deeper learning – produce a better prediction? And are short-term price moves predictable by short-term price history? The last question came up due to my scepticism about price action trading in the previous part of this series. I got several emails asking about the “trading system generators” or similar price action tools that are praised on some websites. There is no hard evidence that such tools ever produced any profit (except for their vendors) – but does this mean that they all are garbage? Nós veremos.


Our experiment is simple: We collect information from the last candles of a price curve, feed it in a deep learning neural net, and use it to predict the next candles. My hypothesis is that a few candles don’t contain any useful predictive information. Of course, a nonpredictive outcome of the experiment won’t mean that I’m right, since I could have used wrong parameters or prepared the data badly. But a predictive outcome would be a hint that I’m wrong and price action trading can indeed be profitable.


Machine learning strategy development.


Step 1: The target variable.


To recap the previous part: a supervised learning algorithm is trained with a set of features in order to predict a target variable . So the first thing to determine is what this target variable shall be. A popular target, used in most papers, is the sign of the price return at the next bar. Better suited for prediction, since less susceptible to randomness, is the price difference to a more distant prediction horizon , like 3 bars from now, or same day next week. Like almost anything in trading systems, the prediction horizon is a compromise between the effects of randomness (less bars are worse) and predictability (less bars are better).


Sometimes you’re not interested in directly predicting price, but in predicting some other parameter – such as the current leg of a Zigzag indicator – that could otherwise only be determined in hindsight. Or you want to know if a certain market inefficiency will be present in the next time, especially when you’re using machine learning not directly for trading, but for filtering trades in a model-based system. Or you want to predict something entirely different, for instance the probability of a market crash tomorrow. All this is often easier to predict than the popular tomorrow’s return.


In our price action experiment we’ll use the return of a short-term price action trade as target variable. Once the target is determined, next step is selecting the features.


Step 2: The features.


A price curve is the worst case for any machine learning algorithm. Not only does it carry little signal and mostly noise , it is also nonstationary and the signal/noise ratio changes all the time. The exact ratio of signal and noise depends on what is meant with “signal”, but it is normally too low for any known machine learning algorithm to produce anything useful. So we must derive features from the price curve that contain more signal and less noise. Signal, in that context, is any information that can be used to predict the target, whatever it is. All the rest is noise.


Thus, selecting the features is critical for success – much more critical than deciding which machine learning algorithm you’re going to use. There are two approaches for selecting features. The first and most common is extracting as much information from the price curve as possible. Since you do not know where the information is hidden, you just generate a wild collection of indicators with a wide range of parameters, and hope that at least a few of them will contain the information that the algorithm needs. This is the approach that you normally find in the literature. The problem of this method: Any machine learning algorithm is easily confused by nonpredictive predictors. So it won’t do to just throw 150 indicators at it. You need some preselection algorithm that determines which of them carry useful information and which can be omitted. Without reducing the features this way to maybe eight or ten, even the deepest learning algorithm won’t produce anything useful.


The other approach, normally for experiments and research, is using only limited information from the price curve. This is the case here: Since we want to examine price action trading, we only use the last few prices as inputs, and must discard all the rest of the curve. This has the advantage that we don’t need any preselection algorithm since the number of features is limited anyway. Here are the two simple predictor functions that we use in our experiment (in C):


The two functions are supposed to carry the necessary information for price action: per-bar movement and volatility. The change function is the difference of the current price to the price of n bars before, divided by the current price. The range function is the total high-low distance of the last n candles, also in divided by the current price. And the scale function centers and compresses the values to the +/-100 range, so we divide them by 100 for getting them normalized to +/-1 . We remember that normalizing is needed for machine learning algorithms.


Step 3: Preselecting/preprocessing predictors.


When you have selected a large number of indicators or other signals as features for your algorithm, you must determine which of them is useful and which not. There are many methods for reducing the number of features, for instance:


Determine the correlations between the signals. Remove those with a strong correlation to other signals, since they do not contribute to the information. Compare the information content of signals directly, with algorithms like information entropy or decision trees. Determine the information content indirectly by comparing the signals with randomized signals; there are some software libraries for this, such as the R Boruta package. Use an algorithm like Principal Components Analysis (PCA) for generating a new signal set with reduced dimensionality. Use genetic optimization for determining the most important signals just by the most profitable results from the prediction process. Great for curve fitting if you want to publish impressive results in a research paper.


For our experiment we do not need to preselect or preprocess the features, but you can find useful information about this in articles (1), (2), and (3) listed at the end of the page.


Step 4: Select the machine learning algorithm.


R offers many different ML packages, and any of them offers many different algorithms with many different parameters. Even if you already decided about the method – here, deep learning – you have still the choice among different approaches and different R packages. Most are quite new, and you can find not many empirical information that helps your decision. You have to try them all and gain experience with different methods. For our experiment we’ve choosen the Deepnet package, which is probably the simplest and easiest to use deep learning library. This keeps our code short. We’re using its Stacked Autoencoder ( SAE ) algorithm for pre-training the network. Deepnet also offers a Restricted Boltzmann Machine ( RBM ) for pre-training, but I could not get good results from it. There are other and more complex deep learning packages for R, so you can spend a lot of time checking out all of them.


How pre-training works is easily explained, but why it works is a different matter. As to my knowledge, no one has yet come up with a solid mathematical proof that it works at all. Anyway, imagine a large neural net with many hidden layers:


Training the net means setting up the connection weights between the neurons. The usual method is error backpropagation. But it turns out that the more hidden layers you have, the worse it works. The backpropagated error terms get smaller and smaller from layer to layer, causing the first layers of the net to learn almost nothing. Which means that the predicted result becomes more and more dependent of the random initial state of the weights. This severely limited the complexity of layer-based neural nets and therefore the tasks that they can solve. At least until 10 years ago.


In 2006 scientists in Toronto first published the idea to pre-train the weights with an unsupervised learning algorithm, a restricted Boltzmann machine. This turned out a revolutionary concept. It boosted the development of artificial intelligence and allowed all sorts of new applications from Go-playing machines to self-driving cars. In the case of a stacked autoencoder, it works this way:


Select the hidden layer to train; begin with the first hidden layer. Connect its outputs to a temporary output layer that has the same structure as the network’s input layer. Feed the network with the training samples, but without the targets. Train it so that the first hidden layer reproduces the input signal – the features – at its outputs as exactly as possible. The rest of the network is ignored. During training, apply a ‘weight penalty term’ so that as few connection weights as possible are used for reproducing the signal. Now feed the outputs of the trained hidden layer to the inputs of the next untrained hidden layer, and repeat the training process so that the input signal is now reproduced at the outputs of the next layer. Repeat this process until all hidden layers are trained. We have now a ‘sparse network’ with very few layer connections that can reproduce the input signals. Now train the network with backpropagation for learning the target variable, using the pre-trained weights of the hidden layers as a starting point.


The hope is that the unsupervised pre-training process produces an internal noise-reduced abstraction of the input signals that can then be used for easier learning the target. And this indeed appears to work. No one really knows why, but several theories – see paper (4) below – try to explain that phenomenon.


Step 5: Generate a test data set.


We first need to produce a data set with features and targets so that we can test our prediction process and try out parameters. The features must be based on the same price data as in live trading, and for the target we must simulate a short-term trade. So it makes sense to generate the data not with R, but with our trading platform, which is anyway a lot faster. Here’s a small Zorro script for this, DeepSignals. c :


We’re generating 2 years of data with features calculated by our above defined change and range functions. Our target is the result of a trade with 3 bars life time. Trading costs are set to zero, so in this case the result is equivalent to the sign of the price difference at 3 bars in the future. The adviseLong function is described in the Zorro manual; it is a mighty function that automatically handles training and predicting and allows to use any R-based machine learning algorithm just as if it were a simple indicator.


In our code, the function uses the next trade return as target, and the price changes and ranges of the last 4 bars as features. The SIGNALS flag tells it not to train the data, but to export it to a. csv file. The BALANCED flag makes sure that we get as many positive as negative returns; this is important for most machine learning algorithms. Run the script in [Train] mode with our usual test asset EUR/USD selected. It generates a spreadsheet file named DeepSignalsEURUSD_L. csv that contains the features in the first 8 columns, and the trade return in the last column.


Step 6: Calibrate the algorithm.


Complex machine learning algorithms have many parameters to adjust. Some of them offer great opportunities to curve-fit the algorithm for publications. Still, we must calibrate parameters since the algorithm rarely works well with its default settings. For this, here’s an R script that reads the previously created data set and processes it with the deep learning algorithm ( DeepSignal. r ):


We’ve defined three functions neural. train , neural. predict , and neural. init for training, predicting, and initializing the neural net. The function names are not arbitrary, but follow the convention used by Zorro’s advise(NEURAL. ) function. It doesn’t matter now, but will matter later when we use the same R script for training and trading the deep learning strategy. A fourth function, TestOOS , is used for out-of-sample testing our setup.


The function neural. init seeds the R random generator with a fixed value (365 is my personal lucky number). Otherwise we would get a slightly different result any time, since the neural net is initialized with random weights. It also creates a global R list named “Models”. Most R variable types don’t need to be created beforehand, some do (don’t ask me why). The ‘<<-‘ operator is for accessing a global variable from within a function.


The function neural. train takes as input a model number and the data set to be trained. The model number identifies the trained model in the “ Models ” Lista. A list is not really needed for this test, but we’ll need it for more complex strategies that train more than one model. The matrix containing the features and target is passed to the function as second parameter. If the XY data is not a proper matrix, which frequently happens in R depending on how you generated it, it is converted to one. Then it is split into the features ( X ) and the target ( Y ), and finally the target is converted to 1 for a positive trade outcome and 0 for a negative outcome.


The network parameters are then set up. Some are obvious, others are free to play around with:


The network structure is given by the hidden vector: c(50,100,50) defines 3 hidden layers, the first with 50, second with 100, and third with 50 neurons. That’s the parameter that we’ll later modify for determining whether deeper is better. The activation function converts the sum of neuron input values to the neuron output; most often used are sigmoid that saturates to 0 or 1, or tanh that saturates to -1 or +1.


We use tanh here since our signals are also in the +/-1 range. The output of the network is a sigmoid function since we want a prediction in the 0..1 range. But the SAE output must be “linear” so that the Stacked Autoencoder can reproduce the analog input signals on the outputs.


The learning rate controls the step size for the gradient descent in training; a lower rate means finer steps and possibly more precise prediction, but longer training time. Momentum adds a fraction of the previous step to the current one. It prevents the gradient descent from getting stuck at a tiny local minimum or saddle point. The learning rate scale is a multiplication factor for changing the learning rate after each iteration (I am not sure for what this is good, but there may be tasks where a lower learning rate on higher epochs improves the training). An epoch is a training iteration over the entire data set. Training will stop once the number of epochs is reached. More epochs mean better prediction, but longer training. The batch size is a number of random samples – a mini batch – taken out of the data set for a single training run. Splitting the data into mini batches speeds up training since the weight gradient is then calculated from fewer samples. The higher the batch size, the better is the training, but the more time it will take. The dropout is a number of randomly selected neurons that are disabled during a mini batch. This way the net learns only with a part of its neurons. This seems a strange idea, but can effectively reduce overfitting.


All these parameters are common for neural networks. Play around with them and check their effect on the result and the training time. Properly calibrating a neural net is not trivial and might be the topic of another article. The parameters are stored in the model together with the matrix of trained connection weights. So they need not to be given again in the prediction function, neural. predict . It takes the model and a vector X of features, runs it through the layers, and returns the network output, the predicted target Y . Compared with training, prediction is pretty fast since it only needs a couple thousand multiplications. If X was a row vector, it is transposed and this way converted to a column vector, otherwise the nn. predict function won’t accept it.


Use RStudio or some similar environment for conveniently working with R. Edit the path to the. csv data in the file above, source it, install the required R packages (deepnet, e1071, and caret), then call the TestOOS function from the command line. If everything works, it should print something like that:


TestOOS reads first our data set from Zorro’s Data folder. It splits the data in 80% for training ( XY. tr ) and 20% for out-of-sample testing ( XY. ts ). The training set is trained and the result stored in the Models list at index 1. The test set is further split in features ( X ) and targets ( Y ). Y is converted to binary 0 or 1 and stored in Y. ob , our vector of observed targets. We then predict the targets from the test set, convert them again to binary 0 or 1 and store them in Y. pr . For comparing the observation with the prediction, we use the confusionMatrix function from the caret package.


A confusion matrix of a binary classifier is simply a 2×2 matrix that tells how many 0’s and how many 1’s had been predicted wrongly and correctly. A lot of metrics are derived from the matrix and printed in the lines above. The most important at the moment is the 62% prediction accuracy . This may hint that I bashed price action trading a little prematurely. 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.


72 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 \//\//\\///


Interesting! 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 11.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. & # 8230; ..


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.


I love your work. And I have got lots to learn.


Hope you don’t mind me asking another question …


Nanalyze.


In previous articles, we’ve defined some of the terms being thrown around lately like “machine learning” and “artificial intelligence“. These disruptive technologies will soon change the world as we know it. While some pundits predicted that we were years away from a computer that could beat a human expert at “Go”, this achievement was recently announced. If a “deep learning” program can now beat a game that has more possible moves than atoms in the known universe, then what’s stopping us from unleashing it upon the stock market and making millions?


The idea of using computers to trade stocks is hardly new. Algorithmic trading (also known as algo trading or black box trading which is a subset of algo trading) has been around for well over a decade and rapidly gaining in popularity. Here’s a look at algorithmic trading as a percentage of market volume:


Source: Morton Glantz, Robert Kissell. Multi-Asset Risk Modeling: Techniques for a Global Economy in an Electronic and Algorithmic Trading Era.


If that trend continues, then this means that today upwards of 90% of trading is being conducted by computer programs. One thing to notice about algorithmic trading is that it has been moving in the direction of shorter and shorter holding times. High frequency trading (HFT) is a subset of algorithmic trading in which stocks are bought and then sold in fractions of a second. This strategy is a form of arbitrage in which the HFT algorithm spots a price discrepancy and then quickly capitalizes on it. As you would expect, HFT trading profits are becoming smaller and smaller but the volume of trades are still dominating the overall market:


Now that we know about algorithmic trading and HFT, just how does machine learning or deep learning come into play? To answer this question, the important variable to take into account is duration. While HFT and algo trading perform trades of a short duration, it becomes much more difficult to “capture alpha” when you start increasing the time frame. The reality is that some of the world’s biggest hedge funds are already all over this space and have been capturing alpha across many durations for a long time now using machine learning.


Early last year, Bridgewater Associates which has $150 billion in assets under management (AUM) started a new artificial intelligence unit led by David Ferrucci who led the development of IBM’s Watson. After working at IBM for 17 years, he was poached by Bridgewater in 2012.


Another firm called Renaissance Technologies has $65 billion in AUM and is said to have “the best physics and mathematics department in the world”. The Medallion Fund at Renaissance, run mostly for employees of the company, has one of the best records in investing history having returned +35% annualized over 20 years. The two co-CEOs of Renaissance were both hired from IBM Research in 1993 where they were working on language-recognition programs.


With $32 billion under management, Two Sigma Investments is known for using AI and machine learning as a key part of their strategy. One co-founder did his PHD in artificial intelligence at MIT and the other was an International Mathematical Olympiad Silver Medalist. Being a finance professional is not a requirement to work at this firm.


While hedge funds such as these 3 are pioneers of using machine learning for stock trading strategies, there are some startups playing in this space as well. Binatix is a deep learning trading firm that came out of stealth mode in 2014 and claims to be nicely profitable having used their strategy for well over three years. Aidyia is a Hong Kong based hedge fund launched in 2015 that trades in U. S. equities and makes all stock trades using artificial intelligence with no human intervention required. Sentient, another deep learning company we discussed before, has developed an artificial intelligence trader that was successful enough that they are consider spinning it out as a prop trading company or asset management firm.


If there’s a startup that shows promise in this space, you can bet that the 3 well established hedge funds we discussed know about it. If you had a machine learning algorithm that generated alpha, would you tell the world about it? Mais provável que não. But then how would you raise the capital needed to make some serious money off of your strategy? Firms like Bridgewater can be as nimble as any startup and at the same time have $150 billion in capital to play with. It’s hard to compete if you’re a startup that’s trying to get funded. If you’re looking for investors, you have to disclose what you’re doing. Word travels fast. It’s not hard to see hedge funds like Bridgewater poaching talent from AI startups that are trying to play in this space and quickly finding out what they’re up to.


For retail investors to take advantage of machine learning for stock trading, you have a couple directions to take. For ultra high net worth retail investors, you can invest your money in one of the hedge funds using AI like Bridgewater or Renaissance. For those of us who don’t have such large amounts of capital, we can wait for deep learning companies like Sentient to go public or be acquired and then invest in those vehicles. We’ll be keeping a close eye on this space because frankly, it’s just fascinating.


Se você pagar mais de US $ 4,95 no comércio, você está pagando demais. Ally Invest é um dos corretores de taxas mais baixas ao redor, então você gasta menos dinheiro em taxas de transação e mais em ações. Com mais de 30 transações por trimestre ele cai ainda mais baixo para US $ 3,95 no comércio. Abra uma conta e comece a negociar hoje.


Published: April 14, 2016.


6 AI Cybersecurity Startups to Watch in 2018.


5 ETFs and Funds Using AI for Stock Selection.


Is Stitch Fix an Artificial Intelligence IPO?


You said: Algorithmic trading (also known as algo trading or black box trading)


Just wanted to point out that not all algo trading is black box.


Thank you for the clarification David! We noted that in the article.


there is an ETF that allows investors to access these technologies today! NYSE listed ticker symbol ‘BUZ’. Learn more at buzzindexes.


Thank you for the comment Jamie! That was a great interview you had on Squawk Box introducing the BUZ ETF.


Obrigado pelas cabeças!


Assine o Weekly Digest.


Assine o Nanalyze Weekly Digest.


Assine nosso Nanalyze Weekly Digest para receber um resumo de todos os artigos por semana.


Nós nunca usaremos seu e-mail para nada além de enviar excelentes artigos sobre investir em tecnologias disruptivas.

Комментариев нет:

Отправить комментарий