Thursday, 23 November 2017

Moving average pandas dataframe


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édia 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 maior tempo de retrocesso. 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 essa 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 cruzar 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 o preço de fecho barsClose 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, em vez 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 todas as funcionalidades 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. Subseqüentemente, a carteira é gerada com uma base de capital inicial de 100.000 USD e os retornos são calculados na curva de patrimônio líquido. O passo final é usar matplotlib para traçar um gráfico de dois dígitos de ambos os preços da AAPL, superposto com as médias móveis e sinais de compra / venda, bem como a curva de equidade com os mesmos sinais de compra / venda. 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, para que a saída gráfica permaneceu na vista. Os upticks rosa representam a compra do estoque, enquanto os downticks pretos representam vendê-lo de volta: Como pode ser visto a estratégia perde dinheiro durante o período, com cinco negócios de ida e volta. Isto não é surpreendente, tendo em conta o comportamento da AAPL ao longo do período, que registou uma ligeira tendência descendente, seguida de um aumento significativo a partir de 1998. O período de retrocesso dos sinais da média móvel é bastante grande e isso afectou o lucro do comércio final , O que de outra forma pode ter feito a estratégia rentável. Em artigos subseqüentes vamos criar um meio mais sofisticado de analisar o desempenho, bem como descrevendo como otimizar os períodos de lookback dos sinais individuais de média móvel. Pandas Column Operations (operações matemáticas básicas e médias móveis) Neste Pandas com vídeo tutorial Python com Código de exemplo, nós cobrimos algumas das operações rápidas e básicas que podemos realizar em nossos dados. Digamos que você tenha um conjunto de dados ao qual deseja adicionar uma média móvel ou talvez queira fazer alguns cálculos matemáticos com base em alguns bits de dados em outras colunas, adicionando o resultado a uma nova coluna. Vamos ver como podemos fazer isso: Tudo o que precede deve ser entendido, uma vez que já foi coberto até este ponto. Agora, vamos fazer uma nova coluna, chamando H-L, onde os dados na coluna é o resultado do preço alto menos o preço baixo. Aqui, bem como você faria com um dicionário, nós definimos um novo objeto em nossos dados Pandas, nomeando-o H-L. A partir daí, dizemos que o valor deste objeto H-L é (df. High - df. Low). Ele ainda não foi levantado, mas isso é realmente muito interessante que somos capazes de fazer isso, mas também pode ser confuso. Podemos também dizer dfH-L dfHigh-dfLow, mas, uma vez que Pandas é tão fortemente baseado em objetos, foram capazes de também referência-lo puramente como um objeto Seu até você como você quer fazê-lo. Eu prefiro tratá-lo como um objeto, já que é o que é. Depois weve executar isso, podemos ver através da impressão de cabeça (), que weve tem uma nova coluna agradável contendo nossos novos dados Thats arrumado, mas o que sobre referência de dados anteriores em outras colunas Podemos fazê-lo Eu quero fazer uma média móvel Claro nós podemos. As médias móveis são construídas realmente em pandas, chamado rollingmean. Acima, weve definido ainda outra coluna, muito como podemos um dicionário, e disse que a coluna é igual a df. rollingmean () do preço de fechamento. Nosso segundo parâmetro aqui é o período de tempo para esta média móvel. Então, nós apenas imprimimos uma fatia dos dados, do 200º elemento para o 210º. Não podemos realmente fazer df. head () aqui. Poderíamos, mas os dados para o 100MA wouldnt ser calculado até que tivemos 100 peças de dados para calcular. Outra função embutida interessante com Pandas é diff (): Com a função diff (), foram capazes de calcular a diferença, ou alterar a partir do valor anterior, para uma coluna. Portanto, existem algumas operações básicas e uma introdução inicial para alguns dados de manipulação e análise com Pandas. Analogamente, o DataFrame tem um método cov para calcular covariancias pairwise entre as séries no DataFrame, também excluindo NA / valores nulos. Assumindo que os dados ausentes estão faltando aleatoriamente, isso 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 pode levar a correlações estimadas com valores absolutos que são maiores do que um, e / 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 anteriores ocorrendo 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 inteiro 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 realizam operações redutoras em objetos 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 desse 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 DataFrame / Series ou DataFrame / DataFrame. Aqui está o comportamento em cada caso: duas séries. Calcular a estatística para o emparelhamento. DataFrame / Series. Calcular as estatísticas para cada coluna do DataFrame com a série passada, retornando um DataFrame. DataFrame / DataFrame. Por padrão, calcular a estatística para nomes de colunas correspondentes, 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 de rotação Na análise de dados financeiros e em outros campos, é comum calcular covariâncias e matrizes de correlação para uma coleção de séries temporais. Muitas vezes também se interessa por 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á render 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 a 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 deseja definir os rótulos 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 nulos de minperiods na janela atual. Isso difere de cumsum. Cumprod. Cummax. E cummin. Que retornam NaN na saída sempre que um NaN é encontrado na entrada. Uma estatística de janela em expansão será mais estável (e menos responsiva) do que a sua contrapartida de janela de rolamento à medida que o tamanho de janela crescente diminui o impacto relativo de um ponto de dados individual. Como um exemplo, aqui está a saída mean () para o conjunto de dados de séries temporais anteriores: 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 pelo método. ewm para receber um objeto EWM. São fornecidos vários métodos EW em expansão (ponderados exponencialmente):

No comments:

Post a Comment