Advertisement
Guest User

Untitled

a guest
Oct 17th, 2018
83
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
T-SQL 2.12 KB | None | 0 0
  1. create table reddit_9ozhkk
  2. (
  3.     dt date,
  4.     stock_id int,
  5.     price decimal(10,4)
  6. );
  7.  
  8. create unique clustered index uxc_reddit_9ozhkk_dt on reddit_9ozhkk (dt)
  9.  
  10. ;with recursively as
  11. (
  12.     -- initial data point
  13.     SELECT 1 as i
  14.          , CONVERT(DATE, '2008-01-01') AS dt
  15.          , CONVERT(DECIMAL(10,4), 65.678) AS price
  16.     UNION ALL
  17.  
  18.    SELECT i+1
  19.         , DATEADD(DAY, 1, dt)
  20.         , CONVERT(DECIMAL(10, 4), price + RAND(CONVERT(VARBINARY, NEWID()))*2.000-1) -- vary price by (-1,+1) each day
  21.      FROM recursively
  22.     WHERE dt < GETDATE() -- until today
  23. )
  24. INSERT INTO reddit_9ozhkk (dt, stock_id, price)
  25. SELECT dt, 2, price FROM recursively OPTION (MAXRECURSION 0)
  26.  
  27. -- multiplier
  28. -- select 2.0000 / (14+1) -- = 0.133333333333333
  29.  
  30. ;WITH SMA AS
  31. (
  32.     -- calculate SMA for each row, across the entire range
  33.     SELECT stock_id
  34.          , dt
  35.          , price
  36.          , SUM(price) OVER (PARTITION BY stock_id ORDER BY dt ROWS BETWEEN 13 PRECEDING AND CURRENT ROW)/14 AS sma
  37.       FROM reddit_9ozhkk
  38.      WHERE stock_id = 2
  39. ),
  40. -- Recursively; first row, here from 2018-02-01, will use SMA as the EMA
  41. -- then, recursively, each row from a subsequent date will calculate the EMA using the formula
  42. -- Multiplier is 2.0000 / (14+1) -- = 0.133333333333333
  43. -- If SMA value is removed from the SELECT statement, it will run much faster as the database will
  44. -- only need to calculate one value for the rather expensive window SUM
  45. EMA AS
  46. (
  47.     SELECT dt, price, sma, CONVERT(DECIMAL(10, 4), sma) AS ema
  48.       FROM sma
  49.      WHERE dt = '2018-02-01'
  50.  
  51.      UNION ALL
  52.  
  53.      SELECT curr.dt, curr.price, curr.sma, convert(decimal(10,4), calc.ema) as EMA
  54.        FROM ema previous
  55.       INNER
  56.        JOIN sma curr
  57.          -- This join will only work if there are no gaps inbetween data points
  58.          -- Otherwise, add a ROW_NUMBER() OVER (PARTITION BY stock_id ORDER BY dt) AS rn
  59.          -- and join on that
  60.          ON curr.dt = dateadd(day, 1, previous.dt)
  61.       CROSS
  62.       APPLY (SELECT 0.133333333333333 * (curr.price - previous.ema) + previous.ema as ema) calc
  63. )
  64. SELECT * FROM EMA OPTION (MAXRECURSION 0)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement