第14-15周作业

1、当前市场的利率为:一年期平价债券的票面利率5%,二年期平价债券的票面利率6%,三年期平价债券的票面利率7%,假设所有的债券都是一年付息一次。给出如下计算 的sas程序。
a.试计算1、2、3年期即期收益率(假设面值为1)。

因为此三支债券都为平价债券,则这些债券现在的价格就等于面值,即为1,又易知一年期平价债券的票面利率就是1年即期利率,为5%

data a;
array b (3) b1-b3  (1 1 1);
array c (3) c1-c3 (0  0.06 0.07);
array r (3) r1-r3 (0.05  0  0);
do t=2 to 3;s=0;do n=1 to t-1;s=s+c(t)/((1+r(n))**n);end;r(t)=((1+c(t))/(b(t)-s))**(1/t)-1;
end;
proc print data=a;
var r1-r3;
run;

运行结果:SAS在金融中的应用七-编程知识网

可知1、2、3年期即期收益率分别为0.05,0.060303,0.070969。

b. 假设现在有一个票面利率为5%面值为100的三年期债券,试根据即期收益率和内生收益率求出价格。

根据即期收益率求出价格为:94.6882。

data a1;
array jqr (3) jqr1-jqr3(0.05 0.060303 0.070969);
b=0;
do n=1 to 3;if n<3 then c=100*0.05;else c=100+100*0.05;b=b+c/(1+jqr(n))**n;
end;
proc print data=a1;
var b;
run;

运行结果:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Y6PRqPsm-1630667730581)(C:\Users\ASUS\AppData\Roaming\Typora\typora-user-images\image-20210604085812141.png)]

根据内生收益率求出价格为:94.7514。

/*由题意可知该债券的内生收益率就是三年期平价债券的票面利率,即为7%*/
data a4;
b=0;
do n=1 to 3;if n<3 then c=100*0.05;else c=100+100*0.05;b=b+c/(1+0.07)**n;
end;
proc print data=a4;
var b;
run;

c.试计算一年后发行的一年期息票债券的远期利率和二年后发行的一年期息票债券的远期利率。

一年后发行的一年期息票债券的远期利率:为8.118%

data a2;
array r(3) r1-r3 (0.05  0.060303 0.070969);
b1=1/(1+r1)-1/(1+r3)**3;
b=0;
do n=2 to 3;b=b+1/(1+r(n))**n;
end;
yqr=b1/b;
proc print data=a2;
var yqr;
run;

运行结果:SAS在金融中的应用七-编程知识网

二年后发行的一年期息票债券的远期利率:为9.2624%。

data a3;
array r(3) r1-r3 (0.05  0.060303 0.070969);
b1=1/(1+r2)**2-1/(1+r3)**3;
b=1/(1+r(3))**3;
yqr=b1/b;
proc print data=a3;
var yqr;
run;

运行结果:SAS在金融中的应用七-编程知识网

  1. Excel数据集sjk6-3给出银行客户的财务指标数据x1-x12、以及客户是否违约的记录y,其中y=1表示客户违约、y=0表示客户不违约。试利用这个数据集构建信用风险度量模型,要求在模型构建时,预测变量的选择至少采用两种方法,模型构建要求采用判别分析、Logistic回归和朴素贝叶斯分类法三种方法,并比较所构建模型的预测准确率。给出所用到的SAS程序。
proc import out=cwzbsjDatafile='D:\mySASDATA\第14-15周\sjk6-3.xls'DbmS=xls replace;getnames=yes;
run;/*导入数据*/
/*预测变量的选取:t检验法*/
proc ttest cochran data=cwzbsj ;class y;
run;
/*根据程序运行结果,t检验出的在违约企业和非违约企业之间有良好区分度的变量有x1,x2,x3,x4,x5,x6,x7,x8,x9,x10,x11*/
proc corr data=cwzbsj;
var x1 x2 x3 x4 x5 x6 x7 x8 x9 x10 x11;
run;
/*通过相关系数矩阵的初步分析,这些变量之间的相关系数均较小,都不超过0.15,且基本小于0.1,
说明通过ttest过程对变量的筛选达到的效果还是比较好的*/
/*预测变量的选取:信号的噪音差方法*/
/*由上表易知x1为负指标,x2-x11为正指标*/
data a;
set cwzbsj;
do x0=-207.9 to 31.7 by 0.1;/*循环变量初值取x1的最小值,终值取x1的最大值,步长取0.1,因为数据量较大,阈值只保留一位小数*/output;
end;
data a1;
set a;
if x1>x0 and y=1 then xh=1;/*若对违约企业发出警报,记作一个信号*/
if x1>x0 and y=0 then zy=1;/*若对非违约企业发出警报,记作一个噪音*/
run;
data a2;
set a1;
if xh=1;
proc sort data=a2;
by x0;
proc freq data=a2;
table x0*xh/out=b1;
run;
data c1;
set b1;
xhb=count/228;/*计算指标的信号比*/
keep x0 xhb;
run;
data a3;
set a1;
if zy=1;
proc sort data=a3;
by x0;
proc freq data=a3;
tables x0*zy/out=b2;
data c2;
set b2;
zyb=count/6467;/*计算指标的信号噪音差*/
keep x0 zyb;
data a4;
merge c1 c2;
by x0;
xhzyc=xhb-zyb;/*计算指标的信号噪音差*/
proc sort data=a4;
by descending xhzyc;
data a5; 
set a4;
if _n_=1;/*只保留数据a4中信号噪音差最大的那个观测*/
proc print data=a5;
var x0 xhb zyb xhzyc;
run;
%macro xhzyf(sjj,zb,min,max,wyzs,fwyzs);
data a1&sjj.;
set cwzbsj;
do x0&zb.=&min.  to  &max. by 1;output;
end;
data a1&sjj.;
set a1&sjj.;
x00&zb.=x0&zb./10;
if x&zb.<=x00&zb. and y=1 then xh=1;/*若对违约企业发出警报,记作一个信号*/
if x&zb.<=x00&zb. and y=0 then zy=1;/*若对非违约企业发出警报,记作一个噪音*/
run;
data a2&sjj.;
set a1&sjj.;
if xh=1;
proc sort data=a2&sjj.;
by x00&zb.;
proc freq data=a2&sjj.;
table x00&zb.*xh/out=b1&sjj.;
run;
data c1&sjj.;
set b1&sjj.;
xhb=count/&wyzs.;/*计算指标的信号比*/
keep x00&zb. xhb;
run;
data a3&sjj.;
set a1&sjj.;
if zy=1;
proc sort data=a3&sjj.;
by x00&zb.;
proc freq data=a3&sjj.;
tables x00&zb.*zy/out=b2&sjj.;
data c2&sjj.;
set b2&sjj.;
zyb=count/&fwyzs.;/*计算指标的信号噪音差*/
keep x00&zb. zyb;
data a4&sjj.;
merge c1&sjj.  c2&sjj.;
by x00&zb.;
xhzyc=xhb-zyb;/*计算指标的信号噪音差*/
proc sort data=a4&sjj.;
by descending xhzyc;
data a5&sjj.; 
set a4&sjj.;
if _n_=1;/*只保留数据a4中信号噪音差最大的那个观测*/
proc print data=a5&sjj.;
var x00&zb. xhb zyb xhzyc;
run;
%mend xhzyf;
%xhzyf(2,2,-399,1106,228,6467);
%xhzyf(3,3,-335,2051,228,6467);
%xhzyf(4,4,-2656,1261,228,6467);
%xhzyf(5,5,-5512,337,226,6433);
%xhzyf(6,6,-437,1338,228,6467);
%xhzyf(7,7,-726,-18,228,6467);
%xhzyf(8,8,-3659,5240,228,6467);
%xhzyf(9,9,-1455	,712,228,6467);
%xhzyf(10,10,-136,2537,228,6467);
%xhzyf(11,11,-331,2165,228,6467);
run;

相关系数图:

SAS在金融中的应用七-编程知识网

指标表格:

指标 Y 个数 均值 标准差 标准误差 最小值 最大值 指标属性
x1 0 6467 -13.8333 77.6957 0.9662 -207.9 31.717 负指标
x1 1 228 35.82 91.8797 6.0849 -207.9 31.717 负指标
x2 0 6467 -8.5341 52.0477 0.6472 -39.942 110.6 正指标
x2 1 228 -15.8295 45.6717 3.0247 -39.942 110.6 正指标
x3 0 6467 -7.1326 53.9233 0.6705 -33.519 205.1 正指标
x3 1 228 -15.9612 41.7351 2.764 -33.519 205.1 正指标
x4 0 6467 16.1294 61.1958 0.761 -265.6 126.1 正指标
x4 1 228 -0.8547 81.5155 5.3985 -265.6 126.1 正指标
x5 0 6433 -77.4337 199.6 2.4887 -551.2 33.721 正指标
x5 1 226 -117.5 229.4 15.2584 -551.2 33.721 正指标
x6 0 6467 11.8526 64.4133 0.801 -43.77 133.8 正指标
x6 1 228 0.3308 58.2332 3.8566 -43.77 133.8 正指标
x7 0 6467 -16.7364 17.111 0.2128 -72.6267 -1.7587 正指标
x7 1 228 -22.0489 22.3903 1.4828 -72.6267 -1.7587 正指标
x8 0 6467 90.4248 318.2 3.9567 -365.9 524 正指标
x8 1 228 -51.8633 302.4 20.0245 -365.9 524 正指标
x9 0 6467 39.9497 72.2066 0.8979 -145.5 71.1395 正指标
x9 1 228 -51.0004 105.7 6.9999 -145.5 71.1395 正指标
x10 0 6467 19.4053 84.1508 1.0464 -13.6113 253.7 正指标
x10 1 228 -9.3904 27.3118 1.8088 -13.6113 253.7 正指标
x11 0 6467 25.1507 65.9662 0.8203 -33.174 216.5 正指标
x11 1 228 11.7831 55.8199 3.6968 -33.174 216.5 正指标

各指标的阈值和信号噪音差:

指标 指标阈值 信号比 噪音比 信号噪音差
x1 -173.5 0.77193 0.84846 -0.076532
x2 -3.3 0.78509 0.73048 0.05461
x3 -33.5 0.7807 0.70744 0.073264
x4 -24.2 0.51316 0.45245 0.060707
x5 -0.3 0.80088 0.71568 0.0852
x6 -21.1 0.8114 0.73434 0.07706
x7 -40 0.22368 0.12077 0.10292
x8 -135.2 0.4386 0.23798 0.20062
x9 -145.5 0.55263 0.12896 0.42367
x10 -13.6 0.96491 0.84212 0.12279
x11 -15.7 0.57018 0.44333 0.12685

根据此表发现x1-x11这些指标对区分企业是否违约时效果都不太好。

将数据集cwzbsj随机地分成训练样本组cwzbsjxl和检验样本组cwzbsjjy:

data m;
set cwzbsj;
k=uniform(131);
proc sort data=m;by y k;
data cwzbsjxl cwzbsjjy;
set m;
drop k;
if int(_n_/2)-_n_/2=0 then output cwzbsjxl;
else output cwzbsjjy;
run;

采用判别分析构建模型:

proc discrim data=cwzbsjxl testout=w testdata=cwzbsjjy;
class y;
var x1-x11;
run;
/*利用逐步判别分析法,选择建立判别分析模型的指标*/
proc stepdisc data=cwzbsjxl method=sw;class y;
run;
/*此方法发现x11作用不大*/

结果图:

SAS在金融中的应用七-编程知识网

此模型对非违约企业进行判断出错的概率为18.41%,对违约企业判断出错的概率为31.86%。

Logistic回归构建模型:

/*Logistic回归*/
proc logistic descending data=cwzbsjxl;
model y=x1-x11;/* output out=u DFBETAS=ALL*/
run;

修正的朴素贝叶斯方法:

/*由之前的噪音差法,勉强选出x2,x3,x5,x9x10这几个指标*/
data bys;
set cwzbsjxl;
if x2<=-3.3 then x2p1=0.785;
else x2p1=0.215;
if x2<=-3.3 then x2p0=0.73;
else x2p0=0.27;
if x3<=-33.5 then x3p1=0.781;
else x3p1=0.219;
if x3<=-33.5 then x3p0=0.707;
else x3p0=0.293;
if x5<=-0.3 then x5p1=0.8;
else x5p1=0.2;
if x5<=-0.3 then x5p0=0.716;
else x5p0=0.284;
if x9<=-145.5 then x9p1=0.553;
else x9p1=0.447;
if x9<=-145.5 then x9p0=0.129;
else x9p0=0.871;
if x10<=-13.6 then x10p1=0.965;
else x10p1=0.034;
if x10<=-13.6 then x10p0=0.842;
else x10p0=0.158;
p1=228*x2p1*x3p1*x5p1*x9p1*x10p1/6755;
p0=6467*x2p0*x3p0*x5p0*x9p0*x10p0/6755;
chap=p0-p1;
run;
data byszy;
set  bys;
if y=0 and chap>0 then zyjg=1;
if y=0 and chap<=0 then zyjg=0;
if y=1 and chap>0 then zyjg=0;
if y=1 and chap<=0 then zyjg=1;
run;
proc print data=byszy;
var y chap zyjg;
run;
/*由结果可知其对一个企业是否违约判断的总正确率为93%左右*/

lse x10p0=0.158;
p1=228x2p1x3p1x5p1x9p1x10p1/6755;
p0=6467
x2p0x3p0x5p0x9p0x10p0/6755;
chap=p0-p1;
run;
data byszy;
set bys;
if y=0 and chap>0 then zyjg=1;
if y=0 and chap<=0 then zyjg=0;
if y=1 and chap>0 then zyjg=0;
if y=1 and chap<=0 then zyjg=1;
run;
proc print data=byszy;
var y chap zyjg;
run;
/由结果可知其对一个企业是否违约判断的总正确率为93%左右/


这三个模型中,总的来说,修正的朴素贝叶斯分类法效果较好。