Análise forex em Python
Se você é um profissional ou um investidor e gostaria de adquirir um conjunto de habilidades de negociação quantitativa, você está no lugar certo.
O curso de Negociação com o Python fornecerá as melhores ferramentas e práticas para pesquisa de negociação quantitativa, incluindo funções e scripts escritos por especialistas em negociações quantitativas. O curso dá o máximo impacto ao seu tempo e dinheiro investidos. Centra-se na aplicação prática da programação à negociação, em vez da informática teórica. O curso se pagará rapidamente economizando seu tempo no processamento manual de dados. Você passará mais tempo pesquisando sua estratégia e implementando negociações lucrativas.
Visão geral do curso.
Parte 1: Noções básicas Você aprenderá por que o Python é uma ferramenta ideal para negociações quantitativas. Começaremos configurando um ambiente de desenvolvimento e, em seguida, apresentaremos as bibliotecas científicas.
Parte 2: Manipulando os dados Aprenda como obter dados de várias fontes gratuitas como Yahoo Finance, CBOE e outros sites. Leia e escreva vários formatos de dados, incluindo arquivos CSV e Excel.
Parte 3: Pesquisando estratégias Aprenda a calcular P & L e acompanhar as métricas de desempenho como Sharpe e Drawdown. Construa uma estratégia de negociação e otimize seu desempenho. Vários exemplos de estratégias são discutidos nesta parte.
Parte 4: Indo ao vivo! Esta parte é centralizada em torno da API Interactive Brokers. Você aprenderá como obter dados de estoque em tempo real e fazer pedidos ao vivo.
Muito código de exemplo.
O material do curso consiste em 'cadernos' que contêm texto juntamente com código interativo como este. Você poderá aprender interagindo com o código e modificando-o ao seu gosto. Será um ótimo ponto de partida para escrever suas próprias estratégias.
Embora alguns tópicos sejam explicados detalhadamente para ajudá-lo a entender os conceitos subjacentes, na maioria dos casos você não precisará escrever seu próprio código de baixo nível, devido ao suporte de bibliotecas de código aberto existentes:
A biblioteca TradingWithPython combina grande parte da funcionalidade discutida neste curso como uma função pronta para uso e será usada durante todo o curso. Os pandas fornecerão a você todo o poder de levantamento pesado necessário para a compactação de dados.
Todo o código é fornecido sob a licença BSD, permitindo seu uso em aplicações comerciais.
Classificação do curso.
Um piloto do curso foi realizado na primavera de 2013, isso é o que os alunos puderam dizer:
Matej curso bem planejado e bom treinador. Definitivamente vale seu preço e meu tempo Lave Jev obviamente sabia suas coisas. A profundidade da cobertura foi perfeita. Se Jev executar algo assim novamente, eu serei o primeiro a me inscrever. John Phillips Seu curso realmente me fez começar a considerar o python para análise de sistemas de estoque.
Negociação com Python.
Sábado, 20 de maio de 2017.
Yahoo está morto, viva o Yahoo!
Nota: os dados fornecidos parecem ser ajustados para divisões, mas não para dividendos.
Sábado, 20 de fevereiro de 2016.
Uma borda estatística simples no SPY.
Ocorreu-me que na maioria das vezes que há muita conversa na mídia sobre a queda do mercado (depois de grandes perdas ao longo de vários dias de intervalo), uma recuperação bastante significativa às vezes acontece.
No passado cometi alguns erros ao fechar minhas posições para reduzir as perdas, apenas para perder uma recuperação nos dias seguintes.
Após um período de perdas consecutivas, muitos traders irão reduzir suas posições com medo de perdas ainda maiores. Muito desse comportamento é governado pelo medo, e não pelo risco calculado. Comerciantes mais espertos entram então para as barganhas.
Depois de 3 ou mais perdas consectivas, vá muito. Saia no próximo feche.
Isso não parece nada mau! Observando as taxas de sharpe, a estratégia obtém uma descida de 2,2 versus 0,44 para os B & amp; Na verdade, isso é muito bom! (não fique muito empolgado, pois não contei com custos de comissão, escorregões, etc.).
Embora a estratégia acima não seja algo que eu gostaria de negociar simplesmente por causa do longo período de tempo, a própria teoria provoca pensamentos adicionais que poderiam produzir algo útil. Se o mesmo princípio se aplica aos dados intradiários, uma forma de estratégia de escalpelamento poderia ser construída. No exemplo acima, simplifiquei um pouco o mundo contando apenas o * número * de dias de inatividade, sem prestar atenção à profundidade do rebaixamento. Além disso, a saída de posição é apenas um 'próximo dia de fechamento' básico. Há muito a melhorar, mas a essência na minha opinião é esta:
Segunda-feira, 17 de novembro de 2014.
Negociando o VXX com a previsão de vizinhos mais próximos.
Minha definição desses dois é:
prêmio de volatilidade = VIX-realizadoVol delta (inclinação da estrutura de prazo) = VIX-VXV.
Combinar tanto o prêmio quanto o delta em um modelo foi um desafio para mim, mas eu sempre quis fazer uma aproximação estatística. Em essência, para uma combinação de (delta, premium), gostaria de encontrar todos os valores históricos que estão mais próximos dos valores atuais e fazer uma estimativa dos retornos futuros com base neles. Algumas vezes comecei a escrever meus próprios algoritmos de interpolação de vizinhos mais próximos, mas toda vez tive que desistir. até me deparar com a regressão dos vizinhos mais próximos. Isso me permitiu construir rapidamente um preditor baseado em duas entradas e os resultados são tão bons, que estou um pouco preocupado por ter cometido um erro em algum lugar.
criar um conjunto de dados de [delta, premium] - & gt; [Retorno do próximo dia VXX] (na amostra) cria um preditor do vizinho mais próximo com base no conjunto de dados acima da estratégia de negociação (fora da amostra) com as regras: go long if predicted return & gt; 0 vai curto se o retorno previsto & lt; 0.
Nos dois últimos gráficos, a estratégia parece realizar o mesmo dentro e fora da amostra. Relação de Sharpe é em torno de 2,3.
Estou muito satisfeito com os resultados e tenho a sensação de que só estive a arranhar a superfície do que é possível com esta técnica.
Quarta-feira, 16 de julho de 2014.
Módulo de backtesting simples.
Minha busca por uma ferramenta de backtesting ideal (minha definição de 'ideal' é descrita nos posts anteriores de 'dilemas de backtesting') não resultou em algo que eu pudesse usar imediatamente. No entanto, rever as opções disponíveis me ajudou a entender melhor o que eu realmente quero. Das opções que eu olhei, o pybacktest foi o que eu mais gostei por causa de sua simplicidade e velocidade. Depois de passar pelo código-fonte, tenho algumas ideias para simplificar e tornar um pouco mais elegante. A partir daí, foi apenas um pequeno passo para escrever meu próprio backtester, que agora está disponível na biblioteca TradingWithPython.
encontrar entrada e saídas - & gt; calcular pnl e fazer gráficos com backtester - & gt; dados de estratégia pós-processo.
Sábado, 7 de junho de 2014.
Aumentando o desempenho com o Cython.
5k amostras como dados de teste. Aí vem a versão original da minha função drawdown (como está agora implementada na biblioteca TradingWithPython)
Hmm 1,2 segundos não é muito rápido para uma função tão simples. Há algumas coisas aqui que podem ser uma ótima alternativa para o desempenho, como uma lista * highwatermark * que está sendo anexada em cada iteração de loop. Acessar Series por seu índice também deve envolver algum processamento que não seja estritamente necessário. Vamos dar uma olhada no que acontece quando esta função é reescrita para trabalhar com dados numpy.
Bem, isso é muito mais rápido que a função original, aproximadamente 40x de aumento de velocidade. Ainda há muito espaço para melhoria, movendo-se para código compilado com cython Agora eu reescrever a função dd de cima, mas usando dicas de otimização que eu encontrei no tutorial de cython. Observe que esta é minha primeira tentativa de otimização de funções com o Cython.
Uau, esta versão corre em 122 micro segundos, tornando-a dez mil vezes mais rápida que a minha versão original! Devo dizer que estou muito impressionado com o que as equipes Cython e IPython conseguiram! A velocidade em comparação com a facilidade de uso é simplesmente incrível!
P. S. Eu costumava fazer otimizações de código no Matlab usando encapsulamento C e. mex puro, era tudo apenas uma dor na bunda em comparação com isso.
Terça-feira, 27 de maio de 2014.
Dilemas de backtesting: revisão de pyalgotrade.
Primeira impressão: ativamente desenvolvida, documentação muito boa, mais do que feautures suficiente (indicadores de TA, otimizadores etc). Parece bom, então eu continuei com a instalação que também correu bem.
O tutorial parece estar um pouco desatualizado, já que o primeiro comando yahoofinance. get_daily_csv () lança um erro sobre a função desconhecida. Não se preocupe, a documentação está atualizada e acho que a função ausente agora é renomeada para yahoofinance. download_daily_bars (símbolo, ano, csvFile). O problema é que essa função só faz o download de dados por um ano, em vez de tudo, desde aquele ano até a data atual. Tão bem inútil.
Depois que eu baixei os dados e os salvei no csv, eu precisei ajustar os nomes das colunas, porque aparentemente o pyalgotrade espera que Date, Adj Close, Close, High, Low, Open e Volume estejam no cabeçalho. Isso é tudo um pequeno problema.
Seguindo para o teste de desempenho em uma estratégia de SMA que é fornecida no tutorial. Meu conjunto de dados consiste em 5370 dias de SPY:
Isso é realmente muito bom para um framework baseado em eventos.
Mas tentei pesquisar a documentação para obter a funcionalidade necessária para fazer o backtest de spreads e vários portfólios de ativos e simplesmente não consegui encontrar nenhum. Então eu tentei encontrar uma maneira de alimentar o DataFrame pandas como uma entrada para uma estratégia e acontece de não ser possível, o que é novamente uma grande decepção. Eu não o afirmei como um requisito no post anterior, mas agora chego à conclusão de que o suporte a pandas é obrigatório para qualquer framework que trabalhe com dados de séries temporais. Pandas foi uma razão para eu mudar de Matlab para Python e eu nunca mais quero voltar.
Conclusão A pyalgotrade não cumpre minha exigência de flexibilidade. Parece que foi projetado com o TA clássico em mente e negociação de instrumento único. Eu não vejo isso como uma boa ferramenta para estratégias de backtesting que envolvem vários ativos, hedge etc.
Segunda-feira, 26 de maio de 2014.
Dilemas de backtesting.
Seja boa aproximação do mundo real. Este é obviamente o requisito mais importante. Permitir flexibilidade ilimitada: o ferramental não deve ficar no caminho de testar ideias prontas para uso. Tudo o que pode ser quantificado deve ser utilizável. Seja fácil de implementar & amp; manter. É tudo sobre produtividade e poder testar muitas ideias para encontrar uma que funcione. Permitir varreduras de parâmetros, testes de avanço e otimizações. Isso é necessário para investigar o desempenho e a estabilidade da estratégia, dependendo dos parâmetros da estratégia. O problema de satisfazer todos os requisitos acima é que os números 2 e 3 são conflitantes. Não há ferramenta que possa fazer tudo sem o custo de alta complexidade (= baixa manutenção). Normalmente, uma ferramenta point-and-click de terceiros limitará severamente a liberdade de teste com sinais personalizados e portfólios ímpares, enquanto no outro extremo do espectro uma solução diy personalizada precisará de dezenas ou mais horas para ser implementada, com grandes chances de terminando com código desordenado e ilegível. Então, na tentativa de combinar o melhor dos dois mundos, vamos começar de alguma forma no meio: use uma estrutura de backtesting existente e adapte-a ao nosso gosto.
Nos posts a seguir, eu vou ver três candidatos possíveis que encontrei:
Zipline é amplamente conhecida e é o motor por trás do PyPlotTub Quantopian parece ser ativamente desenvolvido e o pybacktest bem documentado é um framework baseado em vetores leve, que pode ser interessante por causa de sua simplicidade e desempenho. Eu vou estar olhando para a adequação dessas ferramentas comparando-as com uma estratégia de negociação hipotética. Se nenhuma dessas opções se encaixa nos meus requisitos, terei que decidir se quero investir na criação do meu próprio framework (pelo menos, olhando as opções disponíveis, eu sei o que não funciona) ou manter o código personalizado para cada uma delas. estratégia.
O primeiro para a avaliação é Zipline.
Minha primeira impressão de Zipline e Quantopian é positiva. O Zipline é apoiado por uma equipe de desenvolvedores e é testado em produção, então a qualidade (bugs) deve ser ótima. Existe uma boa documentação no site e um exemplo de caderno no github.
Para pegar um jeito, baixei o caderno do exame e comecei a brincar com ele. Para minha decepção, rapidamente me deparei com o primeiro exemplo do Algoritmo de Zipline Mais Simples: Compre a Apple. O conjunto de dados tem apenas 3028 dias, mas a execução deste exemplo demorou uma eternidade. Aqui está o que eu medi:
Eu não esperava um desempenho estelar, já que o zipline é um backtester baseado em eventos, mas quase um minuto para 3000 samples é muito ruim. Esse tipo de desempenho seria proibitivo para qualquer tipo de varredura ou otimização. Outro problema surgiria quando se trabalha com conjuntos de dados maiores, como dados intradiários ou vários títulos, que podem conter facilmente centenas de milhares de amostras.
Infelizmente, eu terei que abandonar o Zipline da lista de backtesters utilizáveis, já que ele não atende ao meu requisito # 4 por uma margem de gordura.
No post seguinte, eu vou estar olhando para PyAlgotrade.
Nota: Meu sistema atual é um par de anos, rodando um AMD Athlon II X2 @ 2800MHZ com 3GB de RAM. Com backtesting baseado em vetor, eu estou acostumado a calcular tempos de menos de um segundo para um único backtest e um ou dois minutos para uma varredura de parâmetro. Um teste básico de caminhada com 10 passos e uma varredura de parâmetros para 20x20 resultaria em uma convulsiva 66 horas com tirolesa. Eu não sou tão paciente assim.
Calculando Correlações de Pares de Moedas Forex em Python.
Os comerciantes geralmente calculam a correlação entre diferentes instrumentos, como ações e ETFs, ou pares de moedas Forex. É importante saber se sua carteira é bem diversificada. Instrumentos altamente correlacionados em seu portfólio tenderão a subir e descer juntos, comprometendo sua estratégia de diversificação. Manter um olho para correlações altas (positivas ou negativas) é ainda mais importante para os traders de Forex, uma vez que os pares de moedas frequentemente exibem correlações positivas ou negativas altas devido às condições do mercado ou com drivers de mercado similares. Por exemplo, produtores de commodities como o AUD, NZD, CAD tendem a reagir de forma semelhante às mudanças nos preços das commodities. Duas posições com alta correlação negativa basicamente se anulam e podem não fazer sentido manter.
O coeficiente de correlação é uma medida de correlação. É calculado como um valor de ponto flutuante entre -1,0 e 1,0. Instrumentos com valores de correlação próximos de 1,0 são chamados de "correlacionados positivamente", o que significa que eles tendem a se mover juntos. Símbolos com valores de correlação próximos de -1,0 são chamados de "correlacionados negativamente" # 8221; e geralmente se movem em direções opostas. Valores de correlação próximos de zero geralmente significam que os instrumentos não estão relacionados entre si e estão se movendo independentemente no período de tempo refletido no cálculo de correlação.
Calculando Correlações & # 8211; Exemplo.
Neste post, vamos calcular as correlações em Python. Mais especificamente, calcularemos índices de correlação para um conjunto de pares de moedas por um período de 6 meses com base em barras de preço de 15 minutos do final de janeiro até o final de julho deste ano. Os preços são armazenados em arquivos separados por vírgula (csv) em texto sem formatação. Cada arquivo possui: preços de abertura, alta, baixa e fechamento, além de barSize e colunas de data. O valor da coluna de datas realmente contém a data e a hora do tamanho da barra. Cada linha representa dados para bar.
Para este post nós baixamos os preços históricos para nove pares de moedas Forex da Interactive Brokers TWS usando nosso IB Data Downloader, no entanto os dados de preços podem ser obtidos de várias maneiras, o que não é importante para este exemplo. Os arquivos de dados de amostra usados neste exemplo podem ser baixados aqui: historical_data_forex_jul2015. Cada arquivo contém um pouco mais de 12.000 linhas.
No exemplo do programa, usaremos Pandas & # 8211; e biblioteca de análise de dados de alto desempenho de código aberto para Python. O Pandas amplia a funcionalidade do NumPy e fornece estruturas de dados flexíveis e poderosas semelhantes às encontradas em R. Usaremos a poderosa classe DataFrame da Panda, que é modelada a partir do data. frame do R & B, muito mais poderoso. Você pode pensar em um DataFrame como uma tabela em um banco de dados relacional ou em uma planilha do Excel, em que cada coluna possui um nome e um índice (baseado em 0) e um tipo de dados associado, como string, data, inteiro etc. 8230; Coluna diferente pode ter diferentes tipos de dados.
Nós copiamos todos os nossos arquivos de entrada para o diretório / historical_data:
Como você pode ver, cada arquivo contém o nome do par de moedas Forex em seu nome, como: AUDJPY, AUDUSD, EURUSD, etc & # 8230; Isso é importante porque analisaremos esses nomes de par de moedas para usar como colunas no DataFrame associado.
Todos os arquivos têm o mesmo formato, aqui está uma amostra mostrando as primeiras 10 linhas de dados do AUDJPY .:
A linha 2 acima (primeira linha do arquivo) contém nomes de coluna. Como você pode ver, cada linha representa uma barra de dados de preço de 15 minutos, a partir da meia-noite de 29 de janeiro de 2015.
Calculando Correlação em Python.
Código-fonte Python.
Para rodar este programa python você precisa ter certeza de ter requerido pacotes instalados.
Você pode consultar as instruções de instalação de cada pacote (fornecemos links abaixo, mas uma simples pesquisa no Google deve ser suficiente). Abaixo está uma seqüência de comandos que usamos para instalar pacotes em nosso MacOS Yosemite com Python 2.7:
Tentamos documentar esse programa tão bem quanto podemos, mas fique à vontade para postar perguntas na parte inferior desta página ou enviá-las para nós por meio do formulário "Fale conosco" à direita.
Abaixo está a saída da função de impressão final (corr_df. head (len (dataframes))), mostrando os valores do coeficiente de correlação no formato da matriz.
Observe que uma correlação negativa significa que os dois pares de moedas se correlacionam nas direções opostas (por exemplo, quando o preço de um sobe, o outro diminui e vice-versa).
Abaixo está a imagem do mapa de calor gerado pelo código acima. Observe que você precisará instalar pacotes Python matplotlib e seaborn.
Alimento para o pensamento.
Os comerciantes devem prestar atenção aos valores de correlação em vários prazos. Os corretores de dia de curto prazo geralmente são aconselhados a monitorar os gráficos de prazos mais longos para estarem cientes da direção da tendência maior. Da mesma forma, ao analisar as correlações entre os pares de moedas, os corretores devem verificar não apenas as correlações para o período de geração de sinal, mas também um ou dois prazos mais longos, já que, assim como as tendências de preço, as correlações de longo prazo são muito mais significativas.
Em conclusão, gostaríamos de agradecer o maravilhoso livro que referenciamos abaixo & # 8211; & # 8220; Python para análise de dados & # 8221 ;. É uma ótima fonte de informações detalhadas sobre pandas e bibliotecas NumPy Python. Economizamos inúmeras horas ao codificar scripts em Python, mantendo este livro em nossa mesa.
No nosso radar.
No nosso radar.
Negociação algorítmica em menos de 100 linhas de código Python.
Se você estiver familiarizado com a negociação financeira e conhecer o Python, poderá iniciar a negociação algorítmica básica em pouco tempo.
Se você quiser saber mais sobre como analisar dados financeiros com o Python, confira o Python for Finance de Yves Hilpisch.
Negociação Algorítmica.
O comércio algorítmico refere-se à negociação informatizada e automatizada de instrumentos financeiros (com base em algum algoritmo ou regra) com pouca ou nenhuma intervenção humana durante as horas de negociação. Quase qualquer tipo de instrumento financeiro - seja ações, moedas, commodities, produtos de crédito ou volatilidade - pode ser negociado dessa maneira. Não só isso, em certos segmentos de mercado, os algoritmos são responsáveis pela maior parte do volume de negociação. Os livros The Quants, de Scott Patterson, e More Money Than God, de Sebastian Mallaby, pintam uma imagem vívida dos primórdios do comércio algorítmico e das personalidades por trás de sua ascensão.
As barreiras à entrada para negociação algorítmica nunca foram menores. Não muito tempo atrás, apenas investidores institucionais com orçamentos de TI na casa dos milhões de dólares poderiam participar, mas hoje mesmo indivíduos equipados apenas com um notebook e uma conexão com a Internet podem começar em poucos minutos. Algumas tendências importantes estão por trás desse desenvolvimento:
Software de código aberto: todo software que um trader precisa para começar em negociação algorítmica está disponível na forma de código aberto; especificamente, o Python se tornou a linguagem e o ecossistema de escolha. Fontes de dados abertas: Mais e mais conjuntos de dados valiosos estão disponíveis em fontes abertas e gratuitas, fornecendo uma variedade de opções para testar hipóteses e estratégias de negociação. Plataformas de negociação on-line: há um grande número de plataformas de negociação on-line que fornecem acesso fácil e padronizado a dados históricos (via RESTful APIs) e dados em tempo real (via APIs de streaming de soquete) e também oferecem recursos de negociação e portfólio (via APIs programáticas). ).
Este artigo mostra como implementar um projeto de comércio algorítmico completo, desde o backtesting da estratégia até a realização de negociações automatizadas em tempo real. Aqui estão os principais elementos do projeto:
Estratégia: Eu escolhi uma estratégia de momentum de série temporal (cf. Moskowitz, Tobias, Yao Hua Ooi e Lasse Heje Pedersen (2012): "Momento Momento Temporal". Journal of Financial Economics, Vol. 104, 228-250.), Que basicamente pressupõe que um instrumento financeiro que tenha funcionado bem / mal continuará a fazê-lo. Plataforma: Eu escolhi Oanda; Ele permite que você negocie uma variedade de contratos alavancados para diferenças (CFDs), que essencialmente permitem apostas direcionais em um conjunto diversificado de instrumentos financeiros (por exemplo, moedas, índices de ações, commodities). Dados: receberemos todos os dados históricos e dados de streaming da Oanda. Software: usaremos o Python em combinação com os poderosos pandas da biblioteca de análise de dados, além de alguns pacotes adicionais do Python.
O seguinte pressupõe que você tenha uma instalação do Python 3.5 disponível com as principais bibliotecas de análise de dados, como NumPy e pandas, incluídas. Se não, você deve, por exemplo, baixar e instalar a distribuição do Anaconda Python.
Conta Oanda.
Na oanda, qualquer pessoa pode registrar-se para uma conta de demonstração gratuita ("negociação de papel") em poucos minutos. Depois de ter feito isso, para acessar a API do Oanda programaticamente, você precisa instalar o pacote relevante do Python:
Para trabalhar com o pacote, você precisa criar um arquivo de configuração com o nome de arquivo oanda. cfg que tenha o seguinte conteúdo:
Substitua as informações acima pelo ID e token que você encontra em sua conta na plataforma Oanda.
A execução deste código prepara você com o objeto principal para trabalhar programaticamente com a plataforma Oanda.
Backtesting
Já criamos tudo o que é necessário para começar com o backtesting da estratégia de momentum. Em particular, somos capazes de recuperar dados históricos da Oanda. O instrumento que usamos é EUR_USD e é baseado na taxa de câmbio EUR / USD.
A primeira etapa do backtesting é recuperar os dados e convertê-los em um objeto DataFrame do pandas. O conjunto de dados é para os dois dias 8 e 9 de dezembro de 2016 e tem uma granularidade de um minuto. A saída no final do bloco de código a seguir fornece uma visão geral detalhada do conjunto de dados. Ele é usado para implementar o backtesting da estratégia de negociação.
Segundo, formalizamos a estratégia de momentum informando ao Python para fazer o retorno médio do log ao longo das últimas barras de 15, 30, 60 e 120 minutos para derivar a posição no instrumento. Por exemplo, o retorno médio do log das últimas barras de 15 minutos fornece o valor médio das últimas 15 observações de retorno. Se esse valor for positivo, nós ficamos / permanecemos longos no instrumento negociado; se for negativo, nós ficamos curtos. Para simplificar o código que se segue, apenas confiamos nos valores de closeAsk que recuperamos através do nosso bloco de código anterior:
Terceiro, para derivar o desempenho absoluto da estratégia de momentum para os diferentes intervalos de momentum (em minutos), você precisa multiplicar os posicionamentos derivados acima (desviado em um dia) pelos retornos de mercado. Veja como fazer isso:
A inspeção do gráfico acima revela que, durante o período do conjunto de dados, o instrumento negociado em si tem um desempenho negativo de cerca de -2%. Entre as estratégias de momentum, a baseada em 120 minutos apresenta um desempenho melhor com um retorno positivo de cerca de 1,5% (ignorando o spread bid / ask). Em princípio, essa estratégia mostra "alfa real": gera um retorno positivo mesmo quando o próprio instrumento mostra um negativo.
Negociação Automatizada.
Depois de ter decidido qual estratégia de negociação implementar, você está pronto para automatizar a operação de negociação. Para acelerar as coisas, estou implementando a negociação automatizada baseada em doze barras de cinco segundos para a estratégia de momentum de série temporal, em vez de barras de um minuto, usadas para o backtesting. Uma única classe bastante concisa faz o truque:
O código abaixo permite que a classe MomentumTrader faça seu trabalho. A negociação automatizada ocorre no momento calculado em 12 intervalos de duração de cinco segundos. A classe interrompe automaticamente a negociação após 250 ticks de dados recebidos. Isso é arbitrário, mas permite uma rápida demonstração da classe MomentumTrader.
A saída acima mostra as negociações individuais executadas pela classe MomentumTrader durante uma execução de demonstração. A captura de tela abaixo mostra o aplicativo de área de trabalho fxTradePractice da Oanda, onde uma negociação da execução da classe MomentumTrader em EUR_USD está ativa.
Todas as saídas de exemplo mostradas neste artigo são baseadas em uma conta demo (onde somente papel-moeda é usado em vez de dinheiro real) para simular negociações algorítmicas. Para mudar para uma operação de negociação real com dinheiro real, você simplesmente precisa criar uma conta real com a Oanda, fornecer fundos reais e ajustar o ambiente e os parâmetros da conta usados no código. O código em si não precisa ser alterado.
Conclusões
Este artigo mostra que você pode iniciar uma operação de negociação algorítmica básica com menos de 100 linhas de código Python. Em princípio, todas as etapas desse projeto são ilustradas, como a recuperação de dados para fins de backtesting, o backtesting de uma estratégia de momentum ea automatização da negociação com base em uma especificação de estratégia de momentum. O código apresentado fornece um ponto de partida para explorar muitas direções diferentes: usando estratégias alternativas de negociação algorítmica, negociando instrumentos alternativos, negociando múltiplos instrumentos de uma vez, etc.
A popularidade do comércio algorítmico é ilustrada pela ascensão de diferentes tipos de plataformas. Por exemplo, a Quantopian - uma plataforma de backtesting baseada na Web e baseada em Python para estratégias de negociação algorítmica - informou no final de 2016 que atraiu uma base de usuários de mais de 100.000 pessoas. Plataformas de negociação on-line como a Oanda ou aquelas para criptomoedas como a Gemini permitem que você comece em mercados reais em poucos minutos e atenda a milhares de traders ativos em todo o mundo.
Se você quiser saber mais sobre como analisar dados financeiros com o Python, confira o Python for Finance de Yves Hilpisch.
Construa indicadores técnicos em Python.
O Indicador Técnico é essencialmente uma representação matemática baseada em conjuntos de dados como preço (alto, baixo, aberto, próximo, etc.) ou volume de uma segurança para prever tendências de preço. Existem vários tipos de indicadores técnicos que são usados para analisar e detectar a direção do movimento do preço. Os traders os usam para estudar o movimento de preços de curto prazo, uma vez que não se mostram muito úteis para investidores de longo prazo. Eles são empregados principalmente para prever os níveis futuros de preços.
Os indicadores técnicos não seguem um padrão geral, ou seja, eles se comportam de maneira diferente em cada segurança. O que pode ser um bom indicador para uma determinada segurança, pode não sustentar o caso da outra. Assim, usar um indicador técnico requer jurisprudência, juntamente com uma boa experiência.
No post seguinte, destacarei seis indicadores técnicos que são utilizados popularmente nos mercados para estudar o movimento dos preços.
Como essas análises podem ser feitas em python, um trecho de código também é inserido junto com a descrição dos indicadores. Gráficos de exemplo com exemplos também são acrescentados para maior clareza.
Índice de Canal de Commodity (CCI)
O índice do canal de mercadorias (CCI) é um oscilador que foi originalmente introduzido por Donald Lambert em 1980. O CCI pode ser usado para identificar retornos cíclicos em classes de ativos, sejam commodities, índices, ações ou ETFs. A CCI também é usada pelos comerciantes para identificar os níveis de sobrecompra / sobrevenda de títulos.
Estimativa.
O CCI analisa a relação entre preço e média móvel. As etapas envolvidas na estimativa do CCI incluem:
Computando o preço típico para a segurança. O preço típico é obtido pela média do preço alto, baixo e próximo do dia. Encontrar a média móvel para o número de dias escolhido com base no preço típico. Calculando o desvio padrão para o mesmo período usado para o MA.
A fórmula para o CCI é dada por:
O índice é dimensionado por um fator inverso de 0,015 para fornecer números mais legíveis.
O CCI pode ser usado para determinar os níveis de sobrecompra e sobrevenda. Leituras acima de +100 podem implicar uma condição de sobrecompra, enquanto leituras abaixo de -100 podem implicar uma condição de sobrevenda. No entanto, deve-se ter cuidado porque uma segurança pode continuar se movendo mais alto depois que o indicador CCI se torna overbought. Da mesma forma, os títulos podem continuar se movendo para baixo após o vencimento do indicador.
Sempre que a segurança estiver nos níveis de sobrecompra / sobrevenda, conforme indicado pelo CCI, há uma boa chance de que o preço verá correções. Assim, um comerciante pode usar esses níveis de sobrecompra / sobrevenda para entrar em posições curtas / longas.
Os comerciantes também podem procurar sinais de divergência para tomar posições adequadas usando o CCI. Uma divergência de alta ocorre quando o título subjacente faz uma baixa mais baixa e o CCI forma uma baixa mais alta, o que mostra menos momentum de queda. Da mesma forma, uma divergência de baixa é formada quando a segurança registra uma alta mais alta e o CCI forma uma alta mais baixa, o que mostra menor momento de alta.
Código Python para calcular o Índice de Canal de Commodity.
No código abaixo, usamos as funções Series, rolling_mean, rolling_std e join para calcular o Índice de Canal de Commodity. A função de série é usada para formar uma série que é um objeto de matriz unidimensional contendo uma matriz de dados. A função rolling_mean usa uma série temporal ou um quadro de dados juntamente com o número de períodos e calcula a média. A função rolling_std calcula o desvio padrão com base no preço fornecido. A função de junção une uma determinada série com uma série especificada / dataframe.
Também plotamos a série NSE Price e os valores do Índice de Canal de Commodities (CCI) abaixo do gráfico de preços. Primeiro criamos uma figura vazia usando a função plt. figure e depois criamos duas subtramas. A primeira subtrama traça a série de preços NSE, enquanto a segunda subtrama registra os valores de CCI.
Facilidade de Movimento (EVM)
Facilidade de Movimento (EMV) é um oscilador baseado em volume que foi desenvolvido por Richard Arms. O EVM indica a facilidade com que os preços sobem ou descem, tendo em conta o volume da garantia. Por exemplo, um aumento de preço em um volume baixo significa que os preços avançaram com relativa facilidade, e houve pouca pressão de venda. Valores de EVM positivos indicam que o mercado está subindo com facilidade, enquanto valores negativos indicam um declínio fácil.
Estimativa.
Para calcular o EMV, calculamos primeiro a distância movida. É dado por:
Em seguida, calculamos a taxa Box, que usa o volume e o intervalo alto-baixo:
Para calcular o EMV de período n, tomamos a média móvel simples do período n do EMV de 1 período.
A facilidade de movimento (EMV) pode ser usada para confirmar uma tendência de alta ou baixa. Uma facilidade de movimento positiva sustentada juntamente com um mercado em alta confirma uma tendência de alta, enquanto os valores negativos de Facilidade de Movimento com a queda dos preços confirmam uma tendência de baixa. Além de usar como um indicador independente, Facilidade de Movimento (EMV) também é usado com outros indicadores na análise de gráficos.
Código Python para calcular a facilidade de movimento (EMV)
Exemplo de código: 14 dias de facilidade de movimento (EMV) para AAPL.
No código abaixo, usamos as funções Series, rolling_mean, shift e join para calcular o indicador de Facilidade de Movimento (EMV). A função de série é usada para formar uma série que é um objeto de matriz unidimensional contendo uma matriz de dados. A função rolling_mean usa uma série temporal ou um quadro de dados juntamente com o número de períodos e calcula a média. A função shift é usada para buscar o preço alto e baixo do dia anterior. A função de junção une uma determinada série com uma série especificada / dataframe.
Nós também plotamos a série de Preços AAPL e os valores de Facilidade de Movimento (EVM) abaixo do gráfico de preços. Primeiro criamos uma figura vazia usando a função plt. figure e depois criamos duas subtramas. A primeira subtrama faz o gráfico da série de preços AAPL, enquanto a segunda subtrama registra os valores de EVM.
Média móvel (MA)
A média móvel é um dos indicadores técnicos mais utilizados. Ele é usado junto com outros indicadores técnicos ou pode formar o bloco de construção para o cálculo de outros indicadores técnicos.
Uma "média móvel" é a média dos preços dos ativos em relação ao número "x" de dias / semanas. O termo "em movimento" é usado porque o grupo de dados avança a cada novo dia de negociação. Para cada novo dia, incluímos o preço desse dia e excluímos o preço do primeiro dia na sequência de dados.
As médias móveis mais utilizadas são as médias móveis de 5 dias, 10 dias, 20 dias, 50 dias e 200 dias.
Estimativa.
Existem diferentes tipos de médias móveis usadas para análise, média móvel simples (SMA), média móvel ponderada (WMA) e média móvel exponencial (EMA).
Para computar uma SMA de 20 dias, tomamos a soma dos preços em 20 dias e dividimos por 20. Para chegar ao próximo ponto de dados para a SMA de 20 dias, incluímos o preço do próximo dia de negociação, excluindo o preço. do primeiro dia de negociação. Desta forma, o grupo de dados avança.
O SMA atribui pesos iguais a cada ponto de preço no grupo. Quando calculamos um WMA de 20 dias, atribuímos pesos variáveis a cada preço. O último preço, ou seja, o preço do 20º dia obtém o maior peso, enquanto o primeiro preço obtém o menor peso. Essa soma é então dividida pela soma dos pesos usados.
Para calcular o EMA de 20 dias, primeiro calculamos o primeiro valor de EMA usando uma média móvel simples. Em seguida, calculamos o multiplicador e, a partir daí, calculamos o segundo valor de EMA que usamos o multiplicador e o EMA do dia anterior. Essa fórmula é usada para calcular os valores de EMA subsequentes.
A média móvel informa se uma tendência começou, terminou ou foi revertida. A média dos preços produz uma linha mais suave que facilita a identificação da tendência subjacente. No entanto, a média móvel fica abaixo da ação do mercado.
Uma média móvel mais curta é mais sensível que uma média móvel mais longa. No entanto, é propenso a gerar sinais de negociação falsos.
Usando uma única Média Móvel - Uma única média móvel pode ser usada para gerar sinais de negociação. Quando o preço de fechamento se move acima da média móvel, um sinal de compra é gerado e vice-versa. Quando se utiliza uma única média móvel, deve-se selecionar o período da média de tal forma que seja sensível ao gerar sinais de negociação e, ao mesmo tempo, insensível a emitir sinais falsos.
Usando duas médias móveis - Usar uma única média móvel pode ser desvantajoso. Por isso, muitos comerciantes usam duas médias móveis para gerar sinais. Nesse caso, um sinal de compra é gerado quando a média mais curta cruza acima da média mais longa. Da mesma forma, uma venda é gerada quando a menor cruza abaixo da média mais longa. Usando duas médias móveis reduz os sinais falsos que são mais prováveis ao usar uma única média móvel.
Os traders também usam três médias móveis, como o sistema de média móvel de 5, 10 e 20 dias amplamente utilizado nos mercados de commodities.
Código Python para computação Médias Móveis para NIFTY.
No código abaixo, usamos as funções Series, rolling mean e join para criar as funções SMA e EWMA. A função de série é usada para formar uma série que é um objeto de matriz unidimensional contendo uma matriz de dados. A função rolling_mean usa uma série temporal ou um quadro de dados juntamente com o número de períodos e calcula a média. A função de junção une uma determinada série com uma série especificada / dataframe.
Também plotamos a série de preços NIFTY, SMA de 50 dias e EWMA de 200 dias.
Taxa de variação (ROC)
A taxa de variação (ROC) é um indicador técnico que mede a variação percentual entre o preço mais recente e o preço & # 8220; n & # 8221; dias atrás. O indicador flutua em torno da linha zero.
Se o ROC está subindo, ele dá um sinal de alta, enquanto um ROC em queda dá um sinal de baixa. Pode-se calcular o ROC com base em diferentes períodos para medir o momentum de curto prazo ou o momentum de longo prazo.
Estimativa.
Código Python para calcular taxa de variação (ROC)
Exemplo de código: Taxa de alteração de 5 dias (ROC) para NIFTY.
No código abaixo, usamos as funções Series, diff, shift e join para calcular a taxa de variação (ROC). A função de série é usada para formar uma série que é um objeto de matriz unidimensional contendo uma matriz de dados. A função diff calcula a diferença de preços entre o preço do dia atual e o preço "n" do dia anterior. A função shift é usada para buscar o preço do dia anterior de "n". A função de junção une uma determinada série com uma série especificada / dataframe.
Nós também plotamos a série NIFTY Price e os valores de Rate of Change (ROC) abaixo do gráfico de preços. Primeiro criamos uma figura vazia usando a função plt. figure e depois criamos duas subtramas. A primeira subtrama representa a série de preços NIFTY, enquanto a segunda subtrama registra os valores da ROC.
Bandas de Bollinger.
O conceito de bandas de Bollinger foi desenvolvido por John Bollinger. Essas bandas compreendem uma banda de Bollinger superior e uma banda de Bollinger inferior e são colocadas dois desvios padrão acima e abaixo de uma média móvel.
As bandas de Bollinger expandem e contratam com base na volatilidade. Durante um período de crescente volatilidade, as bandas se ampliam e elas se contraem conforme a volatilidade diminui. Os preços são considerados relativamente altos quando se movem acima da faixa superior e relativamente baixos quando vão abaixo da faixa inferior.
Para criar as bandas, primeiro calculamos o SMA e usamos isso para calcular os valores das bandas.
Para usar bandas de Bollinger para gerar sinais, uma abordagem simples seria usar as bandas superior e inferior como as metas de preço. Se o preço rebate a faixa inferior e cruza a linha da média móvel, a faixa superior se torna a meta de preço superior.
No caso de um cruzamento do preço abaixo da linha da média móvel, a faixa inferior torna-se o preço alvo descendente.
Código Python para computação de Bollinger Bands para NIFTY.
No código abaixo rolamos a função para criar a função da banda Bollinger. Os métodos de média e desvio padrão são usados para calcular essas métricas respectivas usando o preço de fechamento. Depois de computarmos a média e o desvio padrão, calculamos a banda de Bollinger superior e a banda de Bollinger inferior. A função de banda do Bollinger é chamada nos dados do preço NIFTY usando a janela média móvel de 50 dias.
Índice de força.
O índice de força foi criado por Alexander Elder. O índice de força leva em conta a direção do preço da ação, a extensão do movimento do preço da ação e o volume. Usando esses três elementos, forma um oscilador que mede a pressão de compra e venda.
Cada um desses três fatores desempenha um papel importante na determinação do índice de força. Por exemplo, um grande avanço nos preços, que é dado pela extensão do movimento dos preços, mostra uma forte pressão de compra. Um grande declínio no volume pesado indica uma forte pressão de venda.
Estimativa.
Exemplo: índice de força de computação (1) e período de índice de força (15).
O índice de força para o período de 15 dias é uma média móvel exponencial do índice de força de 1 período.
O Force Index pode ser usado para determinar ou confirmar a tendência, identificar correções e prever reversões com divergências. Um índice de força mais curto é usado para determinar a tendência de curto prazo, enquanto um índice de força mais longo, por exemplo, um índice de força de 100 dias, pode ser usado para determinar a tendência de longo prazo dos preços.
Um índice de força também pode ser usado para identificar correções em uma determinada tendência. Para fazer isso, ele pode ser usado em conjunto com um indicador de tendência seguinte. Por exemplo, pode-se usar uma MME de 22 dias para tendência e um índice de força de 2 dias para identificar correções na tendência.
Código Python para calcular o índice de força para o estoque da Apple Inc. (AAPL).
No código abaixo, usamos as funções Series, diff e join para calcular o índice de força. A função de série é usada para formar uma série que é um objeto de matriz unidimensional contendo uma matriz de dados. A função diff calcula a diferença entre o ponto de dados atual e o ponto de dados “n” períodos / dias de intervalo. A função de junção une uma determinada série com uma série especificada / dataframe.
Se você está procurando mais informações sobre bibliotecas Python para a Algo Trading, confira nossa postagem no blog. Se você é um programador ou um profissional de tecnologia procurando aprender negociações automatizadas com especialistas como o Dr. Yves Hilpisch, dê uma olhada no nosso curso Executive Program em Algorithmic Trading (EPAT).
Percebemos que alguns usuários estão enfrentando desafios ao baixar os dados de mercado das plataformas Yahoo e Google Finance. Caso você esteja procurando uma fonte alternativa para dados de mercado, você pode usar o Quandl para o mesmo.
Disclaimer: Todos os investimentos e negociação no mercado de ações envolvem risco. Quaisquer decisões de negociar nos mercados financeiros, incluindo negociação de ações ou opções ou outros instrumentos financeiros, são uma decisão pessoal que só deve ser tomada após uma pesquisa completa, incluindo risco pessoal e avaliação financeira e o envolvimento de assistência profissional na medida em que você Acredito necessário. As estratégias de negociação ou informações relacionadas mencionadas neste artigo são apenas para fins informativos.
Biblioteca de Negociação Algorítmica Python.
O PyAlgoTrade é uma Biblioteca de Negociação Algorítmica Python, com foco em backtesting e suporte para negociação de papéis e negociação ao vivo. Digamos que você tenha uma ideia para uma estratégia de negociação e gostaria de avaliá-la com dados históricos e ver como ela se comporta. O PyAlgoTrade permite que você faça isso com o mínimo de esforço.
Principais características.
Totalmente documentado. Evento dirigido. Suporta ordens Market, Limit, Stop e StopLimit. Suporta o Yahoo! Arquivos Finanças, Google Finance e NinjaTrader CSV. Suporta qualquer tipo de dados de séries temporais no formato CSV, por exemplo, o Quandl. Suporte de negociação Bitcoin através do Bitstamp. Indicadores técnicos e filtros como SMA, WMA, EMA, RSI, Bandas de Bollinger, expoente de Hurst e outros. Métricas de desempenho como a taxa de Sharpe e a análise de rebaixamento. Manipulando eventos do Twitter em tempo real. Criador de perfil de eventos. Integração TA-Lib.
Muito fácil de dimensionar horizontalmente, isto é, usando um ou mais computadores para fazer backtest de uma estratégia.
O PyAlgoTrade é gratuito, de código aberto e está licenciado sob a Licença Apache, Versão 2.0.
Previsão de séries temporais financeiras - Parte I.
Previsão de séries temporais financeiras - Parte I.
Nesta série de artigos, vamos criar um processo estatisticamente robusto para previsão de séries temporais financeiras. Essas previsões formarão a base para um grupo de estratégias de negociação automatizadas. O primeiro artigo da série discutirá a abordagem de modelagem e um grupo de algoritmos de classificação que nos permitirá prever a direção do mercado.
Dentro desses artigos, usaremos o scikit-learn, uma biblioteca de aprendizado de máquina para Python. O Scikit-learn contém implementações de muitas técnicas de aprendizado de máquina. Isso não só nos poupa muito tempo na implementação da nossa, mas minimiza o risco de erros introduzidos pelo nosso próprio código e permite uma verificação adicional em relação a bibliotecas escritas em outros pacotes, como R. Isso nos dá uma grande quantidade de confiança se precisarmos criar nossa própria implementação personalizada (por razões de velocidade de execução, digamos).
Processo para previsão.
Uma explicação detalhada do campo da aprendizagem de máquina estatística está além deste artigo. Para utilizar técnicas como a Regressão Logística, a Análise Discriminante Linear e a Análise Discriminante Quadrática, precisamos delinear alguns conceitos básicos.
Técnicas de Aprendizagem Supervisionadas.
Técnicas de aprendizado supervisionadas envolvem um conjunto de tuplas conhecidas $ (x_i, y_i) $, $ i \ in \ $, com $ x_i $ representando as variáveis preditoras (como retorno do mercado de ações atrasado ou volume negociado) e $ y_i $ representando o associado variáveis de resposta / observação (como o retorno do mercado de ações hoje). Nesta situação, estamos interessados na previsão. Dadas as variáveis preditoras futuras, desejamos estimar as respostas desses preditores. Isso está em oposição à inferência onde estamos mais interessados na relação entre as variáveis.
Todos os algoritmos que utilizamos neste artigo, juntamente com muitos outros que serão utilizados no futuro, são do domínio de aprendizagem supervisionada.
Medindo Precisão de Previsão.
A classe particular de métodos em que estamos interessados envolve classificação binária. Ou seja, tentaremos alocar o retorno percentual de um dia específico em dois intervalos: "Para cima" ou "Para baixo". Em uma previsão de produção estaríamos muito preocupados com a magnitude desta previsão e os desvios da previsão do valor real.
Nesses casos, podemos utilizar o erro médio, o desvio absoluto médio e o erro quadrático médio da raiz para fornecer uma estimativa da precisão da previsão. A literatura fornece numerosos outros exemplos de medidas de precisão de previsão.
Neste caso, estaremos apenas preocupados com a taxa de acerto, que é simplesmente a porcentagem de vezes que o previsor alcançou uma previsão precisa (ou seja, quando o dia acabou e vice-versa). Em exemplos posteriores, faremos uso de uma matriz de confusão para determinar o desempenho de previsão em uma base de classe por classe. Além disso, calcularemos os valores acima mencionados e os incorporaremos ao processo de pesquisa de negociação.
Fatores de previsão.
Uma metodologia de previsão é tão boa quanto os fatores escolhidos como preditores. Há um número impressionante de fatores potenciais a serem escolhidos ao se prever retornos do índice do mercado de ações. Neste artigo, vamos restringir os fatores às defasagens de tempo dos retornos percentuais atuais. Isso não é porque eles são os melhores preditores, e sim porque é simples demonstrar o processo de previsão em um conjunto de dados facilmente obtido.
A escolha do fator de previsão é extremamente importante, se não o mais importante, componente do previsor. Mesmo as técnicas simples de aprendizado de máquina produzirão bons resultados em fatores bem escolhidos. Note que o inverso não é frequentemente o caso. "Lançar um algoritmo em um problema" geralmente leva a uma baixa precisão de previsão.
Especificamente para esse analista, escolhi o primeiro e o segundo desfasamento dos retornos percentuais como os preditores da direção atual do mercado de ações. Esta é uma escolha relativamente arbitrária e há muito espaço para modificação, por exemplo, adicionando atrasos adicionais ou o volume de ações negociadas. Geralmente, é melhor ter menos preditores em um modelo, embora existam testes estatísticos disponíveis que possam demonstrar a capacidade preditiva de cada fator.
Previsão S & amp; P500 com Regressão Logística, LDA e QDA.
O S & amp; P500 é um índice ponderado das 500 maiores empresas de capital aberto (por capitalização de mercado) no mercado de ações dos EUA. Muitas vezes, é considerado um "benchmark" de ações. Existem muitos produtos derivados para permitir a especulação ou cobertura no índice. Em particular, o contrato de futuros do S & amp; P500 E-Mini Index é um meio extremamente vago de negociar o índice.
Nesta seção, usaremos três classificadores para prever a direção do preço de fechamento no dia $ N $ com base apenas na informação de preço conhecida no dia $ N-1 $. Um movimento direcional ascendente significa que o preço de fechamento em $ N $ é maior do que o preço em $ N-1 $, enquanto um movimento descendente implica em um preço de fechamento em $ N $ menor do que em $ N-1 $.
Se pudermos determinar a direção do movimento de maneira que exceda significativamente uma taxa de acerto de 50%, com baixo erro e uma boa significância estatística, então estamos no caminho de formar uma estratégia básica de negociação sistemática com base em nossas previsões. Neste estágio, não estamos preocupados com os algoritmos de classificação de aprendizado de máquina mais atualizados. No momento, estamos apenas introduzindo conceitos e, assim, começaremos a discussão sobre previsão com alguns métodos elementares.
Regressão Logística.
A primeira técnica que vamos considerar é a regressão logística (LR). No nosso caso, vamos usar o LR para medir a relação entre uma variável dependente categórica binária ("Up" ou "Down") e várias variáveis contínuas independentes (os retornos percentuais defasados). O modelo fornece a probabilidade de que um determinado dia (seguinte) seja categorizado como "Up" ou "Down". Nesta implementação, escolhemos atribuir cada dia como "Up" se a probabilidade exceder 0,5. Poderíamos usar um limite diferente, mas, por simplicidade, escolhi 0,5.
O LR usa a fórmula logística para modelar a probabilidade de obter um dia "Up" ($ Y = U $) com base nos fatores de atraso ($ L_1 $, $ L_2 $):
A função logística é usada porque fornece uma probabilidade entre $ [0,1] $ para todos os valores de $ L_1 $ e $ L_2 $, ao contrário da regressão linear, na qual as probabilidades negativas podem ser geradas na mesma configuração.
Para ajustar o modelo (ou seja, estimar os coeficientes $ \ beta_i $), o método de máxima verossimilhança é usado. Felizmente para nós, a implementação do ajuste e previsão do modelo LR é feita pela biblioteca scikit-learn.
Análise Discriminante Linear.
A próxima técnica usada é a Análise Linear Discriminante (LDA). O LDA difere do LR porque na LR modelamos $ P (Y = U | L_1, L_2) $ como uma distribuição condicional da resposta $ Y $ dados os preditores $ L_i $, usando uma função logística. No LDA, a distribuição das variáveis $ L_i $ é modelada separadamente, dado $ Y $, e $ P (Y = U | L_1, L_2) $ é obtido através do Teorema de Bayes.
Essencialmente, o LDA resulta da suposição de que os preditores são extraídos de uma distribuição multivariada gaussiana. Após estimativas de calcu - lação para os parâmetros dessa distribuição, os parâmetros podem ser introduzidos no Teorema de Bayes para fazer previsões sobre a qual classe uma observação pertence.
O LDA assume que todas as classes compartilham a mesma matriz de covariância.
Não vou me debruçar sobre as fórmulas para estimar a distribuição ou as probabilidades posteriores que são necessárias para fazer previsões, pois mais uma vez o scikit-learn lida com isso para nós.
Análise Discriminante Quadrática.
A Análise Discriminante Quadrática (QDA) está intimamente relacionada com a LDA. A diferença significativa é que cada classe pode agora possuir sua própria matriz de covariância.
O QDA geralmente funciona melhor quando os limites de decisão não são lineares. O LDA geralmente apresenta melhor desempenho quando há menos observações de treinamento (ou seja, quando é necessário reduzir a variação). O QDA, por outro lado, apresenta um bom desempenho quando o conjunto de treinamento é grande (ou seja, a variação é menos preocupante). O uso de um ou de outro, em última análise, resume-se ao trade-off de viés-variância.
Assim como com LR e LDA, o scikit-learn cuida da implementação do QDA, portanto, precisamos fornecer apenas dados de treinamento / teste para estimativa e previsão de parâmetros.
Implementação Python.
Para a implementação destes meteorologistas vamos fazer uso de NumPy, pandas e scikit-learn. Eu escrevi anteriormente um tutorial sobre como instalar essas bibliotecas. Eu tenho fortemente comentado o código em si, então deve ser fácil determinar o que está acontecendo.
O primeiro passo é importar os módulos e bibliotecas relevantes. Vamos importar os classificadores LogisticRegression, LDA e QDA para esse previsor:
Agora que as bibliotecas são importadas, precisamos criar um DataFrame pandas que contenha os retornos percentuais com defasagem para um número anterior de dias (com o padrão de cinco). create_lagged_series pegará um símbolo de ação (conforme reconhecido pelo Yahoo Finance) e criará um DataFrame com defasagem ao longo do período especificado:
A próxima função auxiliar foi projetada para criar uma porcentagem de hit_rate para cada modelo, eliminando o código duplicado. Ele se baseia no fato de que os objetos Logistic Regression, LDA e QDA possuem os mesmos métodos (ajuste e previsão). A taxa de acertos é enviada para o terminal:
Finalmente, nós o associamos com uma função __main__. Neste caso, vamos tentar prever a direção do mercado de ações dos EUA em 2005, usando dados de retornos de 2001 a 2004:
A saída do código é a seguinte:
Pode-se observar que tanto a Regressão Logística quanto o Analisador Linear Discriminante conseguiram uma taxa de acerto de 56%. No entanto, o Analisador Discriminante Quadrático foi capaz de melhorar em ambos para produzir uma taxa de acerto de 60%. Para o período em particular analisado, isto é provavelmente devido ao fato de que há alguma não-linearidade na relação entre os fatores defasados e a direção que não é bem capturada na análise linear.
Assim, há esperança de que possamos prever parcialmente o mercado de ações dos EUA. Existem algumas ressalvas a esta metodologia de previsão:
Não usamos qualquer forma de validação cruzada para reduzir erros de ajuste. Um analista de produção exigiria que tal análise fosse considerada robusta. O previsor só foi treinado em dados entre 2001-2004 inclusive. Dados mais recentes do mercado de ações podem ter precisão de previsão substancialmente diferente. Na verdade, não tentamos negociar essa informação. Em particular, como podemos realmente executar negociações? Nós usaríamos o futuro do e-mini dos EUA? Nós faríamos uso de ordens Market-On-Open (MOO) ou Market-On-Close (MOC)? Também precisaríamos considerar os custos de transação.
Nos artigos subseqüentes, consideraremos essas questões em maior profundidade.
Um aviso sobre previsão aleatória.
Nesta seção, quero destacar abertamente o problema de significância estatística ao lidar com os previsores. Além do previsor acima, também gerou uma série de "previsão" baseada apenas no sinal de sorteios aleatórios de uma distribuição normal padrão. Note-se que no mesmo período produziu uma taxa de acerto de previsão de 53,4% e ainda o método usado para gerar a série não é essencialmente diferente de jogar uma moeda! Tenha isso em mente sempre que você executar procedimentos de previsão, pois muitas vezes pode levar a um desempenho comercial terrível se não for levado em conta.
Nos artigos a seguir, serão considerados os classificadores de previsão não linear supervisionados mais avançados, como redes neurais artificiais (ANN) e máquinas de vetores de suporte (SVM). Com um "estável" de técnicas de aprendizado de máquina à nossa disposição, poderemos usar métodos de conjunto para produzir uma precisão de previsão e robustez que, às vezes, pode exceder os de qualquer previsor individual.
A Quantcademy.
Participe do portal de associação da Quantcademy que atende à crescente comunidade de traders de quantificação de varejo e aprenda como aumentar a lucratividade de sua estratégia.
Negociação Algorítmica Bem Sucedida.
Como encontrar novas ideias de estratégia de negociação e avaliá-las objetivamente para o seu portfólio usando um mecanismo de backtesting personalizado no Python.
Comércio Algorítmico Avançado.
Como implementar estratégias de negociação avançadas usando análise de séries temporais, aprendizado de máquina e estatísticas Bayesianas com R e Python.
Regressão Linear em Python: Um Tutorial.
Neste tutorial, estaremos construindo uma regressão linear básica que indicará se existe uma relação positiva ou negativa entre duas variáveis.
Uma regressão linear é uma boa ferramenta para análise preditiva rápida: por exemplo, o preço de uma casa depende de uma infinidade de fatores, como seu tamanho ou sua localização. Para ver a relação entre essas variáveis, precisamos construir uma regressão linear, que prevê a linha de melhor ajuste entre elas e pode ajudar a concluir se esses dois fatores têm ou não uma relação positiva ou negativa. Isso pode nos ajudar a descobrir se um fator como o número de escolas na área pode aumentar ou diminuir os valores dos imóveis.
Para os nossos propósitos de hoje, estaremos olhando para algo um pouco mais divertido: a relação entre os resultados dos testes de matemática e a concentração de LSD no tecido da pele de um usuário (fonte: Wagner, Agahajanian, e Bing.1968. " Correlação de Pontuações de Teste de Desempenho com Concentração de Tecido de Dietilamida de Ácido Lisérgico em Seres Humanos. ”Farmacologia Clínica e Terapêutica, Vol.9 pp 635-638.) Esse é um conjunto de dados bastante simples que baixei dos conjuntos de dados abertos da Universidade da Flórida, um catálogo do qual pode ser encontrado ela e.
Esses dados ajudarão a ilustrar como podemos mapear visualmente a relação entre uma variável dependente (nesse caso, a pontuação do teste) e a variável independente (ingestão de LSD). Uma versão ligeiramente modificada do próprio conjunto de dados pode ser encontrada no repositório do Github deste tutorial, juntamente com o código Python que foi extraído neste artigo.
Antes de começarmos, vamos esclarecer como um algoritmo de regressão linear é montado: a fórmula para essa equação é Y = a + bX, onde X é a variável independente (explicativa) e Y é a variável dependente. Se você ainda estiver confuso, pense nos eixos individuais: a variável y sempre plota a variável "dependente", portanto, no nosso exemplo, essa seria a pontuação do teste. A variável x é a variável independente, ou o que às vezes é chamado de “variável explicativa” & # 8212; neste caso, a quantidade de LSD atualmente na amostra de tecido de alguém.
Queremos traçar o quanto da variação na variável y (neste caso, os escores dos testes) pode ser explicado pela variação na variável x (neste caso, a quantidade de LSD que um testador tem em sua corrente sanguínea).
Para este exemplo, usaremos as bibliotecas de aprendizado pandas e sci-kit no Python para calcular e visualizar a regressão linear em Python. Vamos escrevê-los agora:
Em seguida, nós carregamos nossos dados. O repositório do Github contém o arquivo “lsd. csv”, que possui todos os dados que você precisa para plotar a regressão linear no Python. Vamos lê-los no nosso quadro de dados dos pandas. A segunda linha chama a função “head ()”, que nos permite usar os nomes das colunas para direcionar as maneiras pelas quais o ajuste será desenhado nos dados.
Na última etapa de nossa preparação de dados, extrairemos os dados do quadro de dados dos pandas de forma que a função “fit ()” funcione e em que possamos implementar uma regressão linear no Python.
O código acima cria todos os dados necessários que podemos traçar usando o sci-kit learn. Vamos traçar isso agora:
E voila! Abaixo você deve ver sua nova regressão linear brilhante, que mostra uma correlação negativa entre a ingestão de LSD e as pontuações dos testes de matemática (algo sem surpresa).
Regressão Linear em Python, Pontuações de Teste Matemático no Eixo Y, Quantidade de ingestão de LSD no Eixo-X.
Комментарии
Отправить комментарий