Saturday 9 September 2017

Algoritmo de média móvel ponderada


Eu tenho uma série de tempo de preços de ações e desejo calcular a média móvel em uma janela de dez minutos (veja o diagrama abaixo). Como os carrapatos de preços ocorrem esporadicamente (ou seja, não são periódicos), parece mais conveniente calcular uma média móvel ponderada no tempo. No diagrama há quatro mudanças de preço: A, B, C e D, com os três últimos ocorrendo dentro da janela. Observe que, porque B só ocorre algum tempo na janela (digamos 3 minutos), o valor de A ainda contribui para a computação. Na verdade, até onde eu posso dizer, a computação deve basear-se exclusivamente nos valores de A, B e C (não D) e as durações entre eles e o próximo ponto (ou no caso de A: a duração entre o início Da janela de tempo e B). Inicialmente D não terá qualquer efeito, já que sua pontuação será zero. Isso é correto. Assumindo que isso está correto, minha preocupação é que a média móvel ficará mais do que a computação não ponderada (o que explicaria o valor de D imediatamente), no entanto, a computação não ponderada tem suas próprias desvantagens: A Tem tanto efeito sobre o resultado como os outros preços apesar de estar fora da janela de tempo. Uma onda repentina de carrapatos de preços rápidos prejudicaria fortemente a média móvel (embora talvez isso seja desejável) Alguém pode oferecer algum conselho sobre qual abordagem parece melhor, ou se há uma abordagem alternativa (ou híbrida) que vale a pena considerar, pediu 14 de abril 12 às 21: 35 Seu raciocínio está correto. O que você quer usar a média para embora, sem saber que é difícil dar qualquer conselho. Talvez uma alternativa seja considerar sua média de corrida A, e quando um novo valor V entrar, calcule a nova A média a (1-c) AcV, onde c está entre 0 e 1. Desta forma, os tiques mais recentes têm Uma influência mais forte, e o efeito de carrapatos antigos se dissipa ao longo do tempo. Você poderia até mesmo c depender do tempo desde os tiques anteriores (c se tornando menor à medida que os tiques se aproximam). No primeiro modelo (ponderação), a média seria diferente a cada segundo (como as leituras antigas obtêm menor peso e novas leituras mais altas), então está sempre mudando o que pode não ser desejável. Com a segunda abordagem, os preços fazem saltos bruscos à medida que novos preços são introduzidos e os antigos desaparecem da janela. Respondeu 14 de abril 12 às 21:50 As duas sugestões vêm do mundo discreto, mas você pode encontrar uma inspiração para seu caso particular. Dê uma olhada no suavização exponencial. Nesta abordagem, você apresenta o fator de suavização (01) que permite que você altere a influência dos elementos recentes no valor da previsão (os elementos mais antigos recebem pesos exponencialmente decrescentes): criei uma animação simples de como o alisamento exponencial rastrearia o Uma série de tempo uniforme x1 1 1 1 3 3 2 2 2 1 com três diferentes: veja também algumas das técnicas de aprendizagem de reforço (veja os diferentes métodos de desconto), por exemplo TD-learning e Q-Learning. Sim, a média móvel será, naturalmente, atrasada. Isso ocorre porque seu valor é informação histórica: ele resume amostras do preço nos últimos 10 minutos. Esse tipo de média é inerentemente laggy. Ele tem um deslocamento construído em cinco minutos (porque uma média de caixa sem deslocamento seria baseada em - 5 minutos, centrada na amostra). Se o preço estiver em A por um longo período de tempo e, em seguida, muda uma vez para B, leva 5 minutos para a média para alcançar (AB) 2. Se você quiser uma média de uma função sem qualquer mudança no domínio, o peso tem Para ser distribuído uniformemente em torno do ponto de amostra. Mas isso é impossível para os preços que ocorrem em tempo real, uma vez que os dados futuros não estão disponíveis. Se você quer uma mudança recente, como D, para ter um impacto maior, use uma média que dê um peso maior aos dados recentes, ou um período de tempo mais curto, ou ambos. Uma maneira de suavizar os dados é simplesmente usar um único acumulador (o estimador suavizado) E e tomar amostras periódicas dos dados S. E é atualizado da seguinte forma: I. e. Uma fração K (entre 0 e 1) da diferença entre a amostra de preço atual S e o estimador E é adicionado a E. Suponha que o preço tenha sido em A há muito tempo, de modo que E esteja em A e, de repente, muda Para B. O estimador começará a se mover para B de forma exponencial (como aquecimento, arrefecimento de carga de um capacitor, etc.). No começo, ele irá dar um grande salto e, em seguida, incrementos menores e menores. O quão rápido ele se move depende de K. Se K é 0, o estimador não se move, e se K é 1, ele se move instantaneamente. Com K você pode ajustar a quantidade de peso que você dá ao estimador versus a nova amostra. Mais peso é dado a amostras mais recentes de forma implícita, e a janela de exemplo basicamente se estende ao infinito: E é baseado em cada amostra de valor que já ocorreu. Embora, obviamente, os mais antigos não tenham influência no valor atual. Um método muito simples e bonito. Respondeu 14 de abril 12 às 21:50 Isso é o mesmo que a resposta de Tom. Sua fórmula para o novo valor do estimador é (1 - K) E KS. Que é algébricamente o mesmo que E K (S-E). É uma função de mistura quotlinear entre o estimador atual E e a nova amostra S onde o valor de K 0, 1 controla a mistura. Escrevê-lo dessa maneira é agradável e útil. Se K for 0,7, tomamos 70 de S e 30 de E, o que é o mesmo que adicionar 70 da diferença entre E e S de volta para E. ndash Kaz 14 de abril 12 às 22:15 Ao expandir a resposta Toms, a fórmula Para ter em consideração o espaçamento entre carrapatos pode ser formalizado (os tiques de fechamento têm uma ponderação proporcionalmente menor): a (tn - t n-1) T que é, a é uma proporção de delta de tempo de chegada sobre o intervalo de média v 1 (uso anterior Ponto) ou v (1 - u) a (interpolação linear ou vu (próximo ponto) Mais informações são encontradas na página 59 do livro Uma Introdução à Finanças de Alta Frequência. Desejo implementar um algoritmo iterativo, que calcula a média ponderada A lei de peso específica não importa, mas deve ser próxima de 1 para os valores mais recentes e perto de 0 para o mais antigo. O algoritmo deve ser iterativo, ou seja, não deve lembrar todos os valores anteriores. Ele deve saber apenas um valor mais recente E qualquer informação agregada sobre o passado, como valores anteriores da média, somas, contagem 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 enviar uma modificação -) respondeu 21 de janeiro 14 às 15:59 Sua resposta 2017 Stack Exchange, Inc Este repo fornece algoritmos de média móvel móvel ponderada exponencial ou EWMAs para breve, com base em nossa conversa de comportamento quantificador anormal. Média de Movimento Ponderada Exponencialmente Uma média móvel ponderada exponencialmente é uma maneira de calcular continuamente um tipo de média para uma série de números, à medida que os números chegam. Depois que um valor na série é adicionado à média, seu peso na média diminui exponencialmente ao longo do tempo. Isso prejudica a média em relação a dados mais recentes. Os EWMAs são úteis por várias razões, principalmente o custo computacional e de memória barato, bem como o fato de representarem a recente tendência central da série de valores. O algoritmo EWMA requer um fator de decaimento, alfa. Quanto maior o alfa, mais a média é tendenciosa em relação à história recente. O alfa deve estar entre 0 e 1, e geralmente é um número bastante pequeno, como 0,04. Vamos discutir a escolha do alfa mais tarde. O algoritmo funciona assim, em pseudocódigo: multiplique o próximo número da série por alfa. Multiplique o valor atual da média em 1 menos alfa. Adicione o resultado das etapas 1 e 2 e guarde-o como o novo valor atual da média. Repita para cada número da série. Existem comportamentos de casos especiais para como inicializar o valor atual, e estes variam entre as implementações. Uma abordagem é começar com o primeiro valor na série. Outro é a média dos 10 primeiros valores da série usando uma média aritmética e, em seguida, iniciar a atualização incremental da média. Cada método tem prós e contras. Pode ajudar a vê-lo de forma ilustrada. Suponha que a série tenha cinco números, e nós escolhemos alfa para ser 0.50 por simplicidade. Heres a série, com números no bairro de 300. Agora, vamos tomar a média móvel desses números. Primeiro, estabelecemos a média para o valor do primeiro número. Em seguida, multiplicamos o próximo número por alfa, multiplique o valor atual por 1-alfa e adicione-os para gerar um novo valor. Isso continua até terminar. Observe como cada um dos valores na série decai pela metade cada vez que um novo valor é adicionado e a parte superior das barras na parte inferior da imagem representa o tamanho da média móvel. É uma média suavizada, ou baixa passagem, da série original. Considere uma média móvel de janela de deslizamento de tamanho fixo (não uma média móvel ponderada exponencialmente) que mede em relação às amostras N anteriores. Qual é a idade média de cada amostra é N2. Agora suponha que você deseja construir um EWMA cujas amostras tenham a mesma idade média. A fórmula para calcular o alfa necessário para isso é: alpha 2 (N1). Prova está no livro Produção e Análise de Operações por Steven Nahmias. Então, por exemplo, se você tiver uma série de tempo com amostras uma vez por segundo, e você deseja obter a média móvel em relação ao minuto anterior, use um alfa de .032786885. Este, por sinal, é o alfa constante usado para este repositorys SimpleEWMA. Este repositório contém duas implementações do algoritmo EWMA, com diferentes propriedades. As implementações estão em conformidade com a interface MovingAverage e o construtor retorna esse tipo. As implementações atuais assumem um intervalo de tempo implícito de 1.0 entre cada amostra adicionada. Ou seja, a passagem do tempo é tratada como se fosse o mesmo que a chegada das amostras. Se você precisar de decadência com base no tempo quando as amostras não estão chegando precisamente em intervalos estabelecidos, esse pacote não suportará suas necessidades no momento. Um SimpleEWMA foi projetado para baixo consumo de CPU e memória. Ele terá um comportamento diferente do VariableEWMA por vários motivos. Não tem período de aquecimento e usa uma decomposição constante. Essas propriedades permitem usar menos memória. Ele também se comportará de forma diferente quando for igual a zero, o que é suposto significar não inicializado, então se um valor provavelmente se tornará zero ao longo do tempo, então qualquer valor não-zero causará um salto acentuado em vez de uma pequena mudança. Ao contrário de SimpleEWMA, isso suporta uma idade personalizada que deve ser armazenada e, portanto, usa mais memória. Ele também tem um tempo de aquecimento quando você começa a adicionar valores a ele. Ele reportará um valor de 0,0 até que você tenha adicionado o número de amostras necessárias. Ele usa alguma memória para armazenar o número de amostras adicionadas a ele. Como resultado, usa um pouco mais do dobro da memória do SimpleEWMA. Veja aqui a documentação gerada pelo GoDoc. Só aceitamos pedidos de puxão para pequenas correcções ou melhorias. Isso inclui: Pequenas correções de erros Typos Documentação ou comentários Abra itens para discutir novos recursos. Os pedidos de solicitação de novos recursos serão rejeitados, por isso recomendamos forjar o repositório e fazer alterações em seu garfo para o seu caso de uso. Este repositório é Copyright (c) 2013 VividCortex, Inc. Todos os direitos reservados. É licenciado sob a licença MIT. Consulte o arquivo LICENSE para obter os termos de licença aplicáveis.

No comments:

Post a Comment