Moving Average Algorithm Python
Eu estou no processo de criação de um algoritmo de negociação forex e queria experimentar o meu tiro no cálculo EMA Exponential Moving Averages Meus resultados parecem estar corretas em comparação com os cálculos que fiz à mão, então eu acredito que o método a seguir funciona, mas só queria Um conjunto extra de olhos para se certificar de que eu não estou faltando nada. Note que isso só retorna a EMA para o preço mais recente, ele não retorna uma matriz de EMA s como que isn t o que eu preciso para o meu application. Recursion é uma boa ferramenta Para o trabalho certo, mas aqui ele é usado para realizar loop simples Como tal, o code. is mais difícil de ler e razão about. is mais lento porque grande parte do código em ema só precisa executar once. will falhar com o valor suficientemente grande de Janela devido a transbordar pilha de chamada de Python s. Por favor, documento pelo menos os parâmetros de cada função, por exemplo, que a janela é o comprimento da janela, e que a posição conta para trás a partir do final de dados Na verdade as coisas seriam mais claras se a posição era um normal Índice forward i Nto data. Raise uma exceção quando você encontrar um parâmetro tem um valor inválido retornando Nenhum, em vez disso, só irá causar uma excepção mais confusa mais tarde De fato, se eu tentar 600 eu recebo recursão infinita porque sma retorna Nenhuma que faz ema chamar sma uma e outra vez . O ponto anterior também revela que, se a janela de dados len 2 não for a verificação de validade correta. O 1 em data - window 2 1 - window 1 não parece correto para mim suponho que você quer data - window 2 - window. Previousema está em um lugar estranho, porque naquele momento você calculou um novo currentema Este é o caso base da recursão, e é costume lidar com o caso base primeiro. Minha proposta para ema. answered Nov 26 14 at 18 56.Pretty Revisão superficial. Você não precisa escrever uma classe para o que você está fazendo e eu sugiro que você tenha um olhar para este vídeo Sua classe não encapsular os dados e você apenas usá-lo para ter suas funções em uma mesma entidade Eu acho que as coisas Seria mais fácil entender se você fosse definir clas Smethod para tornar óbvio que você ganhou t realmente confiar em qualquer instância qualquer No entanto, uma opção ainda melhor seria apenas definir funções em um indicador module. answered Nov 24 14 at 18 04.Thanks para as sugestões que eu realmente tê-los como Classmethods e debatido indo para a frente e para trás entre mesmo usando uma classe ou apenas definir funções em um módulo indicador que eu vou fazer ChrisC Nov 25 14 às 19 12.Just assisti o vídeo também, grande material ChrisC novembro 25 14 em 19 43.Your Answer.2017 Stack Exchange, Inc. Eu sei que esta é uma velha questão, mas aqui está uma solução que doesn t usar quaisquer estruturas de dados extra ou bibliotecas É linear no número de elementos da lista de entrada e não consigo pensar em qualquer outro Maneira de torná-lo mais eficiente, na verdade, se alguém sabe de uma maneira melhor para alocar o resultado, por favor me avise know. NOTE isso seria muito mais rápido usando uma matriz numpy em vez de uma lista, mas eu queria eliminar todas as dependências Também seria Possível melhorar o desempenho b Y multi-threaded execução. A função assume que a lista de entrada é um dimensional, por isso tenha cuidado. UPD soluções mais eficientes foram propostas por Alleo e jasaarim. You pode usar para that. The modo argumento especifica como lidar com as bordas que eu escolhi O modo válido aqui, porque eu acho que é como a maioria das pessoas esperam correr média para o trabalho, mas você pode ter outras prioridades Aqui está um gráfico que ilustra a diferença entre os modos. contestada Mar 24 14 at 22 01.I como esta solução porque ele É limpa uma linha e trabalho relativamente eficiente feito dentro numpy Mas Alleo s Solução eficiente usando tem melhor complexidade Ulrich Stern Sep 25 15 em 0 31. 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 execução é 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 pontos N-1. Minha máquina, a versão rápida é 20-30 vezes mais rápida, dependendo do comprimento do vetor de entrada e tamanho da janela de média. Note que convolve não incluem um mesmo modo que parece que ele deve abordar a questão transitória inicial, mas divide Ele entre o começo eo fim. Remove o transiente do fim, eo começo 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 cheio, mesmo, convênio válido convolve os 200,, uns 50, 50, modo m para m nos modos eixo -10, 251, 1, 1 1 modos de legenda, loc centro inferior com pyplot e numpy importado lapis Mar 24 14 em 13 56.pandas é mais adequado para isso do que NumPy ou SciPy Sua função rollingmean faz o trabalho convenientemente Ele também retorna uma matriz NumPy quando a entrada é Um array. It é difícil de bater rollingmean no desempenho com Qualquer implementação de Python puro personalizado Aqui está um exemplo de desempenho contra duas das soluções propostas. Há também opções agradáveis sobre como lidar com os valores de borda. Eu estou sempre irritado pela função de processamento de sinal que retornam sinais de saída de forma diferente da entrada Sinais quando ambas as entradas e saídas são da mesma natureza, por exemplo, ambos os sinais temporais Quebra a correspondência com a variável independente relacionada, por exemplo, tempo, freqüência fazendo plotagem ou comparação não é uma questão direta de qualquer maneira, se você compartilhar o sentimento, você pode querer mudar o último Linhas da função proposta como o mesmo retorno. Um pouco tarde para a festa, mas eu fiz minha própria pequena função que não envolve em torno das extremidades ou almofadas Com zeros que são então usados para encontrar a média, bem como um tratamento adicional é, que também re-amostras do sinal em pontos espaçados linearmente Personalizar o código à vontade para obter outros recursos. O método é um si Mple multiplicação matricial com um kernel Gaussian normalizado. Uso simples em um sinal sinusoidal com o ruído distribuído normal adicionado. Esta pergunta é agora mesmo mais velha do que quando NeXuS escreveu sobre ela o mês passado, MAS eu gosto como seu código trata dos casos da borda Contudo, porque É uma média móvel simples, seus resultados ficam atrás dos dados que eles se aplicam Eu pensei que lidar com casos de borda de uma forma mais satisfatória do que NumPy s modos válidos mesmo e completo poderia ser alcançado através da aplicação de uma abordagem semelhante a um método baseado convolução. Minha contribuição usa uma média de execução central para alinhar seus resultados com seus dados. Quando há dois poucos pontos disponíveis para a janela de tamanho completo a ser usada, as médias correntes são calculadas a partir de janelas sucessivamente menores nas bordas da matriz. Janelas maiores, mas isso é uma implementação detail. It s relativamente lento porque usa convolve e poderia provavelmente ser spruced até muito por um verdadeiro Pythonista, no entanto, acredito que A idéia resiste. Jan 2 em 0 28. é bom, mas lento quando a largura da janela cresce grande Algumas respostas fornecem algoritmos mais eficientes com mas parecem incapazes de lidar com os valores de ponta Eu mesmo tenho implementado um algoritmo que pode lidar com este problema bem, se este Problema é declarado como. Input parâmetro mergenum pode ser pensado como 2 windowwidth 1.Eu sei que este código é um pouco ilegível se u encontrá-lo útil e deseja algumas expansões, por favor me avise e eu vou atualizar esta resposta Desde escrever uma explicação pode Me custou muito tempo, eu espero que eu faço isso só quando alguém precisa dele Por favor, perdoe-me por minha preguiça. Se apenas u estiver interessado em sua versão original. É ainda mais ilegível a primeira solução se livrar do problema de borda por zeros de preenchimento ao redor O array, mas a segunda solução postada aqui manipula-lo de uma maneira dura e direta. Em minha última frase eu estava tentando indicar por que ele ajuda a ponto flutuante erro Se dois valores são aproximadamente a mesma ordem de grandeza, em seguida, adicionando-lhes l Oses menos precisão do que se você adicionou um número muito grande para um muito pequeno O código combina valores adjacentes 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 tem Salvou um casal muito mal implementado projetos em produção Mayur Patel Dez 15 14 em 17 22. Alleo Em vez de fazer uma adição por valor, você vai estar fazendo dois A prova é o mesmo que o bit-flipping problema No entanto, o ponto desta resposta Não é necessariamente desempenho, mas precisão Uso de memória para a média de valores de 64 bits não excederia 64 elementos no cache, por isso é amigável no uso de memória Mayur Patel 29 de dezembro de 17 04. Eu tenho um intervalo de datas e um Medição 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 this. I m novo para python Não parece que as médias são construídas na biblioteca padrão python, que st Rikes me como um pouco estranho Talvez eu não estou olhando no lugar certo. Então, dado o seguinte código, como eu poderia calcular a média móvel ponderada de pontos de QI para datas de calendário. Há provavelmente uma maneira melhor de estruturar os dados, qualquer conselho seria apreciado. Postado em Jan 28 09 às 18 01.My python é um pouco enferrujado ninguém pode se sentir livre para editar este código para fazer correções, se eu ve estragou o Esta função move-se para trás, do fim da lista para o início, calculando a média móvel exponencial para cada valor trabalhando para trás até que o coeficiente de peso para um elemento seja menor do que o epsilon dado. Da função, ele inverte os valores antes de retornar a lista para que eles re na ordem correta para o chamador. NOTA LATERAL se eu estava usando uma linguagem diferente de python, eu criaria uma matriz vazia de tamanho completo primeiro e depois a preencheria para trás-ordem, de modo que eu não teria que inverter isto no final Mas eu não acho que você pode declarar Uma grande matriz vazia em python E em listas de python, acrescentando é muito menos caro do que prepending, é por isso que eu construí a lista na ordem inversa Por favor, corrija-me se estou 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 de movimento de hoje seria composto dos seguintes valores ponderados. Claro, se você tem uma grande variedade de valores, os valores de dez ou quinze dias atrás não vão contribuir muito Para a 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, uma vez que sua contribuição para o valor de hoje será insignificante. Você d invocar a função algo como this. answered Jan 28 09 at 18 46. Eu não sei Python, mas para a média Parte, você quer dizer um filtro de passagem decrescente exponencialmente decrescente da forma. Onde dt tau, dt o timestep do filtro, tau a constante de tempo do filtro a variável-timestep forma desta é a seguinte, apenas clipe dt tau Para não ser mais do que 1 0. Se você deseja filtrar algo como uma data, certifique-se de converter para uma quantidade de ponto flutuante como de segundos desde Jan 1 1970.resposta 28 de janeiro 09 em 18 10.I encontrou o trecho de código acima Por earino muito útil - mas eu precisava de algo que pudesse suavizar continuamente um fluxo de valores - então eu refatorou isso para this. and eu usá-lo assim. Onde produz o próximo valor que eu gostaria de consumir. Respondido Feb 12 14 em 20 35.I m sempre calculando EMAs com Pandas. Here é um exemplo de como fazê-lo. Mais informações sobre Pandas EWMA. respondeu Oct 4 15 em 12 42. Don t versões mais recentes de Pandas têm novas e melhores funções Cristian Ciupitu 11 de maio 16 às 14 10.Note que ao contrário em sua planilha, eu não calculo o SMA, e eu não espero para gerar o EMA após 10 amostras Isto significa que os meus valores Diferem ligeiramente, mas se você o traçar, segue-se exatamente após 10 amostras Durante as primeiras 10 amostras, o EMA que eu calculo é alisado apropriadamente.
Comments
Post a Comment