2017-03-26 20 views
1

マクロループを実行して、変動率モデルを計算するために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の値をハードコーディングしようとしましたが、それはループを実行することはありません。どのような考えが評価されます。

+0

変更後に実行する前にマクロを再コンパイルしましたか? – user667489

答えて

1

%do whileは内部で%evalを使用していますが、これは整数比較でのみ正常に動作しますが、2つの小数点を比較しているようです。次のように置き換えると、正常に動作するはずです。

%do %while(%sysevalf(&z_max. > &crit.) and (&i. < 30)); 
+0

チャームのように働いた。助けてくれてありがとう! –

関連する問題