%macro transform(method='lumped');
data &libref..ASXreturn;
set &libref..ASXINDEX;
LastValue = lag(IndexValue);
IndexReturn = log(IndexValue/LastValue);
if _n_ in (1) then delete;
keep DATE IndexReturn;
if '01JUL1991'd<=DATE<= '08NOV2005'd;
run;
proc surveyselect data=&libref..asxreturn rep=243 n=3644
out=IndexReturn;
proc surveyselect data=&libref..firmdata(keep=firmcode EDATE) rep=3644 n=243
out=dupfirmdata;
proc sort data=dupfirmdata;
by firmcode edate;
data repeat;
merge IndexReturn(keep=DATE IndexReturn) dupfirmdata(keep=firmcode EDATE);
run;
proc sql;
create table prepared1 as
select c.*,
f.EDATE
from &libref..combine as c
left outer join
&libref..firmdata as f
on c.firmcode = f.firmcode
where c.firmcode = f.firmcode and volume~=0
order by FIRMCODE,DATE;
quit;
data prepared2;
merge &libref..combine (in = c drop=firmid)
&libref..firmdata (in = f drop=firmid EDATE);
by FIRMCODE;
if c and f;
if volume=0 then delete;
lagCODE = lag(FIRMCODE);
lagclprice = lag(LastTrade);
if FIRMCODE = lagCODE then do;
stockreturn = log(LastTrade/lagclprice);
end;
else do;
stockreturn = .;
end;
if stockreturn = . then delete;
drop lagcode lagclprice;
run;
proc sql;
create table prepared as
select p1.*,
p2.stockreturn
from prepared1 as p1
left outer join
prepared2 as p2
on p1.FIRMCODE = p2.FIRMCODE and p1.DATE = p2.DATE;
proc sort data= prepared;
by FIRMCODE EDATE;
run;
proc sql;
create table output as
select *
from repeat as r
left outer join
prepared as p
on r.date = p.date and r.edate=p.edate and r.firmcode=p.firmcode;
data output;
set output;
if DATE < EDATE then evndum = 1;
else evndum = 0;
proc sort data=output;
by firmcode edate;
run;
data ready;
set prepared(keep=date firmcode edate);
by firmcode;
if last.firmcode then lobs=1;
if first.firmcode then fobs=1;
if fobs=1 then obs=1;
if lobs=1 then obs=2;
DATE2=DATE;format DATE2 yymmddn8.;
if fobs=1 or lobs=1 then output ready;
drop lobs fobs;
run;
proc sql;
create table output2 as
select *
from output
left join
ready
on output.date=ready.date and output.firmcode=ready.firmcode;
proc sort data=output2;
by firmcode edate;
run;
data output3;
set output2;
if date=date2 and obs=1 then do;
retain x;
if ~missing(obs) then x=obs;
else x=x;
end;
if obs=2 and x=1 then x=2;
data output4;
set output3;
where x=1 or (obs=2 and x=2);
if (~missing(volume) and missing(StockReturn)) then delete;
drop x obs date2;
run;
%if &method = 'lumped' %then %do;
data &libref..output;
set output4;
if Volume = . then Volume = 0;
if StockReturn = . then StockReturn = 0;
run;
%end;
%mend;
谢谢你了456852 ,请问能不能帮我顺便看一下新post的问题,关于count missing value的。 谢谢了
其实有的地方还是有问题 。。不过暂时也只能样了。。明天还有report要交。。汗。。。
code看上去很乱。。因为要几个file是同时整合的。。
[此贴子已经被作者于2009-1-19 14:29:55编辑过]