DAFTAR PUSTAKA
Anton, Howard, dan Rorres, C. 1994. Elementary Linear Algebra : Application
Version. Canada : John Wiley & Sans, Inc.
Baki, Isa. Yield Curve Estimation by Spline Based Methods. 2006.
Bliss, R. Robert. Testing Term Structure Estimation Methods. Draft 1996.
Diebold, Francis X., dan Li, C. Forecasting the Term Structure of Government
Bond Yields. Journal of Econometrics, 130 (2005), 337-364
Donohue, Robert J. Introduction to Cashflow Analysis. Regent School Press.
Eberly, David. Least-Squares Fitting of Data with B-Spline Curves. February,
2008
Lin, Bing-Huei. Fitting Term Structure of Interest Rates Using B-splines : The
Case of Taiwanese Government Bonds. Applied Financial Economics, 12,
2002, 57-75.
Lyuu, Yuh-Dauh. 2002. Financial Engineering and Computation : Principles,
Mathematics, Algorithms. USA : Cambridge University Press.
Mathews, John H. 1987. Numerical Methods fot Mathematics, Science, and
Engineering. New Jersey : Prentice-Hall.
McDonald, Robert L. 2002. Derivative Markets. USA : Pearson Education.
McCulloch, J. Huston. Measuring the Term Structure of Interest Rate. The
Journal of Business, 44, No. 1 (1971), 19-31.
McCulloch, J. Huston. The Tax-Adjusted Yield Curve. The Journal of Finance,
30, No. 3 (Jun., 1975), 811-830.
Nash, Stephen G., dan Sofer, A. 1996. Linier and Nonlinier Programming. USA :
McGraw-Hill.
Nocedal, Jorge, dan Wright, Sephen J. 2006. Numerical Optimization. New York
: Springer Verlag.
Nelson, Charles R, dan Siegel, Andrew F. Parsimonius Modelling of Yield Curves.
The Journal of Business, 60, No. 4(1987), 473-489.
Ruf, Johannes. B-Spline of Third Order on a Non-Uniform Grid. Draft 2008.
Syamsuddin, M. Catatan Kuliah Teori Ekonometrika. Maret, 2008.
Danareksa Debt Research Weekly Reports.
http://www.danareksa.com/home/index_news2.cfm?act=riset&categoryId
=5. Diakses terakhir tanggal 25 Mei 2009.
Riding the Yield Curve.
http://www.kiplinger.com/basics/archives/2003/04/bonds4.html. Diakses
tanggal 17 Januari 2009.
LAMPIRAN A KODE MATLAB
Main Program
clear all;data=xlsread('052509'); data2=plotreal(data); global W x_real y_real nk t x_real=data2(:,1); %data x y_real=data2(:,2); %data y
nk=length(x_real); %banyak data x real %---
% NS %---
beta_nol=[10 -8 -3 1]; %tebakan awal optimasi A=[-1 -1 0 0;-1 0 0 0; 0 0 0 -1]; %constrain eps=[0.001 0.001 0.001]; %syarat berhenti
%weight matrix kk=sum(1/x_real);
for i=1:nk W(i,i)=(1/x_real(i))/kk; end %optimasi [b]=barrier(beta_nol) %error var_NS=leastsqr(b)/(nk-1) SE_NS=sqrt(var_NS)
%producing data for plot x1=x_real(1):0.1:x_real(nk); for i=1:length(x1)
y1(i)=NS(b,x1(i)); end
%plot each segment d=NSSegmenPlot(x1,b);
%--- % Spline %---
nknot=floor(sqrt(nk)); %banyak knot stp=round(nk/nknot); %step index x_real %creating knot for i=1:nknot-1 t(i)=x_real(1+(i-1)*stp); end t(nknot)=x_real(nk);
%pembuatan subselang di luar [a,b] nt=length(t); %banyak data t d1=t(2)-t(1); %distance i=-3,-2,-1 d2=t(nt)-t(nt-1); %distance i=n+1,n+2,n+3
%stretching subsection from 0...n into -3...n-3 for i=nt:-1:1 t(i+3)=t(i); end
for i=1:3
%set equidistance for -3..-1 and n+1..n+3 t(4-i)=t(5-i)-d1; t(nt+3+i)=t(nt+2+i)+d2; end
nt=length(t); %update banyak data t %creating B-spline for i=1:nk for j=1:nt-4 B(i,j)=bspline(x_real(i),j); end end
%finding parameter a by least square LL=transpose(B)*W*B;
a=inv(LL)*transpose(B)*W*y_real; %error measure for price
for j=1:nk y_spln(j)=0; for i=1:(length(t)-4) y_spln(j)=y_spln(j)+bspline(x_real(j),i)*a(i); end end y_spln=transpose(y_spln); P=y_real-y_spln; var_MC=(transpose(P)*P)/(nk-nknot) SE_MC=sqrt(var_MC)
%producing data for plot for j=1:length(x1) y2(j)=0; for i=1:(length(t)-4) y2(j)=y2(j)+bspline(x1(j),i)*a(i); end end %plot figure; plot(x1,y1); hold on; plot(x1,y2,'--k');
xlabel('Time to Maturity in Years'); ylabel('Yield %');
title('Yield Curve'); plot(x_real,y_real,'or');
h = legend('Nelson Siegel','McCulloch','Eksak',4); hold off;
Screenshot input
Berikut adalah contoh tampilan input data pada Microsoft Excel untuk data laporan 6 April 2009 dengan nama file 040609.xls dengan kolom A : maturity time dalam hari; kolom B : yield; kolom C : tanggal pengambilan data; kolom D : waktu jatuh tempo obligasi; kolom E : yield; dan kolom F : penanda apakah data digunakan dalam perhitungan atau tidak. Jika diberi angka 1 maka data tidak digunakan.
plotreal.m
| Fungsi : membuat plot data real dan outlier jika ada. Output dari program ini adalah data yang telah dibersihkan dari outlier (yang diberikan angka 1 pada kolom F) function d=plotreal(data) years=252; x_real=data(:,1)./years; y_real=data(:,2); isOutlier=data(:,6); nk=length(x_real); %plot k=0;ind=1;for i=1:nk
%jika data adalah outlier, masukkan ke list if isOutlier(i)==1
k=k+1;
xOut(k)=x_real(i); yOut(k)=y_real(i); else
%jika bukan, masukkan ke perhitungan pembentukan kurva d(ind,1)=x_real(i); d(ind,2)=y_real(i); ind=ind+1; end end plot(x_real,y_real,'or'); hold on;
xlabel('Time to Maturity in Years'); ylabel('Yield %');
title('Data Yield Asli'); %jika ada outlier, plot outlier if k>0
plot(xOut,yOut,'ok','MarkerEdgeColor','k','MarkerFaceColor','k'); h = legend('Data asli','Data yang Tidak Digunakan',4);
end hold off;
barrier.m
| Fungsi : menghitung nilai optimal parameter Nelson-Siegel dengan menggunakan metode penalti tipe barrier% beta_nol : tebakan awal parameter Nelson Siegel % W : matriks bobot
function k=barrier(beta_nol,W) global x_real y_real lambda lambda=10; step_lambda=0.1; akurasi=10^(-9); sudah=false; iterasi=1; syms b1b2tau g=(1/(b1+b2))+(1/(b1))+(1/tau); %barrier method while (sudah==false) beta_baru= fminsearch(@NSleastsqrW,[beta_nol],[],x_real,y_real); cek=lambda*subs(g,[b1,b2,tau],[beta_baru(1),beta_baru(2),beta_baru(4)]); if (norm(cek) <= akurasi sudah=true; else lambda=lambda*step_lambda; beta_nol=beta_baru; iterasi=iterasi+1; end end banyak_iterasi_barrier=iterasi-1 k=beta_nol;
NSleastsqrW.m
| Fungsi : menghitung jumlah kuadrat selisih berbobot antara data asli dan data hasil model Nelson-Siegel ditambah dengan kendala% b : parameter Nelson Siegel % y : vektor data yield asli
% x : vektor data maturity time yang berpasangan dengan data yield function J = NSleastsqrW(b,x,y)
global lambda W n = length(x); Jtemp = 0; for i=1:n,
Jtemp = Jtemp + W(i,i)*(y(i)-NS(b,x(i)))^2; end
J = Jtemp + lambda * ( (1/(b(1)+b(2))) + (1/(b(1))) + (1/b(4)) );
NS.m
| Fungsi : menghitung nilai yield menggunakan model Nelson-Siegel % x : nilai x (maturity time)% b : parameter Nelson Siegel function K=NS(b,x)
Tt=x/b(4);
K=b(1)+(b(2)+b(3))*(1/Tt)*(1-exp(-Tt))-b(3)*exp(-Tt);
NSleastsqr.m
| Fungsi : menghitung jumlah kuadrat selisih tanpa bobot antara data asli dan data hasil model Nelson-Siegel% b : parameter Nelson Siegel function sieg=NSleastsqr(b) global W x_real y_real nk parsi for i=1:nk Tt=x_real(i)/b(4); parsi(i)=b(1)+(b(2)+b(3))*(1/Tt)*(1-exp(-Tt))-b(3)*exp(-Tt); end; P=y_real-transpose(parsi); sieg=transpose(P)*P;
NSSegmenPlot.m
| Fungsi : membentuk plot setiap segmen parameter Nelson-Siegel% x1 : vektor range x (maturity time) % b : parameter Nelson Siegel
function k=NSSegmenPlot(x1,b) figure; Tt1=x1/b(4); for i=1:length(Tt1) NSseg0(i)=b(1); NSseg1(i)=b(2)*(1/Tt1(i))*(1-exp(-Tt1(i))); NSseg2(i)=b(3)*(1/Tt1(i))*(1-exp(-Tt1(i)))-b(3)*exp(-Tt1(i)); end plot(Tt1,NSseg0); hold on plot(Tt1,NSseg1,'--k','LineWidth',3); xlabel('Time to Maturity in Years'); ylabel('Yield %');
plot(Tt1,NSseg2,'--r');
h = legend('Segmen beta 0','Segmen beta 1','Segmen beta 2',4); hold off
k=1;
bspline.m
| Fungsi : menghitung nilai b-spline kubik % t : matriks titik subselang x% x : nilai x (maturity time) yang dicari nilai splinenya % i : urutan subselang spline
function b = bspline(x,i) global t; if ((x>=t(i))&(x<t(i+1))) b=(x-t(i))^3/((t(i+3)-t(i))*(t(i+2)-t(i))*(t(i+1)-t(i))); elseif ((x>=t(i+1))&(x<t(i+2))) b1=((x-t(i))^2*(t(i+2)-x))/((t(i+3)-t(i))*(t(i+2)-t(i))*(t(i+2)-t(i+1))); b2=((x-t(i))*(x-t(i+1))*(t(i+3)-x))/((t(i+3)-t(i))*(t(i+3)-t(i+1))*(t(i+2)-t(i+1))); b3=((x-t(i+1))^2*(t(i+4)-x))/((t(i+4)-t(i+1))*(t(i+3)-t(i+1))*(t(i+2)-t(i+1))); b=b1+b2+b3; elseif ((x>=t(i+2))&(x<t(i+3))) b1=((x-t(i))*(t(i+3)-x)^2)/((t(i+3)-t(i))*(t(i+3)-t(i+1))*(t(i+3)-t(i+2))); b2=((t(i+4)-x)/(t(i+4)-t(i+1))); b3=((x-t(i+1))*(t(i+3)-x))/((t(i+3)-t(i+1))*(t(i+3)-t(i+2))); b4=((x-t(i+2))*(t(i+4)-x))/((t(i+4)-t(i+2))*(t(i+3)-t(i+2))); b=b1+b2*(b3+b4); elseif ((x>=t(i+3))&(x<t(i+4))) b=(t(i+4)-x)^3/((t(i+4)-t(i+1))*(t(i+4)-t(i+2))*(t(i+4)-t(i+3))); else b=0; end;