Lampiran 1 : Kode MATLAB untuk model-model khusus APARCH Berdistribusi Normal
1.1.Kode Utama
1.1.1.
Kode Utama ARCH
function [ Hasil ] = MCMC_ARCH_RW_adapt(R)
%%%%% Function : Distribusi posterior dari parameter model GARCH %%%%% Inputs :
%%%%% R : returns
%%%%% its_MCMC : banyak iterasi MCMC
%%%%% RW_step : suatu skalar yang merupakan variansi untuk distribusi proposal dalam proses Random Walk
%%%%% Outputs :
%%%%% post_theta_RW : Posterior MCMC untuk omega, alfa, beta, gamma, dan
%%%%% delta
%%%%% post_theta_RW_adapt : Posterior MCMC untuk Omega,Alpha,Beta, Gamma, Delta dengan proses adaptive (selama burn-in)
%%%%% post_like_RW : Log-likelihood dari posterior
%%%%% post_like_RW_adapt : Log-likelihood posterior dari proses adaptive
%%%%% Ditampilkan juga hasil test diagnosa if(nargin<4)
graph = 1; if(nargin<3)
RW_step = 1; if(nargin<2)
its_MCMC = 15000; end
end end
%%%% Returns simpan dalam variabel T T = max(size(R));
if(T~=size(R,1)) R = R';
end
R2 = R.*R;
%%%%%%%%%% Dipilih nilai awal
theta0 = [0.1 0.2]; theta_RW_adapt = theta0;
like_current = ARCH_likelihood_adapt(R,R2,theta0); like_current_RW_adapt = like_current;
%%%%%%%%%% Batas-batas dari prior : Omega ~ U[0,wka] ; alpha ~ U[0,1] ;
%%%%%%%%%% beta|alpha ~ U[0,1-alpha], delta ~ [0,10], gamma ~ [-1,1] %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
wka = 10; burn_in = 5000;
%%%%%%%%%%% Proses Random Walk dengan adaptative selama burn-in %%%%%%%%%%% Lihat Atchadé and Rosenthal (2005)
RW_step_adapt = [0.005 0.005]'; theta = zeros(N,2); min_max_var = [1e-5 10]; eta = 0.6;
%%MCMC
accept_adapt = ones(1,2); thetaProp = zeros(1,2); thetaAcc = zeros(1,2); tic
for i=1:its_MCMC
thetaProp = thetaProp + 1; theta_prop = theta_RW_adapt; for q=1:5
theta_prop(q) = theta_RW_adapt(q) + sqrt(RW_step_adapt(q))*randn();
test = 0; if(q==1) %omega
if(theta_prop(q)>0 && theta_prop(q)<wka) test = 1;
end % alfa else
if(theta_prop(q)>0 && theta_prop(q)<1) test = 1;
end end
if(test==1)
[log_like_move] = ARCH_likelihood_adapt(R,R2,theta_prop); prior_lama = -log(wka) - log(1-theta_RW_adapt(2));
prior_baru = -log(wka) - log(1-theta_prop(2)); if(exp(log_like_move+prior_baru-like_current_RW_adapt-prior_lama)>rand())
like_current_RW_adapt = log_like_move; theta_RW_adapt(q) = theta_prop(q); accept_adapt(q) = accept_adapt(q)+1; thetaAcc(q) = thetaAcc(q) + 1; else
theta_prop(q) = theta_RW_adapt(q); end
else
theta_prop(q) = theta_RW_adapt(q); end
RW_step_adapt(q) = max(min_max_var(1),RW_step_adapt(q) + (accept_adapt(q)/i - 0.44)/(i^eta));
if(RW_step_adapt(q)>min_max_var(2))
RW_step_adapt(q) = min_max_var(2); end
if mod(i,100) == 0
thetaProp = zeros(1,2); thetaAcc = zeros(1,2); end
%theta_RW_adapt
% simpan w, a, b, del if i>burn_in
theta(i-burn_in,:) = theta_RW_adapt;
post_like(i-burn_in,1) = like_current_RW_adapt; end
% Start timer after burn-in if i == burn_in
disp('Burn-in complete, now drawing posterior samples.') end
end toc
% --- Algoritma MCMC. Step 2: Menghitung rata-rata Monte Carlo Hasil.post_theta = theta;
Hasil.post_like = post_like; Hasil.post_step = theta_RW_adapt; MP = mean(Hasil.post_theta);
SP = std(Hasil.post_theta);
% ===== Integrated Autocorrelation Time (IACT) ========================
% Berapa banyak sampel yang harus dibangkitkan untuk mendapatkan sampel
% yang independen (seberapa cepat konvergensi simulasi) resultsIAT = IACT(Hasil.post_theta);
IAT = [resultsIAT.iact]; % ===== Uji Konvergensi Geweke
============================================ idraw1 = round(.1*N);
resultCV = momentg(Hasil.post_theta(1:idraw1,:)); meansa = [resultCV.pmean];
nsea = [resultCV.nse1]; idraw2 = round(.5*N)+1;
resultCV = momentg(Hasil.post_theta(idraw2:N,:)); meansb = [resultCV.pmean];
nseb = [resultCV.nse1];
CD = (meansa - meansb)./sqrt(nsea+nseb); onetail = 1-normcdf(abs(CD),0,1);
pV = 2*onetail;
% ===== 95% Highest Posterior Density (HPD) Interval ======================
resultsHPD = HPD(Hasil.post_theta,0.05); LB = [resultsHPD.LB];
% ===== Numerical Standard Error (NSE) ==================================== resultsNSE = NSE(Hasil.post_theta); NSEd = [resultsNSE.nse];
%====================== Mengatur hasil pencetakan =========================
%--- Statistik Parameter: in.cnames = char('w','a');
in.rnames = char('Parameter','Mean','SD','LB','UB','IACT','NSE','G-CD','p-Value');
in.fmt = '%16.6f';
tmp = [MP; SP; LB; UB; IAT; NSEd; CD; pV];
fprintf(1,'Estimasi menggunakan MCMC dan Uji Diagnosa\n'); % cetak hasil
mprint(tmp,in);
1.1.2.
Kode Utama GARCH
function [ Hasil ] = MCMC_GARCH_RW_adapt(R)
%%%%% Function : Distribusi posterior dari parameter model GARCH %%%%% Inputs :
%%%%% R : returns
%%%%% its_MCMC : banyak iterasi MCMC
%%%%% RW_step : suatu skalar yang merupakan variansi untuk distribusi proposal dalam proses Random Walk
%%%%% Outputs :
%%%%% post_theta_RW : Posterior MCMC untuk omega, alfa, beta, gamma, dan
%%%%% delta
%%%%% post_theta_RW_adapt : Posterior MCMC untuk Omega,Alpha,Beta, Gamma, Delta dengan proses adaptive (selama burn-in)
%%%%% post_like_RW : Log-likelihood dari posterior
%%%%% post_like_RW_adapt : Log-likelihood posterior dari proses adaptive
%%%%% Ditampilkan juga hasil test diagnosa if(nargin<4)
graph = 1; if(nargin<3)
RW_step = 1; if(nargin<2)
its_MCMC = 15000; end
end end
%%%% Returns simpan dalam variabel T T = max(size(R));
if(T~=size(R,1)) R = R';
end
%%%%%%%%%% Dipilih nilai awal
theta0 = [0.1 0.2 0.3]; theta_RW_adapt = theta0;
like_current = GARCH_likelihood_adapt(R,R2,theta0); like_current_RW_adapt = like_current;
%%%%%%%%%% Batas-batas dari prior : Omega ~ U[0,wka] ; alpha ~ U[0,1] ;
%%%%%%%%%% beta|alpha ~ U[0,1-alpha], delta ~ [0,10], gamma ~ [-1,1] %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
wka = 10; burn_in = 5000;
N = its_MCMC-burn_in; post_like = zeros(N,1);
%%%%%%%%%%% Proses Random Walk dengan adaptative selama burn-in %%%%%%%%%%% Lihat Atchadé and Rosenthal (2005)
RW_step_adapt = [0.005 0.005 0.005]'; theta = zeros(N,3);
min_max_var = [1e-5 10]; eta = 0.6;
%%MCMC
accept_adapt = ones(1,3); thetaProp = zeros(1,3); thetaAcc = zeros(1,3); tic
for i=1:its_MCMC
thetaProp = thetaProp + 1; theta_prop = theta_RW_adapt; for q=1:5
theta_prop(q) = theta_RW_adapt(q) + sqrt(RW_step_adapt(q))*randn();
test = 0; if(q==1) %omega
if(theta_prop(q)>0 && theta_prop(q)<wka) test = 1;
end
% alfa dan beta else
if(theta_prop(q)>0 && sum(theta_prop(2:3))<1 && theta_prop(q)<1) test = 1;
end end
if(test==1)
[log_like_move] = GARCH_likelihood_adapt(R,R2,theta_prop); prior_lama = -log(wka) - log(1-theta_RW_adapt(2));
prior_baru = -log(wka) - log(1-theta_prop(2)); if(exp(log_like_move+prior_baru-like_current_RW_adapt-prior_lama)>rand())
theta_RW_adapt(q) = theta_prop(q); accept_adapt(q) = accept_adapt(q)+1; thetaAcc(q) = thetaAcc(q) + 1; else
theta_prop(q) = theta_RW_adapt(q); end
else
theta_prop(q) = theta_RW_adapt(q); end
RW_step_adapt(q) = max(min_max_var(1),RW_step_adapt(q) + (accept_adapt(q)/i - 0.44)/(i^eta));
if(RW_step_adapt(q)>min_max_var(2))
RW_step_adapt(q) = min_max_var(2); end
end
if mod(i,100) == 0
thetaProp = zeros(1,3); thetaAcc = zeros(1,3); end
%theta_RW_adapt % simpan w, a, b if i>burn_in
theta(i-burn_in,:) = theta_RW_adapt;
post_like(i-burn_in,1) = like_current_RW_adapt; end
% Start timer after burn-in if i == burn_in
disp('Burn-in complete, now drawing posterior samples.') end
end toc
% --- Algoritma MCMC. Step 2: Menghitung rata-rata Monte Carlo Hasil.post_theta = theta;
Hasil.post_like = post_like; Hasil.post_step = theta_RW_adapt; MP = mean(Hasil.post_theta);
SP = std(Hasil.post_theta);
% ===== Integrated Autocorrelation Time (IACT) ========================
% Berapa banyak sampel yang harus dibangkitkan untuk mendapatkan sampel
% yang independen (seberapa cepat konvergensi simulasi) resultsIAT = IACT(Hasil.post_theta);
IAT = [resultsIAT.iact]; % ===== Uji Konvergensi Geweke
============================================ idraw1 = round(.1*N);
resultCV = momentg(Hasil.post_theta(1:idraw1,:)); meansa = [resultCV.pmean];
idraw2 = round(.5*N)+1;
resultCV = momentg(Hasil.post_theta(idraw2:N,:)); meansb = [resultCV.pmean];
nseb = [resultCV.nse1];
CD = (meansa - meansb)./sqrt(nsea+nseb); onetail = 1-normcdf(abs(CD),0,1);
pV = 2*onetail;
% ===== 95% Highest Posterior Density (HPD) Interval ======================
resultsHPD = HPD(Hasil.post_theta,0.05); LB = [resultsHPD.LB];
UB = [resultsHPD.UB];
% ===== Numerical Standard Error (NSE) ==================================== resultsNSE = NSE(Hasil.post_theta); NSEd = [resultsNSE.nse];
%====================== Mengatur hasil pencetakan =========================
%--- Statistik Parameter: in.cnames = char('w','a');
in.rnames = char('Parameter','Mean','SD','LB','UB','IACT','NSE','G-CD','p-Value');
in.fmt = '%16.6f';
tmp = [MP; SP; LB; UB; IAT; NSEd; CD; pV];
fprintf(1,'Estimasi menggunakan MCMC dan Uji Diagnosa\n'); % cetak hasil
mprint(tmp,in);
1.1.3.
Kode Utama TARCH
function [ Hasil ] = MCMC_TARCH_RW_adapt(R)
%%%%% Function : Distribusi posterior dari parameter model GARCH %%%%% Inputs :
%%%%% R : returns
%%%%% its_MCMC : banyak iterasi MCMC
%%%%% RW_step : suatu skalar yang merupakan variansi untuk distribusi proposal dalam proses Random Walk
%%%%% Outputs :
%%%%% post_theta_RW : Posterior MCMC untuk omega, alfa, beta, gamma, dan
%%%%% delta
%%%%% post_theta_RW_adapt : Posterior MCMC untuk Omega,Alpha,Beta, Gamma, Delta dengan proses adaptive (selama burn-in)
%%%%% post_like_RW : Log-likelihood dari posterior
%%%%% post_like_RW_adapt : Log-likelihood posterior dari proses adaptive
if(nargin<4) graph = 1; if(nargin<3)
RW_step = 1; if(nargin<2)
its_MCMC = 15000; end
end end
%%%% Returns simpan dalam variabel T T = max(size(R));
if(T~=size(R,1)) R = R';
end
R2 = R.*R;
%%%%%%%%%% Dipilih nilai awal
theta0 = [0.1 0.2 0.1 0.1]; theta_RW_adapt = theta0;
like_current = TARCH_likelihood_adapt(R,R2,theta0); like_current_RW_adapt = like_current;
%%%%%%%%%% Batas-batas dari prior : Omega ~ U[0,wka] ; alpha ~ U[0,1] ;
%%%%%%%%%% beta|alpha ~ U[0,1-alpha], delta ~ [0,10], gamma ~ [-1,1] %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
wka = 10; burn_in = 5000;
N = its_MCMC-burn_in; post_like = zeros(N,1);
%%%%%%%%%%% Proses Random Walk dengan adaptative selama burn-in %%%%%%%%%%% Lihat Atchadé and Rosenthal (2005)
RW_step_adapt = [0.003 0.001 0.002 0.004]'; theta = zeros(N,4);
min_max_var = [1e-5 10]; eta = 0.6;
%%MCMC
accept_adapt = ones(1,4); thetaProp = zeros(1,4); thetaAcc = zeros(1,4); tic
for i=1:its_MCMC
thetaProp = thetaProp + 1; theta_prop = theta_RW_adapt; for q=1:5
theta_prop(q) = theta_RW_adapt(q) + sqrt(RW_step_adapt(q))*randn();
test = 0;
pos = theta(2) - 0.5*theta(4) - theta(3); if(q==1) %omega
end
elseif q==4 %gamma
if(theta_prop(q)>=-1 && theta_prop(q)<=1 && pos<1) test = 1;
end
% alfa dan beta else
if(theta_prop(q)>0 && sum(theta_prop(2:3))<1 && theta_prop(q)<1) test = 1;
end end
if(test==1)
[log_like_move] = TARCH_likelihood_adapt(R,R2,theta_prop); prior_lama = -log(wka) - log(1-theta_RW_adapt(2));
RW_step_adapt(q) = max(min_max_var(1),RW_step_adapt(q) + (accept_adapt(q)/i - 0.44)/(i^eta));
post_like(i-burn_in,1) = like_current_RW_adapt; end
% Start timer after burn-in if i == burn_in
disp('Burn-in complete, now drawing posterior samples.') end
end toc
% --- Algoritma MCMC. Step 2: Menghitung rata-rata Monte Carlo Hasil.post_theta = theta;
MP = mean(Hasil.post_theta); SP = std(Hasil.post_theta);
% ===== Integrated Autocorrelation Time (IACT) ========================
% Berapa banyak sampel yang harus dibangkitkan untuk mendapatkan sampel
% yang independen (seberapa cepat konvergensi simulasi) resultsIAT = IACT(Hasil.post_theta);
IAT = [resultsIAT.iact]; % ===== Uji Konvergensi Geweke
============================================ idraw1 = round(.1*N);
resultCV = momentg(Hasil.post_theta(1:idraw1,:)); meansa = [resultCV.pmean];
nsea = [resultCV.nse1]; idraw2 = round(.5*N)+1;
resultCV = momentg(Hasil.post_theta(idraw2:N,:)); meansb = [resultCV.pmean];
nseb = [resultCV.nse1];
CD = (meansa - meansb)./sqrt(nsea+nseb); onetail = 1-normcdf(abs(CD),0,1);
pV = 2*onetail;
% ===== 95% Highest Posterior Density (HPD) Interval ======================
resultsHPD = HPD(Hasil.post_theta,0.05); LB = [resultsHPD.LB];
UB = [resultsHPD.UB];
% ===== Numerical Standard Error (NSE) ==================================== resultsNSE = NSE(Hasil.post_theta); NSEd = [resultsNSE.nse];
%====================== Mengatur hasil pencetakan =========================
%--- Statistik Parameter:
in.cnames = char('w','a',’b’. 'y');
in.rnames = char('Parameter','Mean','SD','LB','UB','IACT','NSE','G-CD','p-Value');
in.fmt = '%16.6f';
tmp = [MP; SP; LB; UB; IAT; NSEd; CD; pV];
fprintf(1,'Estimasi menggunakan MCMC dan Uji Diagnosa\n'); % cetak hasil
mprint(tmp,in);
1.1.4.
Kode Utama TS-GARCH
%%%%% Function : Distribusi posterior dari parameter model GARCH %%%%% Inputs :
%%%%% R : returns
%%%%% its_MCMC : banyak iterasi MCMC
%%%%% RW_step : suatu skalar yang merupakan variansi untuk distribusi proposal dalam proses Random Walk
%%%%% Outputs :
%%%%% post_theta_RW : Posterior MCMC untuk omega, alfa, beta, gamma, dan
%%%%% delta
%%%%% post_theta_RW_adapt : Posterior MCMC untuk Omega,Alpha,Beta, Gamma, Delta dengan proses adaptive (selama burn-in)
%%%%% post_like_RW : Log-likelihood dari posterior
%%%%% post_like_RW_adapt : Log-likelihood posterior dari proses adaptive
%%%%% Ditampilkan juga hasil test diagnosa if(nargin<4)
graph = 1; if(nargin<3)
RW_step = 1; if(nargin<2)
its_MCMC = 15000; end
end end
%%%% Returns simpan dalam variabel T T = max(size(R));
if(T~=size(R,1)) R = R';
end
R2 = R.*R;
%%%%%%%%%% Dipilih nilai awal
theta0 = [0.1 0.2 0.3]; theta_RW_adapt = theta0;
like_current = TSGARCH_likelihood_adapt(R,R2,theta0); like_current_RW_adapt = like_current;
%%%%%%%%%% Batas-batas dari prior : Omega ~ U[0,wka] ; alpha ~ U[0,1] ;
%%%%%%%%%% beta|alpha ~ U[0,1-alpha], delta ~ [0,10], gamma ~ [-1,1] %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
wka = 10; burn_in = 5000;
N = its_MCMC-burn_in; post_like = zeros(N,1);
%%%%%%%%%%% Proses Random Walk dengan adaptative selama burn-in %%%%%%%%%%% Lihat Atchadé and Rosenthal (2005)
RW_step_adapt = [0.005 0.005 0.005]'; theta = zeros(N,3);
%%MCMC
accept_adapt = ones(1,3); thetaProp = zeros(1,3); thetaAcc = zeros(1,3); tic
for i=1:its_MCMC
thetaProp = thetaProp + 1; theta_prop = theta_RW_adapt; for q=1:5
theta_prop(q) = theta_RW_adapt(q) + sqrt(RW_step_adapt(q))*randn();
test = 0;
pos = theta(2) - 0.5*theta(4) - theta(3); if(q==1) %omega
if(theta_prop(q)>0 && theta_prop(q)<wka && pos<1) test = 1;
end
% alfa dan beta else
if(theta_prop(q)>0 && sum(theta_prop(2:3))<1 && theta_prop(q)<1) test = 1;
end end
if(test==1)
[log_like_move] =
TSGARCH_likelihood_adapt(R,R2,theta_prop);
prior_lama = -log(wka) - log(1-theta_RW_adapt(2)); prior_baru = -log(wka) - log(1-theta_prop(2)); if(exp(log_like_move+prior_baru-like_current_RW_adapt-prior_lama)>rand())
like_current_RW_adapt = log_like_move; theta_RW_adapt(q) = theta_prop(q); accept_adapt(q) = accept_adapt(q)+1; thetaAcc(q) = thetaAcc(q) + 1; else
theta_prop(q) = theta_RW_adapt(q); end
else
theta_prop(q) = theta_RW_adapt(q); end
RW_step_adapt(q) = max(min_max_var(1),RW_step_adapt(q) + (accept_adapt(q)/i - 0.44)/(i^eta));
if(RW_step_adapt(q)>min_max_var(2))
RW_step_adapt(q) = min_max_var(2); end
end
if mod(i,100) == 0
thetaProp = zeros(1,3); thetaAcc = zeros(1,3); end
% simpan w, a, b, del if i>burn_in
theta(i-burn_in,:) = theta_RW_adapt;
post_like(i-burn_in,1) = like_current_RW_adapt; end
% Start timer after burn-in if i == burn_in
disp('Burn-in complete, now drawing posterior samples.') end
end toc
% --- Algoritma MCMC. Step 2: Menghitung rata-rata Monte Carlo Hasil.post_theta = theta;
Hasil.post_like = post_like; Hasil.post_step = theta_RW_adapt; MP = mean(Hasil.post_theta);
SP = std(Hasil.post_theta);
% ===== Integrated Autocorrelation Time (IACT) ========================
% Berapa banyak sampel yang harus dibangkitkan untuk mendapatkan sampel
% yang independen (seberapa cepat konvergensi simulasi) resultsIAT = IACT(Hasil.post_theta);
IAT = [resultsIAT.iact]; % ===== Uji Konvergensi Geweke
============================================ idraw1 = round(.1*N);
resultCV = momentg(Hasil.post_theta(1:idraw1,:)); meansa = [resultCV.pmean];
nsea = [resultCV.nse1]; idraw2 = round(.5*N)+1;
resultCV = momentg(Hasil.post_theta(idraw2:N,:)); meansb = [resultCV.pmean];
nseb = [resultCV.nse1];
CD = (meansa - meansb)./sqrt(nsea+nseb); onetail = 1-normcdf(abs(CD),0,1);
pV = 2*onetail;
% ===== 95% Highest Posterior Density (HPD) Interval ======================
resultsHPD = HPD(Hasil.post_theta,0.05); LB = [resultsHPD.LB];
UB = [resultsHPD.UB];
% ===== Numerical Standard Error (NSE) ==================================== resultsNSE = NSE(Hasil.post_theta); NSEd = [resultsNSE.nse];
========================= %--- Statistik Parameter: in.cnames = char('w','a','b');
in.rnames = char('Parameter','Mean','SD','LB','UB','IACT','NSE','G-CD','p-Value');
in.fmt = '%16.6f';
tmp = [MP; SP; LB; UB; IAT; NSEd; CD; pV];
fprintf(1,'Estimasi menggunakan MCMC dan Uji Diagnosa\n'); % cetak hasil
mprint(tmp,in);
1.1.5.
Kode Utama GJR-GARCH
function [ Hasil ] = MCMC_GJR_RW_adapt(R)
%%%%% Function : Distribusi posterior dari parameter model GARCH %%%%% Inputs :
%%%%% R : returns
%%%%% its_MCMC : banyak iterasi MCMC
%%%%% RW_step : suatu skalar yang merupakan variansi untuk distribusi proposal dalam proses Random Walk
%%%%% Outputs :
%%%%% post_theta_RW : Posterior MCMC untuk omega, alfa, beta, gamma, dan
%%%%% delta
%%%%% post_theta_RW_adapt : Posterior MCMC untuk Omega,Alpha,Beta, Gamma, Delta dengan proses adaptive (selama burn-in)
%%%%% post_like_RW : Log-likelihood dari posterior
%%%%% post_like_RW_adapt : Log-likelihood posterior dari proses adaptive
%%%%% Ditampilkan juga hasil test diagnosa if(nargin<4)
graph = 1; if(nargin<3)
RW_step = 1; if(nargin<2)
its_MCMC = 15000; end
end end
%%%% Returns simpan dalam variabel T T = max(size(R));
if(T~=size(R,1)) R = R';
end
R2 = R.*R;
%%%%%%%%%% Dipilih nilai awal
theta0 = [0.1 0.3 0.1 -0.6]; theta_RW_adapt = theta0;
like_current_RW_adapt = like_current;
%%%%%%%%%% Batas-batas dari prior : Omega ~ U[0,wka] ; alpha ~ U[0,1] ;
%%%%%%%%%% beta|alpha ~ U[0,1-alpha], delta ~ [0,10], gamma ~ [-1,1] %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
wka = 10; burn_in = 5000;
N = its_MCMC-burn_in; post_like = zeros(N,1);
%%%%%%%%%%% Proses Random Walk dengan adaptative selama burn-in %%%%%%%%%%% Lihat Atchadé and Rosenthal (2005)
RW_step_adapt = [0.005 0.005 0.005 0.005]'; theta = zeros(N,4);
min_max_var = [1e-5 10]; eta = 0.6;
%%MCMC
accept_adapt = ones(1,4); thetaProp = zeros(1,4); thetaAcc = zeros(1,4); tic
for i=1:its_MCMC
thetaProp = thetaProp + 1; theta_prop = theta_RW_adapt; for q=1:5
theta_prop(q) = theta_RW_adapt(q) + sqrt(RW_step_adapt(q))*randn();
test = 0;
pos = theta(2) - 0.5*theta(4) - theta(3); if(q==1) %omega
if(theta_prop(q)>0 && theta_prop(q)<wka && pos<1) test = 1;
end
elseif q==4 %gamma
if(theta_prop(q)>=-1 && theta_prop(q)<=1 && pos<1) test=1;
end
% alfa dan beta else
if(theta_prop(q)>0 && pos<1 && theta_prop(q)<1) test = 1;
end end
if(test==1)
[log_like_move] = GJR_likelihood_adapt(R,R2,theta_prop); prior_lama = -log(wka) - log(1-theta_RW_adapt(2));
prior_baru = -log(wka) - log(1-theta_prop(2)); if(exp(log_like_move+prior_baru-like_current_RW_adapt-prior_lama)>rand())
accept_adapt(q) = accept_adapt(q)+1; thetaAcc(q) = thetaAcc(q) + 1; else
theta_prop(q) = theta_RW_adapt(q); end
else
theta_prop(q) = theta_RW_adapt(q); end
RW_step_adapt(q) = max(min_max_var(1),RW_step_adapt(q) + (accept_adapt(q)/i - 0.44)/(i^eta));
if(RW_step_adapt(q)>min_max_var(2))
RW_step_adapt(q) = min_max_var(2); end
end
if mod(i,100) == 0
thetaProp = zeros(1,4); thetaAcc = zeros(1,4); end
%theta_RW_adapt % simpan w, a, b, y if i>burn_in
theta(i-burn_in,:) = theta_RW_adapt;
post_like(i-burn_in,1) = like_current_RW_adapt; end
% Start timer after burn-in if i == burn_in
disp('Burn-in complete, now drawing posterior samples.') end
end toc
% --- Algoritma MCMC. Step 2: Menghitung rata-rata Monte Carlo Hasil.post_theta = theta;
Hasil.post_like = post_like; Hasil.post_step = theta_RW_adapt; MP = mean(Hasil.post_theta);
SP = std(Hasil.post_theta);
% ===== Integrated Autocorrelation Time (IACT) ========================
% Berapa banyak sampel yang harus dibangkitkan untuk mendapatkan sampel
% yang independen (seberapa cepat konvergensi simulasi) resultsIAT = IACT(Hasil.post_theta);
IAT = [resultsIAT.iact]; % ===== Uji Konvergensi Geweke
============================================ idraw1 = round(.1*N);
resultCV = momentg(Hasil.post_theta(1:idraw1,:)); meansa = [resultCV.pmean];
idraw2 = round(.5*N)+1;
resultCV = momentg(Hasil.post_theta(idraw2:N,:)); meansb = [resultCV.pmean];
nseb = [resultCV.nse1];
CD = (meansa - meansb)./sqrt(nsea+nseb); onetail = 1-normcdf(abs(CD),0,1);
pV = 2*onetail;
% ===== 95% Highest Posterior Density (HPD) Interval ======================
resultsHPD = HPD(Hasil.post_theta,0.05); LB = [resultsHPD.LB];
UB = [resultsHPD.UB];
% ===== Numerical Standard Error (NSE) ==================================== resultsNSE = NSE(Hasil.post_theta); NSEd = [resultsNSE.nse];
%====================== Mengatur hasil pencetakan =========================
%--- Statistik Parameter:
in.cnames = char('w','a','b','y');
in.rnames = char('Parameter','Mean','SD','LB','UB','IACT','NSE','G-CD','p-Value');
in.fmt = '%16.6f';
tmp = [MP; SP; LB; UB; IAT; NSEd; CD; pV];
fprintf(1,'Estimasi menggunakan MCMC dan Uji Diagnosa\n'); % cetak hasil
mprint(tmp,in);
1.1.6.
Kode Utama NARCH
function [ Hasil ] = MCMC_NARCH_RW_adapt(R)
%%%%% Function : Distribusi posterior dari parameter model GARCH %%%%% Inputs :
%%%%% R : returns
%%%%% its_MCMC : banyak iterasi MCMC
%%%%% RW_step : suatu skalar yang merupakan variansi untuk distribusi proposal dalam proses Random Walk
%%%%% Outputs :
%%%%% post_theta_RW : Posterior MCMC untuk omega, alfa, beta, gamma, dan
%%%%% delta
%%%%% post_theta_RW_adapt : Posterior MCMC untuk Omega,Alpha,Beta, Gamma, Delta dengan proses adaptive (selama burn-in)
%%%%% post_like_RW : Log-likelihood dari posterior
%%%%% post_like_RW_adapt : Log-likelihood posterior dari proses adaptive
graph = 1; if(nargin<3)
RW_step = 1; if(nargin<2)
its_MCMC = 15000; end
end end
%%%% Returns simpan dalam variabel T T = max(size(R));
if(T~=size(R,1)) R = R';
end
R2 = R.*R;
%%%%%%%%%% Dipilih nilai awal
theta0 = [0.1 0.3 -0.6]; theta_RW_adapt = theta0;
like_current = NARCH_likelihood_adapt(R,R2,theta0); like_current_RW_adapt = like_current;
%%%%%%%%%% Batas-batas dari prior : Omega ~ U[0,wka] ; alpha ~ U[0,1] ;
%%%%%%%%%% beta|alpha ~ U[0,1-alpha], delta ~ [0,10], gamma ~ [-1,1] %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
wka = 10; burn_in = 5000;
N = its_MCMC-burn_in; post_like = zeros(N,1);
%%%%%%%%%%% Proses Random Walk dengan adaptative selama burn-in %%%%%%%%%%% Lihat Atchadé and Rosenthal (2005)
RW_step_adapt = [0.005 0.005 0.005]'; theta = zeros(N,3);
min_max_var = [1e-5 10]; eta = 0.6;
%%MCMC
accept_adapt = ones(1,3); thetaProp = zeros(1,3); thetaAcc = zeros(1,3); tic
for i=1:its_MCMC
thetaProp = thetaProp + 1; theta_prop = theta_RW_adapt; for q=1:5
theta_prop(q) = theta_RW_adapt(q) + sqrt(RW_step_adapt(q))*randn();
test = 0;
pos = theta(2) - 0.5*theta(4) - theta(3); if(q==1) %omega
if(theta_prop(q)>0 && theta_prop(q)<wka && pos<1) test = 1;
elseif q==3 %delta
if(theta_prop(q)>=-1 && theta_prop(q)<=10) test=1;
end % alfa else
if(theta_prop(q)>0 && theta_prop(q)<1) test = 1;
end end
if(test==1)
[log_like_move] = NARCH_likelihood_adapt(R,R2,theta_prop); prior_lama = -log(wka) - log(1-theta_RW_adapt(2));
prior_baru = -log(wka) - log(1-theta_prop(2)); if(exp(log_like_move+prior_baru-like_current_RW_adapt-prior_lama)>rand())
like_current_RW_adapt = log_like_move; theta_RW_adapt(q) = theta_prop(q); accept_adapt(q) = accept_adapt(q)+1; thetaAcc(q) = thetaAcc(q) + 1; else
theta_prop(q) = theta_RW_adapt(q); end
else
theta_prop(q) = theta_RW_adapt(q); end
RW_step_adapt(q) = max(min_max_var(1),RW_step_adapt(q) + (accept_adapt(q)/i - 0.44)/(i^eta));
if(RW_step_adapt(q)>min_max_var(2))
RW_step_adapt(q) = min_max_var(2); end
end
if mod(i,100) == 0
thetaProp = zeros(1,3); thetaAcc = zeros(1,3); end
%theta_RW_adapt % simpan w, a, del if i>burn_in
theta(i-burn_in,:) = theta_RW_adapt;
post_like(i-burn_in,1) = like_current_RW_adapt; end
% Start timer after burn-in if i == burn_in
disp('Burn-in complete, now drawing posterior samples.') end
end toc
% --- Algoritma MCMC. Step 2: Menghitung rata-rata Monte Carlo Hasil.post_theta = theta;
MP = mean(Hasil.post_theta); SP = std(Hasil.post_theta);
% ===== Integrated Autocorrelation Time (IACT) ========================
% Berapa banyak sampel yang harus dibangkitkan untuk mendapatkan sampel
% yang independen (seberapa cepat konvergensi simulasi) resultsIAT = IACT(Hasil.post_theta);
IAT = [resultsIAT.iact]; % ===== Uji Konvergensi Geweke
============================================ idraw1 = round(.1*N);
resultCV = momentg(Hasil.post_theta(1:idraw1,:)); meansa = [resultCV.pmean];
nsea = [resultCV.nse1]; idraw2 = round(.5*N)+1;
resultCV = momentg(Hasil.post_theta(idraw2:N,:)); meansb = [resultCV.pmean];
nseb = [resultCV.nse1];
CD = (meansa - meansb)./sqrt(nsea+nseb); onetail = 1-normcdf(abs(CD),0,1);
pV = 2*onetail;
% ===== 95% Highest Posterior Density (HPD) Interval ======================
resultsHPD = HPD(Hasil.post_theta,0.05); LB = [resultsHPD.LB];
UB = [resultsHPD.UB];
% ===== Numerical Standard Error (NSE) ==================================== resultsNSE = NSE(Hasil.post_theta); NSEd = [resultsNSE.nse];
%====================== Mengatur hasil pencetakan =========================
%--- Statistik Parameter: in.cnames = char('w','a','del');
in.rnames = char('Parameter','Mean','SD','LB','UB','IACT','NSE','G-CD','p-Value');
in.fmt = '%16.6f';
tmp = [MP; SP; LB; UB; IAT; NSEd; CD; pV];
fprintf(1,'Estimasi menggunakan MCMC dan Uji Diagnosa\n'); % cetak hasil
mprint(tmp,in);
1.1.7.
Kode Utama APARCH
%%%%% Function : Distribusi posterior dari parameter model GARCH %%%%% Inputs :
%%%%% R : returns
%%%%% its_MCMC : banyak iterasi MCMC
%%%%% RW_step : suatu skalar yang merupakan variansi untuk distribusi proposal dalam proses Random Walk
%%%%% Outputs :
%%%%% post_theta_RW : Posterior MCMC untuk omega, alfa, beta, gamma, dan
%%%%% delta
%%%%% post_theta_RW_adapt : Posterior MCMC untuk Omega,Alpha,Beta, Gamma, Delta dengan proses adaptive (selama burn-in)
%%%%% post_like_RW : Log-likelihood dari posterior
%%%%% post_like_RW_adapt : Log-likelihood posterior dari proses adaptive
%%%%% Ditampilkan juga hasil test diagnosa if(nargin<4)
graph = 1; if(nargin<3)
RW_step = 1; if(nargin<2)
its_MCMC = 15000; end
end end
%%%% Returns simpan dalam variabel T T = max(size(R));
if(T~=size(R,1)) R = R';
end
R2 = R.*R;
%%%%%%%%%% Dipilih nilai awal
theta0 = [0.5 0.1 0.1 0.1 1]; theta_RW_adapt = theta0;
like_current = APARCH_likelihood_adapt(R,R2,theta0); like_current_RW_adapt = like_current;
%%%%%%%%%% Batas-batas dari prior : Omega ~ U[0,wka] ; alpha ~ U[0,1] ;
%%%%%%%%%% beta|alpha ~ U[0,1-alpha], delta ~ [0,10] %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
wka = 10; burn_in = 5000;
N = its_MCMC-burn_in; post_like = zeros(N,1);
%%%%%%%%%%% Proses Random Walk dengan adaptative selama burn-in %%%%%%%%%%% Lihat Atchadé and Rosenthal (2005)
RW_step_adapt = [0.003 0.001 0.001 0.003 0.003]'; theta = zeros(N,5);
%%MCMC
accept_adapt = ones(1,5); thetaProp = zeros(1,5); thetaAcc = zeros(1,5); tic
for i=1:its_MCMC
thetaProp = thetaProp + 1; theta_prop = theta_RW_adapt; for q=1:5
if(theta_prop(q)>0 && theta_prop(q)<wka && pos<1) test = 1;
end
elseif q==4 %gamma
if(theta_prop(q)>=-1 && theta_prop(q)<=1 && pos<1) test=1;
end
elseifq==5 %delta
if(theta_prop(q)>0 && theta_prop(q)<5 && pos<1) test=1;
end
% alfa dan beta else
if(theta_prop(q)>0 && pos<1 && theta_prop(q)<1) test = 1;
end end
if(test==1)
[log_like_move] = APARCH_likelihood_adapt(R,R2,theta_prop); prior_lama = -log(wka) - log(1-theta_RW_adapt(2));
RW_step_adapt(q) = max(min_max_var(1),RW_step_adapt(q) + (accept_adapt(q)/i - 0.44)/(i^eta));
if(RW_step_adapt(q)>min_max_var(2))
RW_step_adapt(q) = min_max_var(2); end
if mod(i,100) == 0
thetaProp = zeros(1,5); thetaAcc = zeros(1,5); end
%theta_RW_adapt
% simpan w, a, b, del if i>burn_in
theta(i-burn_in,:) = theta_RW_adapt;
post_like(i-burn_in,1) = like_current_RW_adapt; end
% Start timer after burn-in if i == burn_in
disp('Burn-in complete, now drawing posterior samples.') end
end toc
% --- Algoritma MCMC. Step 2: Menghitung rata-rata Monte Carlo Hasil.post_theta = theta;
Hasil.post_like = post_like; Hasil.post_step = theta_RW_adapt; MP = mean(Hasil.post_theta);
SP = std(Hasil.post_theta);
% ===== Integrated Autocorrelation Time (IACT) ========================
% Berapa banyak sampel yang harus dibangkitkan untuk mendapatkan sampel
% yang independen (seberapa cepat konvergensi simulasi) resultsIAT = IACT(Hasil.post_theta);
IAT = [resultsIAT.iact]; % ===== Uji Konvergensi Geweke
============================================ idraw1 = round(.1*N);
resultCV = momentg(Hasil.post_theta(1:idraw1,:)); meansa = [resultCV.pmean];
nsea = [resultCV.nse1]; idraw2 = round(.5*N)+1;
resultCV = momentg(Hasil.post_theta(idraw2:N,:)); meansb = [resultCV.pmean];
nseb = [resultCV.nse1];
CD = (meansa - meansb)./sqrt(nsea+nseb); onetail = 1-normcdf(abs(CD),0,1);
pV = 2*onetail;
% ===== 95% Highest Posterior Density (HPD) Interval ======================
resultsHPD = HPD(Hasil.post_theta,0.05); LB = [resultsHPD.LB];
UB = [resultsHPD.UB];
==================================== resultsNSE = NSE(Hasil.post_theta); NSEd = [resultsNSE.nse];
%====================== Mengatur hasil pencetakan =========================
%--- Statistik Parameter:
in.cnames = char('w','a','b','y','del');
in.rnames = char('Parameter','Mean','SD','LB','UB','IACT','NSE','G-CD','p-Value');
in.fmt = '%16.6f';
tmp = [MP; SP; LB; UB; IAT; NSEd; CD; pV];
fprintf(1,'Estimasi menggunakan MCMC dan Uji Diagnosa\n'); % cetak hasil
mprint(tmp,in);
1.2.Kode Likelihood
1.2.1.
Kode Likelihood ARCH
function [log_likelihood] = ARCH_likelihood_adapt(R,R2,theta) T = max(size(R2));
sigmadel = zeros(T,1);
sigmadel(1) = theta(1) /(1 - theta(2)); log_likelihood =
-0.5*(log(2*pi)+log(sigmadel(1))+R2(1)/sigmadel(1)); for i=2:T
sigmadel(i) = theta(1) + theta(2)*(abs(R(i-1))^2); log_likelihood = log_likelihood
-0.5*(log(2*pi)+log(sigmadel(i))+R2(i)/sigmadel(i)); end
1.2.2.
Kode Likelihood GARCH
function [log_likelihood] = GARCH_likelihood_adapt(R,R2,theta) T = max(size(R2));
sigmadel = zeros(T,1);
sigmadel(1) = theta(1) /(1 - theta(2) - theta(3)); log_likelihood =
-0.5*(log(2*pi)+log(sigmadel(1))+R2(1)/sigmadel(1)); for i=2:T
sigmadel(i) = theta(1) + theta(2)*(abs(R(i-1))^2) + theta(3)*(sigmadel(i-1)^2);
log_likelihood = log_likelihood
-0.5*(log(2*pi)+log(sigmadel(i))+R2(i)/sigmadel(i)); end
1.2.3.
Kode Likelihood TARCH
function [log_likelihood] = TARCH_likelihood_adapt(R,R2,theta) T = max(size(R2));
sigmadel = zeros(T,1);
log_likelihood =
-0.5*(log(2*pi)+log(sigmadel(1)^2)+R2(1)/sigmadel(1)^2); for i=2:T
sigmadel(i) = theta(1) + theta(2)*(abs(R(i-1)) - theta(4)*R(i-1)) + theta(3)*(sigmadel(i-1));
log_likelihood = log_likelihood
-0.5*(log(2*pi)+log(sigmadel(i)^2)+R2(i)/sigmadel(i)^2); end
1.2.4.
Kode Likelihood TS-GARCH
Function [log_likelihood] =TSGARCH_likelihood_adapt(R,R2,theta) T = max(size(R2));
sigmadel = zeros(T,1);
sigmadel(1) = theta(1) /(1 - theta(2) - theta(3)); log_likelihood =
-0.5*(log(2*pi)+log(sigmadel(1))+R2(1)/sigmadel(1)); for i=2:T
sigmadel(i) = theta(1) + theta(2)*(abs(R(i-1))) + theta(3)*(sigmadel(i-1));
log_likelihood = log_likelihood
-0.5*(log(2*pi)+log(sigmadel(i))+R2(i)/sigmadel(i)); end
1.2.5.
Kode Likelihood GJR-GARCH
function [log_likelihood] = GJR_likelihood_adapt(R,R2,theta) T = max(size(R2));
sigmadel = zeros(T,1);
sigmadel(1) = theta(1) /(1 - theta(2) - 0.5*theta(4)) - theta(3)); log_likelihood = -0.5*(log(2*pi)+log(sigmadel(1))+R2(1)/sigmadel(1));
for i=2:T
sigmadel(i) = theta(1) + theta(2)*((abs(R(i-1)) - theta(4)*R(i-1))^2) + theta(3)*((sigmadel(i-1))^2); log_likelihood = log_likelihood
-0.5*(log(2*pi)+log(sigmadel(i))+R2(i)/sigmadel(i)); end
1.2.6.
Kode Likelihood NARCH
function [log_likelihood] = NARCH_likelihood_adapt(R,R2,theta) T = max(size(R2));
sigmadel = zeros(T,1);
sigmadel(1) = theta(1) /(1 - theta(2)); sigma2(1) = sigmadel(1) \^(2/theta(3)); log_likelihood =
-0.5*(log(2*pi)+log(sigmadel(1))+R2(1)/sigmadel(1)); for i=2:T
sigmadel(i) = theta(1) + theta(2)*(abs(R(i-1)))^theta(3); sigma2(i) = sigmadel(i)^(2/theta(3);
log_likelihood = log_likelihood
1.2.7.
Kode Likelihood APARCH
function [log_likelihood] = APARCH_likelihood_adapt(R,R2,theta) T = max(size(R2));
sigma2 = zeros(T,1);
sigmadel(1) = theta(1) /(1 - theta(2)*(1-theta(4))^(theta(5)) - theta(3));
sigma2(1) = sigmadel(1)^(2/theta(5));
log_likelihood = -0.5*(log(2*pi)+log(sigma2(1))+R2(1)/sigma2(1)); for i=2:T
sigmadel(i) = theta(1) + theta(2)*((abs(R(i-1)) - theta(4)*R(i-1))^theta(5)) ...
+ theta(3)*((sigmadel(i-1))^theta(5)); sigma2(i) = sigmadel(i)^(2/theta(5)); log_likelihood = log_likelihood
-0.5*(log(2*pi)+log(sigma2(i))+R2(i)/sigma2(i)); end