Saturday 21 October 2017

Média Móvel Ponderada C


Estou tentando calcular a média móvel de um sinal. O valor do sinal (um duplo) é atualizado em tempos aleatórios. Eu estou procurando uma maneira eficiente de calcular a sua média ponderada de tempo durante uma janela de tempo, em tempo real. Eu poderia fazer isso sozinho, mas é mais desafiador do que eu pensava. A maioria dos recursos que eu encontrei na internet estão calculando a média móvel do sinal periódico, mas as atualizações de minas em tempo aleatório. Alguém sabe bons recursos para o que o truque é o seguinte: Você recebe atualizações em tempos aleatórios através de void update (tempo int, valor float). No entanto, você também precisa acompanhar quando uma atualização cai fora da janela de tempo, então você define um alarme que chamado no tempo N que remove a atualização anterior de ser sempre considerado novamente na computação. Se isso acontecer em tempo real, você pode solicitar que o sistema operacional faça uma chamada para um método void dropoffoldestupdate (int time) para ser chamado no momento N Se esta é uma simulação, você não pode obter ajuda do sistema operacional e você precisa Faça-o manualmente. Em uma simulação você chamaria métodos com o tempo fornecido como um argumento (que não se correlaciona com o tempo real). No entanto, uma suposição razoável é que as chamadas são garantidas de tal forma que os argumentos de tempo estão aumentando. Neste caso, você precisa manter uma lista ordenada de valores de tempo de alarme e, para cada chamada de atualização e leitura, verifique se o argumento de tempo é maior que o cabeçalho da lista de alarmes. Embora seja maior você faz o processamento relacionado com o alarme (deixe cair a atualização mais antiga), remova a cabeça e verifique novamente até que todos os alarmes antes do tempo determinado sejam processados. Em seguida, faça a chamada de atualização. Até agora tenho assumido que é óbvio o que você faria para a computação real, mas vou elaborar apenas no caso. Eu suponho que você tem um método float read (tempo int) que você usa para ler os valores. O objetivo é tornar essa chamada o mais eficiente possível. Portanto, você não calcula a média móvel sempre que o método de leitura é chamado. Em vez disso, você precompute o valor a partir da última atualização ou o último alarme e ajustar esse valor por um par de operações ponto flutuante para conta para a passagem do tempo desde a última atualização. (Isto é, um número constante de operações excepto para talvez processar uma lista de alarmes acumulados). Esperemos que isso seja claro - este deve ser um algoritmo bastante simples e bastante eficiente. Otimização adicional. Um dos problemas restantes é se um grande número de atualizações acontecer dentro da janela de tempo, então há um longo tempo para que não há nem lê nem atualizações e, em seguida, uma leitura ou atualização vem junto. Neste caso, o algoritmo acima será ineficaz na atualização incremental do valor para cada uma das atualizações que está caindo. Isso não é necessário, porque nós só nos preocupamos com a última atualização além da janela de tempo, então se houver uma maneira eficiente de deixar todas as atualizações mais antigas, que ajudaria. Para fazer isso, podemos modificar o algoritmo para fazer uma busca binária de atualizações para encontrar a atualização mais recente antes da janela de tempo. Se houver relativamente poucas atualizações que precisam ser descartadas, então um pode atualizar incrementalmente o valor para cada atualização descartada. Mas se houver muitas atualizações que precisam ser descartadas, então um pode recalcular o valor do zero após deixar as atualizações antigas. Apêndice sobre Computação Incremental: Eu deveria esclarecer o que eu quero dizer por computação incremental acima na sentença tweak este valor por um par de operações de ponto flutuante para explicar a passagem do tempo desde a última atualização. Cálculo inicial não incremental: então iterar sobre as atualizações relevantes por ordem crescente de tempo: movimentação (sum lastupdate timesincelastupdate) / windowlength. Agora, se exatamente uma atualização cair da janela, mas nenhuma nova atualização chegar, ajuste a soma como: (note que é priorupdate que tem seu timestamp modificado para iniciar o último início da janela). E se exatamente uma atualização entra na janela, mas nenhuma nova atualização cai, ajuste a soma como: Como deve ser óbvio, este é um esboço aproximado, mas espero que ele mostra como você pode manter a média tal que é O (1) operações por atualização Sobre uma base amortizada. Mas observe otimização adicional no parágrafo anterior. Observe também as questões de estabilidade mencionadas em uma resposta mais antiga, o que significa que os erros de ponto flutuante podem se acumular em um grande número dessas operações incrementais, de modo que há uma divergência em relação ao resultado da computação completa que é significativa para a aplicação. Se uma aproximação é OK e há um tempo mínimo entre as amostras, você pode tentar super-amostragem. Tenha uma matriz que represente intervalos de tempo uniformemente espaçados que sejam mais curtos que o mínimo e que, em cada período de tempo, armazene a amostra mais recente que foi recebida. Quanto menor o intervalo, mais próxima será a média do valor real. O período não deve ser maior que a metade do mínimo ou há uma chance de faltar uma amostra. Respondeu Dec 15 11 at 18:12 Obrigado pela resposta. Uma melhoria que seria necessário para realmente quotcachequot o valor da média total para que don39t loop o tempo todo. Além disso, pode ser um ponto menor, mas não seria mais eficiente usar um deque ou uma lista para armazenar o valor, uma vez que assumimos que a atualização virá na ordem correta. A inserção seria mais rápida do que no mapa. Ndash Arthur 16 dez às 8:55 Sim, você poderia armazenar em cache o valor de soma. Subtraia os valores das amostras que você apaga, adicione os valores das amostras inseridas. Além disso, sim, um dequeltpairltSample, Dategtgt pode ser mais eficiente. Eu escolhi o mapa para a legibilidade, ea facilidade de invocar map :: upperbound. Como sempre, escreva o código correto primeiro e, em seguida, perfile e mude as alterações incrementais. Ndash Rob Dec 16 11 at 15:00 Nota: Aparentemente esta não é a maneira de abordar isso. Deixando aqui para referência sobre o que está errado com esta abordagem. Verifique os comentários. UPDATED - com base no comentário Olis. Não tenho certeza sobre a instabilidade que ele está falando embora. Use um mapa ordenado de tempos de chegada contra valores. Na chegada de um valor adicione a hora de chegada ao mapa ordenado junto com seu valor e atualize a média móvel. Aviso este é pseudo-código: Lá. Não totalmente desenvolvido, mas você começa a idéia. Coisas a observar. Como eu disse o acima é pseudo código. Você precisará escolher um mapa apropriado. Não remova os pares à medida que você iterar através como você irá invalidar o iterador e terá que começar novamente. Veja Olis comentário abaixo também. Este trabalho não funciona: ele não leva em conta que proporção do comprimento da janela de cada valor existe para. Além disso, essa abordagem de adição e subtração é apenas estável para tipos inteiros, não para flutuadores. Ndash Oliver Charlesworth Dec 15 11 em 12:29 OliCharlesworth - desculpe eu perdi alguns pontos-chave na descrição (duplo e ponderada em tempo). Eu vou atualizar. Obrigado. Ndash Dennis Dec 15 11 at 12:33 A ponderação de tempo é ainda outro problema. Mas isso não é o que eu estou falando. Eu estava me referindo ao fato de que quando um novo valor entra pela primeira vez na janela de tempo, sua contribuição para a média é mínima. Sua contribuição continua a aumentar até que um novo valor entre. Ndash Oliver Charlesworth Dec 15 11 em 12: 35 Médias móveis ponderadas: O básico Ao longo dos anos, os técnicos encontraram dois problemas com a média móvel simples. O primeiro problema reside no período de tempo da média móvel (MA). A maioria dos analistas técnicos acreditam que a ação preço. O preço de abertura ou de fechamento das ações, não é suficiente para depender para predizer adequadamente sinais de compra ou venda da ação de crossover MAs. Para resolver este problema, os analistas agora atribuem mais peso aos dados de preços mais recentes usando a média móvel exponencialmente suavizada (EMA). Exemplo: Por exemplo, usando um MA de 10 dias, um analista levaria o preço de fechamento do 10º dia e multiplicaria esse número por 10, o nono dia por nove, o oitavo Dia por oito e assim por diante para o primeiro do MA. Uma vez determinado o total, o analista dividiria o número pela adição dos multiplicadores. Se você adicionar os multiplicadores do exemplo de MA de 10 dias, o número é 55. Esse indicador é conhecido como a média móvel ponderada linearmente. (Para a leitura relacionada, verifique para fora as médias moventes simples fazem tendências estar para fora.) Muitos técnicos são crentes firmes na média movente exponencial suavizada (EMA). Este indicador tem sido explicado de tantas maneiras diferentes que confunde estudantes e investidores. Talvez a melhor explicação venha de John J. Murphys Análise Técnica dos Mercados Financeiros (publicado pelo New York Institute of Finance, 1999): A média móvel exponencialmente suavizada aborda ambos os problemas associados à média móvel simples. Primeiro, a média exponencialmente suavizada atribui um maior peso aos dados mais recentes. Portanto, é uma média móvel ponderada. Mas, embora atribua menor importância aos dados de preços passados, inclui no seu cálculo todos os dados na vida útil do instrumento. Além disso, o usuário é capaz de ajustar a ponderação para dar maior ou menor peso ao preço dos dias mais recentes, que é adicionado a uma porcentagem do valor dias anteriores. A soma de ambos os valores percentuais adiciona até 100. Por exemplo, o preço dos últimos dias poderia ser atribuído um peso de 10 (0,10), que é adicionado ao peso dias anteriores de 90 (0,90). Isto dá o último dia 10 da ponderação total. Isso seria o equivalente a uma média de 20 dias, dando ao preço dos últimos dias um valor menor de 5 (0,05). Figura 1: Média Móvel Suavizada Exponencialmente O gráfico acima mostra o índice Nasdaq Composite da primeira semana de agosto de 2000 a 1º de junho de 2001. Como você pode ver claramente, a EMA, que neste caso está usando os dados de fechamento de preços em um Período de nove dias, tem sinais de venda definitiva no dia 8 de setembro (marcado por uma seta preta para baixo). Este foi o dia em que o índice quebrou abaixo do nível de 4.000. A segunda seta preta mostra outra perna para baixo que os técnicos estavam realmente esperando. O Nasdaq não conseguiu gerar volume suficiente e juros dos investidores de varejo para quebrar a marca de 3.000. Em seguida, mergulhou novamente para baixo para fora em 1619.58 em 4 de abril. A tendência de alta de 12 de abril é marcado por uma seta. Aqui o índice fechou em 1.961,46, e os técnicos começaram a ver os gestores de fundos institucionais começando a pegar alguns negócios como Cisco, Microsoft e algumas das questões relacionadas à energia. (Leia nossos artigos relacionados: Envelopes Móveis em Movimento: Refinando uma Ferramenta de Negociação Popular e Saldo Médio em Movimento.) Uma pessoa que negocia derivativos, commodities, títulos, ações ou moedas com um risco maior que a média em troca. QuotHINTquot é uma sigla que significa quothigh renda não impostos. quot É aplicado a high-assalariados que evitam pagar renda federal. Um fabricante de mercado que compra e vende títulos corporativos de curto prazo, denominados papel comercial. Um negociante de papel é tipicamente. A compra e venda ilimitada de bens e serviços entre países sem a imposição de restrições, tais como. Média ponderada Média ponderada A média ponderada é uma média calculada atribuindo valores num conjunto de dados mais influência de acordo com algum atributo dos dados. É uma média em que cada quantidade a ser calculada é atribuída a um peso, e essas ponderações determinam a importância relativa de cada quantidade na média. As ponderações são o equivalente a ter muitos itens semelhantes com o mesmo valor envolvido na média. VIDEO Carregar o leitor. BREAKING Down Média ponderada A média ponderada é mais frequentemente calculada em relação à frequência dos valores de um conjunto de dados. Uma média ponderada pode ser calculada de diferentes maneiras, no entanto, se certos valores em um conjunto de dados são dados mais importância por razões diferentes da freqüência de ocorrência. Cálculo da média ponderada dos investidores muitas vezes compilar uma posição em um estoque ao longo de vários anos. Os preços das ações mudam diariamente, por isso pode ser difícil manter o controle da base de custo sobre as ações acumuladas ao longo de um período de anos. Se um investidor quiser calcular uma média ponderada do preço da ação que pagou pelas ações, ele deve multiplicar o número de ações adquiridas a cada preço por esse preço, somar esses valores e dividir o valor total pelo número total de ações . Por exemplo, digamos que um investidor adquire 100 ações de uma empresa no ano 1 em 10 e 50 ações da mesma empresa no ano 2 em 40. Para obter a média ponderada do preço pago, o investidor multiplica 100 ações por 10 para Ano 1, 50 ações por 40 para o ano 2 e, em seguida, adiciona os resultados para obter um valor total de 3.000. O investidor divide o valor total pago pelas ações, 3.000 neste caso, pelo número total de ações adquiridas ao longo dos dois anos, 150, para obter o preço médio ponderado pago de 20. Esta média é ponderada em relação ao número de ações Adquirido a cada preço e não apenas ao preço absoluto. Exemplos de Média Ponderada A média ponderada mostra-se em muitas áreas de financiamento, além do preço de compra de ações, incluindo retornos de carteira, contabilidade de estoque e avaliação. Quando um fundo, que detém vários títulos, é de 10 no ano, que 10 representa uma média ponderada de retornos para o fundo em relação ao valor de cada posição no fundo. Para a contabilidade de inventário, o valor médio ponderado das contas de estoque explica as flutuações nos preços das commodities, por exemplo, enquanto os métodos LIFO ou FIFO dão mais importância ao tempo do que ao valor. Ao avaliar as empresas para discernir se suas ações estão corretamente com preço, os investidores usam o custo médio ponderado do capital (WACC) para descontar os fluxos de caixa de uma empresa. O WACC é ponderado com base no valor de mercado da dívida e do capital próprio em uma estrutura de capital da empresa. Desvantagens sazonais e tendências por médias móveis exponencialmente ponderadas Charles C. Holt Graduate School of Business, Universidade do Texas em Austin, Austin, TX, EUA Disponível on-line 28 Janeiro 2004. Resumo O artigo fornece um desenvolvimento sistemático das expressões de previsão para médias móveis ponderadas exponenciais. Métodos para séries sem tendência, ou tendência aditiva ou multiplicativa são examinados. Da mesma forma, os métodos cobrem séries não-sazonais e sazonais com estruturas de erro aditivo ou multiplicativo. O artigo é uma versão reimpressa do relatório de 1957 para o Escritório de Pesquisa Naval (ONR 52) e está sendo publicado aqui para fornecer maior acessibilidade. Palavras-chave Exponencial suavização Previsão Local sazonal Tendências locais Vitae Biografia: Charles C. HOLT é Professor de Gestão emérito na Escola de Pós-Graduação de Negócios, Universidade do Texas em Austin. Sua pesquisa atual é sobre métodos de decisão quantitativa, sistemas de apoio à decisão e previsão financeira. Anteriormente, ele fez pesquisa e ensino em M. I.T. A Universidade Carnegie Mellon, a London School of Economics, a Universidade de Wisconsin eo Urban Institute. Atua em aplicações de computador desde 1947, e tem feito pesquisas sobre controle automático, simulação de sistemas econômicos, programação de produção, emprego e estoques e dinâmica de inflação e desemprego. Média simples média móvel / 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 fecho e criando uma função

No comments:

Post a Comment