Algoritmo De Média Móvel Ponderada


Eu quero implementar um algoritmo iterativo, que calcula a média ponderada A lei do peso específico não importa, mas deve estar perto de 1 para os mais novos valores e perto de 0 para o mais antigo. O algoritmo deve ser iterativo ou seja, não deve se lembrar de todos Valores anteriores Deve saber apenas um valor mais recente e qualquer informação agregativa sobre passado, como valores anteriores da média, somas, contagens etc. Por exemplo, o seguinte algoritmo pode ser. It dará peso exponencial decrescente, o que pode não ser bom É possível ter passo diminuindo peso ou algo. Os requisitos para pesagem lei é segue.1 O peso diminui em passado 2 I tem alguma duração média ou característica de modo que os valores mais velhos esta duração importa muito menos do que os mais novos 3 Eu deveria ser capaz Para definir esta duração. Eu preciso do seguinte Suponha vi são valores, onde v1 é o primeiro Suponha também wi são pesos Mas w0 é O ÚLTIMO. Assim, após o primeiro valor veio eu tenho a primeira média. Após a segunda v Alue v2 veio, eu deveria ter average. With próximo valor que eu deveria ter. Nota, esse perfil de peso está se movendo comigo, enquanto eu estou movendo ao longo de seqüência de valor. I e cada valor não tem seu próprio peso o tempo todo Meu objetivo É ter este peso mais baixo, enquanto vai para o passado. Mas minha tarefa é ter a média recalculada cada vez que o novo valor chega com valores antigos reponderados OP. Your tarefa é quase sempre impossível, mesmo com esquemas de ponderação excepcionalmente simples. Você está pedindo, com O 1 memória, as médias de rendimento com um esquema de ponderação em mudança Por exemplo, como novos valores estão sendo passados, para alguns quase arbitrariamente mudar pesos seqüência Isso é impossível devido à injetividade Uma vez que você mesclar os números juntos, você perde uma enorme quantidade de informações Por exemplo, mesmo se você tivesse o vetor de peso você não poderia recuperar o vetor de valor original, ou vice-versa Há apenas dois casos que eu posso pensar de onde você poderia fugir com isso. Peso constante, como 2,2,2 2 este É equivalente a O um algoritmo de média on-line, que você não quer porque os valores antigos não estão sendo reponderados. Os pesos relativos das respostas anteriores não mudam Por exemplo, você poderia fazer pesos de 8,4,2,1 e adicionar um novo Elemento com peso arbitrário como 1, mas você deve aumentar todos os anteriores pelo mesmo fator multiplicativo, como 16,8,4,2 1 Assim, em cada etapa, você está adicionando um novo peso arbitrário, e um novo reescalonamento arbitrário do passado, Então você tem 2 graus de liberdade apenas 1 se você precisa manter o seu produto ponto-normalizado Os vetores de peso que você obteria pareceria. Assim, qualquer esquema de ponderação que você pode fazer parecer que vai funcionar a menos que você precise manter a coisa normalizada Pela soma dos pesos, caso em que você deve então dividir a nova média pela nova soma, que você pode calcular, mantendo apenas memória O 1 Simplesmente multiplicar a média anterior pelo novo s que irá implicitamente distribuir sobre o produto ponto em Os pesos, ea aderência no novo w newValue. answered Mar 29 12 em 21 27.Aqui eu estou supondo que você quer que os pesos para somar a 1 Enquanto você pode gerar um peso relativo sem ele mudar no futuro, você pode acabar com uma solução que imita esse comportamento. Isso é, suponha que você Definiu seus pesos como uma seqüência e definiu a entrada como sequence. Consider o formulário soma s0 i0 s1 i1 s2 i2 sn em soma s0 s1 s2 sn Note que é trivialmente possível calcular este incrementalmente com um par de contadores de agregação. Claro, CalculaWeightFromCounter neste caso shouldn t gerar pesos que somam a um - o truque aqui é que nós médio dividindo pela soma dos pesos de modo que no final, os pesos praticamente parecem somar a um. O truque real é como você Fazer calculateWeightFromCounter Você poderia simplesmente retornar o próprio contador, por exemplo, no entanto nota que o último número ponderado não seria perto da soma dos contadores necessariamente, então você pode não acabar com as propriedades exatas que você quer É difícil dizer desde então, Como mencionado, você ve Deixou um problema razoavelmente aberto. Respondido Mar 28 12 às 21 45.O problema é que os pesos estão mudando com cada novo valor No seu caso eles não são Suzan Cioc Mar 29 12 em 14 43.The pesos reais utilizados estão mudando com cada novo valor - os pesos estão sendo divididos por um número sucessivamente maior, impondo assim que os pesos reais usados ​​sempre somam 1 Kaganar Mar 29 12 em 14 45. Isso é muito longo para postar em um comentário, mas pode ser útil saber. Suponha que você tem w0 vn wn v0 chamaremos isto w 0 nvn 0 para short. Then o próximo passo é w0 vn1 wn1 v0 e este é w 0 n1 v n1 0 para short. This significa que precisamos de uma maneira de calcular w 1 n1 Vn 0 a partir de w 0 nvn 0.It s certamente possível que vn 0 é 0 0, z, 0 0 onde z está em algum local x. Se não temos qualquer armazenamento extra, então fzwxzwx 1 onde wx é o peso para a localização X. Rearranging a equação, wx 1 fzwxz Bem, wx 1 melhor ser constante para uma constante x, então fzwxz melhor ser constante Portanto, f deve deixar z propagar - isto é, Fzwxzfw x. Mas aqui novamente temos um problema Note que se z que poderia ser qualquer número pode propagar através f então wx certamente pode So fzwxwxfz Assim fwxwxfz Mas para uma constante xwx é constante e, portanto, fwx melhor ser constante, também wx é constante , Então fz melhor ser constante de modo que wxfz é constante Assim fwxwxc onde c é uma constante. Então, fxcx onde c é uma constante quando x é um valor de peso. Isto é, cada peso é um múltiplo do anterior Assim, os pesos levam O formulário wxmb x. Note que isso assume a única informação f tem é o último valor agregado Note que em algum momento você será reduzido a este caso, a menos que você está disposto a armazenar uma quantidade não constante de dados que representam a sua entrada Você não pode representar Um vetor de comprimento infinito de números reais com um número real, mas você pode aproximá-los de alguma forma em uma quantidade constante, finita de armazenamento Mas isso seria apenas uma aproximação. Embora eu não o tenha tido rigorosamente comprovado, é a minha conclusão th No que você quer é impossível fazer com um alto grau de precisão, mas você pode ser capaz de usar log n espaço que pode muito bem ser O 1 para muitas aplicações práticas para gerar uma aproximação de qualidade Você pode ser capaz de usar ainda menos. Respondeu Mar 29 12 at 23 01.I tentou praticamente codificar algo em Java Como já foi dito, o seu objetivo não é atingível Você só pode contar a média de um número de últimos valores lembrados Se você não precisa ser exato, você pode aproximar Os valores mais antigos Eu tentei fazê-lo lembrando os últimos 5 valores exatamente e os valores mais antigos Somado por 5 valores, lembrando os últimos 5 SUMs Então, a complexidade é O 2n para lembrar últimos valores nnn Esta é uma aproximação muito aproximada. Você pode modificar The lastValues ​​e lasAggregatedSums matriz tamanhos como você deseja Ver esta foto ascii-art tentando exibir um gráfico de últimos valores, mostrando que as primeiras colunas mais antigas dados são lembrados como valor agregado não individualmente, e apenas os primeiros 5 valores são remembere D individualmente. Desafio 1 Meu exemplo não conta pesos, mas eu acho que não deveria ser problema para você adicionar pesos para o LastAggregatedSums apropriadamente - o único problema é, que se você quiser pesos mais baixos para valores mais antigos, seria mais difícil, Porque a matriz está girando, por isso não é fácil saber qual o peso para o qual membro da matriz Talvez você pode modificar o algoritmo para sempre mudar valores na matriz em vez de girar Então adicionar pesos não deve ser um problema. Challenge 2 As matrizes são inicializadas Com valores de 0, e esses valores estão contando para a média desde o início, mesmo quando não temos recebimento de valores suficientes Se você estiver executando o algoritmo por muito tempo, você provavelmente não se incomoda que está aprendendo por algum tempo no início Se Você faz, você pode postar um modification. answered Jan 21 14 em 15 59.Your Answer.2017 Stack Exchange, Inc. Weighted médias móveis 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 maioria dos analistas técnicos acreditam que a ação de preço de abertura ou de fechamento do preço das ações, não é suficiente para depender para prever adequadamente comprar ou vender sinais da ação de cruzamento MA s Para resolver isso Problema, os analistas agora atribuem mais peso aos dados de preços mais recentes usando a média móvel exponencialmente suavizada EMA Saiba mais em Explorando a média móvel ponderada exponencialmente. Exemplo Por exemplo, usando um MA de 10 dias, um analista levaria o preço de fechamento Do décimo dia e multiplicar este número por 10, o nono dia por nove, o oitavo dia por oito e assim sucessivamente para o primeiro do MA. Uma vez que o total foi determinado, o analista dividiria o número pela adição do 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 leitura relacionada, verifique as Médias Móveis Simples. E os técnicos são crentes firmes na exponencialmente suavizada média móvel EMA Este indicador tem sido explicado de tantas maneiras diferentes que confunde estudantes e investidores Talvez a melhor explicação vem de John J. Murphy s Análise Técnica dos Mercados Financeiros, publicado pela 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 peso maior aos dados mais recentes. Portanto, é uma média móvel ponderada. Além disso, o usuário é capaz de ajustar a ponderação para dar maior ou menor peso ao preço do dia mais recente, que é adicionado Para uma porcentagem do valor do dia anterior s A soma de ambos os valores de porcentagem se soma a 100.Por exemplo, o preço do último dia poderia ser um Ssigned um peso de 10 10, que é adicionado aos dias anteriores peso de 90 90 Isso dá o último dia 10 da ponderação total Isso seria o equivalente a uma média de 20 dias, dando o último preço dias de um valor menor de 5 05.Figura 1 Média Movente 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 Um período de nove dias, tem sinais de venda definitiva no dia 8 de setembro marcado por uma seta para baixo preto Este foi o dia em que o índice quebrou abaixo do nível 4.000 A segunda seta preta mostra outra perna para baixo que os técnicos estavam realmente esperando O Nasdaq não poderia 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 04 de abril A tendência de alta de 12 de abril é marcado por uma seta Aqui o índice fechado em 1.961 46 e técnicos começaram a ver Gestão de fundos institucionais Rs começando a pegar algumas pechinchas como a Cisco, Microsoft e algumas das questões relacionadas à energia Leia nossos artigos relacionados Moving Average Envelopes Refining Uma Ferramenta de Negociação Popular e Bounce. A média Moving. Um inquérito realizado pelo Bureau of Labor Statistics dos Estados Unidos para ajudar a medir A taxa de juros em que uma instituição depositária empresta fundos mantidos no Federal Reserve para outra instituição depositária. 1 Uma medida estatística da dispersão de retornos para um dado índice de segurança ou mercado A volatilidade pode ser medida. Um ato que o Congresso dos EUA aprovou em 1933 como a Lei Bancária, que proibia bancos comerciais de participar no investimento. Trabalho fora das fazendas, das casas particulares e do setor sem fins lucrativos O Escritório de Trabalho dos EUA. Eu preciso acompanhar os últimos 7 dias wor K horas em um loop de leitura de arquivo plano Ele está sendo usado para medir a fatigueability de rosters. Right trabalho agora tenho algo que funciona, mas parece bastante detalhado e eu não tenho certeza se há um padrão que é mais sucinta. 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 rolando total de volta por um O processamento desta matriz estática é feito No seu próprio método, ou seja, minha pergunta é esta uma abordagem de design razoável, ou há algo ofuscantemente óbvio e simples para fazer esta tarefa Obrigado guys. asked 30 de agosto 11 às 14 33.Thanks alot guys eu tenho a mensagem usar um maior - Nível de objeto e explorar os métodos relevantes ou um buffer circular Grandes respostas, todos eles 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 não estava 100 certeza de no meu Próprio I m aliviado que eu hadn t perdeu um 1 forro e foi basicall Y em uma pista razoável, se não eficiente e concisa Isso é o que eu amo sobre este site de alta qualidade, respostas relevantes de pessoas que conhecem seus sh Pete855217 Aug 30 11 at 15 05. Por que você inicializar runningTotal para null Qual é a sua Digite onde é declarado faria bem se você colocar algumas amostras de código que se assemelham ao código Java real. Movendo, minha crítica seria a seguinte sua função faz muito Uma função ou método, deve ser coeso Mais apropriadamente, eles devem fazer Uma coisa e uma coisa only. Worse ainda, o que acontece em seu para loop quando x 5 Você copiar runningTotal 6 em runningTotal 5, mas então você tem duas cópias do mesmo valor na posição 5 e 6.In seu projeto, o seu function. moves Baralha os itens em seu array. calcula o material de total. prints para o erro padrão. returns o total. It faz muito. Minha primeira sugestão não é mover coisas ao redor na matriz Em vez disso, implementar um buffer circular e usá-lo em vez do Array Ele simplificará seu design My A segunda sugestão é dividir as coisas em funções que são coesivas. Possuem uma estrutura de dados um buffer circular que permite que você adicione a ele e que descarte a entrada mais antiga sempre que atingir sua capacidade. Possuem a estrutura de dados implementar um interator. have uma função Que calcula o total no iterador que você não se importa se você está calculando o total de uma matriz, lista ou circular bufer. don t chamá-lo total Chamar soma, que é o que você está computing. That s o que eu d fazer. Isso é ótimo, mas lembre-se que esta função é uma pequena parte da funcionalidade da classe, e seria um exagero para adicionar muito código para torná-lo perfeito Você está tecnicamente correto, e eu entendo que meu código faz muito, mas em Ao mesmo tempo às vezes é melhor errar do lado do código menor, mais claro do que ir para a perfeição Dadas minhas habilidades de Java, mesmo fazendo o pseudocódigo que você descreve compilar teria me golpe meu orçamento sobre isso, mas obrigado pela descrição clara Pete855217 Ago 31 1 1 a 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 este é o caminho a percorrer na Caso em geral, em termos de custo-eficiência, redução de defeitos, compreensão, etc, a menos que seja throw-away código para um único tipo de coisa Nunca é caro para fazer isso quando se inicia qualquer análise do problema desta maneira Codificação 101, Para baixo o problema eo código segue, nem exagerar nem difícil 31 de agosto 11 às 15 55. Sua tarefa é muito simples eo approach que você adotou é certamente bom para o trabalho No entanto, se você quiser usar um projeto melhor, você deve obter Livrar-se de todo o movimento número que você melhor usar uma fila FIFO e fazer bom uso de métodos push e pop dessa forma o código não vai refletir qualquer movimento de dados, apenas as duas ações de lógica de novos dados e remover dados mais de 7 dias. 11 em 14 49.

Comments