我的数据是一组列,如下所示:
gvkey date div price
1166 19970429 0 25.6
1166 19970502 0 26
1166 19970505 0 25.9
1166 19970506 0 22.1
1166 19970507 0 19
1166 19970509 0 20.4
1166 19970512 0 21.4
1166 19970513 0 21.7
1166 19970514 0 21.7
1166 19970515 0 21.1
1166 19970516 0 21.5
1166 19970520 0 21
1166 19970521 0 21.8
1166 19970522 0 22.2
1166 19970523 0 22.7
1166 19970526 0 23.9
1166 19970527 0 24
1166 19970528 0 24.2
1166 19970529 0 24.3
1166 19970530 0 23.7
在excel中,我能够通过添加计算每日rtn((价格+ div)/滞后价格)的列来计算5月份的回报。然后我添加一个加上rtn的列,它将今天的每日rtn乘以前一行加一个值。当然,对于期间的第一天,一加rtn值=每日rtn。
在excel中,我计算了0.925781作为5月30日的一加rtn和作为该月的rtn的-0.07422。我如何让SAS为我做这个?谢谢你的帮助!
答案 0 :(得分:0)
试试这个:
data want;
set have;
format rtn crtn percent12.4;
retain crtn 1;
rtn = (price + div)/lag(price) - 1;
crtn = (1 + crtn) * (1 + sum(rtn,0)) - 1;
run;
这会按照您的描述计算返回rtn
。
我们创建一个起始值为1的累积回报crtn
。RETAIN
告诉SAS在行之间保留此变量的值。然后我们在每一行都更新它。
sum(rtn,0)
= rtn + 0
。在第一行,RTN将为null,但SUM()
函数将忽略该null并返回0.
编辑:在评论中询问每年的累计回复重置情况。假设变量fyear
在数据集上,并且数据继续按正确的顺序排序。
data want;
set have;
by fyear;
format rtn crtn percent12.4;
retain crtn 1;
if first.fyear then do; /*Check for the start of a new BY group*/
crtn = 1;
end;
rtn = (price + div)/lag(price) - 1;
crtn = (1 + crtn) * (1 + sum(rtn,0)) - 1;
run;