【问题标题】:Calculate a return for a period of time using SAS使用 SAS 计算一段时间内的回报
【发布时间】:2016-01-31 21:36:09
【问题描述】:

我的数据是一组列如下:

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 ((price + div)/lag price)) 的列即可计算 5 月份的回报。然后我添加一列一加 rtn,它将今天的每日 rtn 乘以前一行一加值。当然,对于周期的第一天,1加rtn值=每日rtn。

在 excel 中,我计算出 0.925781 作为 5 月 30 日的一加 rtn,而 -0.07422 作为该月的 rtn。我怎样才能让 SAS 为我做这件事?感谢您的帮助!

【问题讨论】:

    标签: sas


    【解决方案1】:

    试试这个:

    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。

    编辑:在 cmets 中询问有关每年重置累积回报的问题。这假设变量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;
    

    【讨论】:

    • 谢谢,我相信我们在正确的轨道上,但我的数字在第一行之后不匹配。在 excel 中,5 月 2 日的 rtn 是 0.015625(这与我的 sas 输出一致)。但随后 5 月 5 日在 excel 中的 rtn 为 0.011719(sas 显示 -0.3846)。到月底我的 excel 计算结果是 -0.07422。
    • 我的Excel计算日期每天RTN 1 + RTN SUBT 1 19970429 19970502 1.015625 1.015625 0.015625 19970505 0.996153846 1.01171875 0.01171875 19970506 0.853281853 0.86328125 -0.13671875 19970507 0.859728507 0.7421875 -0.2578125 ... 19970529 1.004132231 0.94921875 -0.05078125 19970530 0.975308642 0.92578125 - 根据 excel,1997 年 5 月的 0.07421875 回报 = -0.0742
    • 啊!我相信我的起点应该是“crtn 0”而不是“crtn 1”。现在它看起来是正确的。非常感谢!
    • 现在这段代码可以计算累积 rtns,我怎样才能让它在一个周期结束时停止并重新启动?可以放入宏并按年运行吗?如果我可以在这个数据集中插入一个年份变量,那就是。我不确定如何编写宏。
    • 向数据集中添加年份变量并使用 BY 组。在 BY 组的第一条记录处,重置 crtn 的值。如果有帮助,请为答案投票。
    猜你喜欢
    • 2011-05-27
    • 2021-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多