我的code如下,只是在一大段macro中间的一部分,这里面的原有文件one中,含有permno year month date a r f va e;
这一段要实现的功能是通过方程求出新的a,计算出新的va(称为va1),然后比较新的和原有的之间差值,如果绝对差值<0.001,则输出到一个文件中,而绝对差值比较大的则继续循环计算出新的a、va。
[code:2ep3kiee]
%do j=1 %to 15;
proc model noprint data=one; endogenous a; exogenous r f va e;
e=a*probnorm((log(a/f)+(r+va*va/2))/va)-f*exp(-r)*probnorm((log(a/f)+(r-va*va/2))/va);
solve a/out=two;
data two; set two; num=_n_; keep a num;
data one; set one; num=_n_; drop a;
data two; merge one two; by num; l1p=lag1(permno); l1a=lag1(a);
data two; set two; if l1p=permno then ra=log(a/l1a);
proc means noprint data=two; var ra; by permno; output out=bob;
data bar; set bob; if _stat_='MEAN'; mu=252=ra; keep permno mu;
data bob; set bob; if _stat_='STD'; va1=sqrt(252)*ra;
if va1<0.01 then va1=0.01; keep permno va1;
data one; merge two bob bar; by permno; vdif=va1-va;
if abs(vdif)<0.001 and vdif ne . then conv=1;
data fin; set one; if conv=1; assetvol=va1;
proc sort data=fin; by permno descending date;
data fin; set fin; if permno ne lag1(permno); curdat=100*&yyy.+&mmm.; iter=&j.;
data conv; merge conv fin; by permno; drop va ra l1p l1a conv cdt num;
data one; set one; if conv ne 1; va=va1; drop va1;
%end;
[/code:2ep3kiee]