I hesitate to use LAG... I would try something like this:
data aaa;
input ticker $ date mmddyy10. price;
format date mmddyy10.;
cards;
ABC 1/1/2002 10
ABC 1/2/2002 11
ABC 1/5/2002 12
ABC 1/6/2002 13
ABC 1/7/2002 14
DEF 1/1/2002 9
DEF 1/2/2002 11
DEF 1/5/2002 13
DEF 1/6/2002 15
DEF 1/7/2002 18
;
run;
proc sort; by ticker date; run;
* assign n=1,3,5 etc, n=1 means return between that date and 1 business day prior * ;
%let nday = 1;
data aaa1;
set aaa;
by ticker date;
if first.ticker then n = 1;
else n+1;
seq = mod(n,&nday);
run;
proc sort; by ticker seq date; run;
data bbb;
set aaa1;
by ticker seq date;
retain temp;
if first.seq then do; temp = price; return = .; end;
else do;
return = price/temp - 1;
temp = price;
end;
drop temp seq n;
run;
proc sort; by ticker date; run;
有点啰嗦,见谅哈!