Wednesday, 16 May 2018

Aprendizado de máquina no sistema de negociação


Jesse Spaulding.


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


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


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


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


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


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


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


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


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


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


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


O design do meu algoritmo.


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


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


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


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


Previsão de movimentos de preços.


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


Criando & amp; otimização de indicadores.


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


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


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


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


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


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


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


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


Combinando indicadores para uma única previsão.


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


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


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


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


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


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


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


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


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


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


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


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


Fazendo negócios lucrativos.


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


carlosspicyweiner111 gostou disto.


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


Melhores estratégias 4: Machine Learning.


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


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


Princípios de aprendizado de máquina.


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


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


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


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


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


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


1. Sopa indicadora.


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


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


2. Padrões de vela.


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


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


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


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


3. Regressão linear


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


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


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


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


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


4. Perceptron.


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


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


5. Redes nacionais.


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


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


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


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


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


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


6. Aprendizagem profunda.


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


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


7. Máquinas de vetores de suporte.


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


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


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


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


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


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


8. K-vizinho mais próximo.


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


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


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


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


10. Naive Bayes.


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


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


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


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


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


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


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


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


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


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


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


Conclusão.


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


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


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


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


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


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


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


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


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


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


Teoricamente sim, mas para isso você tinha que configurar o realce de sintaxe do Notepad ++, e inserir todas as variáveis ​​na lista. 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 o editor Zorro faz. Não existe uma ferramenta perfeita & # 8230;


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


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


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


Obrigado ao autor pela grande série de artigos.


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


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


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


Desde já, obrigado!


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


Falando nisso, como podemos entrar em contato?


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


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


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


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


2) Corrida para o fundo.


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


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


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


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


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


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


Obrigado pelo post informativo!


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


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


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


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


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


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


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


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


Sistemas de negociação de aprendizado de máquina.


O SPDR S & P 500 ETF (SPY) é um dos produtos de ETF amplamente negociados no mercado, com cerca de US $ 200 bilhões em ativos e volume de negócios médio de pouco menos de 200 milhões de ações diariamente. Assim, a probabilidade de ser capaz de desenvolver um sistema de negociação lucrativo usando informações publicamente disponíveis pode parecer pequena. Então, para nos dar uma chance de lutar, vamos nos concentrar em uma tentativa de prever o movimento durante a noite no SPY, usando dados da sessão do dia anterior.


Além dos preços de abertura / alta / baixa e fechamento da sessão do dia anterior, selecionamos várias outras variáveis ​​plausíveis para construir o vetor de recursos que usaremos em nosso modelo de aprendizado de máquina:


O volume diário O preço de fechamento do dia anterior As médias móveis de 200 dias, 50 dias e 10 dias do preço de fechamento Os preços altos e baixos de 252 dias da série SPY.


Vamos tentar construir um modelo que prevê o retorno overnight no ETF, ou seja, [O (t + 1) - C (t)] / C (t)


Neste exercício, usamos dados diários desde o início da série SPY até o final de 2014 para construir o modelo, que será testado em dados fora da amostra em execução de janeiro de 2015 a agosto de 2016. Em um contexto de alta frequência uma quantidade considerável de tempo seria gasto na avaliação, limpeza e normalização dos dados. Aqui enfrentamos muito menos problemas desse tipo. Normalmente, padronizamos os dados de entrada para equalizar a influência de variáveis ​​que podem ser medidas em escalas de ordens de grandeza muito diferentes. Mas, neste exemplo, todas as variáveis ​​de entrada, com exceção do volume, são medidas na mesma escala e, portanto, a padronização é desnecessária.


Primeiro, os dados na amostra são carregados e usados ​​para criar um conjunto de regras de treinamento que mapeiam o vetor de recursos para a variável de interesse, o retorno noturno:


No Mathematica 10, a Wolfram introduziu um conjunto de algoritmos de aprendizado de máquina que inclui regressão, vizinho mais próximo, redes neurais e florestas aleatórias, juntamente com funcionalidade para avaliar e selecionar a melhor técnica de aprendizado de máquina. Esses recursos fazem com que seja muito fácil criar um classificador ou um modelo de previsão usando algoritmos de aprendizado de máquina, como este exemplo de reconhecimento de manuscrito:


Criamos um modelo preditivo no conjunto de treinamento SPY, permitindo que o Mathematica escolha o melhor algoritmo de aprendizado de máquina:


Há várias opções para a função Prever que podem ser usadas para controlar a seleção de recursos, o tipo de algoritmo, o tipo de desempenho e a meta, em vez de simplesmente aceitar os padrões, como fizemos aqui:


Tendo construído nosso modelo de aprendizado de máquina, carregamos os dados fora de amostra de janeiro de 2015 a agosto de 2016 e criamos um conjunto de testes:


Em seguida, criamos um objeto PredictionMeasurement, usando o modelo Nearest Neighbor, que pode ser usado para análise posterior:


Não há muita dispersão nas previsões do modelo, todas com valor positivo. Uma técnica comum nesses casos é subtrair a média de cada uma das previsões (e também podemos padronizá-las dividindo pelo desvio padrão).


O gráfico de dispersão dos retornos noturnos reais versus previstos no SPY agora se parece com isso:


Ainda há uma falta óbvia de dispersão nos valores previstos, em comparação com os retornos reais durante a noite, que poderíamos corrigir por meio de padronização. De qualquer forma, parece haver uma relação pequena e não linear entre os valores previstos e reais, o que traz alguma esperança de que o modelo possa ser útil.


Da previsão para negociação.


Existem vários métodos de implantar um modelo de previsão no contexto da criação de um sistema de negociação. A rota mais simples, que tomaremos aqui, é aplicar um limite e converter as previsões filtradas diretamente em um sinal de negociação. Mas outras abordagens são possíveis, por exemplo:


Combinando as previsões de vários modelos para criar um conjunto de previsões Usando as previsões como entradas para um modelo de programação genética Alimentando as previsões na camada de entrada de um modelo de rede neural projetado especificamente para gerar sinais de negociação, em vez de previsões.


Neste exemplo, criaremos um modelo de negociação aplicando um filtro simples às previsões, escolhendo apenas os valores que excedem um limite especificado. Este é um truque padrão usado para isolar o sinal no modelo do ruído de fundo. Aceitaremos apenas os sinais positivos que excederem o nível do limiar, criando um sistema comercial de longa duração. Ou seja, ignoramos as previsões abaixo do nível do limite. Compramos o SPY no fechamento quando a previsão excede o limite e saímos de qualquer posição longa no dia seguinte. Essa estratégia produz os seguintes resultados pro forma:


Conclusão.


O sistema tem algumas características bastante atraentes, incluindo uma taxa de ganho de mais de 66% e um CAGR de mais de 10% para o período fora da amostra.


Obviamente, esta é uma ilustração muito básica: gostaríamos de incluir comissões de negociação, e a derrapagem incorreu na entrada e saída de posições nos períodos pós e pré-mercado, o que impactará negativamente o desempenho, é claro. Por outro lado, mal começamos a riscar a superfície em termos das variáveis ​​que poderiam ser consideradas para inclusão no vetor de feição, e que podem aumentar o poder explicativo do modelo.


Em outras palavras, na realidade, isso é apenas o começo de um longo e árduo processo de pesquisa. No entanto, este exemplo simples deve ser suficiente para dar ao leitor um gostinho do que está envolvido na construção de um modelo preditivo de negociação usando algoritmos de aprendizado de máquina.


Artigos relacionados.


Time Warping dinâmico.


O cisne de Deadwood.


Negociação de Futuros Sistemáticos.


1 comentário. Deixa novo.


Sistemas de negociação de machine learning [Jonathan Kinlay] O SPDR S & amp; P 500 ETF (SPY) é um dos produtos ETF amplamente negociados no mercado, com cerca de US $ 200 bilhões em ativos e volume de negócios médio de pouco menos de 200 milhões de ações diariamente. Assim, a probabilidade de ser capaz de desenvolver um sistema de negociação lucrativo usando informações publicamente disponíveis pode parecer pequena. Então, para nos dar uma chance de lutar, vamos nos concentrar em uma tentativa de prever o [& # 8230;]


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


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


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


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


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


Etapa 1: a variável de destino.


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


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


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


Etapa 2: os recursos.


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


Etapa 5: gerar um conjunto de dados de teste.


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


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


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


Etapa 6: Calibre o algoritmo.


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


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


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


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


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


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


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


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


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


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


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


Uma matriz de confusão de um classificador binário é simplesmente uma matriz 2 que informa quantos 0 e quantos foram calculados incorreta e corretamente. Muitas métricas são derivadas da matriz e impressas nas linhas acima. O mais importante no momento é a precisão de previsão de 62%. Isso pode indicar que eu acabei com a negociação de ações de preço um pouco prematuramente. Mas é claro que os 62% podem ter sido apenas sorte. Nós veremos isso mais tarde, quando fizermos um teste WFO.


Um conselho final: Pacotes R são ocasionalmente atualizados, com a possível conseqüência de que o código R anterior funcione de forma diferente ou não funcione de maneira diferente. Isso realmente acontece, então teste cuidadosamente após qualquer atualização.


Etapa 7: a estratégia


Agora que testamos nosso algoritmo e obtivemos uma precisão de previsão acima de 50% com um conjunto de dados de teste, podemos finalmente codificar nossa estratégia de aprendizado de máquina. Na verdade, nós já codificamos a maior parte dele, apenas precisamos adicionar algumas linhas ao script Zorro acima que exportou o conjunto de dados. Este é o script final para treinamento, teste e (teoricamente) negociação do sistema (DeepLearn. c):


Estamos usando um ciclo de WFO de um ano, dividido em 90% de treinamento e 10% de período de teste fora da amostra. Você pode perguntar por que eu usei anteriormente dados de dois anos e uma divisão diferente, 80/20, para calibrar a rede na etapa 5. Isso é para usar dados compostos de forma diferente para calibrar e para testes de caminhada direta. Se usássemos exatamente os mesmos dados, a calibração poderia superá-lo e comprometer o teste.


Os parâmetros WFO selecionados significam que o sistema é treinado com dados de cerca de 225 dias, seguido por um período de teste ou comércio de 25 dias. Assim, na negociação ao vivo, o sistema reciclará a cada 25 dias, utilizando os preços dos 225 dias anteriores. Na literatura, você às vezes encontra a recomendação de reciclar um sistema de aprendizado de máquina após qualquer negociação, ou pelo menos em qualquer dia. Mas isso não faz muito sentido para mim. Quando você usou quase 1 ano de dados para treinar um sistema, obviamente ele não pode se deteriorar após um único dia. Ou, se o fizesse, e apenas produzisse resultados de testes positivos com reciclagem diária, eu suspeitaria fortemente que os resultados fossem artefatos por algum erro de codificação.


Treinar uma rede profunda leva muito tempo, no nosso caso cerca de 10 minutos para uma rede com 3 camadas ocultas e 200 neurônios. Na negociação ao vivo, isso seria feito por um segundo processo Zorro que é iniciado automaticamente pelo Zorro comercial. No backtest, o sistema treina em qualquer ciclo da WFO. Portanto, é recomendável usar vários núcleos para treinar vários ciclos em paralelo. A variável NumCores em -1 ativa todos os núcleos do processador, exceto um. Múltiplos núcleos estão disponíveis apenas no Zorro S, portanto, um teste completo de caminhada com todos os ciclos da WFO pode levar várias horas com a versão gratuita.


No script, agora treinamos tanto negócios longos quanto curtos. Para isso, temos que permitir o hedge no modo Treinamento, já que posições longas e curtas são abertas ao mesmo tempo. Inserir uma posição agora depende do valor de retorno da função advise, que, por sua vez, chama a função neural. train ou neural. predict do script R. Então, estamos aqui entrando em posições quando a rede neural prevê um resultado acima de 0,5.


O script R agora é controlado pelo script Zorro (para isso, ele deve ter o mesmo nome, DeepLearn. r, somente com extensão diferente). É idêntico ao nosso script R acima, pois estamos usando os mesmos parâmetros de rede. Apenas uma função adicional é necessária para suportar um teste WFO:


A função neural. save armazena a lista Modelos & # 8211; agora contém 2 modelos para negociações longas e curtas & # 8211; após cada treinamento executado na pasta Data do Zorro. Como os modelos são armazenados para uso posterior, não precisamos treiná-los novamente para testes repetidos.


Esta é a curva patrimonial da WFO gerada com o script acima (EUR / USD, sem custos de negociação):


Curva de capital EUR / USD com estrutura de rede 50-100-50.


Embora nem todos os ciclos da WFO obtenham um resultado positivo, parece que existe algum efeito preditivo. A curva é equivalente a um retorno anual de 89%, obtido com uma estrutura de camada oculta de 50-100-50. Verificaremos na próxima etapa como diferentes estruturas de rede afetam o resultado.


Como as funções neural. init, neural. train, neural. predict e neural. save são chamadas automaticamente pelas funções adviseLong / adviseShort do Zorro, não há funções R diretamente chamadas no script do Zorro. Assim, o script pode permanecer inalterado ao usar um método de aprendizado de máquina diferente. Apenas o script DeepLearn. r deve ser modificado e a rede neural, por exemplo, substituída por uma máquina de vetores de suporte. Para negociar esse sistema de aprendizado de máquina ao vivo em um VPS, certifique-se de que R também esteja instalado no VPS, que os pacotes R necessários estejam instalados e que o caminho para o terminal R esteja configurado no arquivo ini do Zorro. Caso contrário, você receberá uma mensagem de erro ao iniciar a estratégia.


Etapa 8: o experimento.


Se nosso objetivo estivesse desenvolvendo uma estratégia, os próximos passos seriam a verificação da realidade, o gerenciamento de risco e dinheiro e a preparação para negociação ao vivo, exatamente como descrito no desenvolvimento de estratégias baseadas em modelos. Mas para o nosso experimento, agora executamos uma série de testes, com o número de neurônios por camada aumentado de 10 para 100 em 3 etapas e 1, 2 ou 3 camadas ocultas (o deepnet não suporta mais de 3) . Então, estamos analisando as seguintes 9 estruturas de rede: 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). Para esta experiência, você precisa de uma tarde, mesmo com um PC rápido e em vários modos principais. Aqui estão os resultados (SR = relação de Sharpe, R2 = linearidade da inclinação):


Vemos que uma rede simples com apenas 10 neurônios em uma única camada oculta não funciona bem para previsão de curto prazo. A complexidade da rede melhora claramente o desempenho, mas apenas até certo ponto. Um bom resultado para o nosso sistema já é alcançado com 3 camadas x 30 neurônios. Até mesmo mais neurônios não ajudam muito e às vezes até produzem um resultado pior. Isso não é uma surpresa real, já que para processar apenas 8 entradas, 300 neurônios provavelmente não farão um trabalho melhor que 100.


Conclusão.


Nosso objetivo foi determinar se algumas velas podem ter poder preditivo e como os resultados são afetados pela complexidade do algoritmo. Os resultados parecem sugerir que os movimentos de preços a curto prazo podem ser previstos, por vezes, analisando as mudanças e intervalos das últimas 4 velas. A previsão não é muito precisa & # 8211; está na faixa de 58% a 60%, e a maioria dos sistemas da série de testes se torna não lucrativa quando os custos de negociação são incluídos. Ainda assim, tenho que reconsiderar minha opinião sobre a negociação de ações de preço. O fato de que a previsão melhora com a complexidade da rede é um argumento especialmente convincente para a previsibilidade de preços no curto prazo.


Seria interessante analisar a estabilidade a longo prazo dos padrões de preços preditivos. Para isso, tivemos que executar outra série de experimentos e modificar o período de treinamento (WFOPeriod no script acima) e a divisão de 90% IS / OOS. Isso leva mais tempo, pois precisamos usar mais dados históricos. Eu fiz alguns testes e descobri até agora que um ano parece ser de fato um bom período de treinamento. O sistema se deteriora com períodos mais longos que alguns anos. Padrões preditivos de preços, pelo menos de EUR / USD, têm vida útil limitada.


onde podemos ir a partir daqui? Existe uma infinidade de possibilidades, por exemplo:


Use insumos de mais velas e processe-os com redes muito maiores, com milhares de neurônios. Use oversampling para expandir os dados de treinamento. A previsão sempre melhora com mais amostras de treinamento. Comprimir séries temporais f. i. com análise espetacular e analisa não as velas, mas a representação de freqüência deles / delas com métodos de aprendizagem de máquina. Use entradas de muitas velas & # 8211; como, por exemplo, 100 & # 8211; e pré-processar velas adjacentes com camadas de rede convolucionais unidimensionais. Use redes recorrentes. Especialmente o LSTM poderia ser muito interessante para analisar séries temporais & # 8211; e, quanto ao meu conhecimento, eles raramente foram usados ​​para previsões financeiras até agora. Use um conjunto de redes neurais para previsão, como os oracles & # 8217; s de Aronson & # 8217; e comites & # 8221 ;.


Artigos / Artigos.


(3) V. Pererenko, Seleção de Variáveis ​​para Aprendizado de Máquina.


Eu adicionei os scripts C e R ao repositório de scripts de 2016. Você precisa dos dois na pasta Estratégia do Zorro. Zorro versão 1.474, e R versão 3.2.5 (64 bits) foi usado para o experimento, mas também deve funcionar com outras versões.


75 pensamentos sobre "Melhores Estratégias 5: Um Sistema de Aprendizagem Automática de Curto Prazo"


Eu testei sua estratégia usando dados AAPL de 30 minutos, mas & # 8220; sae. dnn. train & # 8221; retorna todos NaN em treinamento.


(Funciona apenas diminuindo os neurônios para menos de (5,10,5) & # 8230; mas a precisão é de 49%)


Você pode me ajudar a entender por quê?


Desde já, obrigado.


Se você não alterou nenhum parâmetro SAE, examine os dados. csv. É então a única diferença para o teste EUR / USD. Talvez algo esteja errado com isso.


Outro artigo fantástico, jcl. Zorro é um ambiente notável para esses experimentos. Obrigado por compartilhar seu código e sua abordagem & # 8211; Isso realmente abre um número incrível de possibilidades para qualquer pessoa disposta a investir tempo para aprender a usar o Zorro.


O problema com os dados AAPL 30min foi relacionado ao método de normalização que eu usei (X-mean / SD).


O intervalo de recursos não estava entre -1: 1 e eu suponho que o sae. dnn precise que ele funcione & # 8230;


Enfim performances não são comparáveis ​​às suas 🙂


Eu tenho uma pergunta:


Por que você usa o Zorro para criar os recursos no arquivo csv e, em seguida, abri-lo em R?


Por que não criar o arquivo com todos os recursos em R em poucas linhas e fazer o treinamento no arquivo quando você já estiver em R? em vez de entrar no Zorro e depois no R.


Quando você quer que R crie os recursos, você ainda deve transmitir os dados de preços e os alvos de Zorro para R. Então você não está ganhando muito. Criar os recursos nos resultados do Zorro geralmente em código mais curto e treinamento mais rápido. Recursos em R fazem sentido apenas quando você precisa de algum pacote R para calculá-los.


Artigo realmente útil e interessante! Eu gostaria de saber se há alguma versão em inglês do livro:


"Das Börsenhackerbuch: Finanziell unabhängig durch algorithmische Handelssysteme & # 8221;


Eu estou realmente interessado nisso,


Ainda não, mas uma versão em inglês está planejada.


Obrigado JCL! Por favor, deixe-me agora quando a versão em inglês estiver pronta, porque estou realmente interessado nela.


Funciona soberbamente (como sempre). Muito Obrigado. Uma pequena nota, se você tiver o pacote & # 8220; dlm & # 8221; carregado em R, o TestOOS falhará com erro: & # 8220; Erro no TestOOS (): não é possível alterar o valor da ligação bloqueada para o & # 8216; X '& # 8221 ;. Isso ocorre porque existe uma função X no pacote dlm, portanto, o nome é bloqueado quando o pacote é carregado. Facilmente consertado renomeando as ocorrências da variável X para outra coisa, ou temporariamente desanexando o pacote dlm com: detach (& # 8220; package: dlm & # 8221 ;, unload = TRUE)


Obrigado pela informação com o pacote dlm. Eu admito que & # 8216; X & # 8217; não é um bom nome para uma variável, mas uma função chamada & # 8216; X & # 8217; em um pacote distribuído é até um pouco pior.


Os resultados abaixo foram gerados pela versão revisada do DeepSignals. r & # 8211; A única mudança foi o uso da rede LSTM do pacote rnn no CRAN. Os autores do pacote consideram sua implementação do LSTM como "experimental" & # 8221; e não sinto que ainda esteja aprendendo adequadamente, então espero que mais melhorias venham até lá. (Passou a idade tentando realizar o elemento LSTM usando o pacote mxnet, mas desistiu como não pôde descobrir o formato de entrada correto ao usar vários recursos de treinamento.)


Irá publicar os resultados do WFO completo quando eu tiver terminado a versão LSTM do DeepLearn. r.


Matriz de Confusão e Estatística.


IC 95%: (0,5699, 0,5956)


Nenhuma taxa de informação: 0,5002.


Valor-P [Acc & gt; NIR]: & lt; 2e-16.


Teste P de Mcnemar: 0,2438.


Pos Pred Valor: 0,5844.


Valor Pred Neg .: 0.5813.


Taxa de Detecção: 0,2862.


Prevalência de Detecção: 0,4897.


Precisão balanceada: 0,5828.


Resultados do teste WFO abaixo. Mais uma vez, apenas a alteração para arquivos originais foi o uso de LSTM em R, em vez de DNN + SAE.


Teste de caminhada para frente DeepLearnLSTMV4 EUR / USD.


Conta simulada AssetsFix.


Período da barra 1 hora (média 87 min)


Período de simulação 15.05.2014-07.06.2016 (12486 barras)


Período de teste 04.05.2015-07.06.2016 (6649 barras)


Período de lookback 100 bars (4 dias)


Ciclos de teste WFO 11 x 604 bars (5 semanas)


Ciclos de treinamento 12 x 5439 barras (46 semanas)


Ciclos de Monte Carlo 200.


Deslizamento assumido 0.0 seg.


Spread 0,0 pips (rolo 0,00 / 0,00)


Contratos por lote 1000.0.


Ganho / perda bruta 3628 $ / -3235 $ (+ 5199p)


Lucro médio 360 $ / ano, 30 $ / mês, 1,38 $ / dia.


Retirada máxima -134 $ 34% (MAE -134 $ 34%)


Tempo total de inatividade de 95% (TAE 95%)


Tempo máximo de indisponibilidade de 5 semanas a partir de agosto de 2015.


Margem aberta máxima 40 $


Risco máximo aberto 35 $


Volume de negócios 5710964 $ (5212652 $ / ano)


Custos de transação 0,00 $ spr, 0,00 $ slp, 0,00 $ rol.


Capital necessário 262 $


Número de negócios 6787 (6195 / ano, 120 / semana, 25 / dia)


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%


Nível de confiança AR DDMax Capital.


Portfolio analysis OptF ProF Win/Loss Wgt% Cycles.


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


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


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


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


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


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


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


I think there is more fully described this stage.


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


You can paste your LTSM r code please ?


Could you help me answering some questions?


I have few question below:


1.I want to test Commission mode.


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


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


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


And use neural. predict function to trade?


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


I should move DeepLearn_EURUSD. ml to the trade computer?


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


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


Result button will show the message below:


Trade Trend EUR/USD.


Bar period 2 min (avg 2 min)


Trade period 02.11.2016-02.11.2016.


Spread 0.5 pips (roll -0.02/0.01)


Contracts per lot 1000.0.


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


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


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


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


So below code’s result includes Commission ?


I test the result with Commission that seems pretty good.


Annual +93% +3177p.


BarPeriod = 60; // 1 hour.


WFOPeriod = 252*24; // 1 year.


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


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


if(Train) Hedge = 2;


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


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


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


I see the logs below:


Closing prohibited – check NFA flag!


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


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


How to change the order size in paper trade?


Muito obrigado.


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


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


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


The code is below:


BarPeriod = 60; // 1 hour.


WFOPeriod = 252*24; // 1 year.


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


Spread = RollLong = RollShort = Slippage = 0;


if(Train) Hedge = 2;


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


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


Walk-Forward Test DeepLearn EUR/USD.


Simulated account AssetsIB. csv.


Bar period 1 hour (avg 86 min)


Simulation period 15.05.2014-09.09.2016 (14075 bars)


Test period 23.04.2015-09.09.2016 (8404 bars)


Lookback period 100 bars (4 days)


WFO test cycles 14 x 600 bars (5 weeks)


Training cycles 15 x 5401 bars (46 weeks)


Monte Carlo cycles 200.


Simulation mode Realistic (slippage 0.0 sec)


Spread 0.0 pips (roll 0.00/0.00)


Contracts per lot 20000.0.


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


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


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


Total down time 92% (TAE 41%)


Max down time 18 weeks from Dec 2015.


Max open margin 2483$


Max open risk 836$


Trade volume 26162350$ (18916130$/year)


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


Capital required 5239$


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


Percent winning 52.5%


Max win/loss 375$ / -535$


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


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


Avg trade bars 2 (+2 / -3)


Max trade bars 3 (3 hours)


Time in market 46%


Max open trades 3.


Max loss streak 19 (uncorrelated 10)


Annual return 23%


Profit factor 1.07 (PRR 0.99)


Sharpe ratio 0.56.


Kelly criterion 1.39.


R2 coefficient 0.000.


Ulcer index 20.8%


Nível de confiança 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.


Modo de simulação Realista (escorregamento 5,0 seg.)


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%


Nível de confiança 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? Isso faz sentido ?


Distance to what? To each other?


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


Was wondering about this point you made in Step 5:


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


But in the code, doesn’t.


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


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


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


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


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


Muito obrigado.


The code above does use WFO.


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


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


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


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


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


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


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


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


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


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


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


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


The neural training somehow only yields results with EURUSD.


Anyone tried GBPUSD or EURJPY.


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


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


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


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


Thanks for your reply jcl, much appreciated.


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


Hope you don’t mind me asking another question …


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


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


The *.ml files contain the models list.


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


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


Aprendizado de Máquina para Negociação.


Oferecido na Georgia Tech como CS 7646.


Programa de Nanodegree.


Saiba Unreal VR.


Aprenda os fundamentos da construção de aplicativos vr usando o mecanismo unreal.


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


Sobre este curso.


Este curso apresenta aos alunos os desafios do mundo real de implementar estratégias de negociação baseadas em aprendizado de máquina, incluindo as etapas algorítmicas desde a coleta de informações até as ordens do mercado. O foco está em como aplicar abordagens de aprendizado de máquina probabilísticas às decisões de negociação. Consideramos abordagens estatísticas como regressão linear, KNN e árvores de regressão e como aplicá-las às situações reais de negociação de ações.


Custo do Curso


Aprox. 4 meses.


Nível de habilidade.


Incluído no curso.


Conteúdo rico de aprendizado.


Ministrado por profissionais da indústria.


Comunidade de Suporte ao Aluno.


Junte-se ao caminho para a grandeza.


Este curso gratuito é o primeiro passo para uma nova carreira com o Programa Aprender Unreal VR Nanodegree.


Curso Livre.


Aprendizado de Máquina para Negociação.


Melhore seu conjunto de habilidades e impulsione sua contratação por meio de aprendizado inovador e independente.


Programa de Nanodegree.


Saiba Unreal VR.


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


Leads do curso.


Tucker Balch.


Arpan Chakraborty.


O que você aprenderá


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


Mini-curso 1: Manipulando dados financeiros em Python Mini-curso 2: Investimento computacional Mini-curso 3: Algoritmos de Aprendizado de Máquina para Negociação.


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


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


Pré-requisitos e requisitos.


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.


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


Os tópicos do ML podem ser & quot; revisão & quot; para alunos do CS, enquanto partes de finanças serão revisadas para estudantes de finanças. No entanto, mesmo que você tenha experiência nesses tópicos, descobrirá que os consideramos de uma maneira diferente da que você poderia ter visto antes, em particular com um olho voltado para a implementação da negociação.


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


Por que fazer este curso?


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


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


Algumas limitações / restrições:


Nós usamos dados diários. Este não é um curso de 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 ações que você poderia negociar se quisesse.


O que eu ganho?


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


Cursos relacionados.


Aprendizado de Máquina: Aprendizado não supervisionado.


Informática em Saúde na Nuvem.


Big Data Analytics em saúde.


IA baseada em conhecimento: sistemas cognitivos.


Segmentação e Cluster.


Previsão de séries temporais.


Cursos Populares.


Aprendizado Profundo - Redes Neurais Convolucionais.


Engenheiro de Automóveis Autônomo - Visão Computacional.


Meça & amp; Otimize com o Google Analytics.


Programas em destaque.


Apenas no Udacity.


Programas.


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.


The Rise Of Automated Trading: Machines Trading the S&P 500.


Nowadays, more than 60 percent of trading activities with different assets (such as stocks, index futures, commodities) are not made by “human being” traders anymore, instead relying on automated trading. There are specialized programs based on particular algorithms that automatically buy and sell assets over different markets, meant to achieve a positive return in the long run.


In this article, I’m going to show you how to predict, with good accuracy, how the next trade should be placed to get a positive gain. For this example, as the underlying asset to trade, I selected the S&P 500 index, the weighted average of 500 US companies with bigger capitalization. A very simple strategy to implement is to buy the S&P 500 index when Wall Street Exchange starts trading, at 9:30 AM, and selling it at the closing session at 4:00 PM Eastern Time. If the closing price of the index is higher than the opening price, there is a positive gain, whereas a negative gain would be achieved if the closing price is lower than the opening price. So the question is: how do we know if the trading session will end up with a closing price higher than opening price? Machine Learning is a powerful tool to achieve such a complex task, and it can be a useful tool to support us with the trading decision.


Machine Learning is the new frontier of many useful real life applications. Financial trading is one of these, and it’s used very often in this sector. An important concept about Machine Learning is that we do not need to write code for every kind of possible rules, such as pattern recognition. This is because every model associated with Machine Learning learns from the data itself, and then can be later used to predict unseen new data.


Disclaimer : The purpose of this article is to show how to train Machine Learning methods, and in the provided code examples not every function is explained. This article is not intended to let one copy and paste all the code and run the same provided tests, as some details are missing that were out of the scope the article. Also, base knowledge of Python is required. The main intention of the article is to show an example of how machine learning may be effective to predict buys and sells in the financial sector. However, trade with real money means to have many other skills, such as money management and risk management. This article is just a small piece of the “big picture”.


Building Your First Financial Data Automated Trading Program.


So, you want to create your first program to analyze financial data and predict the right trade? Deixa-me mostrar-te como. I will be using Python for Machine Learning code, and we will be using historical data from Yahoo Finance service. As mentioned before, historical data is necessary to train the model before making our predictions.


To begin, we need to install:


Python, and in particular I suggest using IPython notebook. Yahoo Finance Python package (the exact name is yahoo-finance ) through the terminal command: pip install yahoo-finance . A free trial version of Machine Learning package called GraphLab. Feel free to check the useful documentation of that library.


Note that only a part of GraphLab is open source, the SFrame, so to use the entire library we need a license. There is a 30 day free license and a non-commercial license for students or those one participating in Kaggle competitions. From my point of view, GraphLab Create is a very intuitive and easy to use library to analyze data and train Machine Learning models.


Digging in the Python Code.


Let’s dig in with some Python code to see how to download financial data from the Internet. I suggest using IPython notebook to test the following code, because IPython has many advantages compared to a traditional IDE, especially when we need to combine source code, execution code, table data and charts together on the same document. For a brief explanation to use IPython notebook, please look at the Introduction to IPython Notebook article.


So, let’s create a new IPython notebook and write some code to download historical prices of S&P 500 index. Note, if you prefer to use other tools, you can start with a new Python project in your preferred IDE.


Here, hist_quotes is a list of dictionaries, and each dictionary object is a trading day with Open , High , Low , Close , Adj_close , Volume , Symbol and Date values. During each trading day, the price usually changes starting from the opening price Open to the closing price Close , and hitting a maximum and a minimum value High and Low . We need to read through it and create lists of each of the most relevant data. Also, data must be ordered by the most recent values at first, so we need to reverse it:


We can pack all downloaded quotes into an SFrame object, which is a highly scalable column based data frame, and it is compressed. One of the advantages is that it can also be larger than the amount of RAM because it is disk-backed. You can check the documentation to learn more about SFrame.


So, let’s store and then check the historical data:


Now we can save data to disk with the SFrame method save , as follows:


Let’s See What the S&P 500 Looks Like.


To see how the loaded S&P 500 data will look like, we can use the following code:


The output of the code is the following graph:


Training Some Machine Learning Models.


Adding Outcome.


As I stated in the introductory part of this article, the goal of each model is to predict if the closing price will be higher than the opening price. Hence, in that case, we can achieve a positive return when buying the underlying asset. So, we need to add an outcome column on our data which will be the target or predicted variable. Every row of this new column will be:


+1 for an Up day with a Closing price higher than Opening price. -1 for a Down day with a Closing price lower than Opening price.


Since we need to assess some days before the last trading day, we need to lag data by one or more days. For that kind of lagging operation, we need another object from GraphLab package called TimeSeries . TimeSeries has a method shift that lags data by a certain number of rows.


Adding Predictors.


Predictors are a set of feature variables that must be chosen to train the model and predict our outcome . So, forecasting factor choice is crucial, if not the most important, component of the forecaster.


Just to name a few examples, a factor to consider may be if today’s close is higher than yesterday’s close, and that might be extended with two previous days’ close, etc. A similar choice can be translated with the following code:


As shown above, I’ve added two new features columns, feat1 and feat2 on our data set ( ts ) containing 1 if the comparison is true and 0 otherwise.


This article is intended to give an example of Machine Learning applied to the Financial sector. I prefer to focus on how Machine Learning models may be used with financial data, and we will not go into detail regarding how to choose the right factors to train the models. It is too exhaustive to explain why certain factors are used in respect to others, due to a considerable increase in complexity. My job research is to study many hypotheses of choosing factors to create a good predictor. So for a start, I suggest you experiment with lots of different combinations of factors, to see if they may increase the accuracy of the model.


Training a Decision Tree Model.


GraphLab Create has a very clean interface to implement Machine Learning models. Each model has a method create used to fit the model with a training data set. Typical parameters are:


training - it is a training set containing feature columns and a target column. target - it is the name of the column containing the target variable. validation_set - it is a dataset for monitoring the model’s generalization performance. In our case, we have no validation_set . features - it is a list of columns names of features used for training the model. verbose - if true , print progress information during training.


Whereas other parameters are typical of the model itself, such as:


max_depth - it is the maximum depth of a tree.


With the following code we build our decision tree:


Measuring Performance of Fitted Model.


Accuracy is an important metric to evaluate the goodness of the forecaster. It is the number of correct predictions divided by the number of total data points. Since the model is fitted with training data, the accuracy evaluated with the training set is better than the one obtained with a test set.


Precision is the fraction of positive predictions that are positive. We need precision to be a number closer to 1 , to achieve a “perfect” win-rate. Our decision_tree , as another classifier from GraphLab Create package, has its method evaluate to get many important metrics of the fitted model.


Recall quantifies the ability of a classifier to predict positive examples. Recall can be interpreted as the probability that a randomly selected positive example is correctly identified by the classifier. We need that precision would be a number closer to 1 , to achieve a “perfect” win-rate.


The following code will show the accuracy of the fitted model both with training set and testing set:


As shown above, the accuracy of the model with the test set is about 57 percent, which is somehow better than tossing a coin (50 percent).


Predicting Data.


GraphLab Create has the same interface to predict data from different fitted models. We will use the predict method, which needs a test set to predict the target variable, in our case outcome . Now, we can predict data from the testing set:


False positives are cases where the model predicts a positive outcome whereas the real outcome from the testing set is negative. Vice versa, False negatives are cases where the model predicts a negative outcome where the real outcome from the test set is positive.


Our trading strategy waits for a positively predicted outcome to buy S&P 500 at the Opening price, and sell it at the Closing price, so our hope is to have the lowest False positives rate to avoid losses. In other words, we expect our model would have the highest precision rate.


As we can see, there are two false negatives (at 2013-04-10 and 2013-04-11) and two false positives (at 2013-04-15 and 2013-04-18) within the first ten predicted values of the testing set.


With a simple calculation, considering this small set of ten predictions:


Note that usually the numbers above are different from each other, but in this case they are the same.


Backtesting the Model.


We now simulate how the model would trade using its predicted values. If the predicted outcome is equal to +1 , it means that we expect an Up day . With an Up day we buy the index at the beginning of the session, and sell the index at the end of the session during the same day. Conversely, if the predicted outcome is equal to -1 we expect a Down day , so we will not trade during that day.


The Profit and Loss ( pnl ) for a complete daily trade, also called round turn , in this example is given by:


pnl = Close - Open (for each trading day)


With the code shown below, I call the helper function plot_equity_chart to create a chart with the curve of cumulative gains (equity curve). Without going too deep, it simply gets a series of profit and loss values and calculates the series of cumulative sums to plot.


Here, Sharpe is the Annual Sharpe ratio, an important indicator of the goodness of the trading model. Considering trades expressed day by day whereas mean is the mean of the list of profit and loss, and sd is the standard deviation. For simplicity in the formula depicted above, I have considered a risk-free return equal to 0.


Some Basics About Trading.


Trading the index requires buying an asset, which is directly derived from the index. Many brokers replicate the S&P 500 index with a derivative product called CFD (Contract for difference), which is an agreement between two parties to exchange the difference between the opening price and closing price of a contract.


Example : Buy 1 CFD S&P 500 at Open (value is 2000), sell it at Close of the day (value is 2020). The difference, hence the gain, is 20 points. If each point has a value of $25:


Let’s say that the broker keeps a slippage of 0.6 points for its own revenue:


Another important aspect to consider is to avoid significant losses within a trade. They may happen whenever the predicted outcome is +1 but the real outcome value is -1 , so it is a false positive . In that case, the ending session turns out to be a Down day with a closing price lower than the opening, and we get a loss.


A stop loss order must be placed to protect against a maximum loss we would tolerate within a trade, and such an order is triggered whenever the price of the asset goes below a fixed value we have set before.


If we look at the time series downloaded from Yahoo Finance at the beginning of this article, every day has a Low price which is the lowest price reached during that day. If we set a stop level of -3 points far from the Opening price, and Low - Open = -5 the stop order will be triggered, and the opened position will be closed with a loss of -3 points instead of -5 . This is a simple method to reduce the risk. The following code represents my helper function to simulate a trade with a stop level:


Custos de Negociação.


Transaction costs are expenses incurred when buying or selling securities. Transaction costs include brokers’ commissions and spreads (the difference between the price the dealer paid for a security and the price the buyer pays), and they need to be considered if we want to backtest our strategy, similarly to a real scenario. O deslizamento na negociação de ações geralmente ocorre quando há uma mudança no spread. In this example and for the next ongoing simulations, trading costs are fixed as:


Slippage = 0.6 points Commission = 1$ for each trade (one round turn will cost 2$)


Just to write some numbers, if our gross gain were 10 points, 1 point = $25, so $250 including trading costs, our net gain would be (10 - 0.6)*$25 - 2 = $233 .


The following code shows a simulation of the previous trading strategy with a stop loss of -3 points. The blue curve is the curve of cumulative returns. The only costs accounted for are slippage (0.6 points), and the result is expressed in basis points (the same base unit of S&P 500 values downloaded from Yahoo Finance).


The following code is used to make predictions in a slightly different way. Please pay attention to the predict method which is called with an additional parameter output_type = “probability” . This parameter is used to return probabilities of predicted values instead of their class prediction ( +1 for a positively predicted outcome, -1 for a negatively predicted outcome). A probability greater than or equal to 0.5 is associated with a predicted value +1 and a probability value less than 0.5 is related to a predicted value of -1 . The higher that probability is, the more chance we have to predict a real Up Day .


Now we backtest the model with a helper function called backtest_ml_model which calculates the series of cumulative returns including slippage and commissions, and plots their values. For brevity, without explaining thoroughly backtest_ml_model function, the important detail to highlight is that instead of filtering those days with a predicted outcome = 1 as we did in the previous example, now we filter those predictions_prob equal to or greater than a threshold = 0.5 , as following:


Remember that Net gain of each trading day is: Net gain = (Gross gain - SLIPPAGE) * MULT - 2 * COMMISSION .


Another important metric used to evaluate the goodness of a trading strategy is the Maximum Drawdown . In general, it measures the largest single drop from peak to the bottom, in the value of an invested portfolio. In our case, it is the most significant drop from peak to bottom of the equity curve (we have just one asset in our portfolio, S&P 500). So given an SArray of profit and loss pnl , we calculate the drawdown as:


Inside the helper function backtest_summary is calculated:


Maximum drawdown (in dollars) as shown above. Accuracy, with Graphlab. evaluation method. Precision, with Graphlab. evaluation method. Recall, with Graphlab. evaluation method.


Putting it all together, the following example shows the equity curve representing cumulative returns of the model strategy, with all values expressed in dollars.


To increase the precision of forecasted values, instead of a standard probability of 0.5 (50 percent) we choose a higher threshold value, to be more confident that the model predicts an Up day .


As we can see by the chart above, the equity curve is much better than before (Sharpe is 6.5 instead of 3.5), even with fewer round turns.


From this point on, we will consider all next models with a threshold higher than a standard value.


Training a Logistic Classifier.


We can apply our research, as we did previously with the decision tree, into a Logistic Classifier model. GraphLab Create has the same interface with Logistic Classifier object, and we will call the create method to build our model with the same list of parameters. Moreover, we prefer to predict the probability vector instead of the predicted class vector (composed of +1 for a positive outcome, and -1 for a negative outcome), so we would have a threshold greater than 0.5 to achieve a better precision in our forecasting.


In this case, there is a summary very similar to Decision Tree. After all, both models are classifiers, they only predict a class of binary outcomes ( +1 , -1 ).


Training a Linear Regression Model.


The main difference of this model is that it deals with continuous values instead of binary classes, as mentioned before. We don’t have to train the model with a target variable equal to +1 for Up days and -1 for Down days , our target must be a continuous variable. Since we want to predict a positive gain, or in other words a Closing price higher than the Opening price, now target must be the gain column of our training set. Also, the list of features must be composed of continuous values, such as the previous Open , Close , etc.


For brevity, I won’t go into the details of how to select the right features, as this is beyond the scope of this article, which is more inclined to show how we should apply different Machine Learning models over a data set. The list of parameters passed to the create method are:


training - it is a training set containing feature columns and a target column. target - it is the name of the column containing the target variable. validation_set - it is a dataset for monitoring the model’s generalization performance. In our case, we have no validation_set . features - it is a list of column names of features used for training the model, for this model we will use another set respect to the Classifier models. verbose - if true , it will print progress information during training. max_iterations - it is the maximum number of allowed passes through the data. More passes over the data can result in a more accurately trained model.


So far, we have predictions which is SArray of predicted gains, whereas predictions_prob is SArray with predictions values normalized. To have a good accuracy and a certain number of round turns, comparable with previous models, I’ve chosen a threshold value of 0.4 . For a predictions_prob less than 0.4 , the backtest_linear_model helper function will not open a trade because a Down day is expected. Otherwise, a trade will be opened.


Training a Boosted Tree.


As we previously did training a decision tree, now we are going to train a boosted tree classifier with the same parameters used for other classifier models. In addition, we set the number of max_iterations = 12 in order to increase the maximum number of iterations for boosting. Each iteration results in the creation of an extra tree. We also set a higher value of threshold than 0.5 to increase precision.


Training a Random Forest.


This is our last trained model, a Random Forest Classifier, composed by an ensemble of decision trees. The maximum number of trees to use in the model is set to num_trees = 10 , to avoid too much complexity and overfitting.


Collecting All the Models Together.


Now we can join all the strategies together and see the overall result. It’s interesting to see the summary of all Machine Learning models, sorted by their precision.


If we collect all the profit and loss for each one of the previous models in the array pnl , the following chart depicts the equity curve obtained by the sum of each profit and loss, day by day.


Just to give some numbers, with about 3 years of trading, all models have a total gain of about 180,000 dollars. The maximum exposition is 5 CFD contracts in the market, but to reduce the risk they all are closed at the end of each day, so overnight positions are not allowed.


Statistics of the Aggregation of All Models Together.


Since each model can open a trade, but we added 5 concurrent models together, during the same day there could be from 1 contract up to 5 CFD contracts. If all models agree to open trades during the same day, there is a high chance to have an Up day predicted. Moreover, we can group by the number of models that open a trade at the same time during the opening session of the day. Then we evaluate precision as a function of the number of concurrent models.


As we can see by the chart depicted above, the precision gets better as the number of models do agree to open a trade. The more models agree, the more precision we get. For instance, with 5 models triggered the same day, the chance to predict an Up day is greater than 85%.


Conclusão.


Even in the financial world, Machine Learning is welcomed as a powerful instrument to learn from data and give us great forecasting tools. Each model shows different values of accuracy and precision, but in general, all models can be aggregated to achieve a better result than each one of them taken singularly. GraphLab Create is a great library, easy to use, scalable and able to manage Big Data very quickly. It implements different scientific and forecasting models, and there is a free license for students and Kaggle competitions.


Additional disclosure: This article has been prepared solely for information purposes, and is not an offer to buy or sell or a solicitation of an offer to buy or sell any security or instrument or to participate in any particular trading strategy. Os exemplos apresentados nesses sites são apenas para fins educacionais. Os resultados anteriores não são necessariamente indicativos de resultados futuros.

No comments:

Post a Comment