data wkn;
input date $ return1 return2 return3 return4;
cards;
0101 12.3 14.5 2.7 9.3
0102 -1.6 4.8 20.3 3.4
0103 6.2 0.8 7.5 10.6
;
run;
data wkn1;
set wkn;
array a(*) return1-return4;
do i=dim(a)-1 to 1 by -1;
do j=1 to i;
if a(j)>a(j+1) then do;
kk=a(j+1);
a(j+1)=a(j);
a(j)=kk;
end;
end;end;
drop kk i j;
run;
* Reshape data wide to long;
proc transpose data=have out=have1 (rename=(col1=ret _name_=fund) drop=_label_);
by date;
run;
* Assign stocks to quintile portoflios (by date);
proc rank data=have1 out=have2 group=5;
by date;
var ret;
ranks rk;
run;
data have2; set have2;
by date;
rk=rk+1;
* Assign base-date rankings to all dates;
proc sort data=have2 out=have3; by fund date; run;
data have3; set have3;
if date^=101 then rk=.; run;
data have3 (drop=rk);
retain fund date rank ret;
set have3;
by fund;
retain rank;
if first.fund then rank=rk;
run;
* Calculate average portfolio returns;
proc sql;
create table rets_port as
select date, rank, mean(ret) as ret format 7.3
from have3
group by date, rank;
quit;