Sunday 9 July 2017

Média Móvel Exponencial Em Sql


Estou tentando implementar uma média móvel exponencial (EMA) no postgres, mas enquanto checo documentação e penso nisso, mais eu tento mais confundido. A fórmula para EMA (x) é: parece ser perfeita para um agregador, manter o resultado do último elemento calculado é exatamente o que tem que ser feito aqui. No entanto, um agregador produz um único resultado (como reduzir ou dobrar) e aqui precisamos de uma lista (uma coluna) de resultados (como mapa). Eu tenho verificado como os procedimentos e as funções funcionam, mas o AFAIK produz uma única saída, não uma coluna. Eu já vi muitos procedimentos e funções, mas na verdade não consigo descobrir como isso interage com a álgebra relacional, especialmente quando faz algo assim, uma EMA. Não tive sorte pesquisando os internets até agora. Mas a definição de um EMA é bastante simples, espero que seja possível traduzir essa definição para algo que funciona no postgres e é simples e eficiente, porque mudar para o NoSQL será excessivo no meu contexto. Isso está calculando a agregação que produz o resultado em cada linha para cada sublista dos dados de entrada. Porque parece que está usando o agregador até a linha n, retornando o resultado e depois indo para a linha 0 para calcular a agregação até a linha n1 novamente. Existe alguma maneira de usar a acumulação ou alguma variável estática (como em C) para que isso seja calculado uma vez Obrigado. Ndash Trylks 20 de janeiro 12 às 11:59 Não, ele está usando o valor acumulado. Se você executar a consulta com o comando quotraise infoquot descomentado, você poderá ver que a função só é chamada uma vez para cada saída de linha. O Postgresql produz o valor do estado em cada linha (se houver um finalfunc definido, que seria chamado para transformar o estado em um valor de saída). Ndash araqnid 20 de janeiro 12 às 12:04 ErwinBrandstetter: Eu revertei a maioria das mudanças - no caso do formato da primeira parte (âncora) da consulta, o EMA (x1) pode ser claramente representado com uma única linha - isso Corespnds para a linha única definindo-o na questão. No caso da parte recursiva da consulta, usei mn-1 na condição de junção para indicar a equivalência do relacionamento com EMA (xn-1) na pergunta, mesmo que este seja menos performante se o desempenho for um Questão, o OP pode alterar a condição de associação para ser como você sugeriu. Ndash Mark Bannister 16 de janeiro 12 às 9: 27 Eu li a discussão que você mencionou. É aplicável ao PostgreSQL uma vez que é permitido criar uma função agregada definida pelo usuário usando o SQL no PostgreSQL, mas não é permitido no SQL Server. Usar o CTE recursivo é uma maneira viável no SQL Server, mas percebo que a maneira CTE pode resultar em mais varredura de tabela do que as funções da janela. Então, faço essa publicação para perguntar se é possível calcular a média móvel exponencial usando a função de janela do SQL Server 2012, assim como calcular a média móvel simples. Ndash xiagao1982 14 de abril 13 às 2:53 Primeiro, você calcula o EMA (SMA (x)) em vez do EMA (x). Em segundo lugar, o seu quotsmoothing constantquot é, na verdade, o valor beta da minha fórmula, e não o alfa. Com essas duas mudanças, o SQLFiddle parece assim: sqlfiddle6191921 No entanto, ainda há uma pequena diferença entre o resultado real e o resultado esperado. Eu voltaria e veria se a sua definição EMA corresponde ao que eu conheço. Ndash Sebastian Meine 7 de maio 13 às 13:46 Eu apenas olhei o formulário na planilha que você anexou e está fora da definição EMA padrão. Minha fórmula calcula a média móvel exponencial das últimas dez linhas. A planilha calcula primeiro a média padrão nas últimas dez linhas e, em seguida, a média móvel ponderada exponencialmente irrestrita em todas as médias. Isto segue o formulário aqui: en. wikipedia. orgwikiEWMAchart ndash Sebastian Meine 7 de maio 13 às 13: 52 A média móvel expressiva em T-SQL As médias móveis exponentes são semelhantes às médias móveis ponderadas, na medida em que atribuem menos peso às mudanças há muito tempo e mais peso Para mudanças recentes. As médias móveis ponderadas são lineares, mas as médias móveis exponenciais são exponenciais. Ou seja, o peso pode ser expresso como uma curva: existe uma ótima maneira de calcular as médias móveis exponenciais no T-SQL usando um recurso indocumentado sobre variáveis ​​e totais em execução no SQL Server. Nesta publicação no blog, vou mostrar como usar esse método para calcular a média móvel exponencial em T-SQL, mas também apresentarei um método que esteja usando recursos padrão no SQL Server. Infelizmente, isso significa usar um loop. Nos exemplos, calculo uma média móvel exponencial de 9 dias. Os exemplos utilizam o banco de dados TAdb. Um script para criar o TAdb pode ser encontrado aqui. Média móvel exponencial (EMA): Método de execução de totais A teoria por trás das funcionalidades totais em execução em atualizações é descrita em detalhes por Jeff Moden em seu artigo, Resolvendo os Problemas de Ordem Total e Ordinal. Outros recursos que descrevem o uso desse método para calcular EMA são as postagens do blog Calculando as médias móveis com o T-SQL por Gabriel Priester e o fórum Exponential Moving Average Challenge. Ambos no SQL Server Central. Basicamente, no T-SQL você pode atualizar variáveis, bem como colunas em uma declaração de atualização. As atualizações são feitas linha a linha internamente pelo SQL Server. Esse comportamento de linha a linha é o que torna o cálculo de um total executável possível. Este exemplo mostra como funciona: Observe que 8220ColumnRunningTotal8221 é um total executado de 8220ColumnToSum8221. Usando este método, podemos calcular EMA9 com este T-SQL: o cálculo de EMA é bastante simples. Usamos a linha atual e a anterior, mas com mais peso para a linha atual. O peso é calculado pela fórmula 2 (19), onde 822098221 é o parâmetro para o comprimento da EMA. Para calcular EMA9 para a linha 10 acima, o cálculo é: neste caso, a linha atual obtém 20 do peso (2 (19) 0,2) e a linha anterior recebe 80 do peso (1-2 (19) 0,8). Você encontra este cálculo na declaração acima na instrução CASE: Média de Movimento Exponencial (EMA): Método de Looping Tanto quanto eu sei, exceto o método de execução de totais descrito acima, não há como calcular EMA usando uma instrução SQL baseada em conjunto . Portanto, o T-SQL abaixo está usando um loop while para calcular EMA9: os resultados são os mesmos que no exemplo de totais em execução acima. Desempenho Como esperado, a versão de totais em execução baseada em conjunto é muito mais rápida do que a versão do loop. Na minha máquina, a solução baseada em conjunto era de cerca de 300 ms, em comparação com cerca de 1200 com a versão do loop. A versão de loop está mais em conformidade com os padrões SQL, no entanto. Portanto, a escolha entre os métodos depende do que seja o mais importante para você, desempenho ou padrões. A média móvel exponencial pode ser usada na análise de tendências, como ocorre com os outros tipos de médias móveis, média movente simples (SMA) e média móvel ponderada (WMA). Existem também outros cálculos em análises técnicas que utilizam o EMA, MACD, por exemplo. Esta publicação no blog faz parte de uma série sobre análise técnica, TA, no SQL Server. Veja as outras publicações aqui. Postado por Tomas Lind Tomas Lind - Serviços de consultoria como SQL Server DBA e Desenvolvedor de banco de dados no High Coast Database Solutions AB.

No comments:

Post a Comment