|
|
楼主

楼主 |
发表于 2008-4-1 14:09:33
|
只看该作者
有请各位宏高手赐教
具体情况
1、有3个数据集:tradedata,index,evpara。
(1)交易数据集tradedata,里面有zqdm、date、ret(收益率),
zqdm date ret
600000 20040104 1.2
600000 20040105 1.5
.....
600001 20040104 1.1
600001 20040105 1.3
...
(2)指数数据集index,里面有date,indexret(指数收益率)
date indexret
20040104 0.9
20040105 1.1
...
(3)事件数据集evpara,里面有eventzqdm、eventdate
eventzqdm eventdate
600000 20060430
600001 20060825
...
2、要从evpara中循环读取eventzqdm,eventdate做事件研究,
对于evpara.zqdm=tradedata.zqdm and evpara.eventdate=tradedata.date的则进行一次运算CARs:
我自己编了个宏程序,如下,但不行,不知问题在哪里?
%macro build;/*isolate subset of data for a given company, calc Beta on releveant range;
calc CAR on event window; append event period data to Results dataset*/
data t3 t4;
set tradedata;
if zqdm=&eventzqdm and date>&eventdate then output t4;
else if zqdm=&eventzqdm then output t3;
run;
proc sort data=t3;
by descending date;
run;
data betafirm;
set t3;
if 21=<_n_<=60;
run;
data i3 i4;
set index;
if date>&eventdate then output i4;
else output i3;
run;
proc sort data=i3;
by descending date;
run;
data beta_mkt;
set i3;
if 21<=_n_<=60;
run;
data betaboth;
merge betafirm beta_mkt;
run;
proc sort data=betaboth;
by date;
run;
proc reg noprint data=betaboth outest=Coefout;
model ret=indexret;
quit;
data _null_;
set coefout;
call symput('nextalpha',intercept);
call symput('nextbeta',indexret);
run;
data t1 t2;
set tradedata;
if zqdm=&eventzqdm and date>&eventdate then output t2;
else if zqdm=&eventzqdm then output t1;
run;
proc sort data=t1;
by descending date;
run;
data t1;
set t1;
if _n_<=10;
run;
data t2;
set t2;
if _n_<=20;
run;
data eventfirm;
set t1 t2;
run;
proc sort data=eventfirm;
by date;
run;
data i1 i2;
set index;
if date>&eventdate then output i2;
else output i1;
run;
proc sort data=i1;
by descending date;
run;
data i1;
set i1;
if _n_<=10;
run;
data i2;
set i2;
if _n_<=20;
run;
data event_mkt;
set i1 i2;
run;
proc sort data=event_mkt;
by date;
run;
data Car_calc;
merge eventfirm event_mkt;
by date;
if _N_=1 then Car=ret-(&nextalpha + &nextbeta*indexret);
else car =ret-(&nextalpha + &nextbeta*indexret)+holdcar;
holdcar=car;
retain holdcar;
alpha=&nextalpha;
beta=&nextbeta;
run;
proc append base= Cars data=Car_calc(drop=holdcar);
%mend build;
%let dsid=%sysfunc(open(evpara));
%let nobs=%sysfunc(attrn(&dsid,nobs));
%let dsid=%sysfunc(close(&dsid));
data tt;
do n=1 to &nobs;
set evpara point=n;
call symput ('eventzqdm',zqdm);
call symput('eventdate',ltdate);
%build;
end;
stop;
run; |
|