Wednesday 2 August 2017

Filtro médio móvel c


É possível implementar uma média móvel em C sem a necessidade de uma janela de amostras Ive descobri que eu posso otimizar um pouco, escolhendo um tamanho de janela thats um poder de dois para permitir bit-shifting em vez de dividir, mas não necessitando Um buffer seria bom. Existe uma maneira de expressar um novo resultado da média móvel apenas como uma função do antigo resultado e da nova amostra Definir um exemplo de média móvel, através de uma janela de 4 amostras para ser: Adicionar nova amostra e: Uma média móvel pode ser implementada recursivamente , Mas para um cálculo exato da média móvel você deve se lembrar da amostra de entrada mais antiga na soma (ou seja, o a no seu exemplo). Para um comprimento N média móvel você calcula: onde yn é o sinal de saída e xn é o sinal de entrada. Eq. (1) pode ser escrito recursivamente como Então você sempre precisa lembrar a amostra xn-N para calcular (2). Como indicado por Conrad Turner, você pode usar uma janela exponencial (infinitamente longa), que permite calcular a saída somente da saída anterior e da entrada atual: mas esta não é uma média móvel padrão (não ponderada), mas uma média exponencial Ponderada média móvel, onde as amostras mais no passado obter um peso menor, mas (pelo menos em teoria) você nunca esquecer nada (os pesos apenas ficar menor e menor para amostras no passado). Inicialize total 0, count0 (cada vez que vê um novo valor) Então uma entrada (scanf), uma add totalnewValue, um incremento (count), uma divide average (total / count) Esta seria uma média móvel sobre todas as entradas Para calcular a média Sobre apenas as 4 últimas entradas, exigiria 4 variáveis ​​de entrada, talvez copiando cada entrada para uma variável de entrada mais antiga, calculando a nova média móvel como a soma das 4 variáveis ​​de entrada, dividida por 4 (desvio para a direita 2 seria bom se todas as entradas fossem Positivo para fazer o cálculo médio Como outros já mencionaram, você deve considerar um filtro IIR (resposta de impulso infinito) em vez do filtro FIR (resposta de impulso finito) que você está usando agora. Há mais, mas à primeira vista os filtros FIR são implementados Como convoluções explícitas e filtros IIR com equações. O filtro IIR especial que eu uso muito em microcontroladores é um filtro passa-baixo de pólo único. Este é o equivalente digital de um simples filtro analógico RC. Para a maioria das aplicações, estes terão melhores características do que o Caixa que você está usando. A maioria dos usos de um filtro de caixa que eu encontrei são o resultado de alguém não prestar atenção na classe de processamento de sinal digital, e não como resultado de precisar de suas características particulares. Se você só quer atenuar as altas freqüências que você sabe que são ruído, um único pólo filtro passa-baixo é melhor. A melhor maneira de implementar um digitalmente em um microcontrolador é geralmente: FILT lt - FILT FF (NEW - FILT) FILT é um pedaço de estado persistente. Esta é a única variável persistente que você precisa para calcular este filtro. NEW é o novo valor que o filtro está sendo atualizado com esta iteração. FF é a fracção do filtro. Que ajusta o peso do filtro. Olhe para este algoritmo e veja que para FF 0 o filtro é infinitamente pesado desde a saída nunca muda. Para FF 1, seu realmente nenhum filtro em tudo desde que a saída apenas segue a entrada. Os valores úteis estão no meio. Em sistemas pequenos você escolhe FF para ser 1/2 N de modo que a multiplicação por FF possa ser realizada como um deslocamento para a direita por N bits. Por exemplo, FF pode ser 1/16 e multiplicar por FF, portanto, um deslocamento para a direita de 4 bits. Caso contrário, este filtro precisa apenas de uma subtração e uma adição, embora os números geralmente precisam ser mais largos do que o valor de entrada (mais na precisão numérica em uma seção separada abaixo). Eu costumo tomar leituras A / D significativamente mais rápido do que eles são necessários e aplicar dois desses filtros em cascata. Este é o equivalente digital de dois filtros R-C em série, e atenua por 12 dB / oitava acima da freqüência de rolloff. No entanto, para as leituras A / D é geralmente mais relevante olhar para o filtro no domínio do tempo, considerando sua resposta passo. Isso indica a rapidez com que seu sistema verá uma alteração quando a coisa que você está medindo muda. Para facilitar a concepção destes filtros (que significa apenas escolher FF e decidir quantos deles para cascatear), eu uso o meu programa FILTBITS. Você especifica o número de bits de deslocamento para cada FF na série de filtros em cascata e calcula a resposta da etapa e outros valores. Na verdade eu costumo correr isso através do meu script wrapper PLOTFILT. Isso executa FILTBITS, que faz um arquivo CSV, e depois traça o arquivo CSV. Por exemplo, aqui está o resultado de PLOTFILT 4 4: Os dois parâmetros para PLOTFILT significa que haverá dois filtros em cascata do tipo descrito acima. Os valores de 4 indicam o número de bits de mudança para realizar a multiplicação por FF. Os dois valores de FF são, portanto, 1/16 neste caso. O traço vermelho é a resposta da etapa da unidade, e é a coisa principal a olhar. Por exemplo, isto diz-lhe que se a entrada muda instantaneamente, a saída do filtro combinado estabelecerá a 90 do novo valor em 60 iterações. Se você se preocupa com 95 settling tempo, então você tem que esperar cerca de 73 iterações, e por 50 tempo de resolução apenas 26 iterações. O traço verde mostra a saída de um único pico de amplitude total. Isto dá-lhe alguma idéia da supressão de ruído aleatória. Parece que nenhuma amostra irá causar mais do que uma alteração de 2,5 na saída. O traço azul é dar uma sensação subjetiva do que este filtro faz com o ruído branco. Este não é um teste rigoroso, uma vez que não há garantia o que exatamente o conteúdo foi dos números aleatórios escolhidos como a entrada de ruído branco para esta execução de PLOTFILT. Seu somente para dar-lhe uma sensação áspera de quanto será squashed e de como liso é. PLOTFILT, talvez FILTBITS, e muitas outras coisas úteis, especialmente para o desenvolvimento de firmware PIC está disponível no software PIC Development Tools release na minha página de downloads de Software. Adicionado sobre precisão numérica eu vejo dos comentários e agora uma nova resposta que há interesse em discutir o número de bits necessários para implementar este filtro. Observe que a multiplicação por FF criará Log 2 (FF) novos bits abaixo do ponto binário. Em sistemas pequenos, FF é geralmente escolhido para ser 1/2 N para que este multiplicar é realmente realizado por um deslocamento à direita de N bits. FILT é geralmente um inteiro de ponto fixo. Observe que isso não altera nenhuma das matemáticas do ponto de vista dos processadores. Por exemplo, se você estiver filtrando leituras A / D de 10 bits e N 4 (FF 1/16), então você precisará de 4 bits de fração abaixo das leituras A / D inteiras de 10 bits. Um processadores mais, youd estar fazendo operações de 16 bits inteiro devido às leituras de 10 bit A / D. Neste caso, você ainda pode fazer exatamente as mesmas operações de 16 bits inteiros, mas comece com as leituras A / D esquerda deslocada por 4 bits. O processador não sabe a diferença e não precisa. Fazer a matemática em inteiros inteiros de 16 bits funciona se você os considera 12,4 pontos fixos ou inteiros verdadeiros de 16 bits (16,0 ponto fixo). Em geral, você precisa adicionar N bits cada pólo de filtro se você não quiser adicionar ruído devido à representação numérica. No exemplo acima, o segundo filtro de dois teria 1044 18 bits para não perder informações. Na prática em uma máquina de 8 bits que significa youd usar valores de 24 bits. Tecnicamente apenas o segundo pólo de dois precisaria do valor mais amplo, mas para a simplicidade do firmware eu costumo usar a mesma representação, e, portanto, o mesmo código, para todos os pólos de um filtro. Normalmente eu escrevo uma sub-rotina ou macro para executar uma operação de pólo de filtro, em seguida, aplicar isso a cada pólo. Se uma subrotina ou macro depende se os ciclos ou a memória do programa são mais importantes nesse projeto específico. De qualquer maneira, eu uso algum estado zero para passar NOVO para a subrotina / macro, que atualiza FILT, mas também carrega isso para o mesmo estado zero NOVO foi dentro Isso torna mais fácil para aplicar vários pólos desde o FILT atualizado de um pólo é O NOVO do próximo. Quando uma sub-rotina, é útil ter um ponteiro apontar para FILT no caminho, que é atualizado para logo após FILT na saída. Desta forma, a sub-rotina opera automaticamente em filtros consecutivos na memória se for chamada várias vezes. Com uma macro você não precisa de um ponteiro desde que você passa no endereço para operar em cada iteração. Exemplos de código Aqui está um exemplo de uma macro como descrito acima para um PIC 18: E aqui está uma macro semelhante para um PIC 24 ou dsPIC 30 ou 33: Ambos estes exemplos são implementados como macros usando o meu pré-processador de assembler PIC. Que é mais capaz do que qualquer um das instalações macro incorporadas. Clabacchio: Outra questão que eu deveria ter mencionado é a implementação de firmware. Você pode escrever uma sub-rotina de filtro passa-baixa de um único pólo uma vez, depois aplicá-la várias vezes. Na verdade eu costumo escrever tal sub-rotina para ter um ponteiro na memória para o estado do filtro, em seguida, tê-lo avançar o ponteiro para que ele pode ser chamado em sucessão facilmente para realizar filtros multi-polo. Ndash Olin Lathrop Apr 20 12 at 15:03 1. muito obrigado por suas respostas - todas elas. Eu decidi usar este filtro IIR, mas este filtro não é usado como um filtro LowPass padrão, uma vez que eu preciso para a média de valores de contador e compará-los para detectar alterações em um determinado intervalo. Uma vez que estes Valores van ser de dimensões muito diferentes, dependendo de hardware que eu queria tomar uma média, a fim de ser capaz de reagir a estas alterações Hardware específicas automaticamente. Ndash sensslen May 21 12 at 12:06 Se você pode viver com a restrição de um poder de dois números de itens para a média (ou seja, 2,4,8,16,32 etc), então a divisão pode ser feita de forma fácil e eficiente em um Micro de baixo desempenho sem divisão dedicada, pois pode ser feito como um deslocamento bit. Cada turno é um poder de dois, por exemplo: O OP pensou que ele tinha dois problemas, dividindo em um PIC16 e memória para seu buffer de anel. Esta resposta mostra que a divisão não é difícil. É verdade que ele não trata o problema da memória, mas o sistema SE permite respostas parciais, e os usuários podem tirar algo de cada resposta por si mesmos, ou mesmo editar e combinar outras respostas. Uma vez que algumas das outras respostas exigem uma operação de divisão, elas são igualmente incompletas, uma vez que não mostram como efetivamente conseguir isso em um PIC16. Ndash Martin Apr 20 12 at 13:01 Há uma resposta para um verdadeiro filtro de média móvel (aka boxcar filtro) com menos requisitos de memória, se você não mente downsampling. É chamado um filtro integrador-pente em cascata (CIC). A idéia é que você tem um integrador que você toma as diferenças de um período de tempo, eo dispositivo de economia de memória chave é que por downsampling, você não tem que armazenar cada valor do integrador. Ele pode ser implementado usando o seguinte pseudocódigo: Seu comprimento médio móvel efetivo é decimationFactorstatesize, mas você só precisa manter em torno de amostras statesize. Obviamente, você pode obter um melhor desempenho se o seu statesize e decimationFactor são poderes de 2, de modo que a divisão e os operadores restantes são substituídos por turnos e máscara-ands. Postscript: Eu concordo com Olin que você deve sempre considerar filtros IIR simples antes de um filtro de média móvel. Se você não precisa de freqüência-nulos de um filtro de vagão, um filtro de passa-baixa de 1 pólo ou de 2 pólos provavelmente funcionará bem. Por outro lado, se você estiver filtrando para fins de decimação (tomando uma alta taxa de amostragem de entrada e de média para o seu uso por um processo de baixa taxa), em seguida, um CIC filtro pode ser exatamente o que você está procurando. (Especialmente se você pode usar statesize1 e evitar o ringbuffer completamente com apenas um valor único integrador anterior) Theres alguma análise em profundidade da matemática por trás usando o filtro IIR de primeira ordem que Olin Lathrop já descreveu mais sobre a troca de pilha Digital Signal Processing (Inclui muitas imagens bonitas.) A equação para este filtro IIR é: Isso pode ser implementado usando apenas inteiros e nenhuma divisão usando o código a seguir (pode precisar de alguma depuração como eu estava digitando na memória.) Este filtro aproxima uma média móvel de Os últimos K amostras, definindo o valor de alfa para 1 / K. Faça isso no código anterior, definindo BITS para LOG2 (K), ou seja, para K 16 set BITS para 4, para K 4 set BITS para 2, etc (eu verificar o código listado aqui logo que eu recebo uma alteração e Editar esta resposta, se necessário.) Responder Jun 23 12 at 4:04 Heres um filtro passa-baixo de um único pólo (média móvel, com freqüência de corte CutoffFrequency). Muito simples, muito rápido, funciona muito bem, e quase nenhuma sobrecarga de memória. Nota: Todas as variáveis ​​têm escopo além da função de filtro, exceto o passado em newInput Nota: Este é um filtro de etapa única. Várias etapas podem ser conectadas em cascata para aumentar a nitidez do filtro. Se você usar mais de uma etapa, você terá que ajustar DecayFactor (como se relaciona com a Cutoff-Frequency) para compensar. E, obviamente, tudo o que você precisa é dessas duas linhas colocadas em qualquer lugar, eles não precisam de sua própria função. Este filtro tem um tempo de aceleração antes que a média móvel represente a do sinal de entrada. Se você precisar ignorar esse tempo de aceleração, basta inicializar MovingAverage para o primeiro valor de newInput em vez de 0 e esperar que o primeiro newInput não seja um outlier. (CutoffFrequency / SampleRate) tem um intervalo entre 0 e 0,5. DecayFactor é um valor entre 0 e 1, geralmente perto de 1. Flutuadores de precisão única são bons o suficiente para a maioria das coisas, eu só prefiro dobra. Se você precisar ficar com números inteiros, você pode converter DecayFactor e Amplitude Factor em inteiros fracionários, em que o numerador é armazenado como o inteiro, eo denominador é um número inteiro de 2 (assim você pode bit-shift para a direita como o Denominador em vez de ter que dividir durante o loop de filtro). Por exemplo, se você usar DecayFactor 0,99, e você quiser usar números inteiros, você pode definir DecayFactor 0,99 65536 64881. E então, sempre que você multiplicar por DecayFactor em seu loop de filtro, basta deslocar o resultado 16. Para obter mais informações sobre isso, um excelente livro thats Online, capítulo 19 sobre filtros recursivos: www. dspguide / ch19.htm PS Para o paradigma da média móvel, uma abordagem diferente para definir DecayFactor e AmplitudeFactor que pode ser mais relevante para suas necessidades, vamos dizer que você quer o anterior, cerca de 6 itens média juntos, fazê-lo discretamente, youd adicionar 6 itens e dividir por 6, então Você pode definir o AmplitudeFactor para 1/6 e DecayFactor para (1.0 - AmplitudeFactor). Respondeu May 14 12 at 22:55 Todo mundo tem comentado completamente sobre a utilidade de IIR vs FIR, e na divisão de poder-de-dois. Id gostaria de dar alguns detalhes de implementação. O abaixo funciona bem em pequenos microcontroladores sem FPU. Não há multiplicação, e se você manter N um poder de dois, toda a divisão é de ciclo único bit-shifting. Tampão de toque FIR básico: mantém um buffer de execução dos últimos N valores e uma Soma em execução de todos os valores no buffer. Cada vez que uma nova amostra entra, subtraia o valor mais antigo no buffer de SUM, substitua-o pela nova amostra, adicione a nova amostra à SUM e a saída SUM / N. Tampão de anel IIR modificado: mantenha uma SUM corrente dos últimos N valores. Cada vez que uma nova amostra chega, SUM - SUM / N, adicione a nova amostra e a saída SUM / N. Se I39m lendo você direito, você está descrevendo um filtro IIR de primeira ordem, o valor que você está subtraindo isn39t o valor mais antigo que está caindo, mas é, em vez disso, a média dos valores anteriores. Os filtros IIR de primeira ordem podem certamente ser úteis, mas não tenho certeza do que você quer dizer quando sugere que a saída é a mesma para todos os sinais periódicos. A uma taxa de amostragem de 10KHz, a alimentação de uma onda quadrada de 100Hz em um filtro de caixa de 20 estágios produzirá um sinal que sobe uniformemente para 20 amostras, senta alto para 30, cai uniformemente para 20 amostras e senta baixo para 30. Uma primeira ordem IIR. Ndash supercat Aug 28 13 às 15:31 vai produzir uma onda que começa bruscamente a subir e gradualmente nivela perto (mas não no) máximo de entrada, então começa bruscamente a cair e nivela gradualmente perto (mas não) o mínimo de entrada. Comportamento muito diferente. Uma questão é que uma média móvel simples pode ou não ser útil. Com um filtro IIR, você pode obter um bom filtro com relativamente poucos calcs. O FIR que você descreve só pode lhe dar um retângulo no tempo - um sinc em freq - e você não pode gerenciar os lobos laterais. Pode valer a pena jogar algumas multiplicações inteiras para torná-la uma simpática e simétrica sintonia FIR se você pode poupar os carrapatos do relógio. Ndash Scott Seidman Aug 29 13 às 13:50 ScottSeidman: Não há necessidade de multiplicar se um simplesmente tem cada estágio do FIR ou saída a média da entrada para esse estágio e seu valor armazenado anterior, e depois armazenar a entrada (se tiver O intervalo numérico, pode-se usar a soma em vez da média). Se isso é melhor do que um filtro de caixa depende da aplicação (a resposta de passo de um filtro de caixa com um atraso total de 1ms, por exemplo, terá um pico d2 / dt desagradável quando a mudança de entrada e novamente 1ms mais tarde, mas terá O mínimo possível d / dt para um filtro com um atraso total de 1 ms). Como disse mikeselectricstuff, se você realmente precisa reduzir suas necessidades de memória, e você não se importa sua resposta ao impulso é uma exponencial (em vez de um pulso retangular), eu iria para um filtro de média móvel exponencial . Eu uso-os extensivamente. Com esse tipo de filtro, você não precisa de nenhum buffer. Você não tem que armazenar N amostras passadas. Apenas um. Assim, seus requisitos de memória são cortados por um fator de N. Além disso, você não precisa de qualquer divisão para isso. Somente multiplicações. Se você tiver acesso a aritmética de ponto flutuante, use multiplicações de ponto flutuante. Caso contrário, faça multiplicações inteiras e desloque para a direita. No entanto, estamos em 2012, e eu recomendo que você use compiladores (e MCUs) que permitem que você trabalhe com números de ponto flutuante. Além de ser mais memória eficiente e mais rápido (você não tem que atualizar itens em qualquer buffer circular), eu diria que é também mais natural. Porque uma resposta de impulso exponencial corresponde melhor à maneira como a natureza se comporta, na maioria dos casos. Um problema com o filtro IIR como quase tocado por olin e supercat mas aparentemente desconsiderado por outros é que o arredondamento para baixo introduz alguma imprecisão (e potencialmente viés / truncamento). Assumindo que N é uma potência de dois, e apenas aritmética inteira é usada, o deslocamento direto sistematicamente elimina os LSBs da nova amostra. Isso significa que quanto tempo a série poderia ser, a média nunca vai levar esses em conta. Por exemplo, suponha uma série lentamente decrescente (8,8,8,8,7,7,7,7,6,6) e suponha que a média é realmente 8 no início. A amostra do punho 7 trará a média para 7, independentemente da intensidade do filtro. Apenas para uma amostra. Mesma história para 6, etc. Agora pense no oposto. A série sobe. A média ficará em 7 para sempre, até que a amostra seja grande o suficiente para fazer a mudança. Claro, você pode corrigir o viés adicionando 1 / 2N / 2, mas isso não vai realmente resolver o problema de precisão. Nesse caso a série decrescente permanecerá para sempre em 8 até que a amostra seja 8-1 / 2 (N / 2). Para N4, por exemplo, qualquer amostra acima de zero manterá a média inalterada. Acredito que uma solução para isso implicaria manter um acumulador dos LSBs perdidos. Mas eu não fui longe o suficiente para ter o código pronto, e não tenho certeza que não iria prejudicar o poder IIR em alguns outros casos de série (por exemplo, se 7,9,7,9 seria média para 8 então). Olin, sua cascata de dois estágios também precisaria de alguma explicação. Você quer dizer segurando dois valores médios com o resultado do primeiro alimentado para o segundo em cada iteração. Qual é o benefício deste Moving Averages - Simple e exponencial Moving Averages - Simple e Exponencial Introdução Movendo médias lisonjeiam os dados de preços para formar uma tendência seguinte indicador. Eles não prevêem a direção do preço, mas sim definir a direção atual com um atraso. As médias móveis são retardadas porque são baseadas em preços passados. Apesar desse atraso, as médias móveis ajudam a suavizar a ação dos preços e filtrar o ruído. Eles também formam os blocos de construção para muitos outros indicadores técnicos e sobreposições, como Bandas Bollinger. MACD eo Oscilador McClellan. Os dois tipos mais populares de médias móveis são a Média Móvel Simples (SMA) e a Média Móvel Exponencial (EMA). Essas médias móveis podem ser usadas para identificar a direção da tendência ou definir níveis potenciais de suporte e resistência. Here039s um gráfico com um SMA e um EMA nele: Cálculo simples da média móvel Uma média movente simples é dada forma computando o preço médio de uma segurança sobre um número específico dos períodos. A maioria das médias móveis são baseadas em preços de fechamento. Uma média móvel simples de 5 dias é a soma de cinco dias dos preços de fechamento dividida por cinco. Como seu nome indica, uma média móvel é uma média que se move. Os dados antigos são eliminados à medida que novos dados são disponibilizados. Isso faz com que a média se mova ao longo da escala de tempo. Abaixo está um exemplo de uma média móvel de 5 dias evoluindo ao longo de três dias. O primeiro dia da média móvel cobre simplesmente os últimos cinco dias. O segundo dia da média móvel cai o primeiro ponto de dados (11) e adiciona o novo ponto de dados (16). O terceiro dia da média móvel continua caindo o primeiro ponto de dados (12) e adicionando o novo ponto de dados (17). No exemplo acima, os preços aumentam gradualmente de 11 para 17 ao longo de um total de sete dias. Observe que a média móvel também aumenta de 13 para 15 ao longo de um período de cálculo de três dias. Observe também que cada valor de média móvel está logo abaixo do último preço. Por exemplo, a média móvel para o dia um é igual a 13 eo último preço é 15. Os preços dos quatro dias anteriores eram mais baixos e isso faz com que a média móvel fique atrasada. Cálculo da média móvel exponencial As médias móveis exponenciais reduzem o desfasamento aplicando mais peso aos preços recentes. A ponderação aplicada ao preço mais recente depende do número de períodos na média móvel. Há três etapas para calcular uma média móvel exponencial. Primeiro, calcule a média móvel simples. Uma média móvel exponencial (EMA) tem que começar em algum lugar assim que uma média móvel simples é usada como o EMA anterior do período anterior no primeiro cálculo. Em segundo lugar, calcular o multiplicador de ponderação. Em terceiro lugar, calcule a média móvel exponencial. A fórmula abaixo é para um EMA de 10 dias. Uma média móvel exponencial de 10 períodos aplica uma ponderação de 18,18 ao preço mais recente. Um EMA de 10 períodos também pode ser chamado de EMA 18.18. Um EMA de 20 períodos aplica uma ponderação de 9,52 ao preço mais recente (2 / (201) .0952). Observe que a ponderação para o período de tempo mais curto é mais do que a ponderação para o período de tempo mais longo. De fato, a ponderação cai pela metade cada vez que o período de média móvel dobra. Se você deseja uma porcentagem específica para uma EMA, use esta fórmula para convertê-la em períodos de tempo e, em seguida, insira esse valor como o parâmetro EMA039s: Abaixo está um exemplo de planilha de uma média móvel simples de 10 dias e um valor de 10- Dia média móvel exponencial para a Intel. As médias móveis simples são diretas e exigem pouca explicação. A média de 10 dias simplesmente se move conforme novos preços se tornam disponíveis e os preços antigos caem. A média móvel exponencial começa com o valor da média móvel simples (22,22) no primeiro cálculo. Após o primeiro cálculo, a fórmula normal assume o controle. Como um EMA começa com uma média móvel simples, seu valor verdadeiro não será realizado até 20 ou mais períodos mais tarde. Em outras palavras, o valor na planilha do Excel pode diferir do valor do gráfico por causa do curto período de retorno. Esta planilha só remonta 30 períodos, o que significa que o afeto da média móvel simples teve 20 períodos para se dissipar. StockCharts volta pelo menos 250 períodos (geralmente muito mais) para os seus cálculos para os efeitos da média móvel simples no primeiro cálculo totalmente dissipada. O fator de Lag Quanto maior a média móvel, mais o lag. Uma média móvel exponencial de 10 dias abraçará os preços muito de perto e virará logo após os preços virarem. Curtas médias móveis são como barcos de velocidade - ágil e rápido para mudar. Em contraste, uma média móvel de 100 dias contém muitos dados passados ​​que o desaceleram. As médias móveis mais longas são como os petroleiros do oceano - lethargic e lentos mudar. É preciso um movimento de preços maior e mais longo para uma média móvel de 100 dias para mudar de rumo. O gráfico acima mostra o SampP 500 ETF com uma EMA de 10 dias seguindo de perto os preços e uma moagem SMA de 100 dias mais alta. Mesmo com o declínio de janeiro-fevereiro, a SMA de 100 dias manteve o curso e não recusou. O SMA de 50 dias se encaixa em algum lugar entre as médias móveis de 10 e 100 dias quando se trata do fator de latência. Simples vs médias exponenciais Moving Embora existam diferenças claras entre médias móveis simples e médias móveis exponenciais, um não é necessariamente melhor do que o outro. As médias móveis exponenciais têm menos atraso e são, portanto, mais sensíveis aos preços recentes - e às recentes mudanças nos preços. As médias móveis exponenciais virarão antes de médias móveis simples. As médias móveis simples, por outro lado, representam uma verdadeira média de preços para todo o período de tempo. Como tal, as médias móveis simples podem ser mais adequadas para identificar níveis de suporte ou resistência. Preferência média móvel depende de objetivos, estilo analítico e horizonte de tempo. Chartists deve experimentar com ambos os tipos de médias móveis, bem como diferentes prazos para encontrar o melhor ajuste. O gráfico abaixo mostra a IBM com a SMA de 50 dias em vermelho ea EMA de 50 dias em verde. Ambos atingiram o pico no final de janeiro, mas o declínio no EMA foi mais nítida do que o declínio no SMA. A EMA apareceu em meados de fevereiro, mas a SMA continuou baixa até o final de março. Observe que a SMA apareceu mais de um mês após a EMA. Comprimentos e prazos A duração da média móvel depende dos objetivos analíticos. Curtas médias móveis (5-20 períodos) são mais adequados para as tendências de curto prazo e de negociação. Os cartistas interessados ​​em tendências de médio prazo optariam por médias móveis mais longas que poderiam estender 20-60 períodos. Investidores de longo prazo preferem médias móveis com 100 ou mais períodos. Alguns comprimentos de média móvel são mais populares do que outros. A média móvel de 200 dias é talvez a mais popular. Devido ao seu comprimento, esta é claramente uma média móvel a longo prazo. Em seguida, a média móvel de 50 dias é bastante popular para a tendência de médio prazo. Muitos chartists usam as médias móveis de 50 dias e de 200 dias junto. Curto prazo, uma média móvel de 10 dias foi bastante popular no passado porque era fácil de calcular. Um simplesmente adicionou os números e moveu o ponto decimal. Identificação de tendências Os mesmos sinais podem ser gerados usando médias móveis simples ou exponenciais. Como mencionado acima, a preferência depende de cada indivíduo. Esses exemplos abaixo usarão médias móveis simples e exponenciais. O termo média móvel se aplica a médias móveis simples e exponenciais. A direção da média móvel transmite informações importantes sobre os preços. Uma média móvel em ascensão mostra que os preços estão aumentando. Uma média móvel em queda indica que os preços, em média, estão caindo. A subida da média móvel de longo prazo reflecte uma tendência de alta a longo prazo. A queda da média móvel a longo prazo reflecte uma tendência de baixa a longo prazo. O gráfico acima mostra 3M (MMM) com uma média móvel exponencial de 150 dias. Este exemplo mostra quão bem as médias móveis funcionam quando a tendência é forte. A EMA de 150 dias recusou-se em novembro de 2007 e novamente em janeiro de 2008. Observe que foi necessário um declínio de 15 para reverter a direção dessa média móvel. Estes indicadores de atraso identificam inversões de tendência à medida que ocorrem (na melhor das hipóteses) ou depois de ocorrerem (na pior das hipóteses). MMM continuou menor em março de 2009 e, em seguida, subiu 40-50. Observe que a EMA de 150 dias não apareceu até depois desse aumento. Uma vez que o fez, no entanto, MMM continuou maior nos próximos 12 meses. As médias móveis trabalham brilhantemente em tendências fortes. Crossovers duplos Duas médias móveis podem ser usadas juntas para gerar sinais cruzados. Na Análise Técnica dos Mercados Financeiros. John Murphy chama isso de método de cruzamento duplo. Os cruzamentos duplos envolvem uma média móvel relativamente curta e uma média móvel relativamente longa. Como com todas as médias móveis, o comprimento geral da média móvel define o prazo para o sistema. Um sistema que utilizasse um EMA de 5 dias e um EMA de 35 dias seria considerado de curto prazo. Um sistema usando uma SMA de 50 dias e um SMA de 200 dias seria considerado de médio prazo, talvez até de longo prazo. Um crossover de alta ocorre quando a média móvel mais curta cruza acima da média móvel mais longa. Isso também é conhecido como uma cruz de ouro. Um crossover de baixa ocorre quando a média móvel mais curta cruza abaixo da média móvel mais longa. Isso é conhecido como uma cruz morta. Os crossovers médios móveis produzem sinais relativamente atrasados. Afinal, o sistema emprega dois indicadores de atraso. Quanto mais longos os períodos de média móvel, maior o atraso nos sinais. Esses sinais funcionam muito bem quando uma boa tendência se apodera. No entanto, um sistema de crossover média móvel irá produzir lotes de Whipsaws na ausência de uma forte tendência. Há também um método de crossover triplo que envolve três médias móveis. Mais uma vez, um sinal é gerado quando a média móvel mais curta atravessa as duas médias móveis mais longas. Um simples sistema de crossover triplo pode envolver médias móveis de 5 dias, 10 dias e 20 dias. O gráfico acima mostra Home Depot (HD) com um EMA de 10 dias (linha pontilhada verde) e EMA de 50 dias (linha vermelha). A linha preta é o fechamento diário. Usando um crossover média móvel teria resultado em três whipsaws antes de pegar um bom comércio. O EMA de 10 dias quebrou abaixo do EMA de 50 dias em outubro atrasado (1), mas este não durou por muito tempo enquanto os 10 dias se moveram para trás acima em novembro meados de (2). Este cruzamento durou mais, mas o próximo crossover de baixa em janeiro (3) ocorreu perto dos níveis de preços de novembro, resultando em outra whipsaw. Esta cruz bearish não durou por muito tempo enquanto o EMA de 10 dias moveu para trás acima dos 50 dias alguns dias mais tarde (4). Depois de três sinais ruins, o quarto sinal prefigurou um movimento forte como o estoque avançou mais de 20. Existem dois takeaways aqui. Primeiramente, os crossovers são prone ao whipsaw. Um filtro de preço ou tempo pode ser aplicado para ajudar a evitar whipsaws. Os comerciantes podem exigir que o crossover durar 3 dias antes de agir ou exigir a EMA de 10 dias para mover acima / abaixo do EMA de 50 dias por um determinado montante antes de agir. Em segundo lugar, o MACD pode ser usado para identificar e quantificar esses cruzamentos. MACD (10,50,1) mostrará uma linha representando a diferença entre as duas médias móveis exponenciais. MACD torna-se positivo durante uma cruz de ouro e negativo durante uma cruz morta. O Oscilador de Preço Percentual (PPO) pode ser usado da mesma forma para mostrar diferenças percentuais. Observe que o MACD e o PPO são baseados em médias móveis exponenciais e não coincidirão com médias móveis simples. Este gráfico mostra Oracle (ORCL) com a EMA de 50 dias, EMA de 200 dias e MACD (50,200,1). Havia quatro crossovers de média móvel durante um período de 2 1/2 anos. Os três primeiros resultaram em whipsaws ou maus negócios. Uma tendência sustentada começou com o quarto crossover como ORCL avançado para os 20s meados. Mais uma vez, os crossovers de média móvel funcionam muito bem quando a tendência é forte, mas produzem perdas na ausência de uma tendência. Crossovers de preço As médias móveis também podem ser usadas para gerar sinais com crossovers de preços simples. Um sinal de alta é gerado quando os preços se movem acima da média móvel. Um sinal de baixa é gerado quando os preços se movem abaixo da média móvel. Os crossovers do preço podem ser combinados para negociar dentro da tendência mais grande. A média móvel mais longa define o tom para a tendência maior e a média móvel mais curta é usada para gerar os sinais. Um olharia para cruzes de preço de alta somente quando os preços já estão acima da média móvel mais longa. Isso seria negociar em harmonia com a maior tendência. Por exemplo, se o preço estiver acima da média móvel de 200 dias, os chartistas só se concentrarão nos sinais quando o preço se mover acima da média móvel de 50 dias. Obviamente, um movimento abaixo da média móvel de 50 dias precederia tal sinal, mas tais cruzamentos de baixa seriam ignorados porque a tendência maior está para cima. Uma cruz bearish sugeriria simplesmente um pullback dentro de um uptrend mais grande. Uma volta cruzada acima da média móvel de 50 dias indicaria uma subida dos preços e continuação da maior tendência de alta. O gráfico seguinte mostra a Emerson Electric (EMR) com a EMA de 50 dias e a EMA de 200 dias. O estoque movido acima e realizada acima da média móvel de 200 dias em agosto. Houve mergulhos abaixo dos 50 dias EMA no início de novembro e novamente no início de fevereiro. Os preços recuaram rapidamente acima dos 50 dias EMA para fornecer sinais de alta (setas verdes) em harmonia com a maior tendência de alta. MACD (1,50,1) é mostrado na janela do indicador para confirmar cruzamentos de preços acima ou abaixo do EMA de 50 dias. O EMA de 1 dia é igual ao preço de fechamento. MACD (1,50,1) é positivo quando o fechamento está acima do EMA de 50 dias e negativo quando o fechamento está abaixo do EMA de 50 dias. Suporte e Resistência As médias móveis também podem atuar como suporte em uma tendência de alta e resistência em uma tendência de baixa. Uma tendência de alta de curto prazo pode encontrar suporte perto da média móvel simples de 20 dias, que também é usada em Bandas de Bollinger. Uma tendência de alta de longo prazo pode encontrar apoio perto da média móvel simples de 200 dias, que é a média móvel mais popular a longo prazo. Se fato, a média móvel de 200 dias pode oferecer suporte ou resistência simplesmente porque é tão amplamente utilizado. É quase como uma profecia auto-realizável. O gráfico acima mostra o NY Composite com a média móvel simples de 200 dias de meados de 2004 até o final de 2008. Os 200 dias fornecidos suportam várias vezes durante o avanço. Uma vez que a tendência reverteu com uma quebra de apoio superior dupla, a média móvel de 200 dias agiu como resistência em torno de 9500. Não espere suporte exato e níveis de resistência de médias móveis, especialmente as médias móveis mais longas. Os mercados são impulsionados pela emoção, o que os torna propensos a superações. Em vez de níveis exatos, as médias móveis podem ser usadas para identificar zonas de suporte ou de resistência. Conclusões As vantagens de usar médias móveis precisam ser ponderadas contra as desvantagens. As médias móveis são a tendência que segue, ou retardar, os indicadores que serão sempre um passo atrás. Isso não é necessariamente uma coisa ruim embora. Afinal, a tendência é o seu amigo e é melhor para o comércio na direção da tendência. As médias móveis asseguram que um comerciante está em linha com a tendência atual. Mesmo que a tendência é seu amigo, os títulos gastam uma grande quantidade de tempo em intervalos de negociação, o que torna as médias móveis ineficazes. Uma vez em uma tendência, as médias móveis mantê-lo-ão dentro, mas dar também sinais atrasados. Don039t esperar para vender no topo e comprar na parte inferior usando médias móveis. Tal como acontece com a maioria das ferramentas de análise técnica, médias móveis não devem ser utilizados por conta própria, mas em conjunto com outras ferramentas complementares. Os cartistas podem usar médias móveis para definir a tendência geral e, em seguida, usar RSI para definir overbought ou oversold níveis. Adicionando médias móveis para gráficos StockCharts As médias móveis estão disponíveis como um recurso de sobreposição de preços na bancada do SharpCharts. Usando o menu suspenso Sobreposições, os usuários podem escolher uma média móvel simples ou uma média móvel exponencial. O primeiro parâmetro é usado para definir o número de períodos de tempo. Um parâmetro opcional pode ser adicionado para especificar qual campo de preço deve ser usado nos cálculos - O para o Open, H para o Alto, L para o Baixo e C para o Close. Uma vírgula é usada para separar os parâmetros. Outro parâmetro opcional pode ser adicionado para deslocar as médias móveis para a esquerda (passado) ou para a direita (futuro). Um número negativo (-10) deslocaria a média móvel para a esquerda 10 períodos. Um número positivo (10) deslocaria a média móvel para o direito 10 períodos. Múltiplas médias móveis podem ser superados o preço parcela simplesmente adicionando outra linha de superposição para a bancada. Os membros do StockCharts podem alterar as cores eo estilo para diferenciar entre várias médias móveis. Depois de selecionar um indicador, abra Opções Avançadas clicando no pequeno triângulo verde. As Opções Avançadas também podem ser usadas para adicionar uma sobreposição média móvel a outros indicadores técnicos como RSI, CCI e Volume. Clique aqui para um gráfico ao vivo com várias médias móveis diferentes. Usando Médias Móveis com Varreduras StockCharts Aqui estão alguns exemplos de varreduras que os membros da StockCharts podem usar para varrer para várias situações de média móvel: Bullish Moving Average Cross: Esta varredura procura ações com uma média móvel em ascensão de 150 dias simples e uma linha de alta dos 5 EMA de dia e EMA de 35 dias. A média móvel de 150 dias está subindo, desde que ela esteja negociando acima de seu nível cinco dias atrás. Um cruzamento de alta ocorre quando o EMA de 5 dias se move acima do EMA de 35 dias acima do volume médio. Bearish Moving Average Cross: Esta pesquisa procura por ações com uma queda de 150 dias de média móvel simples e uma cruz de baixa dos 5 dias EMA e 35 dias EMA. A média móvel de 150 dias está caindo enquanto ela está negociando abaixo de seu nível cinco dias atrás. Uma cruz de baixa ocorre quando a EMA de 5 dias se move abaixo da EMA de 35 dias acima do volume médio. Estudo adicional O livro de John Murphy tem um capítulo dedicado a médias móveis e seus vários usos. Murphy abrange os prós e os contras de médias móveis. Além disso, Murphy mostra como as médias móveis funcionam com Bollinger Bands e sistemas de negociação baseados em canais. Análise Técnica dos Mercados Financeiros John MurphyAverages / Média Móvel Simples Médias / Média Móvel Simples Você é encorajado a resolver esta tarefa de acordo com a descrição da tarefa, usando qualquer linguagem que você conheça. Calculando a média móvel simples de uma série de números. Criar uma função stateful / classe / instância que leva um período e retorna uma rotina que leva um número como argumento e retorna uma média móvel simples de seus argumentos até agora. Uma m�ia m�el simples �um m�odo para calcular uma m�ia de um fluxo de n�eros calculando apenas a m�ia dos �timos n�eros de 160 P 160 a partir do fluxo 160, em que 160 P 160 �conhecido como o per�do. Ele pode ser implementado chamando uma rotina de iniciação com 160 P 160 como argumento, 160 I (P), 160 que deve retornar uma rotina que, quando chamada com membros individuais, sucessivos de um fluxo de números, calcula a média de Para), os últimos 160 P 160 deles, vamos chamar este 160 SMA (). A palavra 160 estado 160 na descrição da tarefa refere-se à necessidade de 160 SMA () 160 lembrar determinadas informações entre as chamadas para ele: 160 O período, 160 P 160 Um recipiente ordenado de pelo menos os últimos 160 P 160 números de cada um dos Suas chamadas individuais. Stateful 160 também significa que chamadas sucessivas para 160 I (), 160 o inicializador, 160 devem retornar rotinas separadas que não 160 não compartilham o estado salvo para que possam ser usadas em dois fluxos de dados independentes. Pseudo-código para uma implementação de 160 SMA 160 é: Esta versão usa uma fila persistente para conter os valores p mais recentes. Cada função retornada de init-moving-average tem seu estado em um átomo contendo um valor de fila. Esta implementação usa uma lista circular para armazenar os números dentro da janela no início de cada ponteiro de iteração refere-se à célula de lista que mantém o valor apenas movendo para fora da janela e para ser substituído com o valor apenas adicionado. Usando um fechamento editar Atualmente este sma não pode ser nogc porque ele aloca um encerramento no heap. Alguma análise de escape pode remover a alocação de heap. Usando uma edição de estrutura Esta versão evita a alocação de heap do fechamento mantendo os dados no quadro de pilha da função principal. Mesmo resultado: Para evitar que as aproximações de ponto flutuante sigam se acumulando e crescendo, o código poderia executar uma soma periódica em toda a matriz de filas circulares. Esta implementação produz dois estados de compartilhamento de objetos (função). É idiomático em E separar a entrada da saída (ler a partir da escrita) em vez de combiná-los em um objeto. A estrutura é a mesma que a implementação do Desvio PadrãoE. O programa elixir abaixo gera uma função anônima com um período embutido p, que é usado como o período da média móvel simples. A função de execução lê entrada numérica e passa para a função anônima recém-criada e, em seguida, inspeciona o resultado para STDOUT. A saída é mostrada abaixo, com a média, seguida pela entrada agrupada, formando a base de cada média móvel. Erlang tem fechamentos, mas variáveis ​​imutáveis. Uma solução então é usar processos e uma simples mensagem passando API baseada. As linguagens de matriz têm rotinas para calcular os avarages deslizando para uma determinada seqüência de itens. É menos eficiente para loop como nos comandos a seguir. Solicita continuamente uma entrada I. Que é adicionado ao final de uma lista L1. L1 pode ser encontrado pressionando 2ND / 1, e a média pode ser encontrada em List / OPS Pressione ON para terminar o programa. Função que retorna uma lista contendo os dados médios do argumento fornecido Programa que retorna um valor simples em cada invocação: list é a média da lista: p é o período: 5 retorna a lista média: Exemplo 2: Usando o programa movinav2 (i , 5) - Inicializando o cálculo da média móvel e definindo o período de 5 movinav2 (3, x): x - novos dados na lista (valor 3), e o resultado será armazenado na variável x e exibido movinav2 (4, x) : X - novos dados (valor 4), eo novo resultado será armazenado na variável x, e exibido (43) / 2. Descrição da função movinavg: variável r - é o resultado (a lista média) que será retornada variável i - é a variável de índice, e aponta para o fim da sub-lista a lista sendo calculada a média. Variável z - uma variável auxiliar A função usa a variável i para determinar quais valores da lista serão considerados no cálculo da média seguinte. Em cada iteração, a variável i aponta para o último valor na lista que será utilizado no cálculo médio. Portanto, só precisamos descobrir qual será o primeiro valor na lista. Geralmente bem tem que considerar p elementos, então o primeiro elemento será o indexado por (i-p1). No entanto, nas primeiras iterações, esse cálculo será normalmente negativo, de modo que a seguinte equação evitará índices negativos: max (i-p1,1) ou, arranjar a equação, max (i-p, 0) 1. Mas o número de elementos nas primeiras iterações também será menor, o valor correto será (índice final - índice de início 1) ou, arranjar a equação, (i - (max (ip, 0) 1) e então , (I-max (ip, 0)). A variável z detém o valor comum (max (ip), 0) então o beginindex será (z1) e os numberofelements serão (iz) mid (list, z1, iz) retornará a lista de valor que será a soma média .) Irá somá-los soma (.) / (Iz) ri irá média deles e armazenar o resultado no lugar apropriado na lista de resultados Usando um encerramento e criando uma funçãoEu sei que isso é alcançável com o impulso como por: Mas eu realmente gostaria Para evitar o uso de reforço. Eu tenho googled e não encontrei qualquer exemplos adequados ou legível. Basicamente, eu quero acompanhar a média móvel de um fluxo em andamento de um fluxo de números de ponto flutuante usando os mais recentes números de 1000 como uma amostra de dados. Qual é a maneira mais fácil de conseguir isso que eu experimentei com o uso de uma matriz circular, média móvel exponencial e uma média móvel mais simples e descobriu que os resultados da matriz circular adequado às minhas necessidades. Se suas necessidades são simples, você pode apenas tentar usar uma média móvel exponencial. Simplificando, você faz uma variável de acumulador, e como seu código olha para cada amostra, o código atualiza o acumulador com o novo valor. Você escolhe um alfa constante que está entre 0 e 1 e calcula isso: Você só precisa encontrar um valor de alfa onde o efeito de uma determinada amostra só dura cerca de 1000 amostras. Hmm, Im realmente não tenho certeza que isso é adequado para você, agora que Ive colocá-lo aqui. O problema é que 1000 é uma janela muito longa para uma média móvel exponencial Não tenho certeza se há um alfa que estenderia a média nos últimos 1000 números, sem subfluxo no cálculo do ponto flutuante. Mas se você quisesse uma média menor, como 30 números ou assim, esta é uma maneira muito fácil e rápida de fazê-lo. Respondeu 12 de junho 12 em 4:44 1 em seu borne. A média móvel exponencial pode permitir que o alfa seja variável. Portanto, isso permite que ele seja usado para calcular médias de base de tempo (por exemplo, bytes por segundo). Se o tempo desde a última actualização do acumulador for superior a 1 segundo, deixe alfa ser 1.0. Caso contrário, você pode deixar alfa ser (usecs desde a última atualização / 1000000). Ndash jxh Jun 12 12 at 6:21 Basicamente, eu quero acompanhar a média móvel de um fluxo em curso de um fluxo de números de ponto flutuante usando os mais recentes números de 1000 como uma amostra de dados. Observe que o abaixo atualiza o total como elementos como adicionado / substituído, evitando costal O (N) traversal para calcular a soma - necessária para a média - on demand. Total é feito um parâmetro diferente de T para suporte, e. Usando um longo longo quando totalizando 1000 s longos, um int para char s, ou um dobro ao total float s. Este é um pouco falho em que numsamples poderia ir passado INTMAX - se você se importa que você poderia usar um unsigned longo longo. Ou usar um membro de dados bool extra para gravar quando o recipiente é preenchido pela primeira vez enquanto ciclismo numsamples em torno da matriz (melhor então renomeado algo inócuo como pos). Respondida em 12 de junho de 12 às 5:19, assume-se que o operador quotvoid (amostra T) é, na verdade, operador quotvoid (T amostra) quot. Ndash oPless Jun 8 14 at 11:52 oPless ahhh. Bem manchado. Na verdade, eu quis dizer para ser void operador () (T amostra), mas é claro que você poderia usar qualquer nota que você gostava. Vai corrigir, obrigado. Ndash Tony D 8 Jun 14 às 14:27

No comments:

Post a Comment