楼主: shuiqq19840621
1795 7

请教高手修改程序 [推广有奖]

  • 0关注
  • 0粉丝

大专生

48%

还不是VIP/贵宾

-

威望
0
论坛币
108 个
通用积分
0
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
308 点
帖子
46
精华
0
在线时间
29 小时
注册时间
2009-9-3
最后登录
2009-12-9

楼主
shuiqq19840621 发表于 2009-9-12 10:48:26 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
下面是我编的一部分程序,请高手指点一下!究竟问题出在哪里?不胜感激!
/*产生基本数据和变量*/
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;
二维码

扫码加我 拉你入群

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

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

关键词:请教高手 修改程序 coupon format Weight 请教 程序 高手

回帖推荐

坐看云起时 发表于7楼  查看完整内容

/* 现金流分解 */ 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 ...

本帖被以下文库推荐

沙发
zhaozyuan 发表于 2009-9-12 11:04:30
你想做什么?你的程序什么意思呀?
如果楼主讲清楚,更有利于问题的解决的
另外,貌似这问题用vba在excel里就可以解决了

藤椅
shuiqq19840621 发表于 2009-9-12 13:01:14
首先收集到一些债券的信息,然后计算出它的现金流时刻及次数,这些都可以表示成向量,然后根据现金流发生的时刻和次数具体的表示出现金流,后面要做的就是利率期限结构的参数估计。但是现在的问题是现金流表示老是出错,而且网上也没有很好的例子!希望大家帮我出出主意,作为一个初学者,问题还是很多,见笑了!

板凳
zhaozyuan 发表于 2009-9-12 22:50:53
如果你想让大家帮你解决这个问题最好能说清楚
每一步要做什么,怎么做,运算式是什么等等 这样才有人能耐下心帮你看看
你上面的那是什么呀 让机器读还差不多 像俺这样的弱智儿童是读不懂滴
如果让提意见,以上就是意见

报纸
坐看云起时 在职认证  发表于 2009-9-13 00:17:29
我把你程序中的变量名及程序结构、计算的次序调整了一下。
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;

地板
坐看云起时 在职认证  发表于 2009-9-13 11:39:31
不知道为什么一粘贴总是有错,我分开粘贴就没问题了。后面的程序如下

7
坐看云起时 在职认证  发表于 2009-9-13 11:48:36
/*  现金流分解 */
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 weight;
set bonds040927 end=end;
Dur1=1/Dur;
sumDur1+Dur1;
if end;
call symput('ddd',sumDur1);
data weight(keep=weight);
merge bonds040927 weight;
weight=(1/Dur/&ddd);
run;
已有 1 人评分经验 论坛币 收起 理由
bakoll + 3 + 3 精彩帖子

总评分: 经验 + 3  论坛币 + 3   查看全部评分

8
jhhh2000 发表于 2009-9-21 11:13:57
看后深有启发,学习了,对我也有帮助

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2025-12-26 19:45