Exponential Moving Average Sql Server
Li a discussão que você mencionou. É aplicável ao PostgreSQL, uma vez que é permitido criar a função agregada definida pelo usuário usando o SQL no PostgreSQL, mas não permitido no SQL Server. Usar CTE recursivo é uma maneira viável no SQL Server, mas eu percebo que a maneira CTE pode incorrer mais varredura de tabela do que 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 como calcular 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). Em segundo lugar, seu quotsmoothing constante é realmente o valor beta na minha fórmula, não o alfa. Com essas duas alterações o SQLFiddle se parece com isto: sqlfiddle / 6/19192/1 No entanto, ainda há uma pequena diferença entre o resultado real eo resultado esperado. Gostaria de voltar e ver se a sua EMA definição corresponde ao que eu conheço. Ndash Sebastian Meine May 7 13 at 13:46 Eu só olhei para o formulário na planilha que você anexou e está longe da definição padrão EMA. Minha fórmula calcula a média móvel exponencial das últimas dez linhas. A planilha primeiro calcula a média padrão nas ú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 7 de maio 13 às 13: 52O desafio Im tendo aqui está tentando derivar o EMA para o registro de dias atuais onde os dias anteriores EMA para o mesmo contrato de futuros É uma entrada. Da mesma forma, os próximos dias de negociação EMA é dependente da EMA para hoje. O uso de uma abordagem SQL baseada em set não faz a cascata dos resultados da forma desejada. Aqui estão os detalhes e com referência aos dados de exemplo abaixo: EMA fórmula é: EMACurrent EMAPrevious (CLSCurrent - EMAPrevious) Constante Onde Constante no meu exemplo é 0.15385 Nota: O PREVTIMEKEY é o dia de negociação anterior, e não necessariamente TIMEKEY - 1 Como há lacunas devido a dias não-comerciais. Também COMMSYMB são mercadorias diferentes, portanto, o registro anterior não é necessariamente o dia de negociação anterior para a commodity atual. Os dados começam com um valor de semente, veja registros onde TIMEKEY 718. Então para calcular o EMA para registros onde TIMEKEY 719, nós aplicamos a fórmula. Tomando COMMSYMB C como exemplo, obtemos 371,290064102564 (372,75 - 371,290064102564) 0.15385 371.51468 Usando uma abordagem de conjunto de SQL, Im capaz de derivar o próximo valor apenas (ou seja, onde TIMEKEY 719), mas posteriormente todos os registros subseqüentes têm EMAF NULL. Eu entendo porque, porque meus valores derivados não foram gravados na tabela. Então eu preciso de algum método para derivar os próximos dias EMA, em seguida, escrever os resultados para a tabela, em seguida, derivar os dias seguintes EMA, escreva para a tabela, etc Isso deve ser repetido para todos os 30.000 registros na tabela mestre. Obrigado antecipadamente, Wayne - Dados de exemplo DROP TABLE dbo. EMATEST CREATE TABLE dbo. EMATEST (TIMEKEY INT NOT NULL, COMMSYMB NVARCHAR (3) NOT NULL, PREVTIMEKEY INT, CLS FLOAT, EMAF FLOAT) INSERT INTO dbo. EMATEST (TIMEKEY, COMMSYMB, PREVTIMEKEY, CLS, EMAF) SELECT 703, C, 0, 375.5, 0 UNION ALL SELECT 703, CL, 0, 62.44, 0 UNION ALL SELECT 703, GC, 0, 650.9, 0 UNION ALL SELECT 704, C, 703 , 378, 0 UNION ALL SELECT 704, CL, 703, 62.43, 0 UNION ALL SELECT 704, GC, 703, 647.9, 0 UNION ALL SELECT 705, CL, 704, 62.19 , 0 UNION ALL SELECT 706, CL, 705, 62.49, 0 UNION ALL SELECT 706, GC, 705, 637, 0 UNION ALL SELECT 706, UNIÃO ALL SELECT 707, C, 706, 623, 0 UNION ALL SELECT 707, GC, 706, 631, 0 UNION ALL SELECT 710, C, 707, 370.75, 0 UNION ALL SELECT 707, SELECT 710, CL, 707, 61.22, 0 UNION ALL SELECT 710, GC, 707, 634.8, 0 UNION ALL SELECT 711, C, 710, 372.75, , 710, 631,7, 0 UNION ALL SELECT 712, C, 711, 638, 0, UNION ALL SELECT 712, CL, 711, 62.17, 0 UNION ALL SELECT 713, C , 712, 371,75, 0 UNIÃO ALL SELECT 713, CL, 712, 63,33, 0 UNION ALL SELECT 713, GC, 712, 630,9, 0 UNION ALL SELECT 714, CL, 713 , 64.09, 0 UNION ALL SELECT 714, GC, 713, 619.1, 0 UNION ALL SELECT 717, C, 714, 365.75, 0 UNION ALL SELECT 717, CL, 714, 62.79, 0 UNION ALL SELECT 717, GC, 714, 617.9 , 0 UNION ALL SELECT 718, C, 717, 373, 371,290064102564 UNIÃO ALL SELECT 718, CL, 717, 63,46, 62,6237179487179 UNIÃO ALL SELECT 718, GC, 717, 625,4, 631,753205128205 UNIÃO ALL SELECT 719, C, 718, 372,75, NULL UNIÃO ALL SELECT 719, CL, 718, 63,72, NULL UNIÃO ALL SELECT 719, GC, 718, 624,3, NULL UNION ALL SELECT 720, C, 719, 377,75, NULL SELECT 720, GC, 719, 621.6, NULL UNIÃO ALL SELECT 721, C, 720, 624.3, NULL UNION ALL SELECT 724 , C, 721, 384, NULL UNIÃO ALL SELECT 724, CL, 721, 62.41, NULL UNIÃO ALL SELECT 724, GC, 721, 622.3, NULL UNIÃO ALL SELECT 725, C, 724, 388, NULL , 724, 61.1, NULL UNION ALL SELECT 725, GC, 724, 626.9, NULL UNIÃO ALL SELECT 726, C, 725, 386.75, NULL UNIÃO ALL SELECT 726, CL, 725, 60.34, NULL UNION ALL SELECT 726, GC, 725 , 630.3, NULL UNION ALL SELECT 727, C, 726, 388.5, NULL UNIÃO ALL SELECT 727, CL, 726, 60.53, NULL UNION ALL SELECT 727, GC, 726, 636.9, NULL UNIÃO ALL SELECT 728, C, 727, 390.25 , NULL UNION ALL SELECT 728, CL, 727, 61,05, NULL UNION ALL SELECT 728, GC, 727, 638, NULL - Os resultados esperados DROP TABLE dbo. EMAER CREATE TABLE dbo. EMER (TIMEKEY INT NOT NULL, COMMSYMB NVARCHAR 3) NOT NULL, PREVTIMEKEY INT, CLS FLOAT, EMAF FLOAT) INSERT INTO dbo. EMAER (TIMEKEY, COMMSYMB, PREVTIMEKEY, CLS, EMAF) SELECT 703, C, 0, 375.5, 0 UNION ALL SELECT 703, CL, 0, 62.44 , 0 UNION ALL SELECT 704, CL, 703, 62.43, 0 UNION ALL SELECT 704, GC, 703, 647.9, 0 UNION ALL SELECT 705, C, 704, 635.9, 0 UNION ALL SELECT 705, C, 705, 372.5, 0 UNION ALL SELECT 705, CL, 704, 62.19, SELECT 706, CL, 705, 62.49, 0 UNION ALL SELECT 706, GC, 705, 637, 0 UNION ALL SELECT 707, C, 706, , GC, 706, 631, 0 UNION ALL SELECT 710, C, 707, 630.75, 0 UNION ALL SELECT 710, CL, 707, , 710, 372,75, 0 UNION ALL SELECT 711, CL, 710, 61,02, 0 UNION ALL SELECT 712, CL, 711 , 62.17, 0 UNION ALL SELECT 712, GC, 711, 632.4, 0 UNION ALL SELECT 713, C, 712, 371.75, 0 UNION ALL SELECT 713, CL, 712, 63.33, 0 UNION ALL SELECT 713, GC, 712, 630.9 , 0 UNION ALL SELECT 714, C, 713, 369, 0 UNION ALL SELECT 714, CL, 713, 64.09, 0 UNION ALL SELECT 714, GC, 713, 619.1, 0 UNION ALL SELECT 717, C, 714, 365.75, 0 UNIÃO ALL SELECT 717, CL, 714, 62.79, 0 UNION ALL SELECT 718, CL, 717, 63.46, 62.6237179487179 UNION ALL SELECT 718, C, 717, 373, 371.290064102564 SELECT 718, GC, 717, 625,4, 631,753205128205 UNIÃO ALL SELECT 719, C, 718, 372,75, 371,514675240385 UNION ALL SELECT 719, CL, 718, 63,72, 62,7923809423077 UNIÃO ALL SELECT 719, GC, 718, 624,3, 630.606529519231 UNION ALL SELECT 720 , 719, 377,75, 372,473979954651 UNION ALL SELECT 720, CL, 719, 62,66, 62,7720141343336 UNION ALL SELECT 720, GC, 719, 621,6, 629,220874952697 UNIÃO ALL SELECT 721, C, 720, 384, 374,247258138628 UNIÃO ALL SELECT 721, CL , 720, 62,41, 62,7163182597664 UNION ALL SELECT 724, GC, 720, 622,3, 628,156098341225 UNIÃO ALL SELECT 724, C, 721, 384, 375,747717474 UNION ALL SELECT 724, CL 721, 62,41, 62,6691911955013 UNION ALL SELECT 724, GC 721 , 622.3, 627.255137611427 UNION ALL SELECT 725, C, 724, 388, 377.632731140625 UNIÃO ALL SELECT 725, CL, 724, 61.1, 62.4277711300734 UNIÃO ALL SELECT 725, GC, 724, 626.9, 627.200499689909 UNIÃO ALL SELECT 726, C, 725, 386,75 , 379,03542295464 UNION ALL SELECT 726, CL, 725, 60,34, 62,1065675417116 UNIÃO ALL SELECT 726, GC, 725, 630,3, 627,677357812617 UNION ALL SELECT 727, C, 726, 388,5, 380,491548133069 UNIÃO ALL SELECT 727, CL, 726, 60,53, 61,8640126254193 UNIÃO ALL SELECT 728, CL, 727, 61,05, 61,7387767829985 UNIÃO ALL SELECT 728, GC, 727, 638, 630,466101510118 UNIÃO ALL SELECT 727, GC, 726, 636,9, 629,096261313146 UNIÃO ALL SELECT 728, C, 727, 390,25, 381,992885952796 Lynn Pettis (1/30/2009) Surpreendendo quantos problemas parecem ser resolvidos usando a abordagem de totais correntes às vezes. ) Sim. Isso foi reconhecido há muito tempo pelos principais vendedores de banco de dados sql na forma de OLAP, funções de janela analítica (ou seja, rownumber () sobre .. etc). E para manter seus clientes de ir para outros tipos de software. Sua principal preocupação era que as soluções fossem relativamente fáceis. (Observe que eles tiveram a visão para ver que essas funções podem confundir conceitualmente usuários. Mas isso é outro tópico para outra hora :) Considere o seguinte a partir de um documento padrão sql-99: ISO / IEC JTC1 / SC32 WG3: YGJ-068 ANSI NCITS H2 -99-154r2 Introdução às funções OLAP 5 de maio de 1999 cse. iitb. ac. in/dbms/Data/Papers-Other/SQL1999/OLAP-99-154r2.pdf Cada norma deve ser preparada para abordar novas questões que surgem como Mercado evolui. Às vezes, isso exigirá quebrar o molde. Hoje, a comunidade SQL é desafiada pelo surgimento do OLAP, com seus requisitos distintivos. Se o SQL não responder positivamente a esse desafio, o SQL se torna irrelevante para um segmento importante e crescente da indústria de bancos de dados. Infelizmente MS não compartilha o sql vista do utilitário de OLAP. Se eles fizeram eles teriam implementado tudo isso por agora :) Claro RAC foi destinado a pegar um pouco da folga:) Foram ter um desafio tentando colocar os 20 (dias de negociação) Exponential Moving Average (EMA) em nossos dados Modelo no PowerPivot. Aqui está a fórmula EMA e planilha de exemplo: stockcharts / school / doku. phpidchartschool: technicalindicators: movingaverages Colou a fórmula aqui por conveniência: SMA (média móvel simples): 10 sum sum / 10 Multiplicador: 2 / (Período de tempo 43 1)) EMA: x multiplicador 43 EMA (dia anterior). Em nosso modelo, a tabela de fatos tem estas colunas: Símbolo Data Aberto Alto Baixo Fechar Volume E na tabela de Calendário, identificamos os dias de negociação (CalendarTradingDayNumber ) Como 1 para que possamos contá-los de volta. Nós queremos que o campo EMA calculado em uma tabela dinâmica como este contexto Filtro: uma data selecionada em CalendarFullDate Contexto da Linha: FactTableSymbol Valores: FactTableClose FactTableEMA 20D gtgt Faltando Até agora temos esses campos calculados: Ema Multiplicador 2 / (Período 43 1) Média 20D CLOSE IF (Soma de CLOSEBLANK (), BLANK (), (CALCULATE (AVERAGE (FactTableCLOSE), FILTER (ALL (Calendário), CalendarTradingDayNumberltMAX (CalendarTradingDayNumber) ampamp CalendarTradingDayNumbergtMAX (CalendarTradingDayNumber) - Period)))) Mas parece que a EMA fórmula Contém uma auto-referência de valores anteriores, e também começa a partir de um SMA (Average 20D CLOSE) valor. Como podemos fazer isso Obrigado antecipadamente. Eu aprecio muito o seu apoio. Sábado, 19 de julho de 2014 21h42
Comments
Post a Comment