Tuesday 13 June 2017

Simple Moving Average 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 hits em 2 segundos, wed ser estimando 1200 por 2 minutos, o que com toda a probabilidade é maneira off. Your interna é iterar toda a matriz assim thats por que você sempre obter a mesma média Um para toda a matriz), você deve iterar de 0 para o número atual do externo para em vez disso. Sua média móvel está sendo atualizada com base em j de seu interior para isso significa que ele irá substituir os valores anteriores de cada novo loop, isso deve estar dentro do exterior para em vez do interno usando i como índice. Você está dividindo sumj para calcular médias, cada novo laço interno j você dividirá por 0 a primeira soma. Eu acredito que você pretendia usar j1 em vez disso, o índice não é o mesmo que o comprimento atual Dicas para solucionar problemas: Evite usar variáveis ​​para arrays de loop, você deve usar array. length em vez disso. Para uma questão de reproduzir o seu problema, você poderia nos dar o problema isolado em vez de seu código atual. Ou seja: Imagine se o erro está em suas entradas, como poderíamos acreditar que você realmente usou respondidas? Você está looping sobre todos os dados de cada vez. Você deve ter para (int j (igtaverageLengthi-averageLength2: 0) jlt iaverageLength2 ampamp jltnumDataPoints j) (ou algo semelhante) para a sua média innermost. Além disso, movingAverageisumj deve ser modificado para lidar com o caso quando j é 0. Em particular, provavelmente deve ser movingAverageisumaverageLength e deve ser aplicado ao slot movingAveragei fora do loop de média. Respondido Oct 4 13 at 20:42 Da próxima vez, tome os comentários sobre a atribuição fora da questão antes de publicá-la. Mas desde que você parece muito novo nisso, pense sobre como você iria passar os dados, e fazê-lo fazer isso. Você deve tentar certificar-se de que cada loop está parando no ponto correto, e lembre-se que se você parar quando não há mais números, (como quando você está fazendo o loop interno e você só pode obter mais 3 números em vez de 4) O programa precisa parar também. Certifique-se de que o seu código está a verificar. Resposta Sem quaisquer detalhes adicionais, você provavelmente precisará de uma média móvel não ponderada. Em qualquer ponto Ai na matriz de entrada A de comprimento N (com 0ltiltN), isso é simplesmente a média das entradas K anteriores da matriz, até e incluindo Ai. Se não houver K tais valores, então a média dos valores (i1) de A0 a Ai. Inclusive. Um pouco de pensamento irá mostrar-lhe que você não precisa adicionar todos os valores de K cada vez. Basta manter a soma e, ao passar para o próximo ponto (esta é uma média móvel), subtraia o valor que está sendo substituído e adicione o novo valor que irá substituí-lo. (Durante os primeiros pontos K-1, basta adicionar o novo valor à soma e aumentar o contador por 1.) Em qualquer ponto desse processo, a média móvel é a soma corrente dividida pelo valor da contagem atual. Resposta Em uma média móvel, você precisa ter algum tipo de tamanho de janela. Seu tamanho de janela é averageLength, então ele será algo parecido com isto: O loop for começa nos dados atuais e retorna pontos de dados averageLength e os adiciona. Você só terá uma média móvel quando tiver você tem quando você tem pontos de dados suficientes ea média será a soma dividida pelo comprimento médio. Nota: Não testado apenas o código sudo, mas esta é a idéia. MA Como um exemplo de SMA, considere um título com os seguintes preços de fechamento em 15 dias: Semana 1 (5 dias) 20, 22 24, 25, 23 Semana 2 (5 dias) 26, 28, 26, 29, 27 Semana 3 (5 dias) 28, 30, 27, 29, 28 Uma MA de 10 dias seria a média dos preços de fechamento para a primeira 10 dias como o primeiro ponto de dados. O ponto de dados seguinte iria cair o preço mais antigo, adicione o preço no dia 11 e tomar a média, e assim por diante, como mostrado abaixo. Conforme observado anteriormente, MAs atraso ação preço atual porque eles são baseados em preços passados ​​quanto maior for o período de tempo para o MA, maior será o desfasamento. Assim, um MA de 200 dias terá um grau muito maior de atraso do que um MA de 20 dias porque contém preços nos últimos 200 dias. A duração do MA para usar depende dos objetivos de negociação, com MAs mais curtos usados ​​para negociação de curto prazo e MA de longo prazo mais adequado para investidores de longo prazo. O MA de 200 dias é amplamente seguido por investidores e comerciantes, com quebras acima e abaixo desta média móvel considerada como sinais comerciais importantes. MAs também transmitir sinais comerciais importantes por conta própria, ou quando duas médias se cruzam. Um aumento MA indica que a segurança está em uma tendência de alta. Enquanto um declínio MA indica que está em uma tendência de baixa. Da mesma forma, o impulso ascendente é confirmado com um crossover de alta. Que ocorre quando um MA de curto prazo cruza acima de um MA de longo prazo. Momento descendente é confirmado com um crossover de baixa, que ocorre quando um MA de curto prazo cruza abaixo de um MA de longo prazo.

No comments:

Post a Comment