Friday 22 September 2017

Simple Moving Average Algorithm Java


Uma implementação simples de média móvel em Java Em várias ocasiões, eu quis computar métricas simples em meus aplicativos Java, por exemplo, o número de acessos por hora ou erros em um período de tempo. Enquanto a computação de métricas simples não é muito difícil, o seu trabalho e apenas Id extra passar esse tempo no domínio do problema. Fiquei surpreso ao não encontrar nenhuma solução amplamente aceita para métricas em Java. Eu encontrei Metrics, mas parecia um pouco complicado e não bem documentado - Tudo o que eu realmente queria era calcular uma média móvel. Eu pensei sobre o problema um pouco mais e decidiu que não é um problema difícil. Heres minha solução Isso funciona criando uma matriz de tamanho de freqüência de atualização de janela, em seguida, um segmento define a contagem para o próximo índice na matriz na freqüência de atualização. A contagem para o intervalo é simplesmente arrayi - arrayi1, que é a contagem mais recente menos a contagem mais antiga. Para um intervalo de 10 minutos, a contagem mais antiga (i1) tem exatamente 10 minutos. Para adicionar uma média móvel ao nosso primeiro código bem precisa de um contador, usando AtomicLong. Esse contador deve ser incrementado com base nos eventos que você está interessado em computação (por exemplo, solicitações POST para um serviço REST). Precisamos fornecer a implementação com acesso ao contador e que é realizado através da interface GetCount. Aqui Ill criar uma média móvel com uma janela de 5 minutos que atualiza a cada segundo. E para obter a média atual simplesmente chamamos o método getAverage: Um detalhe de implementação chave é como o tamanho do array é determinado: dividindo a janela pela frequência de atualização. Assim, uma grande janela com freqüência de atualização freqüente pode consumir uma quantidade significativa de memória. Neste exemplo, o tamanho da matriz é razoável 300. No entanto, se criamos uma média móvel de 24 horas com um intervalo de 1 segundo o tamanho seria 86400 Uma freqüência de atualização mais razoável para um período de 24 horas pode ser a cada 5 minutos (tamanho da matriz de 288 ). Outra consideração de escolher a janela e atualizar freqüência é a janela deve ser divisível pela freqüência. Por exemplo uma janela de 2 minutos com uma frequência de atualização de 6 segundos é ok, mas uma freqüência de atualização de 7 segundos não é, uma vez que não é divisível por 120. Uma IllegalArgumentException é lançada se a freqüência de atualização do módulo de janela não for zero. Esta implementação requer um thread por média móvel, o que não é muito eficiente. Uma solução melhor seria compartilhar um segmento em muitas médias. Atualização. Eu atualizei o código para compartilhar um tópico aqui. Por último, há um problema de estado inicial: não temos dados ainda para toda a janela. Por exemplo, se você tem uma janela de 5 minutos e apenas 15 segundos de dados. Esta implementação retorna null até que tenhamos 5 minutos de dados. Outra abordagem é estimar a média. Suponha que temos uma contagem de 10 em 30 segundos, então podemos estimar a média como 40 em 2 minutos. No entanto, existe o risco de erro significativo pela extrapolação de dados incompletos. Por exemplo, se tivéssemos uma explosão de 20 acessos em 2 segundos, wed ser estimando 1200 por 2 minutos, o que com toda a probabilidade é maneira off. Simple Moving Average - SMA Breaking Down Simple Moving Average - SMA Uma média móvel simples é personalizável em Que pode ser calculado para um número diferente de períodos de tempo, simplesmente adicionando o preço de fechamento da garantia para um número de períodos de tempo e depois dividindo este total pelo número de períodos de tempo, o que dá o preço médio do título sobre o período de tempo. Uma média móvel simples suaviza a volatilidade e facilita a visualização da tendência de preços de um título. Se a média móvel simples aponta para cima, isso significa que o preço dos títulos está aumentando. Se ele está apontando para baixo significa que o preço de segurança está diminuindo. Quanto mais tempo for o tempo para a média móvel, mais suave a média móvel simples. Uma média móvel de curto prazo é mais volátil, mas sua leitura está mais próxima dos dados de origem. Significado analítico As médias móveis são uma importante ferramenta analítica utilizada para identificar as tendências atuais de preços eo potencial para uma mudança em uma tendência estabelecida. A forma mais simples de usar uma média móvel simples na análise é usá-lo para identificar rapidamente se uma segurança está em uma tendência de alta ou tendência de baixa. Outra ferramenta analítica popular, embora ligeiramente mais complexa, é comparar um par de médias móveis simples, cobrindo cada uma delas diferentes intervalos de tempo. Se uma média móvel simples de curto prazo estiver acima de uma média de longo prazo, espera-se uma tendência de alta. Por outro lado, uma média de longo prazo acima de uma média de curto prazo sinaliza um movimento descendente na tendência. Padrões de negociação populares Dois padrões de negociação populares que usam médias móveis simples incluem a cruz de morte e uma cruz de ouro. Uma cruz de morte ocorre quando a média móvel simples de 50 dias cruza abaixo da média móvel de 200 dias. Isto é considerado um sinal de baixa, que perdas adicionais estão na loja. A cruz dourada ocorre quando uma média móvel de curto prazo quebra acima de uma média móvel de longo prazo. Reforçado por altos volumes de negociação, isso pode sinalizar ganhos adicionais estão em store. I necessidade de acompanhar os últimos 7 dias de trabalho horas em um loop de leitura de arquivo plano. Seu ser usado para medir fatigueability de rosters do trabalho. Agora eu tenho algo que funciona, mas parece bastante detalhado e não tenho certeza se há um padrão que é mais sucinto. Atualmente, eu tenho uma classe Java com uma matriz estática para armazenar os últimos dados dias x, então como eu leio através do arquivo, eu cortar o primeiro elemento e mover os outros 6 (por uma semana rodando total) de volta por um. O processamento dessa matriz estática é feito em seu próprio método ie. Minha pergunta: esta é uma abordagem de design razoável, ou há algo de cegueira óbvia e simples para fazer esta tarefa Obrigado rapazes pediu Aug 30 11 at 14:33 Thanks alot guys: I39ve tem a mensagem: use um objeto de nível mais alto e explorar o Métodos relevantes ou um tampão circular. Grandes respostas, todas elas. Quando você pensa sobre isso, você sempre precisa de acesso a toda a matriz para que você possa se livrar da primeira entrada - que eu wasn39t 100 certeza de no meu próprio. I39m aliviado que eu hadn39t perdeu um forro 1 e foi basicamente em uma pista razoável, se não eficiente e concisa Isso é o que eu adoro sobre este site: de alta qualidade, respostas relevantes de pessoas que sabem o seu sht. Ndash Pete855217 Aug 30 11 at 15:05 Por que você inicializar runningTotal para null Qual é o seu tipo Onde é declarado Faria bem se você colocar alguns exemplos de código que se assemelham ao código Java real. Seguindo em frente, minha crítica seria a seguinte: a sua função faz muito. Uma função ou método deve ser coeso. Mais apropriadamente, eles deveriam fazer uma coisa e uma coisa só. Pior ainda, o que acontece no seu loop for quando x 5 Você copia runningTotal6 em runningTotal5. Mas então você tem duas cópias do mesmo valor na posição 5 e 6. Em seu projeto, sua função movesshuffles os itens em sua matriz calcula o total imprime coisas para erro padrão retorna o total Ele faz muito. Minha primeira sugestão é não mover coisas ao redor da matriz. Em vez disso, implementar um buffer circular e usá-lo em vez da matriz. Simplificará seu projeto. Minha segunda sugestão é dividir as coisas em funções que são coesas: ter uma estrutura de dados (um buffer circular) que permite adicionar a ele (e que descarta a entrada mais antiga sempre que atingir sua capacidade.) Ter a estrutura de dados implementar um Interator tem uma função que calcula o total no iterador (você não se importa se você está calculando o total de uma matriz, lista ou bufer circular.) Não chamá-lo total. Chamá-lo de soma, que é o que você está computando. Isso é o que fazer :) That39s grande informação luis, no entanto lembre-se esta função é uma pequena parte da funcionalidade da classe, e seria exagero para adicionar muito código para torná-lo perfeito. Você está tecnicamente correto, e eu entendo que meu código faz muito 39, mas ao mesmo tempo às vezes é melhor errar do lado do código menor, mais claro do que ir para a perfeição. Dado o meu Java habilidades, mesmo fazendo o pseudocódigo que você descreve compilação teria me golpe meu orçamento sobre este (), mas obrigado pela descrição clara. Ndash Pete855217 Aug 31 11 at 2:23 Hmmm, não é sobre a perfeição, mas sobre as práticas industriais estabelecidas que temos conhecimento para as últimas 3 décadas. Código limpo é sempre um que é particionado. Temos décadas de evidências que indicam que este é o caminho a percorrer no caso geral (em termos de custo-eficiência, redução de defeitos, compreensão, etc.). A menos que seja um código descartável para um tipo único de coisa. Nunca é custoso fazer isso quando se inicia qualquer análise de problemas desta maneira. Codificação 101, quebrar o problema eo código segue, nem overkill nem difícil) ndash luis. espinal Aug 31 11 at 15:55 Sua tarefa é muito simples ea abordagem que você adotou é certamente bom para o trabalho. No entanto, se você quiser usar um projeto melhor, você deve se livrar de todo esse movimento número você melhor usar uma fila FIFO e fazer bom uso de push e pop métodos dessa forma o código não vai refletir qualquer movimento de dados, apenas as duas ações lógicas De novos dados e remover dados com mais de 7 dias. Respondeu 30 Ago 11 at 14:49

No comments:

Post a Comment