使用SQL LAG函数计算股票收益

时间:2018-02-10 21:33:42

标签: sql lag

我有一张股票价格表,我试图计算每日回报:

Ticker       Date        price
ABC         01/01/13    100.00
ABC         01/02/13    101.50
ABC         01/03/13     99.80
ABC         01/04/13     95.50
ABC         01/05/13     78.00
XYZ         01/01/13     11.50
XYZ         01/02/13     12.10
XYZ         01/03/13     13.15
XYZ         01/04/13     14.10
XYZ         01/05/13     15.55

我有一个使用Lag函数计算回报的公式,但我不知道在处理新的股票代码时如何将值重新设置为NULL。

使用ABC的价格从2013年5月1日开始计算XYZ的回归01/01/03。 XYZ的01/01/03返回应为NULL。

Ticker       Date        price    RETURN
ABC         01/01/13    100.00    NULL
ABC         01/02/13    101.50    1.50
ABC         01/03/13     99.80   -1.67
ABC         01/04/13     95.50   -4.31
ABC         01/05/13     78.00  -18.32
XYZ         01/01/13     11.50  -85.26
XYZ         01/02/13     12.10    5.22
XYZ         01/03/13     13.15    8.68
XYZ         01/04/13     14.10    7.22
XYZ         01/05/13     15.55   10.28

这是我的剧本:

SELECT Ticker,Date, price,((price / lag(price, 1) OVER (ORDER BY Ticker, [Date])) - 1)* 100 AS 'RETURN'
FROM [dbo].[Temp]
Order by Ticker, Date

我是否需要创建一个循环来计算正确的回报?

2 个答案:

答案 0 :(得分:1)

您想要partition by

SELECT Ticker, Date, price,
       ((price / lag(price, 1) OVER (PARTITION BY Ticker ORDER BY [Date])) - 1)* 100 AS daily_return
FROM [dbo].[Temp]
Order by Ticker, Date;

答案 1 :(得分:0)

您可以在日期使用if语句,如果日期不在合法范围内,则返回null,否则返回您的公式。

(IF date_field<lower_date,null,...............what ever......)