Thursday 16 November 2017

Moving Average Python


Apresentamos anteriormente como criar médias móveis usando python. Este tutorial será uma continuação deste tópico. Uma média móvel no contexto da estatística, também chamada média de rolamento / corrida, é um tipo de resposta de impulso finito. Em nosso tutorial anterior traçamos os valores das matrizes xey: Let8217s traçam x contra a média móvel de y que chamaremos yMA: Em primeiro lugar, let8217s equalizar o comprimento de ambos os arrays: E para mostrar isso no contexto: O resultado Gráfico: Para ajudar a entender isso, let8217s trama dois relacionamentos diferentes: x vs y e x vs MAy: A média móvel aqui é a parcela verde que começa em 3: Compartilhe isso: Como este: Related Post navegação Deixe uma resposta Cancelar resposta Very useful Eu gostaria de ler a última parte em grandes conjuntos de dados Espero que ele virá em breve8230 d blogueiros como este: Backtesting um Crossover média móvel em Python com pandas Por Michael Halls-Moore em 21 de janeiro de 2014 No artigo anterior sobre Research Backtesting Ambientes Em Python With Pandas criamos um ambiente de backtesting baseado em pesquisa orientado a objetos e o testamos 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, 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. Michael Halls-Moore Mike é o fundador da QuantStart e tem estado envolvido na indústria de finanças quantitativas nos últimos cinco anos, principalmente como um desenvolvedor quant e mais tarde como consultor de comerciante quant para hedge funds. In minha última frase eu estava tentando indicar Porque ele ajuda a flutuação de erro de ponto. Se dois valores são aproximadamente a mesma ordem de grandeza, então adicioná-los perde menos precisão do que se você adicionou um número muito grande para um muito pequeno. O código combina valores quotadjacentquot de uma forma que mesmo somas intermediárias devem sempre ser razoavelmente próximos em magnitude, para minimizar o erro de ponto flutuante. Nada é à prova de tolo, mas este método salvou um casal projetos muito mal implementados na produção. Ndash Mayur Patel Dec 15 14 at 17:22 Alleo: Em vez de fazer uma adição por valor, você estará fazendo dois. A prova é o mesmo que o problema de bit-flipping. No entanto, o ponto dessa resposta não é necessariamente desempenho, mas precisão. O uso de memória para a média de valores de 64 bits não excederia os 64 elementos no cache, portanto também é amigável no uso de memória. Ndash Mayur Patel Dec 29 14 às 17:04 UPD: soluções mais eficientes foram propostas por Alleo e jasaarim. Você pode usar np. convolve para isso: O argumento mode especifica como lidar com as arestas. Eu escolhi o modo válido aqui porque eu acho que é como a maioria das pessoas esperam correr significa trabalhar, mas você pode ter outras prioridades. Aqui está um gráfico que ilustra a diferença entre os modos: Você pode calcular uma corrida média com: Felizmente, numpy inclui uma função convolve que podemos usar para acelerar as coisas. A média de corrida é equivalente a convolver x com um vetor que é N longo, com todos os membros igual a 1 / N. A implementação numpy de convolve inclui o transiente inicial, então você tem que remover os primeiros N-1 pontos: Na minha máquina, a versão rápida é 20-30 vezes mais rápida, dependendo do comprimento do vetor de entrada e do tamanho da janela de média . Note que convolve não incluir um mesmo modo que parece que ele deve abordar a questão transitória de partida, mas ele divide-lo entre o início eo fim. Ele remove o transitório do final, eo início não tem um. Bem, eu acho que é uma questão de prioridades, eu não preciso do mesmo número de resultados à custa de obter uma inclinação para zero que não está lá nos dados. BTW, aqui está um comando para mostrar a diferença entre os modos: modos (39full39, 39same39, 39valid39) plot (convolve (ones ((200)), uns (50,)) 4750, modem) Eixo (-10, 251, -.1, 1.1) legenda (modos, loc39lower center39) (com pyplot e numpy importados). Ndash lapis Mar 24 14 at 13:56 I39m sempre irritado pela função de processamento de sinal que retornam sinais de saída de forma diferente do que os sinais de entrada quando ambas as entradas e saídas são da mesma natureza (por exemplo, ambos os sinais temporais). Ele quebra a correspondência com a variável independente relacionada (por exemplo, tempo, freqüência) tornando a plotagem ou comparação não uma questão direta. De qualquer maneira, se você compartilhar o sentimento, você pode querer mudar as últimas linhas da função proposta como ynp. convolve (w / w. sum (), s, mode39same39) return ywindowlen-1 :-( windowlen-1) ndash Christian O39Reilly 25 de agosto às 19:56 lapis sim, mas vamos dizer que você usar o método cumsum no primeiro tick e salvar a sua média de rolamento médio para o próximo carrapato. Cada carrapato depois disso você só tem que acrescentar o mais recente valor da média móvel para a sua matriz de rolamento em armazenamento. Usando este método você não está recalculando coisas que você já calculou: Na primeira vez que você cumsum depois disso, basta acrescentar o quotmean dos elementos do último período que é 2x mais rápido para todos os carrapatos subseqüentes. Ndash litepresence Jun 10 at 12: 29numpy. average Eixo ao longo do qual a média a. Se Nenhum. A média é feita sobre o arranjo achatado. Pesos. Arraylike, optional Uma matriz de pesos associados com os valores em a. Cada valor em a contribui para a média de acordo com seu peso associado. A matriz de pesos pode ser 1-D (caso em que seu comprimento deve ser o tamanho de um ao longo do eixo dado) ou da mesma forma como a. Se weightsNone. Então todos os dados em um são assumidos para ter um peso igual a um. devolvida . Bool, opcional O padrão é False. Se for verdade . A tupla (média de sumofweights) é retornada, caso contrário apenas a média é retornada. Se weightsNone. Sumofweights é equivalente ao número de elementos sobre os quais a média é tomada. Média, sumofweights. Arraytype ou double Retorna a média ao longo do eixo especificado. Quando retornado é True. Retorna uma tupla com a média como o primeiro elemento ea soma dos pesos como o segundo elemento. O tipo de retorno é Float se a for de tipo inteiro, caso contrário ele é do mesmo tipo que a. Sumofweights é do mesmo tipo que a média. Forecasting e Python Parte 1 8211 Médias Móveis Gostaria de dar início a uma série que usa metodologias de previsão diferentes e as demonstra utilizando o Python. Para começar o 8216ball rolling8217 eu quero começar com as médias móveis e idealmente terminar a série sobre a previsão com modelos ARIMA (AutoRegressive Integrated Moving Average). Meu objetivo é ter esse conteúdo em teoria e matemática e, em vez disso, focar na aplicação em código. Eu escrevo estas tarde da noite, então sinta-se livre para ping-me se eu tiver quaisquer erros. Eu freqüentemente me refiro ao Y predito como chapéu de Y, se você não está ciente, na equação o símbolo de chapéu está localizado sobre o previsto Y. Previsão com média móvel As médias móveis devem ser um ótimo lugar para começar cada livro que eu tenho começa com a movimentação Médias para lançar as bases. As fórmulas são simples e divertidas. Equação 1: Médias Móveis Equação O modelo de médias móveis calcula a média de cada observação nos períodos k. No meu código e resultados vou usar uma média móvel de 12 períodos, portanto, k12. Y hat (t1) é o valor de previsão para o próximo período e Y (t) é o valor real no período t. Um período pode ser horas, dias, semanas, meses, ano, etc. Como o modelo é o mesmo independentemente, não vou especificar uma unidade. Yvalues ​​é um subconjunto de todos os valores Y reais introduzidos no código. Definir meu 8216k8217 (períodos) igual a 12 como vou calcular uma média móvel de 12 períodos. O código itera sobre as observações (n), calcula a média para cada intervalo de 12 períodos (k12) e atribui o cálculo à lista yhat. No caso de você ter notado, yfull é a minha lista completa de valores Y, onde yvalues ​​é um subconjunto que foi compensado por k. Mais sobre isso abaixo na seção 8216Offsetting Y Subset List8217. Plot real e previsão de previsão 1. 12 período de média móvel Medição de erros de previsão Eu tenho a minha previsão, mas é qualquer bom Visualmente a previsão segue os valores reais muito bem, mas como posso medir a qualidade desta previsão e, em seguida, compará-lo contra as previsões Derivado usando métodos diferentes. Uma maneira de medir uma previsão é medir os erros (a. k.a. residuals, Y real 8211 Y hat) Escolhi incluir os seguintes métodos para medir os erros de previsão nesta discussão. Mean Squared Error (MSE) que mede as médias dos erros quadrados (diferença de Y e Y hat). MSE é relatado nas mesmas unidades que os valores que estão sendo estimados (Y), assim poderia dizer-se que uma previsão é fora por 821610.000 units8217. Esse erro pode ser visto como pequeno se os valores reais variam em bilhões de unidades. O erro pode ser visto como grande se os valores reais só variam no 108217s de milhares. Um problema comum com o MSE é que pesa pesadamente os outliers grandes que inflam a medida do erro. O Root Mean Squared Error toma a raiz quadrada do MSE. RMSE representa o desvio padrão da amostra dos resíduos. O erro de percentagem absoluta média (MAPE) é um método alternativo que reporta o erro como uma percentagem. Em vez de dizer que a previsão está desativada por 8216x units8217, poderíamos dizer que uma previsão está desativada em 4. Eu freqüentemente uso mais de um método ao comparar as previsões como cada um tem limitações, que em algum momento pode resultar em medições espúrias por um ou dois métodos. Equação 2 amp 3: MSE e MAPE Equação 3: RMSE Forecast 1: Medições de erro MSE: 630,649.39 RMSE: 794.13 MAPE: 10.22 Offsetting Y Lista de subconjuntos É interessante que a previsão acima (previsão 1) não 8216fit8217 os valores reais de forma mais eficaz 8211 É uma série de dados simples, eu esperaria que os resíduos fossem menores. Para calcular os valores de Y hat para o modelo de média móvel de 12 períodos, utilizo uma fórmula que move o tempo (t) 12 períodos à frente (veja a equação 1 acima). Isto era como eu fui ensinado originalmente e tenho exemplos para nos livros de texto em minha prateleira do escritório. Este código cria yfull a partir do arquivo de dados carregado, em seguida, cria uma lista de subconjuntos iniciando 12 períodos em. Why8230 porque vamos usar o primeiro período de 12 para lançar a nossa previsão média móvel. Os valores de previsão, no entanto, não 8216fit8217 os valores reais, tanto quanto eu gostaria. Eles estão sob previsão ou sobre a previsão. Outro método para a média móvel de previsão sugere iniciar a previsão no ponto médio de 8216k8217. Previsão 1: Dados usando o ponto médio de 8216k8217 Previsão 2: 12 média móvel de período Previsão 2: Medidas de erro MSE: 7,350.78 RMSE: 85.74 MAPE: 0.86 Comparando as medidas de erro de previsão da previsão 1 com a previsão 2 fornece uma indicação de que o segundo método melhor se adapte Nossos dados. However8230 Há uma grande quantidade de conteúdo disponível em Centered Moving Averages que dará detalhes completos de como calcular os valores de ponto médio para pares / períodos ímpares. Eu não sou essa fonte estou apenas demonstrando como reduzir o atraso das médias alinha melhor nossos chapéus Y para o real e melhora as medidas de erro. O código é quase idêntico, exceto que a lista de subconjuntos (yvalues) é criada 6 períodos em e pára 6 períodos curtos. A média dos dados a partir do ponto médio em diante reduziu a quantidade de sobre / sob previsão como feito na previsão 1. Previsão 2: Dados quando Moving Averages é menos adequado A previsão média móvel começa a falhar quando a série de dados tem uma componente cíclica ou sazonalidade. Abaixo está o mesmo 12 período de média móvel de código Python contra uma série de dados cíclicos. Previsão Médias Mínimas do Período 3: 12 Previsão 3: Medidas de Erro MSE: 5.386.003.002.91 RMSE: 73.389,39 MAPE: 48.79 O gráfico ea medida de erro calculada indicam que as médias móveis não são adequadas para esta série. Vou usar esta mesma série com outros modelos de previsão para demonstrar técnicas que fazem pick-up ciclos nos dados.

No comments:

Post a Comment