全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 SAS专版
5308 4
2009-09-23
下面是我的一个程序,其中涉及到一部分数据调用,我不知道应该用什么命令里执行,看帮助里也感觉不是很清楚,请高手指点一下!
是一个关于用遗传算法估计参数的程序,对于遗传算法,要求初始化数据,后面涉及到w1、Cldirpr、c、 t等数组的调用,对于前面的w1和Cldirpr,我用比较笨的办法,直接写进去。后面的c和t就不容易写了,应该如何调用,请指点一下!
data bonds040927(label='2004年9月27日上交所22只付息国债收盘价');
input bdname $8. matdt:yymmdd10. freq coupond Cldirpr dur term@;
format matdt yymmdd10.;
label
bdname='债券名称'
matdt='到期日'
freq='年付息频率'
coupond='票面利息'
Cldirpr='市场价格'
dur='久期'
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 float(keep=bdname c1-c38);
set bonds040927;
sdate='27sep2004'd;  
edate=Matdt;  
yrdif=yrdif(sdate, edate, '30/360');  
dif=yrdif-int(yrdif);  
if Freq=1 then if dif=0 then do;
y=yrdif;
a=coupond;
end;
else do;
y=int(yrdif)+1;  
a=coupond;
end;
if Freq=2 then if dif=0.5 then do;
y=yrdif*2;
a=coupond/2;
end;
else if dif>0.5 then do;
y=int(yrdif)*2+2;
a=coupond/2;
end;
     
else do;
y=int(yrdif)*2+1;
a=coupond/2;
end;
array c{38};   
do i=1 to y;
if i<y then c[i]=a;  
         else c[i]=a+100;
end;
do j=y+1 to 38;
c[j]=0;
end;
run;
/*  现金流对应的时刻 */
data time(keep=bdname t1-t38);
set bonds040927;
sdate='27sep2004'd;
edate=Matdt;
yrdif=yrdif(sdate, edate, '30/360');
dif=yrdif-int(yrdif);
if Freq=1 then if dif=0 then do;
y=yrdif;  
a=1;
end;
else do;
y=int(yrdif)+1;
a=dif;
end;
if Freq=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;
y=int(yrdif)*2+1;
a=dif;
end;
array t{38};
do i=1 to y;
t[i]=a+(1/Freq)*(i-1);
end;
do j=y+1 to 38;
t[j]=1;
end;
run;
data float_time;
merge float time;
run;
data w1;
set bonds040927 end=end;
Dur1=1/(dur**0.5);/*权重设为久期的算术平方根的倒数*/
sumDur1+Dur1;
if end;
call symput('ddd',sumDur1);
data w1(keep=w1);
merge bonds040927 w1;
w1=(1/(dur**0.5)/&ddd);
run;
proc ga seed=5555 maxiter = 30;
function y(selected[*]);
array x[6] /nosym;
call ReadMember(selected,1,x);
x1=x[1];
x2=x[2];
x3=x[3];
x4=x[4];
x5=x[5];
x6=x[6];
array sum1{38,22};
array w1{22};
array Cldirpr{22};
array c{38};
array t{38};
sum1[i,j]=0;
sum2=0;
Cldirpr[1]=114.85;
Cldirpr[2]=116.6;
Cldirpr[3]=98.48;
Cldirpr[4]=94.62;
Cldirpr[5]=96.66;
Cldirpr[6]=92.09;
Cldirpr[7]=89.13;
Cldirpr[8]=89.67;
Cldirpr[9]=94.16;
Cldirpr[10]=86;
Cldirpr[11]=90.71;
Cldirpr[12]=77.36;
Cldirpr[13]=95.96;
Cldirpr[14]=92.5;
Cldirpr[15]=90.65;
Cldirpr[16]=80.64;
Cldirpr[17]=89.69;
Cldirpr[18]=87.26;
Cldirpr[19]=93.7;
Cldirpr[20]=99.92;
Cldirpr[21]=101.04;
Cldirpr[22]=99.97;
w1[1]=0.041971;
w1[2]=0.06284;
w1[3]=0.061298;
w1[4]=0.048207;
w1[5]=0.053486;
w1[6]=0.029016;
w1[7]=0.041167;
w1[8]=0.038811;
w1[9]=0.048087;
w1[10]=0.03854;
w1[11]=0.047836;
w1[12]=0.031245;
w1[13]=0.053271;
w1[14]=0.044165;
w1[15]=0.044041;
w1[16]=0.027272;
w1[17]=0.044041;
w1[18]=0.036816;
w1[19]=0.041431;
w1[20]=0.048634;
w1[21]=0.042047;
w1[22]=0.041971;
do i=1 to 38;
do j=1 to 22;
sum1[i,j]=sum1[i,j]+c[i]*exp(-t[i]*(x1+(x2+x3)*(1-exp(-t[i]/x5))/(t[i]/x5)-x3*exp(-t[i]/x5)+x4*(1-exp(-t[i]/x6))/(t[i]/x6)-x4*exp(-t[i]/x6)));
sum2=sum2+(Cldirpr[j]-sum1[i,j])**2*w1[j];
end;
end;
result=sum2;
      return(result);
   endsub;
call SetEncoding('R2');
array LowerBound[6] /nosym (0.086 -0.086 -0.109 0.042 9 2.2);
array UpperBound[6] /nosym (0.094 -0.076 -0.098 0.054 12 4);
call SetBounds(LowerBound, UpperBound);
call SetObjFunc('y',0);
call SetCrossProb(0.65);
call SetCrossHeuristic();
call SetMutProb(0.15);
array delta[2] /nosym (0.2 0.2);
call SetMutDelta(delta, 1);
call SetSelTournament(2);
call SetElite(2);
call Initialize('DEFAULT',120);
run;
quit;
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

全部回复
2009-9-23 21:00:36
c和t 是二维数组,我把程序改了下!
data bonds040927(label='2004年9月27日上交所22只付息国债收盘价');
input bdname $8. matdt:yymmdd10. freq coupond Cldirpr dur term@;
format matdt yymmdd10.;
label
bdname='债券名称'
matdt='到期日'
freq='年付息频率'
coupond='票面利息'
Cldirpr='市场价格'
dur='久期'
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 float(keep=bdname c1-c38);
set bonds040927;
sdate='27sep2004'd;  
edate=Matdt;  
yrdif=yrdif(sdate, edate, '30/360');  
dif=yrdif-int(yrdif);  
if Freq=1 then if dif=0 then do;
y=yrdif;
a=coupond;
end;
else do;
y=int(yrdif)+1;  
a=coupond;
end;
if Freq=2 then if dif=0.5 then do;
y=yrdif*2;
a=coupond/2;
end;
else if dif>0.5 then do;
y=int(yrdif)*2+2;
a=coupond/2;
end;
     
else do;
y=int(yrdif)*2+1;
a=coupond/2;
end;
array c{38};   
do i=1 to y;
if i<y then c[i]=a;  
         else c[i]=a+100;
end;
do j=y+1 to 38;
c[j]=0;
end;
run;
/*  现金流对应的时刻 */
data time(keep=bdname t1-t38);
set bonds040927;
sdate='27sep2004'd;
edate=Matdt;
yrdif=yrdif(sdate, edate, '30/360');
dif=yrdif-int(yrdif);
if Freq=1 then if dif=0 then do;
y=yrdif;  
a=1;
end;
else do;
y=int(yrdif)+1;
a=dif;
end;
if Freq=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;
y=int(yrdif)*2+1;
a=dif;
end;
array t{38};
do i=1 to y;
t[i]=a+(1/Freq)*(i-1);
end;
do j=y+1 to 38;
t[j]=1;
end;
run;
data float_time;
merge float time;
run;
data w1;
set bonds040927 end=end;
Dur1=1/(dur**0.5);/*权重设为久期的算术平方根的倒数*/
sumDur1+Dur1;
if end;
call symput('ddd',sumDur1);
data w1(keep=w1);
merge bonds040927 w1;
w1=(1/(dur**0.5)/&ddd);
run;
proc ga seed=5555 maxiter = 30;
function y(selected[*]);
array x[6] /nosym;
call ReadMember(selected,1,x);
x1=x[1];
x2=x[2];
x3=x[3];
x4=x[4];
x5=x[5];
x6=x[6];
array sum1{38,22};
array w1{22};
array Cldirpr{22};
array c{38,22};
array t{38,22};
sum1[i,j]=0;
sum2=0;
Cldirpr[1]=114.85;
Cldirpr[2]=116.6;
Cldirpr[3]=98.48;
Cldirpr[4]=94.62;
Cldirpr[5]=96.66;
Cldirpr[6]=92.09;
Cldirpr[7]=89.13;
Cldirpr[8]=89.67;
Cldirpr[9]=94.16;
Cldirpr[10]=86;
Cldirpr[11]=90.71;
Cldirpr[12]=77.36;
Cldirpr[13]=95.96;
Cldirpr[14]=92.5;
Cldirpr[15]=90.65;
Cldirpr[16]=80.64;
Cldirpr[17]=89.69;
Cldirpr[18]=87.26;
Cldirpr[19]=93.7;
Cldirpr[20]=99.92;
Cldirpr[21]=101.04;
Cldirpr[22]=99.97;
w1[1]=0.041971;
w1[2]=0.06284;
w1[3]=0.061298;
w1[4]=0.048207;
w1[5]=0.053486;
w1[6]=0.029016;
w1[7]=0.041167;
w1[8]=0.038811;
w1[9]=0.048087;
w1[10]=0.03854;
w1[11]=0.047836;
w1[12]=0.031245;
w1[13]=0.053271;
w1[14]=0.044165;
w1[15]=0.044041;
w1[16]=0.027272;
w1[17]=0.044041;
w1[18]=0.036816;
w1[19]=0.041431;
w1[20]=0.048634;
w1[21]=0.042047;
w1[22]=0.041971;
do i=1 to 38;
do j=1 to 22;
sum1[i,j]=sum1[i,j]+c[i,j]*exp(-t[i,j]*(x1+(x2+x3)*(1-exp(-t[i,j]/x5))/(t[i,j]/x5)-x3*exp(-t[i,j]/x5)+x4*(1-exp(-t[i,j]/x6))/(t[i,j]/x6)-x4*exp(-t[i,j]/x6)));
sum2=sum2+(Cldirpr[j]-sum1[i,j])**2*w1[j];
end;
end;
result=sum2;
      return(result);
   endsub;
call SetEncoding('R2');
array LowerBound[6] /nosym (0.086 -0.086 -0.109 0.042 9 2.2);
array UpperBound[6] /nosym (0.094 -0.076 -0.098 0.054 12 4);
call SetBounds(LowerBound, UpperBound);
call SetObjFunc('y',0);
call SetCrossProb(0.65);
call SetCrossHeuristic();
call SetMutProb(0.15);
array delta[2] /nosym (0.2 0.2);
call SetMutDelta(delta, 1);
call SetSelTournament(2);
call SetElite(2);
call Initialize('DEFAULT',120);
run;
quit;
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2009-9-26 10:09:46
如果我把c和t输出在xls里,这样怎么调用啊? 2# shuiqq19840621
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2009-9-26 10:10:17
这是c的输出
data bonds040927(label='2004年9月27日上交所22只付息国债收盘价');
input bdname $8. matdt:yymmdd10. freq coupond Cldirpr dur term@;
format matdt yymmdd10.;
label
bdname='债券名称'
matdt='到期日'
freq='年付息频率'
coupond='票面利息'
Cldirpr='市场价格'
dur='久期'
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 float(keep=bdname c1-c38);
set bonds040927;
sdate='27sep2004'd;  
edate=Matdt;  
yrdif=yrdif(sdate, edate, '30/360');  
dif=yrdif-int(yrdif);  
if Freq=1 then if dif=0 then do;
y=yrdif;
a=coupond;
end;
else do;
y=int(yrdif)+1;  
a=coupond;
end;
if Freq=2 then if dif=0.5 then do;
y=yrdif*2;
a=coupond/2;
end;
else if dif>0.5 then do;
y=int(yrdif)*2+2;
a=coupond/2;
end;
     
else do;
y=int(yrdif)*2+1;
a=coupond/2;
end;
array c{38};   
do i=1 to y;
if i<y then c[i]=a;  
         else c[i]=a+100;
end;
do j=y+1 to 38;
c[j]=0;
end;
run;
proc printto print='d:\float.xls';
proc print data=float() noobs;
run;
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2009-9-26 10:10:56
这是t的输出!
data bonds040927(label='2004年9月27日上交所22只付息国债收盘价');
input bdname $8. matdt:yymmdd10. freq coupond Cldirpr dur term@;
format matdt yymmdd10.;
label
bdname='债券名称'
matdt='到期日'
freq='年付息频率'
coupond='票面利息'
Cldirpr='市场价格'
dur='久期'
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 time(keep=bdname t1-t38);
set bonds040927;
sdate='27sep2004'd;
edate=Matdt;
yrdif=yrdif(sdate, edate, '30/360');
dif=yrdif-int(yrdif);
if Freq=1 then if dif=0 then do;
y=yrdif;  
a=1;
end;
else do;
y=int(yrdif)+1;
a=dif;
end;
if Freq=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;
y=int(yrdif)*2+1;
a=dif;
end;
array t{38};
do i=1 to y;
t[i]=a+(1/Freq)*(i-1);
end;
do j=y+1 to 38;
t[j]=1;
end;
run;
proc printto print='d:\time.xls';
proc print data=float() noobs;
run;
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群