Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- create table reddit_9ozhkk
- (
- dt date,
- stock_id int,
- price decimal(10,4)
- );
- create unique clustered index uxc_reddit_9ozhkk_dt on reddit_9ozhkk (dt)
- ;with recursively as
- (
- -- initial data point
- SELECT 1 as i
- , CONVERT(DATE, '2008-01-01') AS dt
- , CONVERT(DECIMAL(10,4), 65.678) AS price
- UNION ALL
- SELECT i+1
- , DATEADD(DAY, 1, dt)
- , CONVERT(DECIMAL(10, 4), price + RAND(CONVERT(VARBINARY, NEWID()))*2.000-1) -- vary price by (-1,+1) each day
- FROM recursively
- WHERE dt < GETDATE() -- until today
- )
- INSERT INTO reddit_9ozhkk (dt, stock_id, price)
- SELECT dt, 2, price FROM recursively OPTION (MAXRECURSION 0)
- -- multiplier
- -- select 2.0000 / (14+1) -- = 0.133333333333333
- ;WITH SMA AS
- (
- -- calculate SMA for each row, across the entire range
- SELECT stock_id
- , dt
- , price
- , SUM(price) OVER (PARTITION BY stock_id ORDER BY dt ROWS BETWEEN 13 PRECEDING AND CURRENT ROW)/14 AS sma
- FROM reddit_9ozhkk
- WHERE stock_id = 2
- ),
- -- Recursively; first row, here from 2018-02-01, will use SMA as the EMA
- -- then, recursively, each row from a subsequent date will calculate the EMA using the formula
- -- Multiplier is 2.0000 / (14+1) -- = 0.133333333333333
- -- If SMA value is removed from the SELECT statement, it will run much faster as the database will
- -- only need to calculate one value for the rather expensive window SUM
- EMA AS
- (
- SELECT dt, price, sma, CONVERT(DECIMAL(10, 4), sma) AS ema
- FROM sma
- WHERE dt = '2018-02-01'
- UNION ALL
- SELECT curr.dt, curr.price, curr.sma, convert(decimal(10,4), calc.ema) as EMA
- FROM ema previous
- INNER
- JOIN sma curr
- -- This join will only work if there are no gaps inbetween data points
- -- Otherwise, add a ROW_NUMBER() OVER (PARTITION BY stock_id ORDER BY dt) AS rn
- -- and join on that
- ON curr.dt = dateadd(day, 1, previous.dt)
- CROSS
- APPLY (SELECT 0.133333333333333 * (curr.price - previous.ema) + previous.ema as ema) calc
- )
- SELECT * FROM EMA OPTION (MAXRECURSION 0)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement