Tuesday, 11 July 2017

Exponencial Movendo Média Código Em Java


Eu tenho essencialmente uma matriz de valores como este: A matriz acima é simplificada, estou coletando um valor por milissegundo no meu código real e eu preciso processar a saída em um algoritmo que 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 olharia para trás e verá o último número 0.25 como o pico, pois há uma diminuição para 0.24 antes dele. O objetivo é tomar esses valores e aplicar um algoritmo para eles que irá suavizar-los um pouco para que eu tenha mais valores lineares. (Ou seja: Id como meus resultados para ser curvy, não jaggedy) Ive foi dito para aplicar um filtro exponencial de média móvel para os meus valores. Como posso fazer isso É muito difícil para mim ler equações matemáticas, eu lidar muito melhor com o código. Como processar valores em minha matriz, aplicando um cálculo exponencial de média móvel para igualá-los out perguntou Feb 8 12 at 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 requer uma pequena classe (supondo que você está usando o Java 5 ou posterior): Instantiate com o parâmetro de decadência desejado (pode ter ajuste deve estar entre 0 e 1) e use a média () para filtrar. Ao ler uma página sobre alguma 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 matrizes e seqüências com subscritos. (Eles têm algumas outras notações também, o que não ajuda.) No entanto, o EMA é bastante simples, como você só precisa se lembrar de um antigo valor não arrays estado complicado necessário. Respondeu 8 fevereiro às 20:42 TKKocheran: Muito bonito. Não é bom quando as coisas podem ser simples (se começar com uma nova seqüência, obter um novo averager.) Observe que os primeiros termos na seqüência média saltarão um pouco devido a 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 de média móvel para o averager e experimentar sem perturbar o resto do seu programa demais. Ndash Donal Fellows Feb 9 12 em 0:06 Estou tendo dificuldade em entender suas perguntas, mas vou tentar responder de qualquer maneira. 1) Se o seu algoritmo encontrado 0,25 em vez de 0,36, então ele está errado. É errado porque assume um aumento ou uma diminuição monotônica (que está sempre subindo ou sempre indo para baixo). A menos que você média TODOS os seus dados, seus pontos de dados --- como você apresentá-los --- são não-lineares. Se você realmente deseja encontrar o valor máximo entre dois pontos no tempo, corte sua matriz de tmin para tmax e localize 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 isto 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) 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 o 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 ao Google Finance, selecionar um estoque (tente Tesla Motors bastante volátil (TSLA)) e clique em technicals na parte inferior do gráfico. Selecione Média Móvel com um determinado período e Média Mínima exponencial para comparar suas diferenças. A média móvel exponencial é apenas mais uma elaboração disto, mas pondera os dados mais antigos menos do que os novos dados, isto é uma forma 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 pequena. 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. Então a saída que você obtém seria o último x termos dividido por x. Pseudocódigo não testado: Note que você precisará manipular as partes inicial e final dos dados, uma vez que claramente você não consegue média dos últimos 5 termos quando você está no seu 2º ponto de dados. Além disso, há maneiras mais eficientes de calcular essa média móvel (soma sum - mais antigo mais recente), mas isso é para obter o conceito do que está acontecendo em toda. Respondeu 8 de fevereiro em 20: 41March 29o, 2014 por Ryan Hamilton Let8217s olha como escrever a análise média movente em q para a base de dados do kdb. Como dados de exemplo (mcd. csv) vamos usar dados de preço de ações para o McDonalds MCD. O código abaixo irá baixar os dados históricos de estoque para o MCD e colocá-lo na tabela t: Média móvel simples A média móvel simples pode ser usada para suavizar dados flutuantes para identificar tendências e ciclos globais. A média móvel simples é a média dos pontos de dados e pondera igualmente todos os valores no cálculo. Por exemplo, para encontrar o preço médio móvel de uma ação nos últimos dez dias, simplesmente adicionamos o preço diário para esses dez dias e dividimos por dez. Esta janela de tamanho dez dias então se move através das datas, usando os valores dentro da janela para encontrar a média. Here8217s o código em kdb para 1020 dias de média móvel eo gráfico resultante. A média móvel exponencial é e como calculá-la Um dos problemas com a média móvel simples é que dá a cada dia uma ponderação igual. Para muitos propósitos faz mais sentido dar aos dias mais recentes uma maior ponderação, um método de fazer isso é usando a média móvel exponencial. Isso usa um peso exponencialmente decrescente para datas ainda mais no passado. A forma mais simples de suavização exponencial é dada pela fórmula: onde está o fator de suavização e 0 Esta tabela mostra como os vários pesos são calculados considerando os valores 1,2,3 , 4,8,10,20 e um factor de alisamento de 0,7. (Excel spreadsheet) Para executar este cálculo em kdb podemos fazer o seguinte: (Este código foi originalmente publicado na lista de google mail por Attila, a discussão completa pode ser encontrada aqui) Este advérbio de contrabarra funciona como A sintaxe alternativa generaliza para funções de 3 ou mais argumentos onde o primeiro argumento é usado como o valor inicial e os argumentos são elementos correspondentes das listas: Exponential Moving Average Chart Finalmente tomamos a nossa fórmula e aplicá-la aos nossos dados de precificação de ações, permitindo-nos ver a média móvel exponencial Para dois diferentes fatores de suavização: Exponencial Moving Average Stock Price Chart produzido usando qStudio Como você pode ver com EMA, podemos priorizar valores mais recentes usando um fator de suavização escolhido para decidir o equilíbrio entre dados recentes e históricos. Escrevendo kdb analytics como Exponential Moving Average é coberto em nosso curso de treinamento kdb. Regularmente oferecemos cursos de treinamento em Londres, Nova York. Ásia ou nosso curso on-line kdb está disponível para começar agora. 1 Response to 8220Exponential Moving Average EMA em Kdb8221 Obrigado Ryan, isso é muito útil. Mas eu acho que há um erro tipográfico na definição ema8217s, deve ser: ema: xyJava média móvel método Se você estiver procurando por um EMA que é otimizado para streaming de dados, obtidos a partir de um arquivo ou cotação de serviço, a seguinte classe de exemplo vai fazer você bem , Em oposição ao uso de cálculos de força bruta. Esta abordagem é particularmente útil se você estiver processando dados em tempo real. Os EMAs, um caso especial de médias móveis ponderadas, têm o benefício de que a ponderação relativa para cada período sucessivo diminui com um fator constante f 2 (N1), onde N é o número de períodos durante os quais a EMA deve ser aplicada. Eman fprice (1-f) eman-1 A classe de exemplo a seguir implementa essa natureza iterativa de EMA e minimiza os requisitos de computação em relação a brute - Métodos de pós-processamento. Private int numPeriods 0 private int totalPeriods 0 privado double runningEMA 0.0 privado double factor 0.0 público EMA (int numPeriods) this. numPeriods numPeriods factor 2.0 (numPeriods 1.0) Redefinir cálculos para gerar EMA para o período determinado. Public void reset (int numPeriods) Retorna EMA para o período define durante o construtor. Se os períodos processados ​​forem inferiores ao intervalo EMA, zero será retornado. Public double calcular (preço duplo) runningEMA factorprice (1-factor) runningEMA if (totalPeriods lt numPeriods) De onde você origina os dados de preço eo que você faz com os resultados da EMA é com você. Por exemplo, se você tivesse os dados de preço em uma matriz e deseja calcular uma EMA em outra matriz, o snippet a seguir funcionará: os preços duplos. Fonte de cálculos, arquivo ou serviço de citação duplo ema novo doubleprices. length EMA ema novo EMA (50) 50 EMA período para (int idx0 iltprices. length idx) emaidx ema (pricesidx) Boa sorte e os melhores votos para o seu projeto. AveragesSimple Média móvel média média móvel simples Você é encorajado a resolver esta tarefa de acordo com a descrição da tarefa, usando qualquer idioma que você conhece. Calculando a média móvel simples de uma série de números. Crie um functioncloisstance stateful que leva um período e retorna uma rotina que leva um número como argumento e retorna uma média móvel simples de seus argumentos até agora. Uma m�ia m�el simples �um m�odo para calcular uma m�ia de uma corrente de n�eros calculando apenas a m�ia dos �timos n�eros de 160 P 160 a partir da corrente 160, em que 160 P 160 �conhecido como o per�do. Ele pode ser implementado chamando uma rotina de iniciação com 160 P 160 como argumento, 160 I (P), 160 que deve retornar uma rotina que, quando chamada com membros individuais, sucessivos de um fluxo de números, calcula a média de Para), os últimos 160 P 160 deles, permite chamar este 160 SMA (). A palavra 160 stateful 160 na descrição da tarefa refere-se à necessidade de 160 SMA () 160 lembrar certas informações entre as chamadas para ela: 160 O período, 160 P 160 Um contêiner ordenado de pelo menos os últimos 160 P 160 números de cada um dos Suas chamadas individuais. Stateful 160 também significa que chamadas sucessivas para 160 I (), 160 o inicializador, 160 devem retornar rotinas separadas que não 160 não compartilham o estado salvo para que possam ser usadas em dois fluxos de dados independentes. Pseudo-código para uma implementação de 160 SMA 160 é: Esta versão usa uma fila persistente para conter os valores p mais recentes. Cada função retornada de init-moving-average tem seu estado em um átomo contendo um valor de fila. Esta implementação usa uma lista circular para armazenar os números dentro da janela no início de cada ponteiro de iteração refere-se à célula de lista que contém o valor apenas movendo para fora da janela e para ser substituído com o valor apenas adicionado. Usando um fechamento editar Atualmente esta sma não pode ser nogc porque ele aloca um encerramento no heap. Alguma análise de escape pode remover a alocação de heap. Usando uma edição de estrutura Esta versão evita a alocação de heap do fechamento mantendo os dados no quadro de pilha da função principal. Mesmo resultado: Para evitar que as aproximações de ponto flutuante sigam se acumulando e crescendo, o código poderia executar uma soma periódica em toda a matriz de filas circulares. Esta implementação produz dois estados de compartilhamento de objetos (função). É idiomático em E separar a entrada da saída (ler a partir da escrita) em vez de combiná-los em um único objeto. A estrutura é a mesma que a implementação do Desvio PadrãoE. O programa elixir abaixo gera uma função anônima com um período embutido p, que é usado como o período da média móvel simples. A função de execução lê entrada numérica e passa para a função anônima recém-criada e, em seguida, inspeciona o resultado para STDOUT. A saída é mostrada abaixo, com a média, seguida pela entrada agrupada, formando a base de cada média móvel. Erlang tem fechamentos, mas variáveis ​​imutáveis. Uma solução então é usar processos e uma simples mensagem passando API baseada. As linguagens de matriz têm rotinas para calcular os avarages de deslizamento para uma dada seqüência de itens. É menos eficiente para loop como nos comandos a seguir. Solicita continuamente uma entrada I. Que é adicionado ao final de uma lista L1. L1 pode ser encontrado pressionando 2ND1, ea média pode ser encontrada em ListOPS Pressione ON para terminar o programa. Função que retorna uma lista contendo os dados médios do argumento fornecido Programa que retorna um valor simples em cada invocação: list é a média da lista: p é o período: 5 retorna a lista média: Exemplo 2: Usando o programa movinav2 (i , 5) - Inicializando o cálculo da média móvel e definindo o período de 5 movinav2 (3, x): x - novos dados na lista (valor 3), e o resultado será armazenado na variável x e exibido movinav2 (4, x) : X - novos dados (valor 4), eo novo resultado será armazenado na variável x, e exibido (43) 2. Descrição da função movinavg: variável r - é o resultado (a lista média) que será retornada variável i - é a variável de índice, e aponta para o fim da sub-lista a lista sendo calculada a média. Variável z - uma variável auxiliar A função usa a variável i para determinar quais valores da lista serão considerados no cálculo da média seguinte. Em cada iteração, a variável i aponta para o último valor na lista que será usado no cálculo médio. Portanto, só precisamos descobrir qual será o primeiro valor na lista. Geralmente bem tem que considerar p elementos, então o primeiro elemento será o indexado por (i-p1). No entanto, nas primeiras iterações, esse cálculo será normalmente negativo, de modo que a seguinte equação irá evitar índices negativos: max (i-p1,1) ou, arranjar a equação, max (i-p, 0) 1. Mas o número de elementos nas primeiras iterações também será menor, o valor correto será (índice final - começar o índice 1) ou, arranjando a equação, (i - (max (ip, 0) 1) e então , (I-max (ip, 0)). A variável z contém o valor comum (max (ip), 0), então o beginindex será (z1) eo numberofelements será (iz) mid (list, z1, iz) retornará a lista de valor que será a soma média .) Irá somá-los soma (.) (Iz) ri irá média deles e armazenar o resultado no lugar apropriado na lista de resultados fp1 cria uma aplicação parcial fixando o (neste caso) o segundo e terceiro parâmetros

No comments:

Post a Comment