Estratégia de negociação python


Python Algorithmic Trading Library.
PyAlgoTrade é uma Biblioteca de Negociação Algorítmica Python com foco em backtesting e suporte para negociação de papel e negociação ao vivo. Digamos que você tenha uma idéia de uma estratégia de negociação e que você gostaria de avaliá-la com dados históricos e ver como ela se comporta. PyAlgoTrade permite que você faça isso com um esforço mínimo.
Principais características.
Totalmente documentado. Evento conduzido. Suporta pedidos Market, Limit, Stop e StopLimit. Suporta Yahoo! Finanças, Google Finance e NinjaTrader CSV. Suporta qualquer tipo de dados da série temporal no formato CSV, por exemplo, Quandl. Suporte comercial Bitcoin através do Bitstamp. Indicadores técnicos e filtros como SMA, WMA, EMA, RSI, Bandas Bollinger, Expositores Hurst e outros. Métricas de desempenho como a taxa de Sharpe e análise de redução. Manipulação de eventos do Twitter em tempo real. Perfil de eventos. Integração TA-Lib.
Muito fácil de dimensionar horizontalmente, ou seja, usando um ou mais computadores para testar uma estratégia.
PyAlgoTrade é gratuito, de código aberto e está licenciado sob a Licença Apache, Versão 2.0.

Comércio com Python.
Sábado, 20 de maio de 2017.
Yahoo está morto, Viva Yahoo!
Nota: os dados fornecidos parecem ser ajustados para divisões, mas não para dividendos.
Sábado, 20 de fevereiro de 2018.
Uma vantagem estatística simples em SPY.
Ocorreu-me que, na maioria das vezes, há muita conversa na mídia sobre o mercado que cai (depois de grandes perdas ao longo do período de tempo), uma recuperação bastante significativa às vezes segue.
No passado, cometi alguns erros ao fechar minhas posições para reduzir as perdas, apenas para perder uma recuperação nos próximos dias.
Após um período de perdas consecutivas, muitos comerciantes liquidarão suas posições por medo de perda ainda maior. Grande parte desse comportamento é governado pelo medo, ao invés de risco calculado. Comerciantes mais inteligentes entram nas pechinchas.
Depois de três perdas ou mais, percorrer o tempo. Sair no próximo fechamento.
Isso não parece nada mal! Olhando para os índices de sharpe, a estratégia classifica uma descida 2.2 versus 0.44 para os B e H. Na verdade, isso é muito bom! (Não fique excitado demais, pois não contai com custos de comissão, derrapagem, 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 mais pensamentos que poderiam produzir algo útil. Se o mesmo princípio se aplica aos dados intradiários, uma forma de estratégia de escalação poderia ser construída. No exemplo acima, simplifiquei o mundo um pouco apenas contando o * número * dos dias baixos, sem prestar atenção à profundidade da retirada. Além disso, a saída da posição é apenas um "próximo dia próximo" básico. Há muito a ser melhorado, mas a essência na minha opinião é esta:
Segunda-feira, 17 de novembro de 2017.
Trading VXX com previsão de vizinhos mais próximos.
Minha definição desses dois é:
volatilidade premium = VIX-realizadoVol delta (inclinação da estrutura do termo) = VIX-VXV.
Combinar tanto premium como delta em um modelo foi um desafio para mim, mas 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 mais próximos dos valores atuais e fazer uma estimativa dos retornos futuros com base neles. Algumas vezes eu comecei a escrever meus próprios algoritmos de interpolação de vizinho mais próximo, mas sempre que eu tinha que desistir. até encontrar a regressão dos vizinhos mais próximos. Isso me permitiu construir rapidamente um preditor com base em duas entradas e os resultados são tão bons, que estou um pouco preocupado por ter cometido um erro em algum lugar.
crie um conjunto de dados de [delta, premium] - & gt; [Retorno do VXX no próximo dia] (na amostra) crie um preditor vizinho mais próximo baseado no conjunto de dados acima da estratégia de comércio (fora da amostra) com as regras: vá longo se for previsto o retorno & gt; 0 vá curto se for previsto o retorno & lt; 0.
Nas duas últimas parcelas, a estratégia parece executar o mesmo dentro e fora da amostra. O índice Sharpe é de cerca de 2,3.
Estou muito satisfeito com os resultados e tenho a sensação de que eu apenas estava riscando a superfície do que é possível com esta técnica.
Quarta-feira, 16 de julho de 2017.
Módulo de backtesting simples.
Minha busca de uma ferramenta de backtesting ideal (minha definição de "ideal" é descrita nas postagens anteriores de "dilemas de Backtesting") não resultou em algo que eu poderia usar de imediato. No entanto, revisar as opções disponíveis me ajudou a entender melhor o que eu realmente quero. Das opções que eu olhei, pybacktest foi o que mais gostei por causa de sua simplicidade e velocidade. Depois de passar pelo código-fonte, tenho algumas idéias para torná-lo mais simples e 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 sair - & gt; calcular pnl e fazer parcelas com backtester - & gt; dados da estratégia pós-processo.
Sábado, 7 de junho de 2017.
Impulsionando o desempenho com Cython.
5k amostras como dados de teste. Aqui vem a versão original da minha função de redução (como 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 um excelente arrastar para o desempenho, como uma lista * highwatermark * que está sendo anexado em cada iteração de loop. Acessar a Série pelo 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 do que a função original, aproximadamente 40x de aumento de velocidade. Ainda há muito espaço para melhorar ao mudar para o código compilado com o cython. Agora eu reescrevo a função dd acima, mas usando dicas de otimização encontradas no tutorial do cython. Note que esta é a minha primeira tentativa de otimizar funções com o Cython.
Uau, esta versão é executada em 122 micro segundos, tornando-o dez mil vezes mais rápido que a minha versão original! Devo dizer que estou muito impressionado com o que as equipes de Cython e IPython conseguiram! A velocidade em comparação com a facilidade de uso é incrível!
P. S. Eu costumava fazer otimizações de código em Matlab usando o C puro e o wrapper de. mex, tudo era apenas uma dor no burro em comparação com isso.
Terça-feira, 27 de maio de 2017.
Dilemas de backtesting: revisão de pyalgotrade.
Primeira impressão: desenvolvido ativamente, documentação bastante boa, mais do que suficientes feautures (indicadores de TA, otimizadores, etc.). Parece bom, então continuei com a instalação, que também funcionou sem problemas.
O tutorial parece estar um pouco desactualizado, já que o primeiro comando yahoofinance. get_daily_csv () lança um erro sobre a função desconhecida. Não há preocupações, 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 esta função apenas faz o download de dados por um ano em vez de tudo, desde aquele ano até a data atual. Tão bonito, inútil.
Depois que eu baixei os dados e salvou-o para o csv, eu precisava ajustar os nomes das colunas, porque aparentemente o pyalgotrade espera que Date, Adj Close, Close, High, Low, Open, Volume estejam no cabeçalho. Isso é um problema menor.
Após o teste de desempenho em uma estratégia SMA que é fornecida no tutorial. O meu conjunto de dados consiste em 5370 dias de SPY:
Isso é bastante bom para uma estrutura baseada em eventos.
Mas tentei buscar documentação sobre a funcionalidade necessária para espalhar spreads e múltiplas carteiras de ativos e simplesmente não encontrou nenhuma. Então eu tentei encontrar uma maneira de alimentar pandas DataFrame como uma entrada para uma estratégia e não é possível, o que é novamente uma grande decepção. Não afirmei como um requisito na publicação anterior, mas agora chego a perceber que o suporte de pandas é uma obrigação para qualquer estrutura que funcione com dados da série temporal. Pandas foi uma razão para eu mudar de Matlab para Python e nunca mais quero voltar.
Conclusão pyalgotrade não cumpre meu requisito de flexibilidade. Parece que foi projetado com TA clássico em mente e comércio de instrumentos individuais. Eu não vejo isso como uma boa ferramenta para estratégias de backtesting que envolvem vários ativos, hedging etc.
Segunda-feira, 26 de maio de 2017.
Dilemas de backtesting.
Seja uma boa aproximação do mundo real. Este é, claro, o requisito mais importante. Permita flexibilidade ilimitada: as ferramentas não devem impedir o teste de idéias prontas. Tudo o que pode ser quantificado deve ser utilizável. Seja fácil de implementar & amp; manter. É tudo sobre produtividade e ser capaz de testar muitas idéias para encontrar uma que funcione. Permitir varredura de parâmetros, testes avançados 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 # 2 e # 3 são conflitantes. Não há nenhuma ferramenta que possa fazer tudo sem o custo de alta complexidade (= baixa manutenção). Normalmente, uma ferramenta de ponto e clique de terceiros limitará severamente a liberdade para testar com sinais personalizados e portfólios ímpares, enquanto que na outra extremidade do espectro, uma solução diy com codificação personalizada exigirá dezenas ou mais horas para implementar com altas chances de terminando com código desordenado e ilegível. Então, na tentativa de combinar o melhor dos dois mundos, vamos começar alguns lugares no meio: use uma estrutura de backtesting existente e adapte-a ao nosso gosto.
Nas seguintes postagens, eu estarei olhando três candidatos possíveis que eu encontrei:
A Zipline é amplamente conhecida e é o motor por trás da Pyonggotpia da Lospian parece estar ativamente desenvolvido e o bem-documentado pybacktest é uma estrutura leve baseada em vetor que pode ser interessante por causa de sua simplicidade e desempenho. Eu estarei olhando a adequação dessas ferramentas comparando-as contra uma estratégia de negociação hipotética. Se nenhuma dessas opções se adequar aos meus requisitos, terei que decidir se eu quero investir na escrita da minha própria estrutura (pelo menos, olhando as opções disponíveis I & # 8217; saberá o que não funciona) ou fique com código personalizado para cada uma estratégia.
O primeiro para a avaliação é Zipline.
Minha primeira impressão de Zipline e Quantopian é positiva. A Zipline é apoiada por uma equipe de desenvolvedores e é testada em produção, então a qualidade (bugs) deve ser excelente. Há uma boa documentação no site e um exemplo de caderno no github.
Para arrumar isso, baixei o notebook do exampe e comecei a jogar com ele. Para minha decepção, rapidamente me deparo com o primeiro exemplo, Algoritmo de Zipline Simplest: Compre a Apple. O conjunto de dados tem apenas 3028 dias, mas executar este exemplo demorou para sempre. Aqui é o que eu medei:
Eu não esperava um desempenho estelar como o tirolesa é um backtester baseado em eventos, mas quase um minuto para 3000 amostras é muito ruim. Esse tipo de desempenho seria proibitivo para qualquer tipo de digitalização ou otimização. Outro problema surgirá ao trabalhar 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 vou ter que descartar Zipline da lista de backtesters utilizáveis, pois não atende a minha exigência # 4 por uma margem de gordura.
Na próxima publicação, eu vou olhar para PyAlgotrade.
Nota: Meu sistema atual tem alguns anos, executando um AMD Athlon II X2 @ 2800MHZ com 3 GB de RAM. Com o backtesting baseado em vetor I & # 8217; m usado para tempos de cálculo de menos de um segundo para um único backtest e um minuto ou dois para uma verificação de parâmetros. Um teste básico walk-forward com 10 passos e uma varredura de parâmetros para grade 20x20 resultaria em uma frequência de 66 horas com tirolesa. Não é tão paitient.
Quarta-feira, 15 de janeiro de 2017.
Iniciando o IPython notebook a partir do arquivo Windows exlorer.
Segunda-feira, 13 de janeiro de 2017.
ETFs com alavancas em 2018, onde está sua decadência agora?
Conhecendo o comportamento alavancado de etf, eu esperaria que esses resultados melhorassem seu benchmark, então a estratégia que tentaria lucrar com a deterioração perderia dinheiro.
Uma vez que normalizamos os preços para 100 $ no início do período de atraso (250 dias), é evidente que o 2x etf supera 1x etf.
O código fonte completo dos cálculos está disponível para os assinantes do curso Trading With Python. Caderno # 307.
Quinta-feira, 2 de janeiro de 2017.
Colocando um preço na TWTR.
Preço derivado do valor do usuário.
O TWTR é atualmente mais valioso por usuário que não é FB ou LNKD. Isso não é lógico, pois ambos os concorrentes têm mais valiosos dados de usuários pessoais à sua disposição. O GOOG tem se destacado na extração de receita de anúncios de seus usuários. Para fazer isso, tem um conjunto de ofertas altamente diversificadas, do mecanismo de busca para Google+, Docs e Gmail. TWTR não tem nada parecido com isso, enquanto seu valor por usuário é apenas 35% menor que o do Google. A TWTR tem um espaço limitado para aumentar a base de usuários, pois não oferece produtos comparáveis ​​às ofertas do FB ou do GOOG. TWTR tem sido em torno de sete anos agora e a maioria das pessoas que desejam um accout tem sua chance. O resto simplesmente não se importa. A base de usuários TWTR é volátil e é provável que se mova para o próximo hot thing quando ele estará disponível.
Preço derivado de ganhos futuros.
Conclusão.
Quinta-feira, 19 de setembro de 2018.
Curso de negociação com Python disponível!
Domingo, 18 de agosto de 2018.
Estratégia VXX curta.
Em um mundo ideal, se você segurar o tempo suficiente, um lucro gerado pela queda do tempo nos futuros e o reequilíbrio é garantido, mas, no curto prazo, você teria que passar por algumas retiradas bastante pesadas. Basta olhar para trás no verão de 2018. Fui lamentável (ou tolo) o suficiente para manter uma curta posição VXX logo antes do VIX subir. Eu quase explodi minha conta até então: 80% de redução em apenas alguns dias, resultando em uma ameaça de chamada de margem por meu corretor. Margin Call significaria cobrar a perda. Esta não é uma situação em que eu gostaria de estar novamente. Eu sabia que não seria fácil manter a cabeça fresca em todos os momentos, mas experimentar o estresse e a pressão da situação era algo diferente. Felizmente, eu sabia como VXX tende a comportar-se, então não entrei em pânico, mas troquei de lado para XIV para evitar uma chamada de margem. A história acaba bem, 8 meses depois, meu portfólio voltou à força e eu aprendi uma lição muito valiosa.
Dito isto, vamos dar uma olhada em uma estratégia que minimiza alguns dos riscos ao curvar o VXX somente quando for apropriado.
O gráfico acima mostra dados VIX-VXV desde janeiro de 2018. Os pontos de dados do ano passado são mostrados em vermelho.
Eu escolhi usar um ajuste quadrático entre os dois, aproximando VXV = f (VIX). O f (VIX) é plotado como uma linha azul.
Os valores acima da linha representam a situação quando os futuros estão em contango mais forte do que o normal. Agora eu defino um indicador delta, que é o desvio do ajuste: delta = VXV-f (VIX).
É evidente que áreas verdes correspondem a retornos negativos no VXX.
Short VXX quando delta & gt; 0 Capital constante (aposta em cada dia é de 100 $) Não há custos de deslizamento ou de transação.
Obtendo um pequeno volume de BATS.
Quinta-feira, 15 de agosto de 2018.
Construindo um indicador a partir de dados de curto volume.
Precisamos de mais informações adicionais ao que contém o preço para fazer um palpite mais informado sobre o que acontecerá no futuro próximo. Um excelente exemplo de combinar todo tipo de informações com uma análise inteligente pode ser encontrado no blog Short Side of Long. Produzir esse tipo de análise exige uma grande quantidade de trabalho, para o qual eu simplesmente não tenho tempo, pois só negocio a tempo parcial.
Então eu criei o meu próprio "painel de bordo do mercado" que coleciona informações automaticamente para mim e a apresenta de forma facilmente digerível. Nesta publicação, vou mostrar como criar um indicador com base em dados de curto volume. Esta publicação irá ilustrar o processo de coleta e processamento de dados.
A troca de BATS fornece dados de volume diários gratuitamente em seu site.
Os dados de curto volume da troca do BATS estão contidos em um arquivo de texto que é compactado. Cada dia tem seu próprio arquivo zip. Depois de baixar e descompactar o arquivo txt, isso é o que está dentro (primeiro várias linhas):
Esses dados precisam de algum trabalho antes que ele possa ser apresentado de forma significativa.
O que eu realmente quero não é apenas os dados de um dia, mas uma proporção de volume curto para volume total nos últimos anos, e eu realmente não sinto como baixar 500 arquivos zip e copiá-los em excel manualmente.
Por sorte, a automação total é apenas um par de linhas de código:
Primeiro, precisamos criar dinamicamente um URL a partir do qual um arquivo será baixado:
Passo 5: Faça um gráfico:
Domingo, 17 de março de 2018.
Negociação com curso Python - atualização de status.
A partir de hoje, vou preparar um novo site e material para o curso, que começará na segunda semana de abril.
Quinta-feira, 12 de janeiro de 2018.
Reconstruindo VXX a partir de dados futuros do CBOE.
Os scripts abaixo automatizam esse processo. O primeiro, downloadVixFutures. py, obtém os dados do cboe, salva cada arquivo em um diretório de dados e os combina em um único arquivo csv, vix_futures. csv.
O segundo script reconstituir VXX. p.p. analisa o vix_futures. csv, calcula os retornos diários do VXX e salva os resultados para reconstruídoVXX. csv.
Para verificar os cálculos, comparei meus resultados simulados com os dados do índice SPVXSTR, os dois concordam muito bem, veja os gráficos abaixo.
Código para reconstruir o VXX.
Segunda-feira, 26 de dezembro de 2018.
howto: padrão de observador.
Uma classe de ouvinte pode ser de qualquer tipo, aqui eu faço um monte de classes de ExampleListener, chamado Bob, Dave & amp; Charlie. Todos eles têm um método, isto é, está inscrito no remetente. A única coisa especial sobre o método inscrito é que deve conter três parâmetros: remetente, evento, mensagem. Sender é a referência de classe da classe Remetente, então um ouvinte saberia quem enviou a mensagem. O evento é um identificador, pelo qual geralmente uso uma string. Opcionalmente, uma mensagem é o dado que é passado para uma função.
Um detalhe agradável é que, se um método de ouvinte lança uma exceção, ele é automaticamente cancelado a inscrição em outros eventos.
Quarta-feira, 14 de dezembro de 2018.
Ploting with guiqwt.
aquisição de dados: ibpy & amp; tradingWithPython. lib. yahooData - verificar.
recipiente de dados: pandas e amp; sqlite - cheque.
biblioteca de gráficos: matplotlib - ehm. Não.
Mas, como muitas vezes acontece com o Python, alguém, em algum lugar, já escreveu um kit de ferramentas kick-ass que é perfeito para o trabalho. E parece que o guiqt é apenas isso. Os gráficos interativos são apenas algumas linhas de código agora, veja um exemplo aqui: Criando caixa de diálogo de curva. Para isso eu usei um exemplo de código de guiqwt com alguns ajustes menores.
. Se eu soubesse como definir datas no eixo dos x.
Sexta-feira, 4 de novembro de 2018.
Como configurar o ambiente de desenvolvimento do Python.
2. Instale Tortoise SVN. Este é um utilitário que você precisa para extrair o código-fonte do Google Code.
3. Instalar Pandas (biblioteca de séries temporais)
Para obter o código, use o menu de contexto 'Windows Svn Checkout' do Windows Explorer que esteja disponível após a instalação do Tortoise SVN. Marque assim (mude o diretório Checkout para o local desejado, mas deve terminar com tradingWithPython):
Ok, tudo pronto, agora você pode executar os exemplos de \ cookbok dir.
Sexta-feira, 28 de outubro de 2018.
Os pandios kung fu resolverão seus problemas de dados.
Há algum tempo, encontrei um conjunto de ferramentas de análise de dados, especialmente adequado para trabalhar com dados financeiros. Depois de apenas arranhar a superfície de suas capacidades, eu já estou impressionado com o que entrega. O pacote está sendo desenvolvido ativamente por Wes McKinney e sua ambição é criar a ferramenta de análise / manipulação de dados de código aberto mais poderosa e flexível disponível. Bem, acho que ele está bem no caminho!
Aqui está o resultado:
Cara, isso poderia me salvar uma tonelada de tempo! Mas ainda vai me ajudar no futuro, pois vou usar seu objeto DataFrame como padrão no meu trabalho adicional.

Estratégia de negociação python
Se você é um comerciante ou um investidor e gostaria de adquirir um conjunto de habilidades de negociação quantitativas, você está no lugar certo.
O curso Trading With Python irá fornecer-lhe as melhores ferramentas e práticas para pesquisa de negociação quantitativa, incluindo funções e scripts escritos por comerciantes quantitativos especializados. O curso dá o máximo impacto para o seu tempo investido e dinheiro. Ele se concentra na aplicação prática da programação ao comércio e não à informática teórica. O curso irá pagar por si mesmo rapidamente, economizando tempo no processamento manual de dados. Você passará mais tempo pesquisando sua estratégia e implementando negócios lucrativos.
Visão geral do curso.
Parte 1: princípios Você vai aprender por que a Python é uma ferramenta ideal para negociação quantitativa. Começaremos pela criação de um ambiente de desenvolvimento e, em seguida, apresentaremos as bibliotecas científicas.
Parte 2: Manipulação dos dados Saiba 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: estratégias de pesquisa Aprenda a calcular o P & L e as métricas de desempenho acompanhantes, como Sharpe e Drawdown. Desenvolva uma estratégia de negociação e otimize seu desempenho. Múltiplos exemplos de estratégias são discutidos nesta parte.
Parte 4: Indo ao vivo! Esta parte é centrada em torno da Interactive Brokers API. Você aprenderá como obter dados em estoque em tempo real e colocar ordens ao vivo.
Muitos códigos de exemplo.
O material do curso consiste em "cadernos" que contêm texto junto com um código interativo como este. Você poderá aprender interagindo com o código e modificando-o para seu próprio gosto. Será um excelente ponto de partida para escrever suas próprias estratégias.
Embora alguns tópicos sejam explicados em grande detalhe para ajudá-lo a entender os conceitos subjacentes, na maioria dos casos você nem precisa escrever seu próprio código de baixo nível, devido ao suporte de bibliotecas de código aberto existentes:
A biblioteca TradingWithPython combina uma grande parte da funcionalidade discutida neste curso como uma função pronta para usar e será usada ao longo do curso. Pandas irá fornecer-lhe todo o poder de levantamento pesado necessário no trituraçã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 2018, é o que os alunos conseguiram dizer:
Matej curso bem projetado e bom treinador. Definitivamente valeu o preço e meu tempo, Lave Jev, obviamente, conhecia suas coisas. A profundidade de cobertura foi perfeita. Se Jev executar algo assim novamente, serei o primeiro a se inscrever. John Phillips Seu curso realmente me fez começar a pensar em python para a análise do sistema de estoque.

QuantStart.
Junte-se ao portal de membros privados da Quantcademy que atende à comunidade de comerciantes de varejo de varejo em rápido crescimento. Você encontrará um grupo bem informado de mentalistas quant pronto para responder suas perguntas comerciais mais importantes.
Confira meu ebook sobre o comércio de quant, onde eu ensino você como criar estratégias de negociação sistemáticas lucrativas com ferramentas Python, desde o início.
Dê uma olhada no meu novo ebook sobre estratégias de negociação avançadas usando análise de séries temporais, aprendizado de máquina e estatísticas bayesianas, com Python e R.
Por Michael Halls-Moore em 21 de janeiro de 2017.
No artigo anterior sobre Ambientes de Análise de Análise de Pesquisa Em Python Com Pandas, criamos um ambiente de backtesting baseado em pesquisa orientado a objetos e testávamos isso em uma estratégia de previsão aleatória. Neste artigo, faremos uso da maquinaria que introduzimos para realizar pesquisas sobre uma estratégia real, ou seja, o Crossover de média móvel na AAPL.
Estratégia de Crossover Média em Movimento.
A técnica de Crossover de média móvel é uma estratégia de impulso simplista extremamente conhecida. Muitas vezes, é considerado o exemplo do "Olá Mundo" para negociação quantitativa.
A estratégia descrita aqui é longa apenas. São criados dois filtros de média móvel simples separados, com diferentes períodos de lookback, de uma série temporal específica. Os sinais para comprar o recurso ocorrem quando a média móvel de lookback mais curta excede a média móvel de lookback mais longa. Se a média mais longa exceder a média mais curta, o ativo é vendido de volta. A estratégia funciona bem quando uma série temporal entra em um período de forte tendência e, em seguida, inverte lentamente a tendência.
Para este exemplo, escolhi a Apple, Inc. (AAPL) como a série temporal, com um curto lookback de 100 dias e um longo lookback de 400 dias. Este é o exemplo fornecido pela biblioteca de negociação algorítmica de tirolesa. Assim, se quisermos implementar o nosso próprio backtester, precisamos garantir que ele coincida com os resultados na linha aérea, como um meio básico de validação.
Implementação.
Certifique-se de seguir o tutorial anterior aqui, que descreve como a hierarquia de objeto inicial para o backtester é construída, caso contrário, o código abaixo não funcionará. Para esta implementação particular usei as seguintes bibliotecas:
A implementação do ma_cross. py requer backtest. py do tutorial anterior. O primeiro passo é importar os módulos e objetos necessários:
Como no tutorial anterior, vamos sub-classificar a classe base abstrata da Estratégia para produzir MovingAverageCrossStrategy, que contém todos os detalhes sobre como gerar os sinais quando as médias móveis da AAPL se cruzam.
O objeto requer um short_window e um long_window sobre o qual operar. Os valores foram configurados para padrões de 100 dias e 400 dias, respectivamente, que são os mesmos parâmetros utilizados no exemplo principal de tirolesa.
As médias móveis são criadas usando a função pandas rolling_mean nas barras ['Fechar'] preço de fechamento do estoque da AAPL. Uma vez que as médias móveis individuais foram construídas, a série do sinal é gerada definindo a coluna igual a 1,0 quando a média móvel curta é maior do que a média móvel longa, ou 0,0 caso contrário. A partir disso, as ordens de posições podem ser geradas para representar sinais comerciais.
O MarketOnClosePortfolio é subclassado do Portfolio, que é encontrado em backtest. py. É quase idêntico à implementação descrita no tutorial anterior, com a exceção de que os negócios são agora realizados em uma base Close-to-Close, em vez de Open-to-Open. Para obter detalhes sobre como o objeto Portfolio está definido, consulte o tutorial anterior. Eu deixei o código em completo e mantenho esse tutorial autônomo:
Agora que as classes MovingAverageCrossStrategy e MarketOnClosePortfolio foram definidas, uma função __main__ será chamada para amarrar toda a funcionalidade em conjunto. Além disso, o desempenho da estratégia será examinado através de um gráfico da curva de equidade.
O objeto DataReader de pandas transfere os preços de ações da AAPL da OHLCV para o período de 1º de janeiro de 1990 a 1º de janeiro de 2002, momento em que os sinais DataFrame são criados para gerar os sinais de longo tempo. Posteriormente, o portfólio é gerado com uma base de capital inicial de 100.000 USD e os retornos são calculados na curva de patrimônio.
O passo final é usar matplotlib para plotar um gráfico de dois dígitos de ambos os preços da AAPL, superado com as médias móveis e os sinais de compra / venda, bem como a curva de equidade com os mesmos sinais de compra / venda. O código de plotagem é tomado (e modificado) do exemplo de implementação de tirolesa.
A saída gráfica do código é a seguinte. Utilizei o comando IPython% paste para colocar isso diretamente no console IPython, enquanto no Ubuntu, de modo que a saída gráfica permaneça em exibição. Os roseticks cor-de-rosa representam a compra do estoque, enquanto os bastões negros representam a venda de volta:
AAPL Moving Average Crossover Performance de 1990-01-01 a 2002-01-01.
Como pode ser visto, a estratégia perde dinheiro ao longo do período, com cinco comércios de ida e volta. Isso não é surpreendente, dado o comportamento da AAPL durante o período, que estava em uma ligeira tendência descendente, seguido de um aumento significativo em 1998. O período de lookback dos sinais da média móvel é bastante grande e isso impactou o lucro do comércio final , o que de outra forma pode ter tornado a estratégia rentável.
Em artigos subsequentes, criaremos um meio mais sofisticado de análise de desempenho, além de descrever como otimizar os períodos de lookback dos sinais de média móvel individual.
Apenas iniciando o comércio quantitativo?
3 razões para se inscrever para a lista de e-mails QuantStart:
1. Quant Trading Lessons.
Você terá acesso instantâneo a um curso de e-mail gratuito de 10 partes, repleto de sugestões e dicas para ajudá-lo a começar a negociação quantitativa!
2. Todo o conteúdo mais recente.
Todas as semanas, vou enviar-lhe um envoltório de todas as atividades no QuantStart para que você nunca mais perca uma postagem novamente.
Real, dicas de negociação viáveis, sem tonturas.

Estratégia de negociação python
Nós vamos criar uma estratégia de cruzamento Simple Moving Average neste financiamento com o tutorial Python, o que nos permitirá ficar confortáveis ​​com a criação de nosso próprio algoritmo e utilizando os recursos da Quantopian. Para começar, vá para a guia Algoritmos e escolha o botão "Algoritmo novo". Aqui, você pode nomear seu algoritmo o que quiser, e então você deve ter algum código inicial como:
Como você pode ver, alguns códigos iniciais foram preparados para nós.
Se você não está familiarizado com as médias móveis, o que faz é ter um certo número de "janelas" de dados. No caso de correr contra preços diários, uma janela seria um dia. Se você tivesse uma média móvel de 20, isso significaria uma média móvel de 20 dias. A partir daqui, a idéia é dizer que você tem uma média móvel de 20 e uma média móvel de 50. Traçar isso em um gráfico pode parecer algo como:
Aqui, a linha azul é o preço das ações, a linha vermelha é a média móvel de 20 e a linha amarela é a média móvel de 50. A idéia é que quando a média móvel de 20, que reage mais rápido, ultrapassa a média móvel de 50, isso significa que o preço pode estar tendendo, e podemos querer investir. Por outro lado, se a média móvel de 20 cai abaixo da média móvel de 50, isso talvez signifique que o preço está em declínio e que queremos vender ou investir ou até vender a empresa.
Venda curta.
A venda a descoberto é o ato de vender uma segurança que não possui. Normalmente, isso é feito emprestando a parte de outra pessoa para vender, com a promessa de comprá-lo de volta. O objetivo aqui é vender o estoque de outra pessoa, por exemplo, $ 100, porque você acha que vai cair. Então, então cai para US $ 90, você compra de volta, e depois devolve o proprietário original. A diferença de US $ 10 é sua para manter.
A venda a descoberto é arriscada por dois motivos principais. O primeiro é que, na maioria das vezes, é que a outra pessoa está emprestando as ações da empresa, então este é um empréstimo, e você pode acabar perdendo dinheiro que você nunca teve.
A próxima razão pela qual isso é arriscado é porque um short pode ir infinitamente ruim. Por exemplo, se você comprar uma empresa por US $ 100, o máximo que você pode perder é de US $ 100 por ação, pois a participação pode ser igual a zero. Se você abre uma empresa que é de US $ 100, você pode perder uma quantidade infinita de dinheiro, porque essa empresa deve pagar US $ 200 por ação, US $ 2.000 por ação. ou $ 200,000 por ação. É claro que é improvável que isso seja ruim, mas o ponto é: você pode perder muito mais do que seu investimento original, e isso geralmente é acompanhado pelo fato de que o investimento original não era mesmo com o dinheiro, era um empréstimo.
Normalmente, você será emprestado a parte pelo seu corretor ou banco, que também tem o direito de reclamar as ações sempre que quiserem. Isso significa que as ações de US $ 100 podem subir para US $ 110 antes de descer para US $ 90, mas o banco pode reclamar as ações na marca de US $ 110 e você está pagando essa conta.
Olhando para o gráfico acima, parece-nos gostaríamos de fazer muito bem. Perdemos os picos absolutos e as tarifas do preço, mas, em geral, pensamos que faríamos tudo bem com esta estratégia.
Toda vez que você cria um algoritmo com Zipline ou Quantopian, você precisará ter os métodos initialize e handle_data. Eles devem ser incluídos em todos os algoritmos que você inicia de novo.
O método de inicialização é executado uma vez no início do algoritmo (ou uma vez por dia, se você estiver executando o algoritmo ao vivo em tempo real). Handle_data é executado uma vez por período. No nosso caso, estamos executando dados diários, então isso significa que ele será executado uma vez por dia.
Dentro do nosso método de inicialização, geralmente passamos esse parâmetro de contexto. Contexto é um dicionário de Python, que é o que usaremos para rastrear o que de outra forma poderemos usar variáveis ​​globais. O contexto acompanhará vários aspectos do nosso algoritmo de negociação à medida que o tempo passa, para que possamos fazer referência a essas coisas dentro do nosso script.
Dentro do nosso método de inicialização:
O que isso faz, é que estabelece a nossa segurança para a comercialização para o SPY. Esta é a ETF Spyder S & P 500 (Exchange Traded Fund), que é um método que podemos usar para trocar o índice S & P 500.
Isso é tudo o que faremos agora no nosso método de inicialização, a seguir iniciaremos nosso método handle_data:
Observe aqui que passamos o contexto e um novo parâmetro chamado dados. Dados rastreiam os dados atuais das empresas dentro do nosso "universo comercial". O universo é a coleção de empresas às quais estamos potencialmente interessados ​​em investir. No nosso caso, estabelecemos este universo no início no método de inicialização, definindo todo o nosso universo no SPY.
Simplificando, o contexto var é usado para rastrear nossa atual situação de investimento, com coisas como nosso portfólio e dinheiro. A variável de dados é usada para rastrear nosso universo de empresas e suas informações.
.mavg () é um método incorporado em Quantopian, e "data [context. security]" é nós referenciando a chave por este nome no nosso dicionário de contexto.
Poderíamos chamar esses context. MA1 e context. MA2 se quisermos armazená-los no nosso dicionário de contexto e usá-lo fora do nosso método handle_data, mas não precisamos acessar esses dados fora daqui, então nós apenas os faremos variáveis ​​locais.
Agora que temos as médias móveis calculadas, estamos prontos para obter mais lógica. Para negociar, precisamos ter lógica como se os MAs se cruzassem, mas também, antes que possamos fazer um comércio, precisamos ver se temos dinheiro suficiente para fazer uma compra, precisamos saber o preço do segurança, e devemos verificar se já temos essa posição. Para fazer isso, adicionamos o seguinte ao nosso método handle_data:
Nós pegamos o preço atual referenciando dados, que é nossa maneira de rastrear nosso universo de empresas (atualmente apenas o S ​​& P 500 ETF $ SPY). Em seguida, verificamos para ver as posições atuais que temos ao fazer referência ao nosso contexto. Portfólio. Aqui, podemos fazer referência a todos os tipos de coisas em relação ao nosso portfólio, mas, agora mesmo, queremos verificar nossas posições. Isso retorna um dicionário de todas as suas posições, o valor, quanto foi preenchido e assim por diante. Então, estamos interessados ​​em uma posição específica em uma empresa, então fazemos context. portfolio. positions [symbol ('SPY')]. A partir daqui, nossa única preocupação agora é apenas ver se temos algum investimento, então o atributo que mais nos interessa é a quantidade de posições que temos, então usamos. amount no final.
Até agora, criamos as informações necessárias para que possamos saber antes de realmente usar alguma lógica para executar negócios, mas não escrevemos nada para realmente fazer a negociação. É o que vamos cobrir no próximo tutorial.

Comments