マクロループを実行して、変動率モデルを計算するために99.5%を超える株式リターンを再帰的に取り除きます。私は、Zスコア(パーセンタイルの標準標準を仮定)が2.58を超える観測がなくなるまでループを実行しようとしています。しかし何らかの理由で、条件が真であってもループは評価されません。ここで私が使用しているコードです:ループ状態が正しく評価されていないときのSAS%while
%macro delete_jump;
%let z_max=10.0;
%let i=0;
%let crit=%sysfunc(quantile(%str(NORMAL),0.995,0,1));
%put The critical value is &crit.;
%do %while((&z_max. > &crit.) and (&i. < 30));
%put max=&z_max.;
proc expand data=crsp_data out=crsp_data(drop=time);
convert ret_nojmp=ret_vol/transformout=(movstd &hist_pd. trimleft &hist_pd.);
convert ret_nojmp=ret_ma/transformout=(movave &hist_pd. trimleft &hist_pd.);
by ticker;
run;
data crsp_data(drop=ret_vol ret_ma);
set crsp_data(drop=zscore);
zscore=(ret_nojmp-ret_ma)/ret_vol;
if quantile("NORMAL",0.01,0,1) < zscore < quantile("NORMAL",0.99,0,1) then ret_nojmp=ret;
else ret_nojmp = .;
run;
proc sql;
select max(abs(zscore)) into :z_max
from crsp_data;
quit;
%let i=%eval(&i.+1);
%end;
%mend delete_jump;
私はループを初期化するために、Z = 10を設定し、私は一定時間後に脱出することができますので、私はちょうどカウンターです。それはしかし、その点になると、ログファイルには、次の言葉:
MLOGIC(DELETE_JUMP): Beginning execution.
MLOGIC(DELETE_JUMP): %LET (variable name is Z_MAX)
MLOGIC(DELETE_JUMP): %LET (variable name is I)
MLOGIC(DELETE_JUMP): %LET (variable name is CRIT)
MLOGIC(DELETE_JUMP): %PUT The critical value is &crit.
SYMBOLGEN: Macro variable CRIT resolves to 2.57582930354889
The critical value is 2.57582930354889
SYMBOLGEN: Macro variable Z_MAX resolves to 10.0
SYMBOLGEN: Macro variable CRIT resolves to 2.57582930354889
SYMBOLGEN: Macro variable I resolves to 0
MLOGIC(DELETE_JUMP): %DO %WHILE((&z_max. > &crit.) and (&i. < 30)) loop
beginning; condition is FALSE. Loop will not be executed.
MLOGIC(DELETE_JUMP): Ending execution.
私は条件を分割し、CRITの値をハードコーディングしようとしましたが、それはループを実行することはありません。どのような考えが評価されます。
変更後に実行する前にマクロを再コンパイルしましたか? – user667489