957 proc sort data=shibor.r_log out=r_log;
958 by date;
959
960 data sma;
961 set r_log;
962
963 data a;
964 set r_log;
965 rsum+r_log;
966
967 data a ;
968 set a;
969 mu=(rsum-lag20(rsum))/20;
970 sum+(r_log-mu)**2;
971
972 data b(keep=date r_log mu sma);
973 merge a a(firstobs=21 rename=(sum=sum_1));
974 sma=(sum_1-sum)/20;
975 sma=sqrt(sma);
976 sma=lag20(sma);
977 mu=lag20(mu);
978
979 data b;
980 set b;
981 where year(date)=2009;
982 run;
983
984 /* 产生1000列标准正态分布的随机数,每列取其第800个观测值 */
985 proc iml;
986 rv=normal(repeat(0,800,1000));
987 /*产生1000列标准正态分布的随机数,每列有800个观测值。这里1000实际上是随机模拟的次数,选择每次模拟的第800个随机数*
987! /
988 rv=t(rv[800, ]); /*选择矩阵rv的第800列元素组成的行向量,并转置为列向量 */
989 create rv1 from rv[colname='normal']; /*创建SAS数据集rv1,并将列变量设定为normal */
990 append from rv;
WARNING: 当前正处理的加引号的字符串比 262 个字符长。您可能有不平衡的引号。
991 quit;
992
993 /*蒙特卡罗模拟法计算2009年每个交易日的VaR和相应的事后检验结果。2009年每个交易日的VaR分别存储在数据集var_mont5和va
993! r_mont1 中, 事后检验结果存储在数据集bt_mont5和bt_mont1 中*/
994 %macro mont(prob, aa);
995 %do i=1 %to 60; /* 2009年每个交易日,即数据集b中有60个观测值*/
989 create rv1 from rv[colname='normal']; /*创建SAS数据集rv1,并将列变量设定为normal */
------------------------------------------------
49
NOTE 49-169: 加引号的字符串后的标识符的含义可能在将来的 SAS 版本中更改。建议在加引号的字符串和标识符之间插入空格。
996
997 data a;
998 set b;
999 if _n_=&I;
1000 call
1000! symput('mu'
-
49
1000! , mu); /*创建宏变量mu,其值为相应交易日的收益率均值 */
NOTE 49-169: 加引号的字符串后的标识符的含义可能在将来的 SAS 版本中更改。建议在加引号的字符串和标识符之间插入空格。
1001 call symput('sma', sma);
1002
1003 data r;
1004 set rv1;
1005 r=&mu+&sma*normal;
1006
1007 proc sort data=r;
1008 by r;
1009
1010 data r;
1011 set r;
1012 if _n_= int(1000*&prob);
1013
1014 data a;
WARNING: 当前正处理的加引号的字符串比 262 个字符长。您可能有不平衡的引号。
1015 merge a r;
1016 if r_log <r then flag=1;
1017 else flag = 0;
1018
1019 proc append base=var_mont&aa data=a; /*数据集var_mont&aa中变量r就是相应交易日的VaR,r_log为当日的对数收益率 */
1020
1021 %end;
1022
1023 data bt_mont&aa; /*事后检验结果数据集 */
1024 set var_mont&aa nobs=nobs; /*nobs实际不等于60 */
1025 module="mont+&prob";
1026 prob=&prob;
1027 records=nobs; /*2009年的交易日为60天 */
1028 default+flag;
1029 shouldbe= round(records*&prob);
1030 if _n_=nobs ;
1031
1032 %mend mont;
1033 %mont(0.05, 5);
1034 %mont(0.01, 1);
1035 run;