Wednesday 6 December 2017

Python pandas exponencial móvel média


Backtesting um Crossover de média móvel em Python com pandas No artigo anterior sobre Research Backtesting Ambientes Em Python Com Pandas criamos um ambiente de backtesting baseado em pesquisa orientada a objetos e testá-lo 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 Médio Móvel na AAPL. Estratégia de Crossover Médio em Movimento A técnica de Crossover de Moving Average é uma estratégia de momentum simplista extremamente bem conhecida. É freqüentemente considerado o exemplo Hello World para negociação quantitativa. A estratégia aqui descrita é longa. São criados dois filtros separados de média móvel simples, com períodos de retrocesso variáveis, de uma série temporal específica. Os sinais para comprar o ativo ocorrem quando a média móvel de retrocesso mais curta excede a média móvel de retrocesso mais longa. Se a média mais longa subseqüentemente exceder a média mais curta, o ativo é vendido de volta. A estratégia funciona bem quando uma série de tempo entra em um período de forte tendência e, em seguida, lentamente inverte a tendência. Para este exemplo, eu escolhi a Apple, Inc. (AAPL) como a série de tempo, com um lookback curto de 100 dias e um lookback longo de 400 dias. Este é o exemplo fornecido pela biblioteca de negociação algorítmica do zipline. Assim, se queremos implementar nosso próprio backtester, precisamos garantir que ele corresponda aos resultados em tirolesa, 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 em particular, 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 subclassificar a classe base Abstract de Estratégia para produzir MovingAverageCrossStrategy. Que contém todos os detalhes sobre como gerar os sinais quando as médias móveis de AAPL cruzam-se uns aos outros. O objeto requer uma janela curta e uma janela longa sobre a qual operar. Os valores foram ajustados 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 rollingmean pandas sobre as barrasFechar fechar preço do estoque AAPL. Uma vez construídas as médias móveis individuais, a Série de sinais é gerada ajustando a coluna igual a 1,0 quando a média móvel curta é maior que a média móvel longa, ou 0,0 caso contrário. A partir daí, as ordens de posição podem ser geradas para representar sinais de negociação. O MarketOnClosePortfolio é subclassificado do Portfolio. Que é encontrado em backtest. py. É quase idêntico à implementação descrita no tutorial anterior, com a exceção de que as negociações são agora realizadas em uma base Close-to-Close, ao invés de uma base Open-to-Open. Para obter detalhes sobre como o objeto Portfolio está definido, consulte o tutorial anterior. Ive deixou o código em para a integridade e para manter este tutorial auto-contido: Agora que as classes MovingAverageCrossStrategy e MarketOnClosePortfolio foram definidas, uma função principal será chamado para amarrar toda a funcionalidade em conjunto. Além disso, o desempenho da estratégia será analisado através de um gráfico da curva de equivalência patrimonial. O objeto DataReader do pandas faz o download dos preços OHLCV das ações da AAPL 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 long-only. Posteriormente, a carteira é gerada com uma base de capital inicial de 100.000 USD e os retornos são calculados na curva de equivalência patrimonial. O passo final é usar matplotlib para traçar um gráfico de dois dígitos de ambos os preços AAPL, sobreposta com as médias móveis e os sinais de buysell, bem como a curva de equidade com os mesmos sinais de buysell. O código de plotagem é obtido (e modificado) a partir do exemplo de implementação da tirolesa. A saída gráfica do código é a seguinte. Eu fiz uso do comando IPython colar para colocar isso diretamente no console IPython enquanto no Ubuntu, de modo que a saída gráfica permaneceu na vista. Os upticks cor-de-rosa representam a compra do estoque, enquanto os downticks 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. Isto não é surpreendente dado o comportamento da AAPL ao longo do período, que estava em uma ligeira tendência descendente, seguido por um aumento significativo começando em 1998. O período de retrocesso dos sinais de média móvel é bastante grande e isso afetou o lucro do comércio final , O que de outra forma pode ter feito a estratégia rentável. Em artigos subseqüentes, criaremos um meio mais sofisticado de analisar o desempenho, bem como descrevendo como otimizar os períodos de retorno dos sinais individuais de média móvel. Começando com Quantitative TradingSmoothing com Exponentially Weighted Moving Averages Uma média móvel leva uma série de tempo barulhento e substitui cada valor com o valor médio de uma vizinhança sobre o valor dado. Esta vizinhança pode consistir em dados puramente históricos, ou pode ser centrada sobre o valor dado. Além disso, os valores na vizinhança podem ser ponderados usando diferentes conjuntos de pesos. Aqui está um exemplo de uma média móvel ponderada de três pontos, usando dados históricos, Aqui, representa o sinal suavizado e representa a série de tempo ruidosa. Em contraste com as médias móveis simples, uma média móvel exponencialmente ponderada (EWMA) ajusta um valor de acordo com uma soma exponencialmente ponderada de todos os valores anteriores. Esta é a idéia básica, Isso é bom porque você não precisa se preocupar com ter uma janela de três pontos, versus uma janela de cinco pontos, ou se preocupar com a adequação de seu esquema de ponderação. Com o EWMA, as perturbações anteriores 8220 lembradas, 8221 e 8220 são esquecidas, 8221 pelo termo na última equação, enquanto que com uma janela ou vizinhança com limites discretos, uma perturbação é esquecida assim que passa para fora da janela. Avaliando o EWMA para acomodar as tendências Depois de ler sobre EWMAs em um livro de análise de dados, eu tinha ido longitudinalmente feliz usando esta ferramenta em cada aplicação única suavização que me deparei. Não foi até mais tarde que eu aprendi que a função EWMA é realmente apenas adequado para dados estacionários, ou seja, dados sem tendências ou sazonalidade. Em particular, a função EWMA resiste tendências longe da média atual que 8282s já 8220seen8221. Assim, se você tem uma função de som ruidosa que vai de 0, para 1 e, em seguida, de volta para 0, então a função EWMA retornará valores baixos no lado de subida e altos valores no lado de down-hill. Uma maneira de contornar isso é suavizar o sinal em ambas as direções, marchar para frente e, em seguida marchar para trás, e, em seguida, média dos dois. Aqui, usaremos a função EWMA fornecida pelo módulo pandas. Holt-Winters Second Order EWMA E aqui está algum código Python implementando o método de segunda ordem Holt-Winters em outra função de som ruidoso, como antes. Analogamente, DataFrame tem um cov de método para calcular covariancias pairwise entre as séries no DataFrame, também excluindo valores NAnull. Assumindo que os dados faltantes estão faltando aleatoriamente isto resulta em uma estimativa para a matriz de covariância que é imparcial. No entanto, para muitas aplicações esta estimativa pode não ser aceitável porque a matriz de covariância estimada não é garantida para ser semi-definitiva positiva. Isto poderia levar a correlações estimadas com valores absolutos que são maiores do que um, ou uma matriz de covariância não-invertible. Consulte Estimativa de matrizes de covariância para obter mais detalhes. DataFrame. cov também suporta uma palavra-chave opcional minperiods que especifica o número mínimo necessário de observações para cada par de colunas, a fim de ter um resultado válido. Os pesos usados ​​na janela são especificados pela palavra-chave wintype. A lista de tipos reconhecidos são: boxcar triang blackman hamming bartlett parzen bohman blackmanharris nuttall barthann kaiser (necessidades beta) gaussian (necessidades std) generalgaussian (precisa de poder, largura) slepian (precisa de largura). Observe que a janela do boxcar é equivalente a mean (). Para algumas funções de janelas, parâmetros adicionais devem ser especificados: Para. sum () com um wintype. Não há normalização feita para os pesos para a janela. Passando pesos personalizados de 1, 1, 1 irá produzir um resultado diferente do que passando pesos de 2, 2, 2. Por exemplo. Ao passar um wintype em vez de especificar explicitamente os pesos, os pesos já estão normalizados para que o maior peso seja 1. Em contraste, a natureza do cálculo. mean () é tal que os pesos são normalizados em relação uns aos outros. Os pesos de 1, 1, 1 e 2, 2, 2 produzem o mesmo resultado. Rolling de reconhecimento de tempo na versão 0.19.0. Novo na versão 0.19.0 são a capacidade de passar um offset (ou conversível) para um método. rolling () e tê-lo produzir janelas de tamanho variável com base na janela de tempo passada. Para cada ponto de tempo, isso inclui todos os valores precedentes que ocorrem dentro do delta de tempo indicado. Isto pode ser particularmente útil para um índice de frequência de tempo não-regular. Este é um índice de freqüência regular. Usando um parâmetro de janela inteira funciona para rolar ao longo da freqüência da janela. Especificar um deslocamento permite uma especificação mais intuitiva da freqüência de rolamento. Usando um índice não regular, mas ainda monotônico, rolar com uma janela de número inteiro não dá nenhum cálculo especial. A utilização da especificação de tempo gera janelas variáveis ​​para estes dados esparsos. Além disso, agora permitimos que um opcional parâmetro para especificar uma coluna (em vez do padrão do índice) em um DataFrame. Rolling vs Resampling Time-aware Usando. rolling () com um índice baseado em tempo é bastante semelhante a resampling. Ambos operam e executam operações redutoras em objetos de pandas indexados no tempo. Ao usar. rolling () com um deslocamento. O deslocamento é um tempo-delta. Tome uma janela olhando para trás-em-tempo, e agregar todos os valores nessa janela (incluindo o ponto final, mas não o ponto de início). Este é o novo valor nesse ponto no resultado. Estas são janelas de tamanho variável no espaço de tempo para cada ponto da entrada. Você obterá um resultado do mesmo tamanho que a entrada. Ao usar. resample () com um deslocamento. Construa um novo índice que é a freqüência do deslocamento. Para cada compartimento de freqüência, o agregado aponta da entrada dentro de uma janela que olha para trás-no tempo que caem nesse compartimento. O resultado dessa agregação é a saída para esse ponto de freqüência. As janelas são tamanho de tamanho fixo no espaço de freqüência. Seu resultado terá a forma de uma freqüência regular entre o min eo máximo do objeto de entrada original. Para resumir. Rolling () é uma operação de janela baseada em tempo, enquanto. resample () é uma operação de janela baseada em freqüência. Centralização do Windows Por padrão, as etiquetas são definidas para a borda direita da janela, mas uma palavra-chave central está disponível para que as etiquetas possam ser definidas no centro. Funções de janelas binárias cov () e corr () podem calcular as estatísticas da janela em movimento sobre duas séries ou qualquer combinação de DataFrameSeries ou DataFrameDataFrame. Aqui está o comportamento em cada caso: duas séries. Calcular a estatística para o emparelhamento. DataFrameSeries. Calcular as estatísticas para cada coluna do DataFrame com a série passada, retornando um DataFrame. DataFrameDataFrame. Por padrão, calcular a estatística de correspondência de nomes de colunas, retornando um DataFrame. Se o argumento de palavra-chave pairwiseTrue é passado, em seguida, calcula a estatística para cada par de colunas, retornando um painel cujos itens são as datas em questão (consulte a próxima seção). Calculando as covariâncias e as correlações em pares na análise de dados financeiros e outros campos comuns para calcular matrizes de covariância e correlação para uma coleção de séries temporais. Muitas vezes também está interessado em matrizes de covariância de janela móvel e de correlação. Isso pode ser feito passando o argumento de palavra-chave pairwise, que no caso de entradas DataFrame irá produzir um painel cujos itens são as datas em questão. No caso de um único argumento de DataFrame, o argumento pairwise pode até ser omitido: Os valores ausentes são ignorados e cada entrada é calculada usando as observações completas pairwise. Consulte a seção de covariância para ressalvas associadas com este método de cálculo de matrizes de covariância e correlação. Além de não ter um parâmetro de janela, essas funções têm as mesmas interfaces que suas contrapartes de rolagem. Como acima, os parâmetros que todos aceitam são: minperiods. Limite de pontos de dados não nulos a exigir. O padrão é o mínimo necessário para calcular estatística. Nenhum NaNs será emitido uma vez que os pontos de dados não-nulos de minperiods foram vistos. centro. Boolean, se as etiquetas devem ser definidas no centro (o padrão é False) A saída dos métodos. rolling e. expanding não retorna um NaN se houver pelo menos valores não nulos de minperiods na janela atual. Isso difere do cumsum. Cumprod. Cummax. E cummin. Que retornam NaN na saída onde quer que um NaN seja encontrado na entrada. Uma estatística de janela de expansão será mais estável (e menos responsiva) do que sua contrapartida de janela de rolamento à medida que o tamanho de janela crescente diminui o impacto relativo de um ponto de dados individual. Como exemplo, aqui está a saída mean () para o conjunto de dados da série de tempo anterior: Exponentially Weighted Windows Um conjunto relacionado de funções são exponencialmente ponderadas versões de várias das estatísticas acima. Uma interface semelhante ao. rolling e. expanding é acessada através do método. ewm para receber um objeto EWM. Uma série de expansão EW (exponencialmente ponderada) métodos são fornecidos: Obrigado por postar o EMA. E sim, o TAlib deveria estar realmente disponível. Há algum trabalho sobre isso que realmente parece muito promissor (githubquantopianziplinepull100). Vou tentar puxar isso em breve para torná-lo disponível para um público maior. O material deste site é fornecido apenas para fins informativos e não constitui uma oferta de venda, uma solicitação de compra ou uma recomendação ou endosso para qualquer segurança ou estratégia, nem constitui uma oferta para prestar serviços de consultoria de investimento pela Quantopian. Além disso, o material não oferece opinião sobre a adequação de qualquer garantia ou investimento específico. Quantopian não dá garantias quanto à exatidão ou integridade das opiniões expressas no site. As opiniões estão sujeitas a alterações e podem ter-se tornado pouco fiáveis ​​por várias razões, incluindo alterações nas condições de mercado ou circunstâncias económicas. Todos os investimentos envolvem risco, incluindo perda de capital. Você deve consultar com um profissional de investimento antes de tomar qualquer decisão de investimento. Ele faz. Mas a maior parte do trabalho de descobrir o melhor caminho já está feito. Só precisamos finalizá-lo. Depois disso, ele é apenas um monte de copyamppaste para embrulhar toda a biblioteca TAlib. Há muitas coisas boas nas obras para resolver certos defeitos. É uma questão de recursos para a maior parte. O material deste site é fornecido apenas para fins informativos e não constitui uma oferta de venda, uma solicitação de compra ou uma recomendação ou endosso para qualquer segurança ou estratégia, nem constitui uma oferta para prestar serviços de consultoria de investimento pela Quantopian. Além disso, o material não oferece opinião sobre a adequação de qualquer garantia ou investimento específico. Quantopian não dá garantias quanto à exatidão ou integridade das opiniões expressas no site. As opiniões estão sujeitas a alterações e podem ter-se tornado pouco fiáveis ​​por várias razões, incluindo alterações nas condições de mercado ou circunstâncias económicas. Todos os investimentos envolvem risco, incluindo perda de capital. Você deve consultar com um profissional de investimento antes de tomar qualquer decisão de investimento.

No comments:

Post a Comment