Wednesday, 29 November 2017

Algoritmo java exponencial móvel médio no Brasil


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. EMA Os EMAs de 12 e 26 dias são as médias de curto prazo mais populares e são usados ​​para criar indicadores como a divergência de convergência média móvel (EMA). MACD) eo oscilador de preços percentuais (PPO). Em geral, as EMA de 50 e 200 dias são usadas como sinais de tendências de longo prazo. Traders que empregam análise técnica encontrar médias móveis muito útil e perspicaz quando aplicado corretamente, mas criar havoc quando usado de forma inadequada ou são mal interpretados. Todas as médias móveis normalmente utilizadas na análise técnica são, pela sua própria natureza, indicadores atrasados. Conseqüentemente, as conclusões tiradas da aplicação de uma média móvel a um gráfico de mercado específico devem ser para confirmar um movimento de mercado ou para indicar sua força. Muitas vezes, quando uma linha de indicadores de média móvel fez uma alteração para refletir uma mudança significativa no mercado, o ponto ótimo de entrada no mercado já passou. Um EMA serve para aliviar este dilema em certa medida. Porque o cálculo EMA coloca mais peso sobre os dados mais recentes, ele abraça a ação de preço um pouco mais apertado e, portanto, reage mais rápido. Isto é desejável quando um EMA é usado para derivar um sinal de entrada de negociação. Interpretando a EMA Como todos os indicadores de média móvel, eles são muito mais adequados para mercados de tendências. Quando o mercado está em uma tendência de alta forte e sustentada. A linha de indicador EMA também mostrará uma tendência de alta e vice-versa para uma tendência de baixa. Um comerciante vigilante não só prestar atenção à direção da linha EMA, mas também a relação da taxa de mudança de uma barra para a próxima. Por exemplo, à medida que a ação de preço de uma forte tendência de alta começar a se nivelar e reverter, a taxa de mudança da EMA de uma barra para a próxima começará a diminuir até que a linha de indicador se aplana ea taxa de mudança seja zero. Devido ao efeito retardado, por este ponto, ou mesmo algumas barras antes, a ação do preço deve já ter invertido. Portanto, segue-se que a observação de uma diminuição consistente da taxa de variação da EMA poderia ser utilizada como um indicador que pudesse contrariar o dilema causado pelo efeito retardado das médias móveis. Usos comuns do EMA EMAs são comumente usados ​​em conjunto com outros indicadores para confirmar movimentos significativos do mercado e para avaliar a sua validade. Para os comerciantes que negociam intraday e mercados em rápido movimento, o EMA é mais aplicável. Muitas vezes os comerciantes usam EMAs para determinar um viés de negociação. Por exemplo, se um EMA em um gráfico diário mostra uma forte tendência ascendente, uma estratégia de comerciantes intraday pode ser o comércio apenas a partir do lado longo em um gráfico intraday. Eu preciso acompanhar os últimos 7 dias de trabalho em um arquivo plano Loop de leitura. Seu ser usado para medir fatigueability de rosters do trabalho. Agora eu tenho algo que funciona, mas parece bastante detalhado e não tenho certeza se há um padrão que é mais sucinto. Atualmente, eu tenho uma classe Java com uma matriz estática para armazenar os últimos dados x dias, então como eu leio através do arquivo, eu cortar o primeiro elemento e mover os outros 6 (por uma semana rodando total) de volta por um. O processamento dessa matriz estática é feito em seu próprio método ie. Minha pergunta: esta é uma abordagem de design razoável, ou há algo de cegueira óbvia e simples para fazer esta tarefa Obrigado rapazes pediu Aug 30 11 at 14:33 Thanks alot guys: I39ve tem a mensagem: use um objeto de nível mais alto e explorar o Métodos relevantes ou um tampão circular. Grandes respostas, todas elas. Quando você pensa sobre isso, você sempre precisa de acesso a toda a matriz para que você possa se livrar da primeira entrada - que eu wasn39t 100 certeza de no meu próprio. I39m aliviado que eu hadn39t perdeu um forro 1 e foi basicamente em uma pista razoável, se não eficiente e concisa Isso é o que eu adoro sobre este site: de alta qualidade, respostas relevantes de pessoas que sabem o seu sht. Ndash Pete855217 Aug 30 11 at 15:05 Por que você inicializar runningTotal para null Qual é o seu tipo Onde é declarado Faria bem se você colocar alguns exemplos de código que se assemelham ao código Java real. Seguindo em frente, minha crítica seria a seguinte: a sua função faz muito. Uma função ou método deve ser coeso. Mais apropriadamente, eles deveriam fazer uma coisa e uma coisa só. Pior ainda, o que acontece no seu loop for quando x 5 Você copia runningTotal6 em runningTotal5. Mas então você tem duas cópias do mesmo valor na posição 5 e 6. Em seu projeto, sua função movesshuffles os itens em sua matriz calcula o total imprime coisas para erro padrão retorna o total Ele faz muito. Minha primeira sugestão é não mover coisas ao redor da matriz. Em vez disso, implementar um buffer circular e usá-lo em vez da matriz. Simplificará seu projeto. Minha segunda sugestão é dividir as coisas em funções que são coesas: ter uma estrutura de dados (um buffer circular) que permite adicionar a ele (e que cai a entrada mais antiga sempre que atingir sua capacidade.) Ter a estrutura de dados implementar um Interator tem uma função que calcula o total no iterador (você não se importa se você está calculando o total de uma matriz, lista ou bufer circular.) Não chamá-lo total. Chamá-lo de soma, que é o que você está computando. Isso é o que fazer :) That39s grande informação luis, no entanto lembre-se esta função é uma pequena parte da funcionalidade da classe, e seria exagero para adicionar muito código para torná-lo perfeito. Você está tecnicamente correto, e eu entendo que meu código faz muito 39, mas ao mesmo tempo às vezes é melhor errar do lado do código menor, mais claro do que ir para a perfeição. Dado o meu Java habilidades, mesmo fazendo o pseudocódigo que você descreve compilação teria me golpe meu orçamento sobre este (), mas obrigado pela descrição clara. Ndash Pete855217 Aug 31 11 at 2:23 Hmmm, não é sobre a perfeição, mas sobre as práticas industriais estabelecidas que temos conhecimento para as últimas 3 décadas. Código limpo é sempre um que é particionado. Temos décadas de evidências que indicam que este é o caminho a percorrer no caso geral (em termos de custo-eficiência, redução de defeitos, compreensão, etc.). A menos que seja um código descartável para um tipo único de coisa. Nunca é custoso fazer isso quando se inicia qualquer análise de problemas desta maneira. Codificação 101, quebrar o problema eo código segue, nem overkill nem difícil) ndash luis. espinal Aug 31 11 at 15:55 Sua tarefa é muito simples ea abordagem que você adotou é certamente bom para o trabalho. No entanto, se você quiser usar um projeto melhor, você deve se livrar de todo esse movimento número você melhor usar uma fila FIFO e fazer bom uso de push e pop métodos dessa forma o código não vai refletir qualquer movimento de dados, apenas as duas ações lógicas De novos dados e remover dados com mais de 7 dias. Respondeu 30 Ago 11 at 14:49

No comments:

Post a Comment