Thursday, 24 May 2018

Exponential moving average in sql


Média móvel exponencial em T-SQL As médias móveis exponenciais são semelhantes às médias móveis ponderadas, pois atribuem menos peso às mudanças há muito tempo e mais peso às 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: Há uma ótima maneira de calcular médias móveis exponenciais em T-SQL usando um recurso não documentado sobre variáveis ​​e totais em execução no SQL Server. Neste post, mostrarei como usar esse método para calcular a média móvel exponencial em T-SQL, mas também apresentarei um método que está usando recursos padrão no SQL Server. Infelizmente, isso significa usar um loop. Nos exemplos, calcularei uma média móvel exponencial de 9 dias. Os exemplos usam o banco de dados TAdb. Um script para criar o TAdb pode ser encontrado aqui. Média Móvel Exponencial (EMA): Método de Totais em Execução A teoria por trás do total de recursos em execução nas atualizações é descrita em detalhes por Jeff Moden em seu artigo Resolvendo o Total em Execução e Problemas de Classificação Ordinal. Outros recursos que descrevem o uso desse método para calcular o EMA são a postagem no blog Calculando Médias Móveis com o T-SQL, de Gabriel Priester, e o Fórum Exponencial Moving Average Challenge. ambos no SQL Server Central. Basicamente, no T-SQL você pode atualizar variáveis ​​e colunas em uma instrução de atualização. As atualizações são feitas linha por linha internamente pelo SQL Server. Esse comportamento de linha por linha é o que torna possível calcular um total em execução. Este exemplo mostra como funciona: Observe que 8220ColumnRunningTotal8221 é um total em execução de 8220ColumnToSum8221. Usando este método, podemos calcular o EMA9 com este T-SQL: O cálculo do 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 do EMA. Para calcular o 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 esse cálculo na declaração acima na instrução CASE: Média Móvel Exponencial (EMA): Método de Looping Até onde eu sei, exceto pelo método de totais em execução descrito acima, não há como calcular o EMA usando uma instrução SQL baseada em conjunto . Portanto, o T-SQL abaixo está usando um loop while para calcular o EMA9: Os resultados são os mesmos que no exemplo de totais em execução acima. Desempenho Como esperado, a versão dos totais em execução baseados em conjuntos é muito mais rápida que a versão em loop. Na minha máquina, a solução baseada em conjuntos era de cerca de 300 ms, em comparação com cerca de 1200 com a versão de loop. A versão do loop está mais em conformidade com os padrões SQL, no entanto. Portanto, a escolha entre os métodos depende do que é mais importante para você, desempenho ou padrões. A média móvel exponencial pode ser usada na análise de tendências, como nos outros tipos de médias móveis, Média Móvel Simples (SMA) e Média Móvel Ponderada (WMA). Há também outros cálculos em análise técnica que usam o EMA, MACD por exemplo. Esta postagem de blog é parte de uma série sobre análise técnica, TA, no SQL Server. Veja os outros posts aqui. Publicado por Tomas Lind Tomas Lind - Serviços de consultoria como DBA do SQL Server e Desenvolvedor de banco de dados na High Coast Database Solutions AB. Movendo a média em T-SQL Um cálculo comum na análise de tendências é a média móvel. Uma média móvel é a média das últimas 10 linhas, por exemplo. A média móvel mostra uma curva mais suave do que os valores reais, mais ainda com um período mais longo para a média móvel, tornando-se uma boa ferramenta para análise de tendências. Esta postagem do blog mostrará como calcular a média móvel em T-SQL. Diferentes métodos serão usados ​​dependendo da versão do SQL Server. O gráfico abaixo demonstra o efeito de suavização (linha vermelha) com uma média móvel de 200 dias. As cotações de ações são a linha azul. A tendência de longo prazo é claramente visível. T-SQL Movendo Avergage 200 dias A demonstração abaixo requer o banco de dados TAdb que pode ser criado com o script localizado aqui. No próximo exemplo, calcularemos uma média móvel nos últimos 20 dias. Dependendo da versão do SQL Server, haverá um método diferente para fazer o cálculo. E, como veremos mais adiante, as versões mais recentes do SQL Server têm funções que permitem um cálculo muito mais eficaz. SQL Server 2012 e posterior Média Móvel Esta versão faz uso de uma função de janela agregada. O que há de novo no SQL 2012 é a possibilidade de restringir o tamanho da janela, especificando quantas linhas antes da janela deve conter: As linhas anteriores são 19, porque incluiremos a linha atual também no cálculo. Como você pode ver, o cálculo da média móvel no SQL Server 2012 é bem simples. A figura abaixo demonstra o princípio de janelamento. A linha atual está marcada com amarelo. A janela está marcada com um fundo azul. A média móvel é simplesmente a média de QuoteClose nas linhas azuis: T-SQL Janela média móvel. Os resultados dos cálculos em versões mais antigas do SQL Server são os mesmos, portanto, eles não serão mostrados novamente. Mover Média do SQL Server 2005 8211 2008R2 Esta versão faz uso de uma expressão de tabela comum. O CTE é auto referenciado para obter as últimas 20 linhas para cada linha: Média Móvel antes do SQL Server 2005 A versão anterior a 2005 usará uma associação externa esquerda para a mesma tabela para obter as últimas 20 linhas. Pode-se dizer que a tabela externa contém a janela na qual queremos calcular uma média: Comparação de desempenho Se executarmos os três métodos diferentes simultaneamente e verificarmos o plano de execução resultante, haverá uma diferença dramática no desempenho entre os métodos: Comparação de três métodos diferentes para calcular a média móvel Como você pode ver, as melhorias na função de janelas no SQL 2012 fazem uma enorme diferença no desempenho. Como mencionado no início deste post, médias móveis são usadas como uma ferramenta para ilustrar tendências. Uma abordagem comum é combinar médias móveis de diferentes comprimentos, a fim de detectar mudanças nas tendências de curto, médio e longo prazo, respectivamente. De particular interesse é o cruzamento de linhas de tendência. Por exemplo, quando a tendência curta se move sobre a tendência longa ou média, isso pode ser interpretado como um sinal de compra na análise técnica. E quando a tendência curta se move sob uma linha de tendência mais longa, isso pode ser interpretado como um sinal de venda. O gráfico abaixo mostra Cotações, Ma20, Ma50 e Ma200. T-SQL Ma20, Ma50, Ma200 comprar e vender sinais. Esta postagem de blog é parte de uma série sobre análise técnica, TA, no SQL Server. Veja os outros posts aqui. Postado por Tomas Lindi li a discussão que você mencionou. É aplicável ao PostgreSQL, uma vez que é permitido criar funções agregadas definidas pelo usuário usando SQL no PostgreSQL, mas não permitido no SQL Server. Usar CTE recursivo é uma maneira viável no SQL Server, mas percebo que o modo CTE pode incorrer em mais varredura de tabela do que em funções de janela. Então eu faço este post 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 Apr 14 13 at 2:53 Primeiro, você calcula o EMA (SMA (x)) em vez do EMA (x). Segundo, sua constante de quotsmoothing é, na verdade, o valor beta da minha fórmula, não o alfa. Com essas duas mudanças, o SQLFiddle tem esta aparência: sqlfiddle / 6/19192/1 No entanto, ainda há uma pequena diferença entre o resultado real e o resultado esperado. Eu voltaria e veria se a definição de EMA deles corresponde àquela que eu conheço. ndash Sebastian Meine May 7 13 at 13:46 Eu apenas olhei para o formulário na planilha que você anexou e está muito longe da definição padrão da EMA. Minha fórmula calcula a média móvel exponencial das últimas dez linhas. A planilha calcula primeiro a média padrão das últimas dez linhas e, em seguida, a média móvel ponderada exponencialmente sem restrições sobre todas as médias. Isto segue o formulário aqui: en. wikipedia. org/wiki/EWMAchart ndash Sebastian Meine May 7 13 at 13:52

No comments:

Post a Comment