下面是我编的一部分程序,请高手指点一下!究竟问题出在哪里?不胜感激!
/*产生基本数据和变量*/
data bonds040927(label='2004年9月27日上交所22只付息国债收盘价');
input name $8. enddate : yymmdd10. fre coupond price du term@;
format enddate yymmdd10.;
label
name='债券名称',
enddate='到期日',
fre='年付息频率',
coupond='票面利息',
price='市场价格',
du='久期',
term='年限';
cards;
96国债6 2006-6-14 1 11.83 114.85 1.90262 10
97国债4 2007-9-5 1 9.78 116.6 2.76666 10
99国债5 2007-8-20 1 3.28 98.48 2.9076 8
99国债8 2009-9-23 1 3.3 94.62 4.70122 10
21国债3 2008-4-24 1 3.27 96.66 3.81898 7
21国债7 2021-7-31 2 4.26 92.09 12.9768 20
21国债10 2011-9-25 1 2.95 89.13 6.44658 10
21国债12 2011-10-30 1 3.05 89.67 7.25293 10
21国债15 2008-12-18 1 3 94.16 4.72472 7
02国债3 2012-4-18 1 2.54 86 7.3555 10
02国债10 2009-8-16 1 2.39 90.71 4.77451 7
02国债13 2017-9-20 2 2.6 77.36 11.1914 15
02国债14 2007-10-24 1 2.65 95.96 3.84993 5
02国债15 2009-12-6 1 2.93 92.5 5.60126 7
03国债11 2010-2-19 1 2.66 90.65 5.63273 7
03国债3 2023-4-17 2 3.4 80.64 14.6887 20
03国债7 2010-8-20 1 2.66 89.69 5.63273 7
03国债8 2013-9-17 1 3.02 87.26 8.06064 10
03国债11 2010-11-19 1 3.5 93.7 6.36469 7
04国债3 2009-4-19 1 4.4164 99.92 4.61904 5
04国债4 2011-5-25 1 4.89 101.04 6.17962 7
04国债7 2011-8-25 1 4.71 99.97 6.20199 7
;
run;
/*计算权重*/
data weight;
set bonds040927;
w=1/(du**0.5);
run;
/*产生现金流的对应时刻*/
data time(keep=name t1-t38);
set bonds040927;
sdate='27sep2004'd;
edate=enddate;
yrdif=yrdif(sdate, edate, '30/360');
dif=yrdif-int(yrdif);
/*以下if语句的判断是对不同的债券进行的 */
if fre=1 then if dif=0 then do;
y=yrdif;
a=1; /*当前时刻为付息日时现金流对应的时刻应为年份数加1,变量a即为要加上的数 */
end;
else do; /*dif不等于0 */
y=int(yrdif)+1;
a=dif; /*a为求现金流对应的时刻需年份数加上的那个数 */
end;
if fre=2 then if dif=0.5 then do;
y=yrdif*2;
a=0.5;
end;
else if dif>0.5 then do;
y=int(yrdif)*2+2;
a=dif-0.5;
end;
else do; /*dif<0.5 */
y=int(yrdif)*2+1;
a=dif;
end;
array t{38};
do i=1 to y;
t[i]=a+(1/fre)*(i-1); /*现金流对应的时刻,fre为年付息频率 */
end;
do j=y+1 to 38;
t[j]=1; /*剩余的期限赋值为1,方便Nelsen-Siegel模型的计算*/
end;
run;
/*产生现金流序列*/
data float(keep=name c1-c38);
set time;
array c{38} ;
array t{38} ;
par=100;/*债券面值设为100*/
if fre=1 and dif=0 then do i=1 to y-1;/*剩余期限为整数时的情况*/
c[i]=par*coupond;
end;
do j=y;
c[j]=par+par*coupond;
end;
do k=y+1 to 38;
c[k]=0;
end;
else do i=1 to y-1;/*剩余期限为非整数时的情况*/
c[i]=par*coupond;
end;
do j=y;
c[j]=par;
do k=y+1 to 38;
c[k]=0;
end;
if fre=2 and dif=0.5 then do i=1 to y-1;/*剩余期限为整数时的情况*/
c[i]=par*coupond;
end;
do j=y;
c[j]=par+=par*coupond;
end;
do k=y+1 to 38;
c[k]=0;
end;
else do i=1 to y-1;/*剩余期限为非整数时的情况*/
c[i]=par*coupond;
end;
do j=y;
c[j]=par;
do k=y+1 to 38;
c[k]=0;
end;
run;