Java exponential moving average example


Eu essencialmente tenho uma matriz de valores como este: A matriz acima é simplificada, estou coletando 1 valor por milissegundo no meu código real e preciso processar a saída em um algoritmo que 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 olha para trás e vê o último número 0,25 como o pico, já que há uma diminuição para 0,24 antes dele. O objetivo é pegar esses valores e aplicar um algoritmo a eles, que irá suavizá-los um pouco para que eu tenha mais valores lineares. (isto é: Id como meus resultados para ser curvy, não jaggedy) Ive sido dito para aplicar um filtro médio móvel exponencial aos meus valores. Como posso fazer isso? É muito difícil para mim ler equações matemáticas, eu lido muito melhor com código. Como faço para processar valores em minha matriz, aplicando um cálculo de média móvel exponencial para equacioná-los perguntou 8 de fevereiro 12 em 20:27 Para calcular uma média móvel exponencial. você precisa manter algum estado ao redor e precisa de um parâmetro de ajuste. Isso exige uma pequena classe (supondo que você esteja usando o Java 5 ou posterior): Instancie com o parâmetro de decaimento desejado (a sintonização pode ser entre 0 e 1) e use average () para filtrar. Ao ler uma página sobre alguma recorrência matemática, tudo o que você realmente precisa saber ao transformá-la em código é que os matemáticos gostam de escrever índices em matrizes e seqüências com índices. (Eles também têm algumas outras notações, o que não ajuda.) No entanto, o EMA é bastante simples, pois você só precisa lembrar de um valor antigo que não é necessário usar matrizes de estado complicadas. respondeu 8 fev 12 at 20:42 TKKocheran: Muito bonito. Não é bom quando as coisas podem ser simples (Se começar com uma nova sequência, consiga um novo averager). Note que os primeiros termos na seqüência média irão saltar um pouco devido aos efeitos de limite, 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 da média móvel no averager e experimentar sem perturbar demais o resto do seu programa. ndash Donal Fellows 9 de fevereiro de 2012 às 0:06 Eu 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 está errado. Está errado porque assume um aumento ou diminuição monótona (que está sempre subindo ou sempre descendo). A menos que você calcule a média de TODOS os seus dados, seus pontos de dados - conforme você os apresenta - são não-lineares. Se você realmente quiser encontrar o valor máximo entre dois pontos no tempo, então divida 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 alisá-lo, tomando 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úmeros) o segundo (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 o período de 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 ao Google Finance, selecionar uma ação (experimente o Tesla Motors muito volátil (TSLA)) e clicar em technicals na parte inferior do gráfico. Selecione Média Móvel com um determinado período e Média Móvel Exponencial para comparar suas diferenças. A média móvel exponencial é apenas mais uma elaboração disso, mas pesa os dados mais antigos, menos que os novos dados, é uma maneira de influenciar a suavização em direção às costas. Por favor, leia a entrada da Wikipedia. Então, isso é mais um comentário do que uma resposta, mas a pequena caixa de comentários era apenas minúscula. Boa sorte. Se você está tendo problemas com a matemática, você poderia ir com uma média móvel simples em vez de exponencial. Assim, a saída que você obterá será o último x termos dividido por x. Pseudocódigo não testado: Note que você terá que lidar com as partes inicial e final dos dados, já que claramente você não consegue calcular a média dos últimos 5 termos quando está no seu segundo ponto de dados. Além disso, existem maneiras mais eficientes de calcular essa média móvel (soma total - a mais nova mais recente), mas isso é para obter o conceito do que está acontecendo. respondido Feb 8 12 at 20:41 Sua Resposta 2016 Stack Exchange, IncEMA 8211 Como Calcular Média Móvel Exponencial - um Tutorial Média Móvel Exponencial (EMA para abreviar) é um dos indicadores mais utilizados na análise técnica de hoje. Mas como você calcula para si mesmo, usando um papel e uma caneta ou um programa de planilha de sua escolha. Vamos descobrir nesta explicação do cálculo da EMA. O cálculo da média móvel exponencial (EMA) é feito, é claro, automaticamente pela maioria dos softwares comerciais e de análise técnica existentes hoje. Aqui está como calculá-lo manualmente, o que também aumenta a compreensão de como ele funciona. Neste exemplo, calcularemos o EMA para o preço de um estoque. Queremos um EMA de 22 dias, que é um período de tempo bastante comum para um EMA longo. A fórmula para calcular o EMA é a seguinte: EMA Preço (t) k EMA (y) (1 8211 k) t hoje, y ontem, N número de dias no EMA, k 2 / (N1) Siga os seguintes passos para calcular um EMA de 22 dias: 1) Comece calculando k para o período de tempo especificado. 2 / (22 1) 0,0869 2) Adicione os preços de fechamento dos primeiros 22 dias juntos e divida-os por 22. 3) Agora você está pronto para começar a receber o primeiro dia de EMA levando os seguintes dias (dia 23) preço de fechamento multiplicado por k. em seguida, multiplique os dias anteriores pela média móvel de (1-k) e adicione os dois. 4) Execute a etapa 3 repetidamente para cada dia seguinte para obter a gama completa de EMA. Isso pode, obviamente, ser colocado no Excel ou em algum outro software de planilha eletrônica para tornar o processo de cálculo semi-automático do EMA. Para lhe dar uma visão algorítmica de como isso pode ser feito, veja abaixo. public float CalculateEMA (flutuar todaysPrice, float numberOfDays, float EMAYesterday) float k 2 / (numberOfDays 1) retornar todaysPrice k EMAYesterday (1 8211 k) Este método normalmente seria chamado de um loop através de seus dados, parecido com isto: foreach ( DailyRecord sdr em DataRecords) // chame o cálculo EMA ema CalculateEMA (sdr. Close, numberOfDays, yesterdayEMA) // coloque o ema calculado em uma matriz memaSeries. Items. Add (sdr. TradingDate, ema) // certifique-se de que ontem o EEM seja preenchido com o EMA nós usamos este tempo ao redor de ontemEMA ema Note que este é código do psuedo. Normalmente, você precisaria enviar o valor CLOSE de ontem como yesterdayEMA até que o yesterdayEMA seja calculado a partir da EMA de hoje. Isso só acontece depois que o loop é executado mais dias do que o número de dias para o qual você calculou seu EMA. Para um EMA de 22 dias, é somente no 23º tempo do loop e depois disso que o e-mail yesterdayAA é válido. Isso não é grande coisa, já que você precisará de dados de pelo menos 100 dias de negociação para um EMA de 22 dias para ser válido. Related PostsMétodo de média móvel de mão Se você estiver procurando por um EMA otimizado para dados de fluxo contínuo, originado de um serviço de arquivo ou de cotação, a seguinte classe de amostra fará bem, em vez de usar cálculos de força bruta. Essa abordagem é particularmente útil se você estiver processando dados em tempo real. EMAs, um caso especial de médias móveis ponderadas, tem o benefício de que a ponderação relativa para cada período sucessivo diminui por um fator constante f 2 / (N1), onde N é o número de períodos nos quais a EMA deve ser aplicada. Dado isso, você pode calcular o EMA atual (ou seja, para o período atual) usando a seguinte fórmula iterativa: eman fprice (1-f) eman-1 A seguinte classe de amostra implementa essa natureza iterativa de EMA e minimiza os requisitos computacionais sobre brute - métodos de força ou métodos de pós-processamento. private int numPeriods 0 private int totalPeriods 0 private double runningEMA 0.0 private double fator 0.0 public EMA (int numPeriods) this. numPeriods numPeriods fator 2.0 / (numPeriods 1.0) / Redefine os cálculos para gerar o EMA para o período especificado. / public void reset (int numPeriods) / Retorna o EMA para o período definido durante o construtor. Se os períodos processados ​​forem menores que o intervalo de EMA, zero será retornado. / public double calcular (double price) runningEMA factorprice (fator 1) runningEMA if (totalPeriods lt numPeriods) De onde você obtém os dados de preço e o que você faz com os resultados da EMA é sua escolha. Por exemplo, se você tivesse os dados de preço em uma matriz e desejasse calcular um EMA em outra matriz, o snippet a seguir funcionará: preços duplos. originado de cálculos, arquivo ou serviço de cotação double ema new doubleprices. length EMA ema novo EMA (50) // 50 período EMA para (int idx0 iltprices. length idx) emaidx ema (pricesidx) Boa sorte e os melhores votos para o seu projeto .

Comments