使用SAS计算一段时间的回报

时间:2016-01-31 21:36:10

标签: sas

我的数据是一组列,如下所示:

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为我做这个?谢谢你的帮助!

1 个答案:

答案 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的累积回报crtnRETAIN告诉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;