SAS - 如何计算价格数据的回报?

时间:2013-06-10 10:00:16

标签: sas

我正在使用SAS。我有一个名为EOD_close_rtn的数据集,如下所示:

date        CF888   A9888   AG888   AL888   AU888   C9888   CU888   ER888   IF888   J9888
4-Jun-13    20220   4828    4621    14855   281.11  2434    53060   2628    2561.4  1489
5-Jun-13    20210   4827    4620    14850   281.1   2435    53080   2627    2561.6  1489
6-Jun-13    20215   4829    4621    14860   281.14  2435    53080   2627    2561.4  1491

第一列是日期,其余列是与顶部合约名称对应的价格。我想计算每个合约的每日回报,输出应采用相同的格式。我尝试使用LAG函数,但不知道如何将相同的函数应用于所有列。

1 个答案:

答案 0 :(得分:1)

如果您只想要滚动差异,那么您可以使用滞后和数组来完成。适用LAG的标准警告; LAG确实检索以前的记录,而是每次调用时创建一个队列并添加/弹出,所以不要在条件语句(如IF)中使用它,除非你知道你在做什么

data have;
input date :date9. CF888   A9888   AG888   AL888   AU888   C9888   CU888   ER888   IF888   J9888;
format date date9.;
datalines;
04Jun2013    20220   4828    4621    14855   281.11  2434    53060   2628    2561.4  1489
05Jun2013    20210   4827    4620    14850   281.1   2435    53080   2627    2561.6  1489
06Jun2013    20215   4829    4621    14860   281.14  2435    53080   2627    2561.4  1491
;;;;
run;

data want;
set have;
array contracts cf888--j9888;
do _t = 1 to dim(contracts);
  contracts[_t] = contracts[_t] - lag(contracts[_t]);
end;
run;

我还考虑改变你的数据结构;如果你有一个垂直结构,这种事情更容易计算,即每个日期每个合约一行而不是每个日期一行。