Wednesday 14 June 2017

Implementação Média Ponderada Em Movimento


Estou tentando calcular a média móvel de um sinal. O valor do sinal (um duplo) é atualizado em horários aleatórios. Estou procurando uma maneira eficiente de calcular sua média ponderada no tempo ao longo de uma janela de tempo, em tempo real. Eu poderia fazê-lo sozinho, mas é mais desafiante do que eu pensava. A maioria dos recursos que encontrei através da internet calculam a média móvel do sinal periódico, mas as atualizações das minas em tempo aleatório. Alguém conhece bons recursos para isso. O truque é o seguinte: você obtém atualizações em horários aleatórios através de atualização vazia (tempo int, valor flutuante). No entanto, você também precisa acompanhar quando uma atualização cai na janela de tempo, de modo que você configure um alarme chamado no momento N, que remove a atualização anterior de ser novamente considerado novamente na computação. Se isso acontecer em tempo real, você pode solicitar o sistema operacional para fazer uma chamada para um método void dropoffoldestupdate (int time) para ser chamado no tempo 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 hora do alarme e, para cada atualização e leitura, você verifica se o argumento de tempo é maior que o cabeçalho da lista de alarmes. Embora seja maior, você faz o processamento relacionado ao alarme (abandone a atualização mais antiga), remova a cabeça e verifique novamente até que todos os alarmes anteriores ao tempo fornecido sejam processados. Em seguida, faça a chamada de atualização. Tenho até agora assumido que é óbvio o que você faria para a computação real, mas vou elaborar apenas no caso. Eu suponho que você tenha um método flutuante lido (int time) que você usa para ler os valores. O objetivo é tornar este chamado tão eficiente quanto possível. Então você não calcula a média móvel sempre que o método de leitura é chamado. Em vez disso, você precomputa o valor a partir da última atualização ou o último alarme, e ajuste esse valor por algumas operações de ponto flutuante para explicar a passagem do tempo desde a última atualização. (I. E. Um número constante de operações, exceto para talvez processar uma lista de alarmes empilhados). 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 acontecerem dentro da janela de tempo, então há muito tempo para o qual não há leituras nem atualizações e, em seguida, uma leitura ou atualização vem junto. Nesse caso, o algoritmo acima será ineficiente ao atualizar de forma incremental o valor de 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 de descartar todas as atualizações mais antigas, isso ajudaria. Para fazer isso, podemos modificar o algoritmo para fazer uma pesquisa 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, pode-se incrementar o valor para cada atualização descartada. Mas se houver muitas atualizações que precisam ser descartadas, pode-se recalcular o valor a partir do zero depois de deixar as atualizações antigas. Apêndice em Computação Incremental: Devo esclarecer o que quero dizer pela computação incremental acima na frase ajustar esse valor por um par de operações de ponto flutuante para explicar a passagem do tempo desde a última atualização. Computação inicial não incremental: então iterar sobre os atuais relevantes em ordem crescente de tempo: tempo de exibição de motionaverage (sum tempo de atraso). Agora, se exatamente uma atualização cai fora da janela, mas nenhuma nova atualização chegou, ajuste a soma como: (note que é priorupdate, que tem seu timestamp modificado para iniciar o início da última janela). E se exatamente uma atualização entrar na janela, mas nenhuma nova atualização cai, ajuste a soma como: Como deve ser óbvio, este é um esboço áspero, mas espero que mostre como você pode manter a média de que é O (1) operações por atualização Em uma base amortizada. Mas observe uma 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 acumulam em um grande número dessas operações incrementais, de modo que existe uma divergência com o resultado da computação total que é significativa para o aplicativo. Se uma aproximação é OK e há um tempo mínimo entre amostras, você pode tentar super-amostragem. Tenha uma matriz que represente intervalos de tempo uniformemente espaçados que sejam menores do que o mínimo, e em cada período de tempo armazene a última amostra que foi recebida. Quanto menor o intervalo, mais próxima será a média para o valor verdadeiro. O período não deve ser superior a metade do mínimo ou há uma chance de perder uma amostra. Respondeu 15 de dezembro às 18:12 respondido 15 de dezembro às 22:38 Obrigado pela resposta. Uma melhoria que seria necessária para que o quotcachequot fosse o valor da média total, de modo que não estivemos todos os dias. Além disso, pode ser um ponto menor, mas não seria mais eficiente usar um deque ou uma lista para armazenar o valor, já que assumimos que a atualização virá na ordem correta. A inserção seria mais rápida do que no mapa. Ndash Arthur 16 de dezembro 11 às 8:55 Sim, você pode armazenar em cache o valor da soma. Submeta os valores das amostras que você apaga, adicione os valores das amostras que você inseriu. Além disso, sim, um dequeltpairltSample, Dategtgt pode ser mais eficiente. Eu escolhi o mapa para a legibilidade e a facilidade de invocar o mapa :: upperbound. Como sempre, escreva o código correto primeiro, depois faça o perfil e mude as mudanças incrementais. Ndash Rob Dec 16 11 at 15:00 Nota: Aparentemente, esta não é a maneira de abordar isso. Deixando-o aqui para referência sobre o que está errado com essa abordagem. Verifique os comentários. ATUALIZADO - com base no comentário Olis. Não tenho certeza sobre a instabilidade de que ele está falando. Use um mapa ordenado de tempos de chegada contra valores. Após a chegada de um valor, adicione a hora de chegada ao mapa ordenado juntamente com seu valor e atualize a média móvel. Advertindo isso é pseudo-código: aí. Não totalmente elaborado, mas você consegue a ideia. Coisas a serem observadas. Como eu disse, o acima é pseudo-código. Você precisará escolher um mapa apropriado. Não remova os pares conforme você itera, pois você invalidará o iterador e terá que começar de novo. Veja o comentário Olis abaixo também. Respondeu 15 de dezembro às 12:22 Isso não funciona: ele não leva em consideração a proporção do comprimento de janela de cada valor para. Além disso, essa abordagem de adicionar e depois subtrair é apenas estável para tipos inteiros, não flutuadores. Ndash Oliver Charlesworth 15 de dezembro às 12:29 OliCharlesworth - desculpe, perdi alguns pontos-chave na descrição (dupla e ponderada no tempo). Vou atualizar. Obrigado. Ndash Dennis 15 de dezembro 11 às 12:33 A ponderação do tempo é mais um problema. Mas isso não é o que eu estou falando. Eu estava me referindo ao fato de que quando um novo valor primeiro entra na janela de tempo, sua contribuição para a média é mínima. Sua contribuição continua a aumentar até um novo valor entrar. Ndash Oliver Charlesworth 15 de dezembro 11 em 12: 35net. sourceforge. openforecast. models Classe WeightedMovingAverageModel Um modelo de previsão média móvel ponderada é baseado em uma série temporal construída artificialmente, na qual o valor de um determinado período de tempo é substituído pela média ponderada desse valor E os valores para alguns períodos de tempo anteriores. Como você pode ter adivinhado a partir da descrição, este modelo é mais adequado para dados da série temporal, ou seja, dados que mudam ao longo do tempo. Uma vez que o valor de previsão para um determinado período é uma média ponderada dos períodos anteriores, a previsão sempre parecerá atrasada por aumentos ou diminuições nos valores observados (dependentes). Por exemplo, se uma série de dados tiver uma tendência ascendente notável, então uma previsão média móvel ponderada geralmente fornecerá uma subestimação dos valores da variável dependente. O modelo de média móvel ponderada, como o modelo de média móvel, tem uma vantagem em relação a outros modelos de previsão, na medida em que ele suaviza picos e depressões (ou vales) em um conjunto de observações. No entanto, como o modelo de média móvel, ele também possui várias desvantagens. Em particular, este modelo não produz uma equação real. Portanto, não é tão útil como uma ferramenta de previsão de longo alcance. Só pode ser usado de forma confiável para prever alguns períodos no futuro. Desde: 0.4 Autor: Steven R. Gould Campos herdados da classe net. sourceforge. openforecast. models. AbstractForecastingModel WeightedMovingAverageModel () Constrói um novo modelo de previsão média móvel ponderada. WeightedMovingAverageModel (pesos duplos) Constrói um novo modelo de previsão média móvel ponderada, usando os pesos especificados. Previsão (double timeValue) Retorna o valor de previsão da variável dependente para o valor dado da variável de tempo independente. GetForecastType () Retorna um nome de uma ou duas palavras deste tipo de modelo de previsão. GetNumberOfPeriods () Retorna o número atual de períodos usados ​​neste modelo. GetNumberOfPredictors () Retorna o número de preditores usados ​​pelo modelo subjacente. SetWeights (pesos duplos) Define os pesos utilizados por este modelo de previsão média móvel ponderada para os pesos dados. ToString () Isso deve ser substituído para fornecer uma descrição textual do modelo de previsão atual, incluindo, sempre que possível, qualquer parâmetro derivado usado. Métodos herdados da classe net. sourceforge. openforecast. models. AbstractTimeBasedModel WeightedMovingAverageModel Constrói um novo modelo de previsão média móvel ponderada, usando os pesos especificados. Para que um modelo válido seja construído, você deve chamar init e passar um conjunto de dados contendo uma série de pontos de dados com a variável de tempo inicializada para identificar a variável independente. O tamanho da matriz de pesos é usado para determinar o número de observações a serem utilizadas para calcular a média móvel ponderada. Além disso, o período mais recente receberá o peso definido pelo primeiro elemento da matriz, isto é, pesos0. O tamanho da matriz de pesos também é usado para determinar a quantidade de períodos futuros que podem ser efetivamente previstos. Com uma média móvel ponderada de 50 dias, não podemos razoavelmente - com algum grau de precisão - prever mais de 50 dias além do último período para o qual os dados estão disponíveis. Até a previsão próxima ao final deste intervalo provavelmente não será confiável. Nota sobre pesos Em geral, os pesos passados ​​para este construtor devem somar até 1.0. No entanto, como uma conveniência, se a soma dos pesos não for igual a 1,0, esta implementação dimensiona todos os pesos proporcionalmente para que eles somem para 1,0. Parâmetros: pesos - um conjunto de pesos a atribuir às observações históricas ao calcular a média móvel ponderada. WeightedMovingAverageModel Constrói um novo modelo de previsão média móvel ponderada, usando a variável nomeada como a variável independente e os pesos especificados. Parâmetros: independentVariable - o nome da variável independente a ser usada neste modelo. Pesos - uma série de pesos para atribuir às observações históricas ao calcular a média móvel ponderada. WeightedMovingAverageModel Constrói um novo modelo de previsão média móvel ponderada. Este construtor destina-se a ser usado apenas por subclasses (portanto, está protegido). Qualquer subclasse usando este construtor deve invocar o método setWeights (protegido) subseqüentemente para inicializar os pesos a serem usados ​​por este modelo. WeightedMovingAverageModel Constrói um novo modelo de previsão média móvel ponderada usando a variável independente fornecida. Parâmetros: independentVariable - o nome da variável independente a ser usada neste modelo. SetWeights Define os pesos utilizados por este modelo de previsão média móvel ponderada para os pesos dados. Este método destina-se a ser usado apenas por subclasses (portanto, está protegido), e somente em conjunto com o construtor (protegido) de um argumento. Qualquer subclasse que utilize o construtor de um argumento deve subseqüentemente chamar setWeights antes de invocar o método AbstractTimeBasedModel. init (net. sourceforge. openforecast. DataSet) para inicializar o modelo. Nota sobre pesos Em geral, os pesos passados ​​para este método devem somar até 1.0. No entanto, como uma conveniência, se a soma dos pesos não for igual a 1,0, esta implementação dimensiona todos os pesos proporcionalmente para que eles somem para 1,0. Parâmetros: pesos - um conjunto de pesos a atribuir às observações históricas ao calcular a média móvel ponderada. Retorna o valor de previsão da variável dependente para o valor dado da variável de tempo independente. As subclasses devem implementar este método de forma consistente com o modelo de previsão que implementam. As subclasses podem fazer uso dos métodos getForecastValue e getObservedValue para obter previsões e observações anteriores, respectivamente. Especificado por: previsão na classe AbstractTimeBasedModel Parâmetros: timeValue - o valor da variável de tempo para o qual um valor de previsão é necessário. Retorna: o valor de previsão da variável dependente para o tempo determinado. Lances: IllegalArgumentException - se houver dados históricos insuficientes - observações passadas para init - para gerar uma previsão para o valor de tempo determinado. GetNumberOfPredictors Retorna o número de preditores usados ​​pelo modelo subjacente. Retorna: o número de preditores utilizados pelo modelo subjacente. GetNumberOfPeriods Retorna o número atual de períodos usados ​​neste modelo. Especificado por: getNumberOfPeriods na classe AbstractTimeBasedModel Retorna: o número atual de períodos usados ​​neste modelo. GetForecastType Retorna um nome de uma ou duas palavras deste tipo de modelo de previsão. Mantenha isso curto. Uma descrição mais longa deve ser implementada no método toString. Isso deve ser substituído para fornecer uma descrição textual do modelo de previsão atual, incluindo, sempre que possível, qualquer parâmetro derivado usado. Especificado por: toString na interface ForecastingModel Overrides: toString na classe AbstractTimeBasedModel Retorna: uma representação de cadeia do modelo de previsão atual e seus parâmetros. Média de Mudança Exponencial (EMA) A fórmula EMA clássica é: Diferente da Média de Movimento Simples. Onde o peso de todas as barras anteriores é igual, a Média de Movimento Exponencial torna mais importante a barra mais recente. O peso de cada barra mais antiga diminui exponencialmente. Abaixo está um gráfico de peso para N 10 (1 é o preço atual, 2 o anterior e assim por diante): A fórmula de peso é onde eu estou a uma distância da barra mais recente. 0 significa o mais recente, 1 a barra anterior e assim por diante. Primeiro Valor A fórmula faz referência ao valor anterior e não existe um acordo padrão, qual é o primeiro valor (o mais antigo). A implementação diferente da EMA usa: o primeiro preço (MT4, Marketscope) ou a média móvel simples dos primeiros preços N (Stockcharts). No lugar da média móvel simples A média móvel exponencial pode ser usada exatamente como a média móvel simples. Especialmente na situação em que a inércia da Média de Movimento Simples não pode ser ignorada. Basta comparar EMA (10) e MVA (10) aplicadas nos mesmos preços: Limitações A Média de Movimento Exponencial baseia-se em todos os seus valores anteriores, portanto, o resultado do indicador para uma determinada barra depende de quanto dados históricos são levados em consideração. Assim, na situação em que mais dados históricos são carregados, o valor do indicador pode ser diferente do calculado anteriormente. Indicadores Este artigo em outros idiomas

No comments:

Post a Comment