⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hermite_spline.txt

📁 进行分段三次Hermite插值和分段三次Spline插值
💻 TXT
字号:
进行分段三次Hermite插值和分段三次Spline插值,比较F-C取导数方法所得到期收益率曲线逼近中债结算公司的到期收益率曲线的效果的程序
% 先对数据进行预处理,然后进行分段三次Hermite插值和分段三次Spline插值的程序。

% 这一段程序是为《分段三次Hermite插值构建收益率曲线与节点处导数的选取》编写的。具体见该文。
 
%本程序的内容:
%(1)从中国债券信息网下载到2007年1月4日-2007年10月26日共197个交易日(其中20070219至23五日数据缺失)的银行间固定利率国债收益率数据集,
%   每天一个excel文件,每个文件包括当日的到期收益率、即期收益率、远期到期收益率、远期即期收益率数据;
%   希望用本程序把其中的到期收益率数据单独拿出来组成一个数据矩阵YTM以备分析之用。
%(2)另外还下载到了2007年1月4日-2007年10月26日共197个交易日(其中20070219至23五日数据缺失)的银行间固定利率国债到期收益率(标准期限)数据集,
%   希望用本程序把这些到期收益率(标准期限)数据拿出来组成一个数据矩阵ytm_standard以备进行分段三次Hermite插值之用。
%(3)对数据矩阵ytm_standard里的每日到期收益率(标准期限)每隔0.2年进行一次分段三次hermite插值,
%   插值时采用Fritsch and Carlson(1980)的方法选取导数。因为从20070104-20071026共197天,因此得到197条到期收益率曲线。
%(4)对数据矩阵ytm_standard里的每日到期收益率(标准期限)每隔0.2年进行一次分段三次Spline插值,
%(5)然后把所得的到期收益率曲线和中债公司公布的到期收益率曲线(数据矩阵YTM)相比较。看是不是满足
%   2007年5月20日银监会下发的《关于建立银行业金融机构市场风险管理计量参考基准的通知》的规定。
%(6)在实际操作中,还可以使用央行票据收益率曲线与政策性金融债收益率曲线,并且不限于到期收益率曲线,
%   还可以使用即期收益率曲线。程序本身不变,只要改变读入的数据集即可。
 
clear
tic
%%====================================第1步,整理到期收益率数据集========================
delete E:\Hermite\YTM_interbank_fixed_rate_treasury_bond_20070104-20071026\YTM_20070104-20071026.xls
delete E:\Hermite\YTM_interbank_fixed_rate_treasury_bond_20070104-20071026\YTM_20070104-20071026.txt
cd E:\Hermite\YTM_interbank_fixed_rate_treasury_bond_20070104-20071026; %%把该文件夹设置为当前工作目录;
dir *.xls;                                           %%把当前工作目录下的xls文件都显示出来。它们就是下面要读取处理的文件。本句可以去掉。
filename=dir('*.xls');                               %%把当前工作目录下的xls文件赋值给结构filename。它是个r*1的数组,r是dir列出的xls文档的数目。
filename.name;                                       %%此句依次显示出每个xls文件的名字。
%filename(3:8).name                                  %%此句给出第3到8个文件到名字。
num=length(filename);                                %num表示数组filename的长度,即dir列出的xls文档的数目。
%%下面来读取数据集,因为数据集中含有字符串,因此不能用textread函数。
row=151;
YTM = zeros(row,num+1); 
YTM(:,1)= xlsread(filename(1).name,'A2:A152');         
% 上句读取第一个文件的第1列。不读第1行,因为第1行是文件名。这一行实际上是日期。
% 下面读取每日的到期收益率数据。
for i=1:num
    YTM(:,i+1) = xlsread(filename(i).name,'B2:B152');    
    %读取每个数据集的第2列(即到期收益率)。不读第1行,因为第1行是文件名。
end
% dlmwrite('E:\Hermite\YTM_interbank_fixed_rate_treasury_bond_20070104-20071026\YTM_20070104-20071026.txt',YTM,'delimiter','\t','precision',6,'newline','pc');
% xlswrite('E:\Hermite\YTM_interbank_fixed_rate_treasury_bond_20070104-20071026\YTM_20070104-20071026.xls',YTM)
 
%%================================第2步,整理到期收益率(标准期限)数据集===========================
delete E:\Hermite\YTM_interbank_fixed_rate_treasury_bond_20070104-20071026_standard_maturity\ytm_20070104-20071026_standard.xls
delete E:\Hermite\YTM_interbank_fixed_rate_treasury_bond_20070104-20071026_standard_maturity\ytm_20070104-20071026_standard.txt
cd E:\Hermite\YTM_interbank_fixed_rate_treasury_bond_20070104-20071026_standard_maturity; %%把该文件夹设置为当前工作目录;
dir *.xls;                           %%把当前工作目录下的xls文件都显示出来。它们就是下面要读取处理的文件。本句可以去掉。
filename2=dir('*.xls');              %%把当前工作目录下的xls文件赋值给结构filename2。它是个r*1的数组,r是dir列出的xls文档的数目。
filename2.name;                      %%此句依次显示出每个xls文件的名字。
%filename(3:8).name                  %%此句给出第3到8个文件到名字。
num2=length(filename2);              %num2表示数组filename2的长度,即dir列出的xls文档的数目。
row2=14;
ytm_standard = zeros(row2,num2+1);
ytm_standard(:,1)= xlsread(filename2(1).name,'B2:B15');      
% 上句读取第一个文件的第2列(不读第1行),因为第1行是文件名。这一行实际上是日期。
% 下面读取每日的到期收益率数据。
 
for j=1:num2
    ytm_standard(:,j+1) = xlsread(filename2(j).name,'C2:C15');    
    %读取每个数据集的第3列(即标准期限的到期收益率)。不读第1行,因为第1行是文件名。
end

% dlmwrite('E:\Hermite\YTM_interbank_fixed_rate_treasury_bond_20070104-20071026_standard_maturity\ytm_20070104-20071026_standard.txt',ytm_standard,'delimiter','\t','precision',6,'newline','pc');
% xlswrite('E:\Hermite\YTM_interbank_fixed_rate_treasury_bond_20070104-20071026_standard_maturity\ytm_20070104-20071026_standard.xls',ytm_standard)

%=======================第3步,对到期收益率(标准期限券(点))进行分段三次Hermite插值=========================
%对上面得到的数据矩阵ytm_standard里面的每日到期收益率(标准期限)每隔0.2年进行一次分段三次hermite插值,
%插值时采用Fritsch and Carlson(1980)的方法选取导数。因为从20070104-20071026共197天,因此得到197条到期收益率曲线。
delete  E:\Hermite\output_of_pchip.txt
X = ytm_standard(:,1);           %X表示标准期限。
Y = ytm_standard(:,2:num2+1);    %Y表示相应的每日收益率(标准期限)。
XI = [0:0.2:30]';                %XI是插值点横坐标。共151个,当然有些点的收益率是已知的。
%现在用来进行分段三次Hermite插值,可以调用pchip函数,也可以调用interp1函数。
YIhermite=interp1(X,Y,XI,'pchip');       %或者写作YIhermite=pchip(X,Y,XI),得到的YI是个矩阵。
% dlmwrite('E:\hermite\output_of_pchip.txt',YIhermite,'delimiter','\t','precision',6,'newline','pc');

%===========================第4步,对到期收益率(标准期限券(点))进行分段三次Spline插值======================
delete  E:\Hermite\output_of_spline.txt
YIspline=interp1(X,Y,XI,'spline');  
% dlmwrite('E:\hermite\output_of_spline.txt',YIspline,'delimiter','\t','precision',6,'newline','pc');

%===========================第5步 把插值结果和中债结算公司公布的相应到期收益率曲线绘图比较=====================
% Hermite插值得到的结果放在矩阵YIhermite里,Spline插值结果放在YIspline里。
% 中债结算公司公布的相应到期收益率曲线放在矩阵YTM里。
YTM = YTM(:,2:num+1);                  %截取YTM的第2到num+1列。
% 为了能看得清楚,这里只画出几天的收益率曲线比较图。

figure(1)
plot(XI,YTM(:,1),':','color','red')
% grid on
hold on
plot(XI,YIhermite(:,1),'-','color','black')
hold on
plot(XI,YIspline(:,1),'--','color','blue')
title('2007年1月4日')
xlabel('待偿期(年)')
ylabel('银行间固定利率国债到期收益率')          
legend('中债结算公司的结果','F-C方法分段三次Hermite插值','分段三次Spline插值',4)
  
figure(2)
plot(XI,YTM(:,21),':','color','red')
% grid on
hold on
plot(XI,YIhermite(:,21),'-','color','black')
hold on
plot(XI,YIspline(:,21),'--','color','blue')
title('2007年2月1日')
xlabel('待偿期(年)')
ylabel('银行间固定利率国债到期收益率')          
legend('中债结算公司的结果','F-C方法分段三次Hermite插值','分段三次Spline插值',4)
 
figure(3)
plot(XI,YTM(:,40),':','color','red')
% grid on
hold on
plot(XI,YIhermite(:,40),'-','color','black')
hold on
plot(XI,YIspline(:,40),'--','color','blue')
title('2007年3月7日')
xlabel('待偿期(年)')
ylabel('银行间固定利率国债到期收益率')          
legend('中债结算公司的结果','F-C方法分段三次Hermite插值','分段三次Spline插值',4)
 
figure(4)
plot(XI,YTM(:,60),':','color','red')
% grid on
hold on
plot(XI,YIhermite(:,60),'-','color','black')
hold on
plot(XI,YIspline(:,60),'--','color','blue')
title('2007年4月4日')
xlabel('待偿期(年)')
ylabel('银行间固定利率国债到期收益率')          
legend('中债结算公司的结果','F-C方法分段三次Hermite插值','分段三次Spline插值',4)
 
figure(5)
plot(XI,YTM(:,80),':','color','red')
% grid on
hold on
plot(XI,YIhermite(:,80),'-','color','black')
hold on
plot(XI,YIspline(:,80),'--','color','blue')
title('2007年5月9日')
xlabel('待偿期(年)')
ylabel('银行间固定利率国债到期收益率')          
legend('中债结算公司的结果','F-C方法分段三次Hermite插值','分段三次Spline插值',4)
 
figure(6)
plot(XI,YTM(:,100),':','color','red')
% grid on
hold on
plot(XI,YIhermite(:,100),'-','color','black')
hold on
plot(XI,YIspline(:,100),'--','color','blue')
title('2007年6月6日')
xlabel('待偿期(年)')
ylabel('银行间固定利率国债到期收益率')          
legend('中债结算公司的结果','F-C方法分段三次Hermite插值','分段三次Spline插值',4)
 
figure(7)
plot(XI,YTM(:,120),':','color','red')
% grid on
hold on
plot(XI,YIhermite(:,120),'-','color','black')
hold on
plot(XI,YIspline(:,120),'--','color','blue')
title('2007年7月4日')
xlabel('待偿期(年)')
ylabel('银行间固定利率国债到期收益率')          
legend('中债结算公司的结果','F-C方法分段三次Hermite插值','分段三次Spline插值',4)
 
figure(8)
plot(XI,YTM(:,140),':','color','red')
% grid on
hold on
plot(XI,YIhermite(:,140),'-','color','black')
hold on
plot(XI,YIspline(:,140),'--','color','blue')
title('2007年8月1日')
xlabel('待偿期(年)')
ylabel('银行间固定利率国债到期收益率')          
legend('中债结算公司的结果','F-C方法分段三次Hermite插值','分段三次Spline插值',4)
 
figure(9)
plot(XI,YTM(:,160),':','color','red')
% grid on
hold on
plot(XI,YIhermite(:,160),'-','color','black')
hold on
plot(XI,YIspline(:,160),'--','color','blue')
title('2007年8月29日')
xlabel('待偿期(年)')
ylabel('银行间固定利率国债到期收益率')          
legend('中债结算公司的结果','F-C方法分段三次Hermite插值','分段三次Spline插值',4)
 
figure(10)
plot(XI,YTM(:,183),':','color','red')
% grid on
hold on
plot(XI,YIhermite(:,183),'-','color','black')
hold on
plot(XI,YIspline(:,183),'--','color','blue')
title('2007年10月8日')
xlabel('待偿期(年)')
ylabel('银行间固定利率国债到期收益率')          
legend('中债结算公司的结果','F-C方法分段三次Hermite插值','分段三次Spline插值',4)
 
figure(11)
plot(XI,YTM(:,192),':','color','red')
% grid on
hold on
plot(XI,YIhermite(:,192),'-','color','black')
hold on
plot(XI,YIspline(:,192),'--','color','blue')
title('2007年10月19日')
xlabel('待偿期(年)')
ylabel('银行间固定利率国债到期收益率')          
legend('中债结算公司的结果','F-C方法分段三次Hermite插值','分段三次Spline插值',4)

%==========================第6步 下面用其他方法计算比较F-C方法和中债公司公布的结果之间的差异========================
difference=YIhermite-YTM;
%计算相差的基点数目。
basepoints=difference*100; 
dlmwrite('E:\hermite\output_of_basepoints.txt',basepoints,'delimiter','\t','precision',6,'newline','pc');
%计算相差的百分比。
percent=difference./YTM;
dlmwrite('E:\hermite\output_of_percent.txt',percent,'delimiter','\t','precision',6,'newline','pc');
 
%计算difference的均值向量和标准差向量。
meandiff = mean(difference,2);        %2表示所计算的是矩阵difference每行的均值。这样meandiff是151行1列的向量。
dlmwrite('E:\hermite\output_of_meandiff.txt',meandiff,'delimiter','\t','precision',6,'newline','pc');
 
stddiff = std(difference,0,2);        %2表示计算的是矩阵difference每行的标准差,0表示计算标准差的公式分母为n-1,即样本方差。
dlmwrite('E:\hermite\output_of_stddiff.txt',stddiff,'delimiter','\t','precision',6,'newline','pc');
 
%计算percent的均值向量和标准差向量。
meanpercent = mean(percent,2);        %2表示所计算的是矩阵percent每行的均值。这样meanpercent是151行1列的向量。
dlmwrite('E:\hermite\output_of_meanpercent.txt',meanpercent,'delimiter','\t','precision',6,'newline','pc');

stdpercent = std(percent,0,2);        %2表示计算的是矩阵percent每行的标准差,0表示计算标准差的公式分母为n-1,即样本方差。
dlmwrite('E:\hermite\output_of_stdpercent.txt',stdpercent,'delimiter','\t','precision',6,'newline','pc');
  
toc
 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -