Thursday 19 October 2017

Algoritmo de média móvel python


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 subseqüentes, criaremos um meio mais sofisticado de análise de desempenho, bem como descrevendo como otimizar os períodos de lookback dos sinais médios individuais. Tenho um intervalo de datas e uma medida em cada uma dessas datas. Eu gostaria de calcular uma média móvel exponencial para cada uma das datas. Alguém sabe como fazer isso, eu sou novo no python. Não parece que as médias estejam incorporadas na biblioteca padrão do Python, o que me parece um pouco estranho. Talvez eu não esteja olhando no lugar certo. Então, dado o código a seguir, como eu poderia calcular a média ponderada em movimento de pontos de QI para datas de calendário (provavelmente há uma maneira melhor de estruturar os dados, qualquer conselho seria apreciado), perguntou Jan 28 09 às 18:01 Meu python é um Um pouco enferrujado (qualquer pessoa pode se sentir livre para editar este código para fazer correções, se Ive estragou a sintaxe de alguma forma), mas aqui vai. Esta função move-se para trás, desde o final da lista até o início, calculando a média móvel exponencial para cada valor, trabalhando para trás até que o coeficiente de peso de um elemento seja menor que o dado epsilon. No final da função, inverte os valores antes de retornar a lista (para que eles estejam na ordem correta para o chamador). (NOTA LATERAL: se eu estivesse usando um idioma diferente de Python, Id crie uma matriz vazia em tamanho real primeiro e depois preencha-a para trás, de modo que eu não precisaria reverter no final. Mas eu não acho que você possa declarar Uma grande disposição vazia em python. E nas listas de python, o adendo é muito menos caro do que o anterior, e é por isso que eu criei a lista na ordem inversa. Por favor, corrija-me se eu estiver errado.) O argumento alfa é o fator de decaimento em cada iteração. Por exemplo, se você usou um alfa de 0,5, então o valor médio móvel de hoje seria composto pelos seguintes valores ponderados: Claro que, se você tiver uma enorme variedade de valores, os valores de dez ou quinze dias não contribuirão muito para Média ponderada de hoje. O argumento epsilon permite que você defina um ponto de corte, abaixo do qual você deixará de se preocupar com valores antigos (já que sua contribuição para o valor de hoje será insignificante). Você invocou a função de algo assim: respondeu Jan 28 09 às 18:46. Não conheço Python, mas para a parte de média, você quer dizer um filtro de passagem baixa exponencialmente decadente da forma em que o dttau alfa, o tempo real do filtro , Tau a constante de tempo do filtro (a forma variável de timestep é a seguinte, basta digitar o dttau para não ser superior a 1,0) Se você quiser filtrar algo como uma data, certifique-se de converter uma quantidade de ponto flutuante Como em segundos desde 1 de janeiro de 1970. respondeu Jan 28 09 às 18:10 Achei o trecho de código acima por earino bastante útil - mas eu precisava de algo que poderia suavizar continuamente um fluxo de valores - então eu o reflitava para isso: e eu uso Como isto: (onde pin. read () produz o próximo valor Id como consumir). Respondeu 12 de fevereiro às 20:35 Estou sempre calculando EMAs com Pandas: Aqui está um exemplo de como fazê-lo: Mais informações sobre Pandas EWMA: respondidas em 4 de outubro às 12:42 Don39t versões mais recentes de Pandas têm novas e melhores funções. Ndash Cristian Ciupitu 11 de maio 16 às 14:10 Note que, ao contrário de sua planilha, não calculo o SMA, e não espero para gerar o EMA após 10 amostras. Isso significa que meus valores diferem ligeiramente, mas se você apresentá-lo, segue exatamente após 10 amostras. Durante as primeiras 10 amostras, o EMA que eu calculo é adequadamente alisado. Estou no processo de criação de um algoritmo de negociação forex e queria tentar meu tiro ao calcular EMA (Exponential Moving Medes). Meus resultados parecem estar corretos (em comparação com os cálculos que fiz à mão), então eu acredito que o método seguinte funciona, mas queria apenas obter um conjunto extra de olhos para garantir que eu não perca nada. Observe que isso apenas retorna o EMA para o preço mais recente, ele não retorna uma série de EMAs, pois isso não é o que eu preciso para minha aplicação. A recursão é uma boa ferramenta para o trabalho certo, mas aqui é usado para realizar o loop simples. Como tal, o código. É mais difícil de ler e raciocinar. É mais lento porque grande parte do código em ema só precisa ser executado uma vez. Falhará com o valor de janela grande o suficiente devido à pilha de chamadas Pythons transbordante. Documentar pelo menos os parâmetros de cada função, por exemplo. Essa janela é o comprimento da janela, e essa posição conta para trás a partir do final dos dados. (Na verdade, as coisas seriam mais claras se a posição fosse um índice direto normal em dados) Aumentar uma exceção quando você encontrar um parâmetro tem um valor inválido. O retorno de Nenhum, em vez disso, só causará uma exceção mais confusa mais tarde. Na verdade, se eu tentar Indicators (). Ema (closeprices, 600) recebo uma recursão infinita porque sma retorna None. O que faz ema chamada sma uma e outra vez. O ponto anterior também revela que se len (dados) a janela 2 não é a verificação de validade correta. O 1 na janela de dados2 1: a janela 1 não parece correta para mim. Suponho que você queira data-window2: - window A declaração retorna previousema está em um lugar estranho porque nesse ponto você calculou um novo currentema. Este é o caso base da recursão, e é costume lidar com o caso base primeiro. Minha proposta para ema: respondeu 26 de novembro às 18:56 Avaliação bastante rasa: você não precisa escrever uma aula pelo que está fazendo (e sugiro que dê uma olhada neste vídeo). Sua classe não encapsula nenhum dado e você apenas usa para ter suas funções na mesma entidade. Eu acho que as coisas seriam mais fáceis de entender se você fosse definir o método da classe para deixar óbvio que você realmente não confia em nenhum caso. No entanto, uma opção ainda melhor seria simplesmente definir funções em um módulo indicador. Respondeu 24 de novembro às 18h04 Obrigado pelas sugestões que eu realmente fizesse como métodos de classe e debatia indo e voltando entre mesmo usando uma classe ou apenas definindo funções em um módulo de indicadores (o que agora vou fazer). Ndash ChrisC 25 de novembro 14 às 19:12 Apenas assistiu o vídeo, ótimo material. Ndash ChrisC 25 nov 14 às 19:43 Sua resposta 2017 Stack Exchange, Inc

No comments:

Post a Comment