Eu quero implementar um algoritmo iterativo, que calcula a média ponderada. A lei do peso específico não importa, mas deve ser perto de 1 para os valores mais recentes e perto de 0 para os mais antigos. O algoritmo deve ser iterativo. Ou seja, não deve lembrar todos os valores anteriores. Deve saber apenas um valor mais recente e qualquer informação agregada sobre o passado, como valores anteriores da média, somas, contagens, etc. Por exemplo, o seguinte algoritmo pode ser: Ele dará um peso exponencial decrescente, o que pode não ser bom. É possível ter um peso decrescente ou algo assim. Os requisitos para a legislação de pesagem são os seguintes: 1) O peso diminui para o passado 2). Eu tenho alguma duração média ou característica, de modo que os valores mais antigos, essa duração, são muito menores do que os mais recentes. 3) Eu Deve ser capaz de definir esta duração, eu preciso do seguinte. Suponha que vi são valores, onde v1 é o primeiro. Suponhamos também que sejam pesos. Mas wO é o ÚLTIMO. Então, depois que o primeiro valor veio, eu tenho a primeira média. Depois do segundo valor v2, eu deveria ter média. Com o próximo valor, eu deveria ter Nota, esse perfil de peso está se movendo comigo, enquanto eu estou me movendo ao longo da seqüência de valores. Isto é, Cada valor não tem seu próprio peso o tempo todo. Meu objetivo é ter esse peso mais baixo enquanto vai para o passado. Gt Mas minha tarefa é ter uma média recalculada cada vez que um novo valor chega tendo valores antigos refletidos. OP Sua tarefa é quase sempre impossível, mesmo com esquemas de pontuação excepcionalmente simples. Você está pedindo, com memória O (1), médias de rendimento com um esquema de ponderação em mudança. Por exemplo, à medida que novos valores estão sendo transmitidos, para algumas seqüências de pesos que mudam arbitrariamente. Isso é impossível devido à injetividade. Depois de combinar 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 conseguiu recuperar o vetor do valor original, ou vice-versa. Existem apenas dois casos em que posso pensar onde você poderia fugir com isso: pesos constantes como 2,2,2. 2: isso é equivalente a um algoritmo de média on-line, que você não quer porque os valores antigos não estão sendo ponderados. Os pesos relativos de respostas anteriores não mudam. Por exemplo, você poderia fazer pesos de 8,4,2,1. E adicione um novo elemento com peso arbitrário como. 1. mas você deve aumentar todo o anterior pelo mesmo fator multiplicativo, como 16,8,4,21. Assim, em cada etapa, você está adicionando um novo peso arbitrário e um novo arbitrário de atualização do passado, de modo que você tenha 2 graus de liberdade (apenas 1 se precisar manter seu produto ponto normalizado). Os vetores de peso que você obtém pareciam: Assim, qualquer esquema de ponderação que você pode fazer parece funcionar (a menos que você precise manter o item normalizado pela soma dos pesos, caso em que você deve dividir a nova média pelo novo Soma, que você pode calcular, mantendo apenas a memória O (1)). Simplesmente multiplique a média anterior pelo novo s (que irá distribuir implicitamente sobre o ponto-produto nos pesos) e abordar o novo wnewValue. Respondeu 29 de março às 21:27 Aqui estou supondo que você deseja que os pesos somem para 1. Enquanto você pode gerar um peso relativo sem que ele mude no futuro, você pode acabar com uma solução que imita esse comportamento. Ou seja, suponha que você definiu seus pesos como uma seqüência e definiu a entrada como seqüência. Considere a forma: soma (s0i0 s1i1 s2i2. Snin) soma (s0 s1 s2. Sn). Observe que é trivialmente possível calcular isso de forma incremental com alguns contadores de agregação: Claro, calculeWeightFromCounter () nesse caso não deve gerar pesos que somem a um - o truque aqui é que nós, na média, dividindo pela soma dos pesos De modo que no final, os pesos virtualmente parecem somar a um. O verdadeiro truque é como você calculaWeightFromCounter (). Você poderia simplesmente devolver o próprio contador, por exemplo, no entanto, note que o último número ponderado não estaria perto da soma dos contadores necessariamente, então você não pode acabar com as propriedades exatas que deseja. (É difícil dizer que, como mencionado, você deixou um problema bastante aberto.) Respondeu 28 de março às 21:45 O problema é que os pesos estão mudando com cada novo valor. No seu caso, eles não são. Ndash Suzan Cioc 29 de março 12 às 14:43 Os pesos reais utilizados estão mudando com cada valor novo - as quotweightsquot estão sendo divididas por um número sucessivamente maior, reforçando assim que os pesos reais utilizados sempre somem para 1. ndash Kaganar 29 de março 12 Às 14:45 Isso é muito longo para postar em um comentário, mas pode ser útil saber. Suponha que você tenha: w0vn. Wnv0 (bem, chame isso w0..nvn..0 para breve) Então o próximo passo é: w0vn1. Wn1v0 (e isso é w0..n1vn1..0 para baixo) Isso significa que precisamos de uma maneira de calcular w1..n1vn..0 de w0..nvn..0. É certamente possível que vn..0 seja 0. 0, z, 0. 0 onde z esteja em algum local x. Se não tivermos nenhum armazenamento extra, então f (zw (x)) zw (x 1) onde w (x) é o peso para a localização x. Reorganizando a equação, w (x 1) f (zw (x)) z. Bem, w (x 1) melhor ser constante para uma constante x, então f (zw (x)) z melhor ser constante. Portanto, f deve permitir que z se propague - isto é, f (zw (x)) zf (w (x)). Mas aqui novamente temos um problema. Observe que se z (que poderia ser qualquer número) pode se propagar através de f. Então w (x) certamente pode. Então f (zw (x)) w (x) f (z). Assim f (w (x)) w (x) f (z). Mas para uma constante x. W (x) é constante e, portanto, f (w (x)) melhor ser constante, também. W (x) é constante, então f (z) é melhor ser constante, de modo que w (x) f (z) seja constante. Assim, f (w (x)) w (x) c onde c é uma constante. Então, f (x) cx onde c é uma constante quando x é um valor de peso. Ou seja, cada peso é um múltiplo do anterior. Assim, os pesos assumem a forma w (x) mbx. Observe que isso pressupõe que a única informação que f tem é o último valor agregado. Note que, em algum momento, você será reduzido a este caso, a menos que esteja disposto a armazenar uma quantidade de dados não constantes que representem 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 e finita de armazenamento. Mas isso seria apenas uma aproximação. Embora eu não tenha provado com rigor, é minha conclusão de que o que você quer é impossível fazer com um alto grau de precisão, mas você pode usar o log (n) espaço (o que também pode ser O (1) para muitos Aplicações práticas) para gerar uma aproximação de qualidade. Você pode usar ainda menos. Respondeu 29 de março às 23:01 Tentei praticamente codificar algo (em Java). Como já foi dito, seu objetivo não é possível. Você só pode contar a média de alguns dos ú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 somente SUMmed por 5 valores, lembrando as últimas 5 SUMs. Então, a complexidade é O (2n) para lembrar os últimos valores nnn. Esta é uma aproximação muito áspera. Você pode modificar os tamanhos de matriz lastValues e lasAggregatedSums conforme desejado. Veja esta imagem de ascii-art tentando exibir um gráfico de últimos valores, mostrando que as primeiras colunas (dados mais antigos) são lembradas como valor agregado (não individualmente) e somente os 5 valores mais adiantados são lembrados individualmente. Desafio 1. O meu exemplo não conta com pesos, mas acho que não deveria ser um problema para você adicionar pesos adequados para o último. O único problema é que, se você quiser pesos mais baixos para valores mais antigos, seria mais difícil porque a matriz gira, então Não é direto saber qual peso para qual membro da matriz. Talvez você possa modificar o algoritmo para mudar sempre os valores na matriz em vez de girar. Em seguida, adicionar pesos não deve ser um problema. Desafio 2. As matrizes são inicializadas com 0 valores, e esses valores estão contando a média desde o início, mesmo quando não recebemos valores suficientes. Se você estiver executando o algoritmo por um longo período de tempo, você provavelmente não incomodará que esteja aprendendo por algum tempo no início. Se você fizer isso, você pode postar uma modificação -) respondeu 21 de janeiro 14 às 15:59 Sua resposta 2017 Stack Exchange, IncExploração A volatilidade média móvel ponderada exponencialmente é a medida de risco mais comum, mas vem em vários sabores. Em um artigo anterior, mostramos como calcular a volatilidade histórica simples. (Para ler este artigo, consulte Usando a volatilidade para avaliar o risco futuro.) Usamos os dados atuais do preço das ações da Googles para calcular a volatilidade diária com base em 30 dias de estoque de dados. Neste artigo, melhoraremos a volatilidade simples e discutiremos a média móvel ponderada exponencialmente (EWMA). Vs históricos. Volatilidade implícita Primeiro, colocamos essa métrica em um pouco de perspectiva. Existem duas abordagens amplas: volatilidade histórica e implícita (ou implícita). A abordagem histórica pressupõe que o passado é o prólogo que medimos a história na esperança de que seja preditivo. A volatilidade implícita, por outro lado, ignora o histórico que resolve para a volatilidade implícita nos preços de mercado. Espera que o mercado conheça melhor e que o preço de mercado contenha, mesmo que de forma implícita, uma estimativa consensual da volatilidade. (Para leitura relacionada, veja Os Usos e Limites da Volatilidade.) Se nos concentrarmos apenas nas três abordagens históricas (à esquerda acima), eles têm dois passos em comum: Calcule a série de retornos periódicos Aplicar um esquema de ponderação Primeiro, nós Calcule o retorno periódico. Isso geralmente é uma série de retornos diários, em que cada retorno é expresso em termos compostos continuamente. Para cada dia, tomamos o log natural da proporção dos preços das ações (ou seja, preço hoje dividido por preço ontem e assim por diante). Isso produz uma série de retornos diários, de u i to u i-m. Dependendo de quantos dias (m dias) estamos medindo. Isso nos leva ao segundo passo: é aqui que as três abordagens diferem. No artigo anterior (Usando o Volatility To Gauge Future Risk), mostramos que sob um par de simplificações aceitáveis, a variância simples é a média dos retornos quadrados: Observe que isso resume cada um dos retornos periódicos, então divide esse total pelo Número de dias ou observações (m). Então, é realmente apenas uma média dos retornos periódicos quadrados. Dito de outra forma, cada retorno quadrado recebe um peso igual. Então, se o alfa (a) é um fator de ponderação (especificamente, um 1m), então uma variância simples parece algo assim: O EWMA melhora a diferença simples. A fraqueza dessa abordagem é que todos os retornos ganham o mesmo peso. O retorno de Yesterdays (muito recente) não tem mais influência na variação do que o retorno dos últimos meses. Esse problema é corrigido usando a média móvel ponderada exponencialmente (EWMA), na qual os retornos mais recentes têm maior peso na variância. A média móvel ponderada exponencialmente (EWMA) apresenta lambda. Que é chamado de parâmetro de suavização. Lambda deve ser inferior a um. Sob essa condição, em vez de pesos iguais, cada retorno quadrado é ponderado por um multiplicador da seguinte forma: por exemplo, RiskMetrics TM, uma empresa de gerenciamento de risco financeiro, tende a usar uma lambda de 0,94 ou 94. Neste caso, o primeiro ( Mais recente) o retorno periódico ao quadrado é ponderado por (1-0,94) (94) 0 6. O próximo retorno ao quadrado é simplesmente um múltiplo lambda do peso anterior neste caso 6 multiplicado por 94 5,64. E o peso do terceiro dia anterior é igual (1-0,94) (0,94) 2 5,30. Esse é o significado de exponencial em EWMA: cada peso é um multiplicador constante (isto é, lambda, que deve ser inferior a um) do peso dos dias anteriores. Isso garante uma variação ponderada ou tendenciosa em relação a dados mais recentes. (Para saber mais, confira a Planilha do Excel para a Volatilidade dos Googles.) A diferença entre a simples volatilidade e o EWMA para o Google é mostrada abaixo. A volatilidade simples efetivamente pesa cada retorno periódico em 0.196 como mostrado na Coluna O (tivemos dois anos de dados diários sobre o preço das ações. Isso é 509 devoluções diárias e 1509 0.196). Mas observe que a coluna P atribui um peso de 6, então 5.64, depois 5.3 e assim por diante. Essa é a única diferença entre variância simples e EWMA. Lembre-se: depois de somar toda a série (na coluna Q), temos a variância, que é o quadrado do desvio padrão. Se queremos volatilidade, precisamos lembrar de tomar a raiz quadrada dessa variância. Qual é a diferença na volatilidade diária entre a variância e EWMA no caso do Googles. É significativo: a variância simples nos deu uma volatilidade diária de 2,4, mas a EWMA deu uma volatilidade diária de apenas 1,4 (veja a planilha para obter detalhes). Aparentemente, a volatilidade de Googles estabeleceu-se mais recentemente, portanto, uma variação simples pode ser artificialmente alta. A diferença de hoje é uma função da diferença de dias de Pior. Você notará que precisamos calcular uma série longa de pesos exponencialmente decrescentes. Nós não vamos fazer a matemática aqui, mas uma das melhores características do EWMA é que toda a série se reduz convenientemente a uma fórmula recursiva: Recursiva significa que as referências de variância de hoje (ou seja, são uma função da variância dos dias anteriores). Você também pode encontrar esta fórmula na planilha e produz exatamente o mesmo resultado que o cálculo de longo prazo. A variação de hoje (sob EWMA) é igual a variância de ontem (ponderada por lambda) mais retorno quadrado de ontem (pesado por menos a lambda). Observe como estamos apenas adicionando dois termos em conjunto: variância ponderada de ontem e atraso de ontem, retorno quadrado. Mesmo assim, lambda é o nosso parâmetro de suavização. Um lambda mais alto (por exemplo, como RiskMetrics 94) indica decadência mais lenta na série - em termos relativos, teremos mais pontos de dados na série e eles vão cair mais devagar. Por outro lado, se reduzirmos a lambda, indicamos maior deterioração: os pesos caem mais rapidamente e, como resultado direto da rápida deterioração, são usados menos pontos de dados. (Na planilha, lambda é uma entrada, para que você possa experimentar sua sensibilidade). Resumo A volatilidade é o desvio padrão instantâneo de um estoque e a métrica de risco mais comum. É também a raiz quadrada da variância. Podemos medir a variação historicamente ou implicitamente (volatilidade implícita). Ao medir historicamente, o método mais fácil é a variância simples. Mas a fraqueza com variância simples é que todos os retornos recebem o mesmo peso. Então, enfrentamos um trade-off clássico: sempre queremos mais dados, mas quanto mais dados temos, mais nosso cálculo será diluído por dados distantes (menos relevantes). A média móvel ponderada exponencialmente (EWMA) melhora a variação simples ao atribuir pesos aos retornos periódicos. Ao fazer isso, podemos usar um grande tamanho de amostra, mas também dar maior peso aos retornos mais recentes. (Para ver um tutorial de filme sobre este tópico, visite a Tartaruga Bionica.) Eu essencialmente tenho uma série de valores como este: a matriz acima é simplificada demais, 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 olhava 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 é levar esses valores e aplicar um algoritmo para eles, que os suavizará um pouco para que eu tenha mais valores lineares. (Ie: Id como os meus resultados para serem curvy, não jaggedy) Eu fui dito para aplicar um filtro exponencial de média móvel aos meus valores. Como posso fazer isso. É muito difícil para mim ler equações matemáticas, eu lido muito melhor com o código. Como faço para processar valores na minha matriz, aplicando um cálculo exponencial da média móvel para os fazer sair, solicitado 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 exige uma pequena classe (supondo que você esteja usando o Java 5 ou posterior): instanciar com o parâmetro de decaimento desejado (pode ser necessário que a sintonização esteja entre 0 e 1) e depois use a média () para filtrar. Ao ler uma página sobre uma 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 arrays e seqüências com subscritos. (Eles também têm algumas outras notações, o que não ajuda.) No entanto, o EMA é bastante simples, pois você só precisa se lembrar de um valor antigo, não é necessário nenhum arrays de estados complicados. Respondeu 8 de fevereiro às 20:42 TKKocheran: praticamente. Não é bom quando as coisas podem ser simples (Se começar com uma nova seqüência, obtenha uma nova média). Observe que os primeiros termos da seqüência média saltarão em torno de um bit devido a efeitos de limites, 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 média móvel na média e experimentar sem incomodar demais o seu programa. Ndash Donal Fellows 9 de fevereiro às 0:06 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 é errado. É errado porque assume um aumento ou diminuição monotônico (que sempre está subindo ou sempre está indo para baixo). A menos que você tenha média de todos os seus dados, seus pontos de dados --- como você os apresenta --- são não-lineares. Se você realmente quer encontrar o valor máximo entre dois pontos no tempo, então 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, levando 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úmero), 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 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 para o Google Finance, selecionar um estoque (tente Tesla Motors bastante volátil (TSLA)) e clique em técnicas na parte inferior do gráfico. Selecione a média móvel com um período determinado e a média móvel exponencial para comparar suas diferenças. A média móvel exponencial é apenas uma outra elaboração deste, mas considera os dados mais antigos inferiores aos novos dados, esta é uma maneira de polarizar o alisamento para trás. Leia a entrada da Wikipedia. Então, isso é mais um comentário do que uma resposta, mas a pequena caixa de comentários foi apenas pequena. Boa sorte. Se você estiver 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 os últimos x termos divididos por x. Pseudocódigo não testado: note que você precisará lidar com as partes de início e término dos dados, pois claramente você não pode significar os últimos 5 termos quando estiver no seu segundo ponto de dados. Além disso, existem maneiras mais eficientes de calcular essa média móvel (soma sumária - a mais nova), mas é para obter o conceito de o que está acontecendo. Respondeu 8 de fevereiro às 20:41 Sua resposta 2017 Stack Exchange, Inc
No comments:
Post a Comment