Calcule a média móvel exponencial java


Seu interior é iterando toda a matriz, então é por isso que você sempre obtém a mesma média (uma para a matriz inteira), 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 do seu interior, o que significa que irá anular 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 loop interno j você irá dividir por 0 a primeira soma. Eu acredito que você quisesse usar o 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 do seu código atual. Ou seja: Imagine se o erro está em suas entradas, como podemos acreditar que você realmente as usou, respondidas em 4 de outubro 13 às 20:54 Você está fazendo o loop de todos os dados sempre. Você deve ter para (int j (igtaverageLengthi-averageLength2: 0) jlt iaverageLength2 ampamp jltnumDataPoints j) (ou algo semelhante) para a sua média mais interna. Além disso, moveAverageisumj 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. Respondeu 4 de outubro 13 às 20:42 Na próxima vez, leve os comentários sobre a cessão da questão antes de publicá-la. Mas como você parece muito novo nisso, pense em como você passaria pelos dados, e faria isso. Você deve tentar certificar-se de que cada loop está parando no ponto correto e lembre-se de 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 também precisa parar. Verifique se o seu código está a verificar isso. Respondeu 4 de outubro às 20:56 Sem detalhes adicionais, você provavelmente precisa 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 valores desse tipo, então, mude os valores (i1) de A0 para Ai. Inclusive. Um pouco de pensamento irá mostrar que você não precisa adicionar todos os valores K sempre. Basta manter a soma e, ao passar para o próximo ponto (esta é uma média móvel), subtrai o valor que está sendo substituído e adiciona o novo valor que irá substituí-lo. (Durante os primeiros pontos K-1, você simplesmente adicionará o novo valor à soma e aumentará seu contador em 1.) Em qualquer ponto desse processo, a média móvel é a soma atual dividida pelo valor atual da contagem. Respondeu 4 de outubro às 21:05 Em uma média móvel, você precisa ter algum tipo de tamanho de janela. O tamanho da sua janela é o comprimento médio, por isso parecerá algo assim: o loop for começa nos dados atuais e volta os pontos de dados da média e adiciona-os. Você só terá uma média móvel quando você tiver quando tiver pontos de dados suficientes e a média será a soma dividida pelo comprimento médio. Nota: Não testado apenas o código sudo, mas essa é a idéia. Respondeu 4 de outubro 13 às 21:05 Sua resposta 2017 Stack Exchange, IncI essencialmente tem uma série de valores como este: a matriz acima é simplificada demais, estou coletando 1 valor por milissegundo no meu código real e preciso processar a saída em um algoritmo Eu escrevi para encontrar o pico mais próximo antes de um ponto no tempo. Minha lógica falha porque no meu exemplo acima, 0.36 é o pico real, mas meu algoritmo olhava para trás e veria o último número 0.25 como o pico, pois há uma diminuição para 0.24 antes dele. O objetivo é levar esses valores e aplicar um algoritmo para eles, que os suavizará um pouco para que eu tenha mais valores lineares. (Ie: Id como os meus resultados para serem curvy, não jaggedy) Eu fui dito para aplicar um filtro exponencial de média móvel aos meus valores. Como posso fazer isso. É muito difícil para mim ler equações matemáticas, eu lido muito melhor com o código. Como faço para processar valores na minha matriz, aplicando um cálculo exponencial da média móvel para os fazer sair, solicitado 8 de fevereiro às 20:27 Para calcular uma média móvel exponencial. Você precisa manter algum estado ao redor e você precisa de um parâmetro de ajuste. Isso exige uma pequena classe (supondo que você esteja usando o Java 5 ou posterior): instanciar com o parâmetro de decaimento desejado (pode ser necessário que a sintonização esteja entre 0 e 1) e depois use a média () para filtrar. Ao ler uma página sobre uma recorrência matemática, tudo o que você realmente precisa saber ao transformá-lo em código é que os matemáticos gostam de escrever índices em arrays e seqüências com subscritos. (Eles também têm algumas outras notações, o que não ajuda.) No entanto, o EMA é bastante simples, pois você só precisa se lembrar de um valor antigo, não é necessário nenhum arrays de estados complicados. Respondeu 8 de fevereiro às 20:42 TKKocheran: praticamente. Não é bom quando as coisas podem ser simples (Se começar com uma nova seqüência, obtenha uma nova média). Observe que os primeiros termos da seqüência média saltarão em torno de um bit devido a efeitos de limites, mas você obtém aqueles com outras médias móveis também. No entanto, uma boa vantagem é que você pode envolver a lógica média móvel na média e experimentar sem incomodar demais o seu programa. Ndash Donal Fellows 9 de fevereiro às 0:06 Estou tendo dificuldade em entender suas perguntas, mas vou tentar responder de qualquer maneira. 1) Se o seu algoritmo encontrou 0,25 em vez de 0,36, então é errado. É errado porque assume um aumento ou diminuição monotônico (que sempre está subindo ou sempre está indo para baixo). A menos que você tenha média de todos os seus dados, seus pontos de dados --- como você os apresenta --- são não-lineares. Se você realmente quer encontrar o valor máximo entre dois pontos no tempo, então corte sua matriz de tmin para tmax e encontre o máximo desse subarray. 2) Agora, o conceito de médias móveis é muito simples: imagine que eu tenho a seguinte lista: 1.4, 1.5, 1.4, 1.5, 1.5. Eu posso suavizar, levando a média de dois números: 1.45, 1.45, 1.45, 1.5. Observe que o primeiro número é a média de 1,5 e 1,4 (segundo e primeiro número), a segunda (nova lista) é a média de 1,4 e 1,5 (terceira e segunda lista antiga) a terceira (nova lista) a média de 1,5 e 1,4 (Quarto e terceiro), e assim por diante. Eu poderia ter feito período três ou quatro, ou n. Observe como os dados são muito mais suaves. Uma boa maneira de ver as médias móveis no trabalho é ir para o Google Finance, selecionar um estoque (tente Tesla Motors bastante volátil (TSLA)) e clique em técnicas na parte inferior do gráfico. Selecione a média móvel com um período determinado e a média móvel exponencial para comparar suas diferenças. A média móvel exponencial é apenas uma outra elaboração deste, mas considera os dados mais antigos inferiores aos novos dados, esta é uma maneira de polarizar o alisamento para trás. Leia a entrada da Wikipedia. Então, isso é mais um comentário do que uma resposta, mas a pequena caixa de comentários foi apenas pequena. Boa sorte. Se você estiver tendo problemas com a matemática, você poderia ir com uma média móvel simples em vez de exponencial. Então, a saída que você obtém seria os últimos x termos divididos por x. Pseudocódigo não testado: note que você precisará lidar com as partes de início e término dos dados, pois claramente você não pode significar os últimos 5 termos quando estiver no seu segundo ponto de dados. Além disso, existem maneiras mais eficientes de calcular essa média móvel (soma sumária - a mais nova), mas é para obter o conceito de o que está acontecendo. Respondeu 8 de fevereiro às 20:41 Sua resposta 2017 Stack Exchange, IncEMA 8211 Como calculá-lo Calculando a média móvel exponencial - um Tutorial A média móvel exponencial (EMA para abreviar) é hoje um dos indicadores mais utilizados na análise técnica. Mas como você calcula isso sozinho, usando um papel e uma caneta ou 8211 preferiu 8211 uma planilha eletrônica de sua escolha. Vamos descobrir nesta explicação sobre o cálculo da EMA. Calculando a média móvel exponencial (EMA), é claro, é feito automaticamente pela maioria dos softwares de análise comercial e técnica lá fora hoje. Aqui é como calculá-lo manualmente, o que também contribui para a compreensão sobre como ele funciona. Neste exemplo, devemos calcular EMA por um preço de estoque. Queremos um EMA de 22 dias que seja um período de tempo bastante comum para um EMA longo. A fórmula para calcular EMA é a seguinte: EMA Price (t) k EMA (y) (1 8211 k) t hoje, y ontem, N número de dias em EMA, k 2 (N1) Use as seguintes etapas para calcular um 22 Dia EMA: 1) Comece calculando k para o prazo especificado. 2 (22 1) 0,0869 2) Adicione os preços de fechamento dos primeiros 22 dias juntos e divida-os por 22. 3) Você está pronto para começar a receber o primeiro dia da EMA, levando os dias seguintes (dia 23), preço de fechamento multiplicado Por k. Então multiplique os dias anteriores em média móvel por (1-k) e adicione os dois. 4) Faça o passo 3 repetidamente para cada dia que se segue para obter a gama completa de EMA. Isso pode, naturalmente, ser colocado no Excel ou algum outro software de planilha para tornar o processo de cálculo da EMA semi-automático. Para lhe dar uma visão algorítmica sobre como isso pode ser realizado, veja abaixo. Flutuador público CalculateEMA (float todaysPrice, float numberOfDays, float EMAYesterday) float k 2 (numberOfDays 1) return todaysPrice k EMAYesterday (1 8211 k) Este método normalmente seria chamado de um loop através de seus dados, procurando algo como isto: foreach (DailyRecord Sdr em DataRecords) ligue para o cálculo de EMA. CalculateEMA (sdr. Close, numberOfDays, yesterdayEMA) coloque o ema calculado em uma matriz de memaSeries. Items. Add (sdr. TradingDate, ema) certifique-se de que o ontem seja preenchido com o EMA que usamos neste momento Around yesterdayEMA ema Note que este é o código psuedo. Você normalmente precisaria enviar o valor de CLOSE de ontem como ontemema até que o ontemema seja calculado a partir de EMA de hoje. Isso está acontecendo apenas após o loop ter executado mais dias do que o número de dias que você calculou para o seu EMA. Para um EMA de 22 dias, é apenas na 23 vez no loop e, posteriormente, que o ontemema ema é válido. Isso não é grande coisa, pois você precisará dados de pelo menos 100 dias de negociação para uma EMA de 22 dias para ser válida. Posts Relacionados

Comments