Sunday 25 February 2018

Algoritmo de média móvel móvel ponderada exponencialmente


Eu tenho uma série temporal de preços das ações e desejo calcular a média móvel em uma janela de dez minutos (veja o diagrama abaixo). Como os tiques 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, tanto quanto 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, pois sua ponderação de tempo 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 representaria 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, 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 o seu caso particular. Dê uma olhada no alisamento 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 são atribuídos 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 compensação 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 uniformemente distribuído 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 alisar dados é simplesmente usar um único acumulador (o estimador suavizado) E e fazer 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 por um longo 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 dará um grande salto e, em seguida, incrementos menores e menores. A rapidez com que 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 é 0,7, nós 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 de Toms, a fórmula Para ter em consideração que 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 do 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ífico 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 S 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 diferente. 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. Suponha também que sejam pesos. Mas w0 é 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 chega um novo valor com valores antigos refletidos. OP Sua tarefa é quase sempre impossível, mesmo com esquemas de ponderaçã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. Uma vez que você combina 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 considerados novamente. Os pesos relativos das 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 redimensionamento arbitrário 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ê possa fazer parecer assim funcionará (a menos que você precise manter a coisa normalizada 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 de forma implícita 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 () neste caso não deve gerar pesos que somam a um - o truque aqui é que nós média dividindo pela soma dos pesos De modo que no final, os pesos praticamente parecem somar a um. O verdadeiro truque é como você calculaWeightFromCounter (). Você poderia simplesmente devolver o contador em si, 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 novo valor - 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 curto) 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. Note que se z (que poderia ser qualquer número) pode 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. Observe que, em algum momento, você será reduzido a este caso, a menos que você esteja disposto a armazenar uma quantidade de dados não constantes que represente 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 que o que você quer é impossível fazer com um alto grau de precisão, mas você pode usar o espaço de log (n) (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 Eu 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 apenas os primeiros 5 valores 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 para o últimoAggregatedSums de forma apropriada - 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 às 15:59 Sua resposta 2017 Stack Exchange, Inc

No comments:

Post a Comment