/* libname research 'L:\faculty\PHDShared\green\research\papers'; *set up 10 years 1000 firms; *this file just starts with 10000 observations with one variable numbered 1 to 10000; data firmyr; set research.id10000; do j=1 to 1000; if (j-1)*10lag(fc)*3 then do; fc=lag(eavgsaled)/3; end; else do; fc=lag(fc); end; end; if saledg>3*fc then saleg=3*fc; else saleg=saledg; if saledb>3*fc then saleb=3*fc; else saleb=saledb; end; drop i; run; *get average total cost for similar expected sales demand to create variable costs percentage; proc sql; create table avgcostsf as select *,firm,sum(fc)/sum(eavgsaled) as avgpctcosts,avg(eavgsaled) as avgsaled from firmyr4 group by firm; quit; data fcm; set avgcostsf; where id<=5000; mavgsaled=avgsaled; keep avgpctcosts mavgsaled mergedum; mergedum=1; run; data vcm; set avgcostsf; where id>5000; drop avgpctcosts; mergedum=1; run; proc sql; create table m as select * from fcm a,vcm b where a.mergedum=b.mergedum; quit; data m; set m; avgsaleddif=abs(avgsaled-mavgsaled); run; proc sort data=m; by firm year avgsaleddif; run; proc sort data=m nodupkey; by firm year; run; data m; set m; vcp=avgpctcosts; run; data vc; set m; saleg=saledg; saleb=saledb; drop avgpctcosts avgsaleddif mavgsaled mergedum; run; data fc; set firmyr4; where id<=5000; vcp=0; run; data firmyr5; set vc fc; drop avgsaled; run; data firmyr5; set firmyr5; nig=saleg-saleg*vcp-fc; nib=saleb-saleb*vcp-fc; run; *now present value the net income; data firmyr5; set firmyr5; pvnig=nig/(1+.05)**year; pvnib=nib/(1+.05)**year; run; proc sort data=firmyr5; by firm descending year; run; data firmyr5; set firmyr5; lagpvnig=lag(pvnig); lag2pvnig=lag2(pvnig); lag3pvnig=lag3(pvnig); lag4pvnig=lag4(pvnig); lag5pvnig=lag5(pvnig); lag6pvnig=lag6(pvnig); lag7pvnig=lag7(pvnig); lag8pvnig=lag8(pvnig); lag9pvnig=lag9(pvnig); lagpvnib=lag(pvnib); lag2pvnib=lag2(pvnib); lag3pvnib=lag3(pvnib); lag4pvnib=lag4(pvnib); lag5pvnib=lag5(pvnib); lag6pvnib=lag6(pvnib); lag7pvnib=lag7(pvnib); lag8pvnib=lag8(pvnib); lag9pvnib=lag9(pvnib); run; *get price; proc sort data=firmyr5; by firm descending year; run; libname research 'L:\faculty\PHDShared\green\research\papers'; data research.firmyr5; set firmyr5; run; data firmyr6; set firmyr5; retain priceyrende; if year=10 then priceyrende=0; if year=9 then priceyrende=(pprg*lagpvnig + (1-pprg)*lagpvnib); if year=8 then priceyrende=(pprg*(lagpvnig+lag2pvnig) + (1-pprg)*(lagpvnib+lag2pvnib)); if year=7 then priceyrende=(pprg*(lagpvnig+lag2pvnig+lag3pvnig) + (1-pprg)*(lagpvnib+lag2pvnib+lag3pvnib)); if year=6 then priceyrende=(pprg*(lagpvnig+lag2pvnig+lag3pvnig+lag4pvnig) + (1-pprg)*(lagpvnib+lag2pvnib+lag3pvnib+lag4pvnib)); if year=5 then priceyrende=(pprg*(lagpvnig+lag2pvnig+lag3pvnig+lag4pvnig+lag5pvnig) + (1-pprg)*(lagpvnib+lag2pvnib+lag3pvnib+lag4pvnib+lag5pvnib)); if year=4 then priceyrende=(pprg*(lagpvnig+lag2pvnig+lag3pvnig+lag4pvnig+lag5pvnig+lag6pvnig) + (1-pprg)*(lagpvnib+lag2pvnib+lag3pvnib+lag4pvnib+lag5pvnib+lag6pvnib)); if year=3 then priceyrende=(pprg*(lagpvnig+lag2pvnig+lag3pvnig+lag4pvnig+lag5pvnig+lag6pvnig+lag7pvnig) + (1-pprg)*(lagpvnib+lag2pvnib+lag3pvnib+lag4pvnib+lag5pvnib+lag6pvnib+lag7pvnib)); if year=2 then priceyrende=(pprg*(lagpvnig+lag2pvnig+lag3pvnig+lag4pvnig+lag5pvnig+lag6pvnig+lag7pvnig+lag8pvnig) + (1-pprg)*(lagpvnib+lag2pvnib+lag3pvnib+lag4pvnib+lag5pvnib+lag6pvnib+lag7pvnib+lag8pvnib)); if year=1 then priceyrende=(pprg*(lagpvnig+lag2pvnig+lag3pvnig+lag4pvnig+lag5pvnig+lag6pvnig+lag7pvnig+lag8pvnig+lag9pvnig)+ (1-pprg)*(lagpvnib+lag2pvnib+lag3pvnib+lag4pvnib+lag5pvnib+lag6pvnib+lag7pvnib+lag8pvnib+lag9pvnib)); retain priceyrendg; if year=10 then priceyrendg=0; if year=9 then priceyrendg=(lagpvnig); if year=8 then priceyrendg=((lagpvnig+lag2pvnig)); if year=7 then priceyrendg=((lagpvnig+lag2pvnig+lag3pvnig)); if year=6 then priceyrendg=((lagpvnig+lag2pvnig+lag3pvnig+lag4pvnig)); if year=5 then priceyrendg=((lagpvnig+lag2pvnig+lag3pvnig+lag4pvnig+lag5pvnig)); if year=4 then priceyrendg=((lagpvnig+lag2pvnig+lag3pvnig+lag4pvnig+lag5pvnig+lag6pvnig)); if year=3 then priceyrendg=((lagpvnig+lag2pvnig+lag3pvnig+lag4pvnig+lag5pvnig+lag6pvnig+lag7pvnig)); if year=2 then priceyrendg=((lagpvnig+lag2pvnig+lag3pvnig+lag4pvnig+lag5pvnig+lag6pvnig+lag7pvnig+lag8pvnig)); if year=1 then priceyrendg=((lagpvnig+lag2pvnig+lag3pvnig+lag4pvnig+lag5pvnig+lag6pvnig+lag7pvnig+lag8pvnig+lag9pvnig)); retain priceyrendb; if year=10 then priceyrendb=0; if year=9 then priceyrendb=(lagpvnib); if year=8 then priceyrendb=((lagpvnib+lag2pvnib)); if year=7 then priceyrendb=((lagpvnib+lag2pvnib+lag3pvnib)); if year=6 then priceyrendb=((lagpvnib+lag2pvnib+lag3pvnib+lag4pvnib)); if year=5 then priceyrendb=((lagpvnib+lag2pvnib+lag3pvnib+lag4pvnib+lag5pvnib)); if year=4 then priceyrendb=((lagpvnib+lag2pvnib+lag3pvnib+lag4pvnib+lag5pvnib+lag6pvnib)); if year=3 then priceyrendb=((lagpvnib+lag2pvnib+lag3pvnib+lag4pvnib+lag5pvnib+lag6pvnib+lag7pvnib)); if year=2 then priceyrendb=((lagpvnib+lag2pvnib+lag3pvnib+lag4pvnib+lag5pvnib+lag6pvnib+lag7pvnib+lag8pvnib)); if year=1 then priceyrendb=((lagpvnib+lag2pvnib+lag3pvnib+lag4pvnib+lag5pvnib+lag6pvnib+lag7pvnib+lag8pvnib+lag9pvnib)); run; proc sort data=firmyr6; by firm year; run; data firmyr6; set firmyr6; *perfect information returns; retg=(priceyrendg-lag(priceyrendg))/lag(priceyrendg); retb=(priceyrendb-lag(priceyrendb))/lag(priceyrendb); *no information returns; rete=(priceyrende-lag(priceyrende))/lag(priceyrende); *scaled earnings; snib=nib/lag(priceyrende); snig=nig/lag(priceyrende); run; *get "random" good and bad news groups so I have both; data goodn; set firmyr6; where ((1<=firm<=250) or (501<=firm<=750)); news='goodstate'; *learn future truth "each period" reduces to essential one period because I am reseting beliefs each period; ret=(priceyrendg-lag(priceyrende))/lag(priceyrende); sni=snig; run; data badn; set firmyr6; where ((251<=firm<=500) or (751<=firm<=1000)); news='badstate'; ret=(priceyrendb-lag(priceyrende))/lag(priceyrende); sni=snib; run; data sim; set goodn badn; run; libname research 'L:\faculty\PHDShared\green\research\papers'; data research.sim; set sim; run; */ libname research 'L:\faculty\PHDShared\green\research\papers'; data sim; set research.sim; run; proc sort data=sim; by firm year; run; data sim; set sim; suni=sni-(pprg*snig+(1-pprg)*snib)/lag(priceyrende); run; ********************************************************************** **********************************************************************; *now I have some dials I can turn: no information ret,full information returns, returns with news during period,good news, bad news, unexpected earnings for good and bad news fc (which imbeds lag for capacity constraints); *note I may also have to limit negative sales and put a constraint on the returns; data sim; set sim; if ret<0 then nret=1; else nret=0; if rete<0 then nrete=1; else nrete=0; if retg<0 then nretg=1; else nretg=0; if retb<0 then nretb=1; else nretb=0; if sni<0 then nsni=1; else nsni=0; if year=1 or year=10 then delete; if id<=5000 then fcd=1; else fcd=0; run; proc means data=sim min p1 p25 median p75 p99 max; var ret rete retb retg sni suni; run;*version 2 almost all returns are negative because the change in the pv is big for any given ni realized, I could add more years... so could the second half of basu stuff just be that these firms are not expected to survive?; proc surveyreg data=sim; *where fcd=0; class year; model sni=ret nret nret*ret year/solution; run;*so here is the later basu stuff, look at it; proc surveyreg data=sim; class year; model suni=ret nret nret*ret year/solution; run; proc surveyreg data=sim; *where sni<0; class year; model sni=ret nret nret*ret fcd fcd*ret fcd*nret fcd*nret*ret year/solution; run; proc surveyreg data=sim; class year; model ret= suni year/solution; run; proc surveyreg data=sim; class year; model ret= sni year/solution; run; proc surveyreg data=sim; class year; model ret= sni suni year/solution; run; proc surveyreg data=sim; class year; model sni=ret nret nret*ret suni year/solution; run;*basu correction?; proc surveyreg data=sim; class year; model ret= sni nsni sni*nsni year/solution; run; *hayn stuff?; proc surveyreg data=sim; class year; model ret= sni nsni sni*nsni suni year/solution; run; *change information; proc surveyreg data=sim; class year; model rete= sni suni year/solution; run; proc surveyreg data=sim; class year; model retg= sni suni year/solution; run;*why does suni load when ret is perfect information?; proc surveyreg data=sim; class year; model retb= sni suni year/solution; run; proc surveyreg data=sim; class year; model retg= sni suni fcd sni*fcd suni*fcd year/solution; run; proc surveyreg data=sim; class year; model retb= sni suni fcd sni*fcd suni*fcd year/solution; run; proc surveyreg data=sim; class year; model ret= sni suni fcd sni*fcd suni*fcd year/solution; run; proc sql; create table firmyr1 as select *,sum(pvnig) as sumpvnig10,sum(pvnib) as sumpvnib10 from firmyr3 group by firm; quit; data firmyr1; set firmyr1; prc1beg=pprg*sumpvnig10+(1-pprg)*simpvnib10; prc1end=pprg*(sumpvnig10-pvnig)+(1-pprg)*(sumpvnib10-pvnib); eni=pprg*nig+(1-pprg)*nib; run; data firmyr1; set firmyr1; unig=nig-eni; unib=nib-eni; data firmyr1; set firmyr1; eni=((priorprg*nig+(1-priorprg)*nib)); begprc=priorprg*sumpvnig+(1-priorprg)*sumpvnib; endprcg=sumpvnig; endprcb=sumpvnib; eni=priorprg*nig+(1-priorprg)*nib; data firmyr; set firmyr; retg=(endprcg-begprc); retb=(endprcb-begprc); UNIG=NIG-eni; UNIB=NIB-eni; run; proc plot data=firmyr; plot retg*unig; plot retb*unib; plot retg*nig; plot retb*nib; run; proc sort data=firmyr; by vc; run; proc plot data=firmyr; by vc; plot retg*unig; plot retb*unib; plot retg*nig; plot retb*nib; run; data firmyrretg; set firmyr; where year=1 and ((1<=firm<=250) or (501<=firm<=750)); ret=retg; uni=unig; ni=nig; news='good'; run; data firmyrretb; set firmyr; where year=1 and ((251<=firm<=500) or (751<=firm<=1000)); ret=retb; uni=unib; ni=nib; news='bad'; run; data firmyrret; set firmyrretg firmyrretb; run; data firmyrret; set firmyrret; if ret<0 then d=1; else d=0; run; %mend lagsim; %lagsim; options notes; if year=1 then vcp=.5 + .1*rannor(0); if year=1 then fc=50 + 1*rannor(0); run; *the random makes some sales negative, set them to zero; data firmyr; set firmyr; if saleg<0 then saleg=0; if saleb<0 then saleb=0; run; options nonotes; %macro lagsim; %do i=1 %to 10000; data firmyr; set firmyr; lagsaleg=lag(saleg); lagsaleb=lag(saleb); lagvcp=lag(vcp); lagfc=lag(fc); if id=&i and firm=lag(firm) then do; saleg=lagsaleg+(lagsaleg*.05)*rannor(0); saleb=lagsaleb+(lagsaleb*.05)*rannor(0); fc=lagfc; lagvcp; end; run; %end; data firmyr; set firmyr; drop lagsaleg lagsaleb lagvcp lagfc; run; %mend lagsim; %lagsim; options notes; data firmyr; set firmyr; if year=1 then priorprg=.5 + .1*rannor(0); if id<=5000 then vc=1; else vc=0; run; data firmyr; set firmyr; if vc=1 then NIG=saleg*(1-vcp); if vc=0 then NIG=saleg-fc; if vc=1 then NIB=saleb*(1-vcp); if vc=0 then NIB=saleb-fc; run; data firmyr; set firmyr; pvnig=nig/(1+.05)**year; pvnib=nib/(1+.05)**year; run; proc sql; create table firmyr as select *,sum(pvnig) as sumpvnig,sum(pvnib) as sumpvnib from firmyr group by firm; quit; data firmyr; set firmyr; eni=((priorprg*nig+(1-priorprg)*nib)); begprc=priorprg*sumpvnig+(1-priorprg)*sumpvnib; endprcg=sumpvnig; endprcb=sumpvnib; eni=priorprg*nig+(1-priorprg)*nib; data firmyr; set firmyr; retg=(endprcg-begprc); retb=(endprcb-begprc); UNIG=NIG-eni; UNIB=NIB-eni; run; proc plot data=firmyr; plot retg*unig; plot retb*unib; plot retg*nig; plot retb*nib; run; proc sort data=firmyr; by vc; run; proc plot data=firmyr; by vc; plot retg*unig; plot retb*unib; plot retg*nig; plot retb*nib; run; data firmyrretg; set firmyr; where year=1 and ((1<=firm<=250) or (501<=firm<=750)); ret=retg; uni=unig; ni=nig; news='good'; run; data firmyrretb; set firmyr; where year=1 and ((251<=firm<=500) or (751<=firm<=1000)); ret=retb; uni=unib; ni=nib; news='bad'; run; data firmyrret; set firmyrretg firmyrretb; run; data firmyrret; set firmyrret; if ret<0 then d=1; else d=0; run; proc means data=firmyrret mean std median min max; class vc; var ni uni ret d; run; *this is year 0, only the probability/state changed; proc surveyreg data=firmyrret; model ni=ret d ret*d vc vc*ret vc*d vc*ret*d; run; proc surveyreg data=firmyrret; where vc=1; model ni=ret d ret*d; run; proc surveyreg data=firmyrret; where vc=0; model ni=ret d ret*d; run; *now introduce change from realized earnings; proc sort data=firmyr; by firm year; run; data firmyr2; set firmyr; priorprg=lag(priorprg); lagprc=lag(begprc); run; data firmyr2; set firmyr2; if year=1 then delete; run; data firmyr2; set firmyr2; drop eni begprc endprcg endprcb sumpvnig sumpvnib retnonews retg retb unig unib; run; proc sql; create table firmyr2 as select *,sum(pvnig) as sumpvnig,sum(pvnib) as sumpvnib from firmyr2 group by firm; quit; data firmyr2; set firmyr2; eni=((priorprg*nig+(1-priorprg)*nib)); begprc=priorprg*sumpvnig+(1-priorprg)*sumpvnib; endprcg=sumpvnig; endprcb=sumpvnib; eni=priorprg*nig+(1-priorprg)*nib; run; data firmyr2; set firmyr2; retnonews=begprc-lagprc; retg=(endprcg-lagprc); retb=(endprcb-lagprc); UNIG=NIG-eni; UNIB=NIB-eni; run; data firmyrretg; set firmyr2; where year=2 and ((1<=firm<=250) or (501<=firm<=750)); ret=retg; uni=unig; ni=nig; news='good'; run; data firmyrretb; set firmyr2; where year=2 and ((251<=firm<=500) or (751<=firm<=1000)); ret=retb; uni=unib; ni=nib; news='bad'; run; data firmyrret; set firmyrretg firmyrretb; run; data firmyrret; set firmyrret; if ret<0 then d=1; else d=0; if retnonews<0 then dnn=1; else dnn=0; run; proc surveyreg data=firmyrret; model ni=retnonews dnn dnn*retnonews; run; proc surveyreg data=firmyrret; model ni=ret d d*ret vc vc*d vc*d*ret; run; proc surveyreg data=firmyrret; model ni=ret d d*ret vc vc*d vc*d*ret dnn dnn*d dnn*ret dnn*d*ret; run; proc surveyreg data=firmyrret; model uni=ret d d*ret vc vc*d vc*d*ret; run; proc surveyreg data=firmyrret; model ret=ni uni; run; proc means data=firmyrret min max; var ret ni uni; run; data firmyrretlimit; set firmyrret; pctret=ret/lagprc; run; proc means data=firmyrretlimit mean min max; var ret ni uni pctret; run; data firmyrretlimit; set firmyrretlimit; if pctret<-1 then pctret=-1; sni=ni/lagprc; run; proc surveyreg data=firmyrretlimit; model sni=pctret d d*pctret; run; proc surveyreg data=firmyrretlimit; model ni=pctret d d*pctret; run; data firmyrret; set firmyrret; pctret=ret/lagprc; sni=ni/lagprc; if pctret<-1 then bigneg=1; else bigneg=0; if pctret>4 then bigpos=1; else bigpos=0; run; proc surveyreg data=firmyrret; model ni=ret d d*ret bigneg bigneg*d bigneg*d*ret bigneg*ret vc vc*d vc*ret vc*d*ret bigpos bigpos*d bigpos*ret bigpos*d*ret; run; proc surveyreg data=firmyrret; model ni=ret d d*ret bigneg bigneg*d bigneg*d*ret bigneg*ret vc vc*d vc*ret vc*d*ret bigpos bigpos*d bigpos*ret bigpos*d*ret uni; run; proc surveyreg data=firmyrret; model uni=ret d d*ret bigneg bigneg*d bigneg*d*ret bigneg*ret vc vc*d vc*ret vc*d*ret bigpos bigpos*d bigpos*ret bigpos*d*ret; run; proc surveyreg data=firmyrret; where vc=0; model uni=ret d d*ret; run; proc surveyreg data=firmyrret; where vc=1; model uni=ret d d*ret; run; do i=0 to 1000; if firm=i then year= data type; set research.id10000; where id<=100; firm=id; if id<=50 then do; FC=50+50*rannor(0); CM=1-0; HFC=1; end; else do; FC=0; CM=1-ranuni(0); HFC=0; end; drop id; run; proc sort data=acc; by firm; run; proc sort data=type; by firm; run; data acc1; merge acc(in=a) type; by firm; if a=1 then output; run; data acc1; set acc1; by firm; if first.firm then year = 0; year + 1; run; options nonotes; %macro lagsim; %do i=2 %to 10000; data acc1; set acc1; newrev=lag(rev); if id=&i and firm=lag(firm) then rev=newrev+100*rannor(0); run; %end; %mend lagsim; %lagsim; options notes; proc sort data=acc1; by id; run; data acc1; set acc1; do; if rev lt 0 then rev=0;end; TotInc=CM*Rev-FC; if firm eq lag(firm) then cfo=.9*(Rev*CM)+.1*(lag(rev)*lag(cm))-fc; else cfo=.9*(Rev*CM)-fc; run; *assume perfect income smoothing; proc sql; create table acc2 as select *,avg(totinc) as smth_ni from acc1 group by firm; quit; proc sort data=acc2; by descending id; run; data acc2; set acc2; if smth_ni lt 0 then possmth_ni=totinc; else possmth_ni=smth_ni; acc=possmth_ni-cfo; if firm eq lag(firm) then lead_possmth_ni=lag(possmth_ni); else lead_possmth_ni=.; run; proc sort data=acc2; by id; run; proc sort data=acc2; by hfc; run; proc corr data=acc2; run; proc corr data=acc2; by hfc; run; data acc2; set acc2; hfc_acc=hfc*acc; hfc_cfo=hfc*cfo; run; proc reg data=acc2; model lead_possmth_ni=acc cfo hfc hfc_acc hfc_cfo; run; proc reg data=acc2; where hfc=1; model lead_possmth_ni=acc cfo; test acc=cfo; run; proc reg data=acc2; where hfc=0; model lead_possmth_ni=acc cfo; test acc=cfo; run;