我正在使用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函数,但不知道如何将相同的函数应用于所有列。
答案 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;
我还考虑改变你的数据结构;如果你有一个垂直结构,这种事情更容易计算,即每个日期每个合约一行而不是每个日期一行。