chenys625 发表于 2012-9-5 22:41 
能不能把你要的结果完整说一下? 感觉你的方法麻烦了
恩恩,我把完整程序贴出来,帮我看看吧。。。还有好多问题都没想通。。

PROC IMPORT OUT= WORK.short2
DATAFILE= "E:\SAS 9.1.3Data\080401.xls"/*数据表里是96支股票,四年的日收益率数据,列变 量是X1-X96,96支股票*/
DBMS=EXCEL REPLACE;
sheet="CR";
GETNAMES=YES;
MIXED=YES;
SCANTEXT=YES;
USEDATE=YES;
SCANTIME=YES;
run;
/*%global p=1,q=1;*/
%macro returnc();
%do t=1 %to 96;
%let t1=%eval(&t+1);
/*选取的观测值随t滚动——形成期(t,t+P-1)持有期(t+p,t+p+q-1),t++*/
proc sql;
create table pq&t as
select * from short2(firstobs=&t obs=&t1);/*调用不出来。??!!!!*/
/* select * from short2(firstobs=1 obs=2);*/
quit;
run;
/*转置*/
proc transpose data=pq&t out=pqtr&t name=var prefix=d;
run;
/*排序期,持有期求和 */
%macro read();
%do i= 1 %to 96;
proc sql;
create table pq12&t as
select sum(d1,0)as d1,sum(d2,0)as d2 from pqtr&t where(&i);/*sum随PQ变,手工操作~*/
quit;
run;
%end;
%mend read;
%read;
/*形成期升序排序*/
proc sort data=pq12&t;
by d1;
run;
/*创建赢者组合和输者组合 */
proc sql ;/* 存储looser和winner看是否可行(原先用的是into:loser做成宏)*/
select avg(d2) into: loser from pq12&t(firstobs=1 obs=10) ;
select avg(d2) into: winner from pq12&t(firstobs=87 obs=96);
%put &loser&t &winner;
quit;
data score ;
array ACR(96) acr1-acr96 ;/*可以设一个数组记录每一期的return */
acr(&t)=&winner-&looser;/
*????总是覆盖 */
run;
%end;
%mend returnc;
%returnc;
红色这部分程序我不会改,想要每次t循环的数据结果都存里面,但是每次之前的都会冲掉。。。