5

OVER()SQL Server 2012 のウィンドウ関数と句を使用して単純移動平均を簡単に計算できることを知っています。しかし、このアプローチを使用して指数移動平均を計算するにはどうすればよいでしょうか? ありがとう!

4

1 に答える 1

10

の式EMA(x)は次のとおりです。

EMA(x 1 ) = x 1 
EMA(x n ) = α * x n + (1 - α) * EMA(x n-1 )

β := 1 - α
それはと同等です

EMA(x n ) = β n-1 * x 1 + α * β n-2 * x 2 + α * β n-3 * x 3 + ... + α * x n

その形式では、 で簡単に実装できLAGます。4 行の EMA の場合、次のようになります。

SELECT LAG(x,3)OVER(ORDER BY ?) * POWER(@beta,3) + 
       LAG(x,2)OVER(ORDER BY ?) * POWER(@beta,2) * @alpha + 
       LAG(x,1)OVER(ORDER BY ?) * POWER(@beta,1) * @alpha + 
       x * @alpha
FROM ...

OK、EWMA_Chart の後にいるように見えるので、そこに到達する方法を示すSQL Fiddleを作成しました。ただし、返される行ごとに 1 回の再帰を必要とする再帰 CTE を使用していることに注意してください。そのため、大きなデータセットでは、悲惨なパフォーマンスが発生する可能性が高くなります。各行は以前に発生したすべての行に依存するため、再帰が必要です。前のすべての行を取得できますが、それ自体を参照できないためLAG()、前の計算も参照LAG()できません。

また、あなたが下に添付したスプレッドシートのフォーミュラーは意味がありません。EWMA_Chart 値を計算しようとしているようですが、失敗しています。上記の SQLFiddle には、スプレッドシートが計算しているのと同じ値を計算する [Wrong] 列が含まれています。

いずれにせよ、これを大きなデータセットで使用する必要がある場合は、おそらくカーソルを作成する方がよいでしょう。

これは、上記の SQLFiddle で計算を行うコードです。vSMA10 行の移動平均を計算するビューを参照します。

WITH

smooth AS(
  SELECT CAST(0.1818 AS NUMERIC(20,5)) AS alpha
),

numbered AS(
  SELECT Date, Price, SMA, ROW_NUMBER()OVER(ORDER BY Date) Rn
  FROM vSMA
  WHERE SMA IS NOT NULL
),

EWMA AS(
  SELECT Date, Price, SMA, CAST(SMA AS NUMERIC(20,5)) AS EWMA, Rn
  , CAST(SMA AS NUMERIC(20,5)) AS Wrong
  FROM numbered
  WHERE Rn = 1
  UNION ALL
  SELECT numbered.Date, numbered.Price, numbered.SMA, 
    CAST(EWMA.EWMA * smooth.alpha + CAST(numbered.SMA AS NUMERIC(20,5)) * (1 - smooth.alpha) AS NUMERIC(20,5)), 
    numbered.Rn
    , CAST((numbered.Price - EWMA.EWMA) * smooth.alpha + EWMA.EWMA AS NUMERIC(20,5))
  FROM EWMA
  JOIN numbered
  ON EWMA.rn + 1 = numbered.rn
  CROSS JOIN smooth
)
SELECT Date, Price, SMA, EWMA
, Wrong
FROM EWMA

ORDER BY Date;
于 2013-04-14T03:59:46.703 に答える