0

我正在使用 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 函数,但不知道如何将相同的函数应用于所有列。

4

1 回答 1

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;

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

于 2013-06-10T13:46:48.420 回答