Thursday, 9 November 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 forma eficiente de calcular a sua média ponderada em tempo sobre 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 que o truque é o seguinte: Você recebe atualizações em tempos aleatórios por meio de atualização void (tempo int, valor float). No entanto, você também precisa acompanhar quando uma atualização cai fora da janela de tempo, então você definir 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 atualização e chamada de leitura, você verifica se o argumento de tempo é maior que o cabeçalho da lista de alarmes. Enquanto é maior você faz o processamento relacionado com o alarme (solte 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á ineficiente na atualização incremental do valor para cada uma das atualizações que está caindo. Isso não é necessário porque só nos preocupamos com a última atualização além da janela de tempo, por isso, se houver uma maneira de descartar eficientemente todas as atualizações antigas, isso 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 datas relevantes por ordem crescente de tempo: movendo-se (sum lastupdate timesincelastupdate) windowlength. Agora, se exatamente uma atualização cai 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 de tal forma 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 aludidas em uma resposta mais antiga, o que significa que os erros de ponto flutuante podem se acumular em um grande número de tais 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 do que o mínimo, e em cada período de tempo armazene a amostra mais recente que foi recebida. Quanto mais curto o intervalo, mais próxima a média será do valor verdadeiro. O período não deve ser maior do que a metade do mínimo ou há uma chance de faltar uma amostra. Respondeu Dec 15 11 at 18:12 respondeu Dec 15 11 at 22:38 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, depois perfil e mude as mudanças incrementais. Ndash Rob 16 de dezembro às 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 de que ele está falando embora. Use um mapa ordenado de tempos de chegada contra valores. Após a chegada de um valor adicionar a hora de chegada para o mapa ordenado juntamente com o seu valor e atualizar 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, e 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). 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 15 de dezembro às 12: 35 Eu sei que isso é possível com o impulso como por: Mas eu realmente gostaria de evitar usar impulso. 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 contínuo de um fluxo de números de ponto flutuante usando os números de 1000 mais recentes 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 dura apenas 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 iria espalhar a média nos últimos 1000 números, sem subfluxo no cálculo de 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, isto 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ção1000000). Ndash jxh 12 de junho de 12 às 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 addedreplaced, 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 longa. Ou usar um membro de dados bool extra para gravar quando o recipiente é preenchido pela primeira vez enquanto ciclismo numsamples ao redor 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 de quotvoid (amostra T) é realmente operador quotvoid (T amostra) quot. Ndash oPless Jun 8 14 at 11:52 oPless ahhh. Bem manchado. Na verdade, eu quis dizer para ser vazio operador () (T amostra), mas é claro que você poderia usar qualquer nota que você gostava. Will fix, obrigado. Ndash Tony D Jun 8 14 em 14: 27 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 décimo 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. Em primeiro lugar, 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 dos 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 desde a primeira semana de agosto de 2000 até 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 em 1619.58 em 4 de abril. A tendência de alta de 12 de abril é marcada 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. O Artigo 50 é uma cláusula no tratado da UE que descreve as medidas que um país membro deve tomar para deixar a União Europeia. Grã-Bretanha. Beta é uma medida da volatilidade, ou risco sistemático, de um título ou de uma carteira em comparação com o mercado como um todo. Um tipo de imposto incidente sobre ganhos de capital incorridos por pessoas físicas e jurídicas. Os ganhos de capital são os lucros que um investidor. Uma ordem para comprar um título igual ou inferior a um preço especificado. Uma ordem de limite de compra permite que traders e investidores especifiquem. Uma regra do Internal Revenue Service (IRS) que permite retiradas sem penalidade de uma conta IRA. A regra requer that. What039s a diferença entre a média móvel e média móvel ponderada A 5-período de média móvel, com base nos preços acima, seria calculado utilizando a fórmula seguinte: Com base na equação acima, o preço médio durante o período listados acima Foi de 90,66. Usando médias móveis é um método eficaz para eliminar flutuações de preços fortes. A principal limitação é que os pontos de dados de dados mais antigos não são ponderados de forma diferente dos pontos de dados próximos ao início do conjunto de dados. É aqui que as médias móveis ponderadas entram em jogo. As médias ponderadas atribuem uma ponderação mais pesada a pontos de dados mais atuais, uma vez que são mais relevantes do que pontos de dados no passado distante. A soma da ponderação deve somar 1 (ou 100). No caso da média móvel simples, as ponderações são distribuídas igualmente, razão pela qual não são mostradas na tabela acima. Preço de Fechamento da AAPL

No comments:

Post a Comment