Monday 20 November 2017

Weighted Moving Average Java Code


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 veria 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 perguntou 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 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 a sintonia 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.) Note que os primeiros termos na seqüência média saltarão em torno de 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 muito. 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 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 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 de três ou quatro, ou n. Observe como os dados são muito mais suaves. Uma boa maneira de ver 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 período determinado 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, esta é uma forma de polarizar o alisamento para trás. 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. Assim, a saída que você obtém seria o último x termos dividido por x. Pseudocódigo não testado: Note que você precisará lidar com as partes inicial e final dos dados, uma vez que claramente você não pode fazer a média dos últimos 5 termos quando estiver no seu 2º ponto de dados. Além disso, há maneiras mais eficientes de calcular essa média móvel (soma soma - mais antigo mais recente), mas isso é para obter o conceito do que está acontecendo em toda. Respondeu Fevereiro 8 12 em 20: Médias móveis ponderadas: O básico Ao longo dos anos, os técnicos encontraram dois problemas com a média móvel simples. O primeiro problema reside no período de tempo da média móvel (MA). A maioria dos analistas técnicos acreditam que a ação preço. O preço de abertura ou de fechamento das ações, não é suficiente para depender para predizer adequadamente sinais de compra ou venda da ação de crossover MAs. Para resolver este problema, os analistas agora atribuem mais peso aos dados de preços mais recentes usando a média móvel exponencialmente suavizada (EMA). Exemplo: Por exemplo, usando um MA de 10 dias, um analista levaria o preço de fechamento do 10º dia e multiplicaria esse número por 10, o nono dia por nove, o oitavo Dia por oito e assim por diante para o primeiro do MA. Uma vez determinado o total, o analista dividiria o número pela adição dos multiplicadores. Se você adicionar os multiplicadores do exemplo de MA de 10 dias, o número é 55. Esse indicador é conhecido como a média móvel ponderada linearmente. (Para a leitura relacionada, verifique para fora as médias moventes simples fazem tendências estar para fora.) Muitos técnicos são crentes firmes na média movente exponencial suavizada (EMA). Este indicador tem sido explicado de tantas maneiras diferentes que confunde estudantes e investidores. Talvez a melhor explicação venha de John J. Murphys Análise Técnica dos Mercados Financeiros (publicado pelo New York Institute of Finance, 1999): A média móvel exponencialmente suavizada aborda ambos os problemas associados à média móvel simples. Primeiro, a média exponencialmente suavizada atribui um maior peso aos dados mais recentes. Portanto, é uma média móvel ponderada. Mas, embora atribua menor importância aos dados de preços passados, inclui no seu cálculo todos os dados na vida útil do instrumento. Além disso, o usuário é capaz de ajustar a ponderação para dar maior ou menor peso ao preço dos dias mais recentes, que é adicionado a uma porcentagem do valor dias anteriores. A soma de ambos os valores percentuais adiciona até 100. Por exemplo, o preço dos últimos dias poderia ser atribuído um peso de 10 (0,10), que é adicionado ao peso dias anteriores de 90 (0,90). Isto dá o último dia 10 da ponderação total. Isso seria o equivalente a uma média de 20 dias, dando ao preço dos últimos dias um valor menor de 5 (0,05). Figura 1: Média Movimentada Exponencialmente Alisada O gráfico acima mostra o índice Nasdaq Composite da primeira semana de agosto de 2000 a 1º de junho de 2001. Como você pode ver claramente, a EMA, que neste caso está usando os dados de fechamento de preços em um Período de nove dias, tem sinais de venda definitiva no dia 8 de setembro (marcado por uma seta preta para baixo). Este foi o dia em que o índice quebrou abaixo do nível de 4.000. A segunda seta preta mostra outra perna para baixo que os técnicos estavam realmente esperando. O Nasdaq não conseguiu gerar volume suficiente e juros dos investidores de varejo para quebrar a marca de 3.000. Em seguida, mergulhou novamente para baixo para fora em 1619.58 em 4 de abril. A tendência de alta de 12 de abril é marcado por uma seta. Aqui o índice fechou em 1.961,46, e os técnicos começaram a ver os gestores de fundos institucionais começando a pegar alguns negócios como Cisco, Microsoft e algumas das questões relacionadas à energia. A diferença entre a média móvel ea média móvel ponderada A média móvel de 5 períodos, com base nos preços acima, seria calculada com base nos seguintes itens: Fórmula: Com base na equação acima, o preço médio durante o período listado acima foi de 90,66. Usando médias móveis é um método eficaz para eliminar flutuações de preços fortes. A principal limitação é que os pontos de dados de dados mais antigos não são ponderados de forma diferente dos pontos de dados próximos ao início do conjunto de dados. Este é o lugar onde médias ponderadas móveis entram em jogo. As médias ponderadas atribuem uma ponderação mais pesada a pontos de dados mais atuais, uma vez que são mais relevantes do que pontos de dados no passado distante. A soma da ponderação deve somar 1 (ou 100). No caso da média móvel simples, as ponderações são distribuídas igualmente, razão pela qual não são mostradas na tabela acima. Preço de Fechamento da AAPL A média ponderada é calculada multiplicando-se o preço dado pela ponderação associada e somando-se os valores. No exemplo acima, a média móvel ponderada de 5 dias seria de 90,62. Neste exemplo, o ponto de dados recente recebeu a maior ponderação de 15 pontos arbitrários. Você pode pesar os valores fora de qualquer valor que você vê o ajuste. O menor valor da média ponderada acima em relação à média simples sugere que a recente pressão de venda poderia ser mais significativa do que alguns comerciantes antecipam. Para a maioria dos comerciantes, a escolha mais popular ao usar médias móveis ponderadas é usar uma maior ponderação para valores recentes. (Para obter mais informações, consulte o Tutorial Moving Average) Leia sobre a diferença entre as médias móveis exponenciais e médias móveis ponderadas, dois indicadores de suavização que. A única diferença entre estes dois tipos de média móvel é a sensibilidade que cada um mostra às mudanças nos dados usados. Leia Resposta Veja por que as médias móveis provaram ser vantajosas para comerciantes e analistas e útil quando aplicadas a gráficos de preços e. Leia a resposta Aprenda como os comerciantes e investidores usam alfa ponderada para identificar o momento de um preço de ações e se os preços se moverão mais alto. Leia Resposta Aprenda os períodos mais comumente selecionados usados ​​por comerciantes e analistas de mercado na criação de médias móveis para superposição como técnica. Leia Resposta Compreender como calcular os pesos dos custos de diferença de capital e como este cálculo é usado para determinar. Read Answer net. sourceforge. openforecast. models Classe WeightedMovingAverageModel Um modelo de previsão de média móvel ponderada é baseado em uma série temporal artificialmente construída em que o valor para um dado período de tempo é substituído pela média ponderada desse valor e os valores para algum número de Períodos de tempo anteriores. Como você pode ter adivinhado a partir da descrição, este modelo é mais adequado para dados de séries temporais, ou seja, dados que muda ao longo do tempo. Uma vez que o valor da previsão para um determinado período é uma média ponderada dos períodos anteriores, então a previsão sempre ficará atrás de aumentos ou diminuições nos valores observados (dependentes). Por exemplo, se uma série de dados tiver uma tendência ascendente notável, então uma previsão média ponderada da média móvel irá geralmente fornecer uma subestimação dos valores da variável dependente. O modelo de média móvel ponderada, como o modelo de média móvel, tem uma vantagem sobre outros modelos de previsão, na medida em que suaviza picos e depressões (ou vales) em um conjunto de observações. No entanto, como o modelo de média móvel, ele também tem várias desvantagens. Em particular, este modelo não produz uma equação real. Portanto, não é tudo o que é útil como uma ferramenta de previsão de médio e longo alcance. Ele só pode ser usado de forma confiável para prever alguns períodos no futuro. Desde: 0.4 Autor: Steven R. Gould Campos herdados da classe net. sourceforge. openforecast. models. AbstractForecastingModel WeightedMovingAverageModel () Constrói um novo modelo de previsão de média móvel ponderada. WeightedMovingAverageModel (double weights) Constrói um novo modelo de previsão de média móvel ponderada, usando os pesos especificados. Forecast (double timeValue) Retorna o valor de previsão da variável dependente para o valor fornecido da variável de tempo independente. GetForecastType () Retorna um nome de uma ou duas palavras desse tipo de modelo de previsão. GetNumberOfPeriods () Retorna o número atual de períodos usados ​​neste modelo. GetNumberOfPredictors () Retorna o número de preditores usados ​​pelo modelo subjacente. SetWeights (pesos duplos) Define os pesos usados ​​por este modelo de previsão de média móvel ponderada para os pesos dados. ToString () Isso deve ser substituído para fornecer uma descrição textual do modelo de previsão atual, incluindo, quando possível, qualquer parâmetro derivado usado. Métodos herdados da classe net. sourceforge. openforecast. models. AbstractTimeBasedModel WeightedMovingAverageModel Constrói um novo modelo de previsão de média móvel ponderada, usando os pesos especificados. Para um modelo válido a ser construído, você deve chamar init e passar em um conjunto de dados contendo uma série de pontos de dados com a variável de tempo inicializado para identificar a variável independente. O tamanho da matriz de pesos é usado para determinar o número de observações a serem utilizadas para calcular a média móvel ponderada. Adicionalmente, o período mais recente será dado o peso definido pelo primeiro elemento da matriz, isto é pesos @. O tamanho da matriz de pesos também é usado para determinar a quantidade de períodos futuros que podem ser efetivamente previstos. Com uma média móvel ponderada de 50 dias, não podemos razoavelmente - com qualquer grau de precisão - prever mais de 50 dias para além do último período para o qual os dados estão disponíveis. Mesmo a previsão perto do fim desta escala é provável ser não confiável. Nota sobre pesos Em geral, os pesos passados ​​para esse construtor devem somar 1,0. No entanto, como uma conveniência, se a soma dos pesos não se somar a 1,0, esta implementação escalas todos os pesos proporcionalmente para que eles somam a 1,0. Parâmetros: pesos - um conjunto de pesos a atribuir às observações históricas ao calcular a média móvel ponderada. WeightedMovingAverageModel Constrói um novo modelo de previsão da média móvel ponderada, usando a variável nomeada como a variável independente e os pesos especificados. Parâmetros: independentVariable - o nome da variável independente a ser usada neste modelo. Pesos - um conjunto de pesos a atribuir às observações históricas ao calcular a média móvel ponderada. WeightedMovingAverageModel Constrói um novo modelo de previsão da média móvel ponderada. Este construtor destina-se a ser usado apenas por subclasses (portanto, ele é protegido). Qualquer subclasse usando esse construtor deve posteriormente invocar o método (protected) setWeights para inicializar os pesos a serem usados ​​por este modelo. WeightedMovingAverageModel Constrói um novo modelo de previsão da média móvel ponderada usando a variável independente dada. Parâmetros: independentVariable - o nome da variável independente a ser usada neste modelo. SetWeights Define os pesos usados ​​por este modelo de previsão de média móvel ponderada para os pesos dados. Este método destina-se a ser utilizado apenas por subclasses (portanto, é protegido), e apenas em conjunto com o (protegido) um argumento-construtor. Qualquer subclasse usando o construtor de um argumento deve subsequentemente chamar setWeights antes de invocar o método AbstractTimeBasedModel. init (net. sourceforge. openforecast. DataSet) para inicializar o modelo. Nota sobre pesos Em geral, os pesos passados ​​para este método devem somar 1,0. No entanto, como uma conveniência, se a soma dos pesos não se somar a 1,0, esta implementação escalas todos os pesos proporcionalmente para que eles somam a 1,0. Parâmetros: pesos - um conjunto de pesos a atribuir às observações históricas ao calcular a média móvel ponderada. Forecast Retorna o valor de previsão da variável dependente para o valor fornecido da variável de tempo independente. As subclasses devem implementar este método de forma consistente com o modelo de previsão que implementam. As subclasses podem usar os métodos getForecastValue e getObservedValue para obter previsões e observações anteriores respectivamente. Especificado por: forecast na classe AbstractTimeBasedModel Parâmetros: timeValue - o valor da variável de tempo para o qual um valor de previsão é necessário. Retorna: o valor de previsão da variável dependente para o tempo determinado. Throws: IllegalArgumentException - se houver dados históricos insuficientes - observações passadas para o init - para gerar uma previsão para o dado valor de tempo. GetNumberOfPredictors Retorna o número de preditores usados ​​pelo modelo subjacente. Retorna: o número de preditores utilizados pelo modelo subjacente. GetNumberOfPeriods Retorna o número atual de períodos usados ​​neste modelo. Especificado por: getNumberOfPeriods na classe AbstractTimeBasedModel Retorna: o número atual de períodos usados ​​neste modelo. GetForecastType Retorna um nome de uma ou duas palavras desse tipo de modelo de previsão. Mantenha este short. Uma descrição mais longa deve ser implementada no método toString. ToString Isso deve ser substituído para fornecer uma descrição textual do modelo de previsão atual, incluindo, quando possível, qualquer parâmetro derivado usado. Especificado por: toString na interface ForecastingModel Substitui: toString na classe AbstractTimeBasedModel Retorna: uma representação de seqüência de caracteres do modelo de previsão atual e seus parâmetros. Não estou certo da solução correta, pois uma vez que somar a média de cada amostra iria introduzir uma quantidade razoável de arredondamento erro. Hmm. Gostaria de saber se seperating a parte fracionária de toda a parte iria ajudar. Divida a parte inteira de cada número pela contagem. Manter três somas correntes: 1) A média das partes inteiras, 2) O restante de cada divisão, e 3) A parte fracionária de cada número. Cada vez que a parte inteira de um número é dividida, o resultado da parte inteira é adicionado à soma corrente média e o restante é adicionado à soma corrente restante. Quando a soma corrente restante obtém um valor maior ou igual à contagem, a sua divisão pela contagem com o resultado da parte inteira adicionada à soma média corrente e o restante adicionado à soma restante em curso. Também, em cada cálculo, a parte fracionária é adicionada à soma de corrida fracionária. Quando a média é terminada, a soma corrente restante é dividida pela contagem e o resultado é adicionado à soma média corrente como um número flutuante. Por exemplo: Agora o que fazer com a soma de execução fracionada. O perigo de estouro é muito menos provável aqui, embora ainda possível, então uma maneira de lidar com isso seria dividir a soma de execução fracionária pela contagem no final e adicioná-lo ao nosso resultado: Uma alternativa seria verificar a execução fracionária Soma em cada cálculo para ver se ele é maior ou igual a contar. Quando isso acontece, basta fazer a mesma coisa que fazemos com o restante executando soma. Excelente Jomit Vaghela 6-Mar-07 20:00 Eu gostei do que você disse pequenos trabalhos rapidamente se transformar em grandes empregos. Pensar em otimização durante a codificação é uma boa prática. Grande esforço e explicação,

No comments:

Post a Comment