Backtesting de um Crossover Médio Mínimo em Python com pandas No artigo anterior sobre Ambientes de Backtesting 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, a saber, o Crossover de média móvel na AAPL. Estratégia de Crossover média móvel A técnica de Crossover de média móvel é uma estratégia de impulso simplista extremamente conhecida. Muitas vezes é considerado o exemplo do Hello World 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 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 eu usei as seguintes bibliotecas: A implementação do macross. 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 básica abstrata 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 uma janela curta e uma longa janela para operar. Os valores foram configurados para padrões de 100 dias e 400 dias, respectivamente, que são os mesmos parâmetros usados no exemplo principal de tirolesa. As médias móveis são criadas usando a função pandas rollingmean nas barras. O preço de fechamento fechado do estoque 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 de negociação. 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 principal 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 baixa 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, em que ponto 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 AAPL, superado com as médias móveis e os sinais de buysell, bem como a curva de equidade com os mesmos sinais de compra. 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. Eu usei o comando de pasta IPython para colocar isso diretamente no console do IPython, enquanto no Ubuntu, de modo que a saída gráfica permaneceu em exibição. As barras-de-rosa cor-de-rosa representam a compra do estoque, enquanto os bastões negros representam vendê-lo de volta: como pode ser visto, a estratégia perde dinheiro durante o 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, bem como descrevendo como otimizar os períodos de lookback dos sinais de média móvel individual. A Zipline é uma biblioteca de negociação algorítmica Pythonic. É um sistema orientado a eventos que oferece suporte ao backtesting e ao live-trading. Zipline é atualmente usado na produção como o motor backtesting e live-trading que alimenta a Quantopian 8211, uma plataforma hospedada gratuita, centrada na comunidade, para construir e executar estratégias comerciais. Facilidade de uso: Zipline tenta sair do seu caminho para que você possa se concentrar no desenvolvimento de algoritmos. Veja abaixo um exemplo de código. Zipline vem 8220batteries included8221 tantas estatísticas comuns como a média móvel e a regressão linear podem ser facilmente acessadas a partir de um algoritmo escrito pelo usuário. A entrada de dados históricos e o resultado das estatísticas de desempenho baseiam-se em Pandas DataFrames para integrar-se bem no sistema ecológico PyData existente. Bibliotecas de estatística e aprendizagem de máquinas, como matplotlib, scipy, statsmodels e sklearn, ajudam a desenvolver, analisar e visualizar sistemas de negociação de ponta. Instalação Instalação com pip Supondo que você tenha todas as dependências não-Python necessárias (veja a nota abaixo), você pode instalar Zipline com pip via: Nota: Instalar Zipline via pip é um pouco mais envolvido que o pacote Python médio. Simplesmente executando o pipi de instalação de pipa provavelmente falhará se você nunca instalou nenhum pacote científico de Python antes. Existem duas razões para a complexidade adicional: Zipline envia várias extensões C que exigem acesso à API CPython C. Para construir as extensões C, pip precisa acessar os arquivos de cabeçalho CPython para sua instalação em Python. Zipline depende do numpy. A biblioteca central para computação numérica em matriz em Python. Numpy depende de ter as rotinas de álgebra linear LAPACK disponíveis. Como o LAPACK e os cabeçalhos do CPython são dependências binárias, a maneira correta de instalá-los varia de plataforma em plataforma. No Linux, os usuários geralmente adquirem essas dependências através de um gerenciador de pacotes como o apt. Yum. Ou pacman. No OSX, o Homebrew é uma escolha popular que oferece funcionalidade similar. Consulte a documentação completa de instalação do Zipline para obter mais informações sobre como adquirir dependências binárias para sua plataforma específica. Outra maneira de instalar a Zipline é através do gerenciador de pacotes conda, que vem como parte da Anaconda ou pode ser instalado via conda de instalação de pip. Uma vez configurado, você pode instalar a Zipline do nosso canal de Quantopian: as plataformas atualmente suportadas incluem: Contribuições de Início Rápido Há dois meses atrás, a Companhia colocou uma atualização importante. Você pode ler sobre isso aqui. Muita da nossa API mudou para melhor, e, infelizmente, isso significa que algum código antigo quebrou. Aqui está o guia de migração para a nova API. Basicamente, armazenando o valor da Média de Movimento do Casco como datatock. HMA não é mais possível. Eu recomendaria que você mude para usar um dict que seja uma propriedade do contexto. Como este: o material deste site é fornecido apenas para fins informativos e não constitui uma oferta de venda, solicitação de compra ou recomendação ou endosso para qualquer segurança ou estratégia, nem constitui uma oferta de prestação de serviços de consultoria de investimento Por Quantopian. Além disso, o material não oferece nenhuma opinião em relação à adequação de qualquer segurança ou investimento específico. A Quantopian não oferece garantias quanto à exatidão ou integridade das opiniões expressas no site. Os pontos de vista estão sujeitos a alterações e podem ter se tornado pouco confiáveis por vários motivos, incluindo mudanças nas condições do mercado ou nas circunstâncias econômicas. Todos os investimentos envolvem risco, incluindo perda de principal. Você deve consultar um profissional de investimentos antes de tomar decisões de investimento. Então, Nathan, por que ganhou uma propriedade dinâmica anexada ao objeto Expando abaixo de Mark, veja o código abaixo, isso parece funcionar no QII. Bem, além de todas as mensagens Q-broke-the-Web. Criminy Q, me dê uma opção quotQVersion 1.0quot em meus algos, então eu não tenho que experimentar as dores de crescimento de seu adolescente. Eu não tenho tempo para deixar isso escorrer o backtest excitantemente lento, então eu postei o código aqui.
Комментариев нет:
Отправить комментарий