23
24
Lampiran 1. Skema MCMC untuk model ARCH(1) non-central Student-t
1.
Inisialisasi a0, b0,
0, dan z0.2.
Pembangkitan
.
Distribusi posterior bersyarat untuk
diberikan oleh
.
Dalam kasus ini, bisa dibangkitkan secara langsung dari distribusi normal yaitu
.
dengan
dan
3.
Pembangkitan
.
Distribusi posterior bersyarat untuk diberikan oleh
|
,
(
|
,
,
,
,
)
)
(
z
tf
IGz
t tg
z
ta
b
R
t 1R
t25
dengan
2
1
,
,
2
,...,
,
)
(
2
)
(
,
1
,
2
)
1
(
2 1 2 1 2 2 1T
t
bR
a
bR
a
R
t
a
a
R
b
t t t t
.
,...,
2
,
exp
,
1
,
)
1
(
exp
)
,
,
,
,
|
(
2 1 2 1 2 1 2 1 2 1 1 1 1T
t
z
bR
a
R
t
az
R
b
R
R
b
a
z
g
t t t t t t
Dalam hal ini, posterior zt tidak mengikuti suatu distribusi tertentu, maka parameter zt
dibangkitkan dengan menggunakan metode IC-MH dengan proposalnya yaitu
)
,
(
~
* t tIG
z
dan rasio penerimaannya yaitu:
)
,
,
,
,
|
(
)
,
,
,
,
|
(
,
1 1 * * t t t t t t t tR
R
b
a
z
g
R
R
b
a
z
g
z
z
r
.
4.
Pembangkitan
Distribusi posterior bersyarat untuk v diberikan oleh
.
Diambil logaritma distribusi posterior bersyarat untuk :
Nilai dibangkitkan menggunakan metode IC-MH, dengan proposal untuk yaitu
dan probabilitas penerimaannya yaitu
.
Dicari modus posterior dari
, artinya bahwa
. Dalam kasus ini
dan
ditentukan dengan menggunakan metode yang didasarkan pada tingkah laku
distribusi di sekitar modus. Lebih lanjut diperoleh bahwa derivatif pertama dan kedua
dari
berturut-turut yaitu:
26
Kemudian
dan
. Namun,
bisa bernilai positif, karena
27
Lampiran 2. Skema MCMC untuk model ARCH(1) Skewed Student-t
1. Inisialisasi a0, b0,
0, dan z0.2. Membangkitkan nilai acak
a
|
b
,
,
k
,
Z,
R
.
Distribusi posterior bersyarat untuk a diberikan oleh
Diambil logaritma distribusi posterior bersyarat untuk a:
Nilai a dibangkitkan menggunakan metode IC-MH, dengan proposal untuk a yaitu
dan probabilitas penerimaannya yaitu
.
Dicari modus posterior dari
, artinya bahwa
. Diperoleh bahwa
derivatif pertama dan kedua dari
berturut-turut yaitu
28
Kemudian
dan
. Namun
bisa bernilai positif, karena
itu diambil
dengan
.
3. Membangkitkan nilai acak
b
|
a
,
,
k
,
Z,
R
Distribusi posterior bersyarat untuk a diberikan oleh
29
Nilai b dibangkitkan menggunakan metode IC-MH, dengan proposal untuk b yaitu
dan probabilitas penerimaannya yaitu
.
Dicari modus posterior dari
, artinya bahwa
. Diperoleh bahwa
derivatif pertama dan kedua dari
berturut-turut yaitu
Kemudian
dan
. Namun
bisa bernilai positif, karena
30
4. Membangkitkan nilai acak
k
|
a
,
b
,
,
Z,
R
Distribusi posterior bersyarat untuk k diberikan oleh
Diambil logaritma distribusi posterior bersyarat untuk k:
dengan
dan
. Dalam kasus ini, bisa dibangkitkan secara
langsung dari distribusi normal yaitu
dimana:
dan
5. Membangkitkan nilai-nilai acak
z
t|
a
,
b
,
k
,
,
R
Distribusi posterior bersyarat untuk diberikan oleh
dengan
,
, t=1,...,T
Nilai dibangkitkan menggunakan metode IC-MH, dengan proposalnya yaitu
31
6. Membangkitkan nilai acak
|
k
,
a
,
b
,
Z,
R
Distribusi posterior bersyarat untuk v diberikan oleh
Diambil logaritma distribusi posterior bersyarat untuk :
Nilai dibangkitkan menggunakan metode IC-MH, dengan proposal untuk yaitu
dan probabilitas penerimaannya yaitu
.
32
Lampiran 3. Kode Matlab untuk Estimasi Model ARCH(1) noncentral Student-t
3.1 Kode Utama
function hasil=archnct_mcmc(Rt,HP)
% Tujuan: Mengestimasi parameter-parameter dalam model ARCH(1) % R_t = sigma_t * zt^0.5 * (miu+xhi_t), xhi_t~N(0,1) % sigma_t^2 = a + b*R_{t-1}^2
% ---% Algoritma: MCMC
% ---% Masukan: Rt = Returns = 100*[(log(S_t)-log(S_{t-1}))- 1/T*sum((log(S_t)-
log(S_{t-1}))],
% dimana S_t = nilai kurs pada saat t
% HP = Hyperparameter = [lambda alpha_b beta_b miu_c var_c alpha_nu beta_nu], untuk prior
% a ~ exp(lambda), b ~ beta(alpha_b,beta_b), % c ~ Normal(miu_c,var_c),
% dan nu ~ Gamma(alpha_nu, beta_nu)
% ---% Keluaran: hasil.draws = draws
% --- I: Inisialisasi T = length(Rt); R2 = Rt.^2; % prior untuk a lamd = HP(1); % prior untuk b alp = HP(2); bet = HP(3); %prior untuk c muc=HP(4); varc=HP(5); % prior untuk nu alpnu = HP(6); betnu = HP(7); % nilai awal a = 0.1; b = 0.1; nu = 20; zt = 1./gamrnd(nu/2,2/nu,T,1); % banyaknya replikasi Nits = 15000; BI = 5000; N = Nits-BI;
% alokasi penyimpanan sampel
av = zeros(N,1); bv = zeros(N,1); cv = zeros(N,1); nuv = zeros(N,1); zv = zeros(T,1); vol = zeros(T,1);
% --- Algoritma MCMC. Step 1: Membangkitkan Rantai Markov
tic
for its = 1:Nits
% --- pembangkitan nilai acak mu
Vc = 1/(T+1/varc);
Mc = Vc*(Rt(1)*sqrt((1-b)/(a*zt(1)))...
+sum(Rt(2:T).*((a+b*R2(1:T-1)).*zt(2:T)).^(-0.5))+muc/varc); c = normrnd(Mc,sqrt(Vc),1,1);
33
% --- pembangkitan nilai acak z
alpz = (nu+1)/2;
betz1 = 0.5*((1-b)*Rt(1)^2+a*nu)/a;
betz2 = (R2(2:T)+(a+b*R2(1:T-1)).*nu)./(2*(a+b*R2(1:T-1))); betz = [betz1; betz2];
% pembangkitan proposal
zprop = 1./gamrnd(alpz,1./betz);
% mengevaluasi probabilitas penerimaan
gzold1 = (sqrt(1-b)*c*Rt(1)./(a*zt(1))^(-0.5)); gzold2 = (c*Rt(2:T)./(sqrt(a+b*R2(1:T...
-1).*sqrt(zt(2:T))))); gzold = [gzold1; gzold2];
gznew1 = (sqrt(1-b)*c*Rt(1)*(a*zprop(1))^(-0.5)); gznew2 = (c*Rt(2:T)./(sqrt(a+b*R2(1:T...
-1).*sqrt(zprop(2:T))))); gznew = [gznew1; gznew2];
ratio = exp(gznew-gzold); % pembaharuan u = rand(T,1); minrat = min(1,ratio); ind = find(u<=minrat); zt(ind) = zprop(ind);
% mencari rata-rata dan variansi untuk proposal bersyarat
hpv = [alpnu betnu]; mv = bisection_nu(hpv,zt); % rata-rata d2v = 0.5*T/mv-T/4*psi(1,mv/2)-(alpnu-1)/mv^2; Dv = min(-0.0001,d2v); s2v = -1/Dv; %variansi % algoritma IC-MH
% pembangkitan proposal nu*
pr = truncnormrnd(1,mv,sqrt(s2v),2.1,40);
% mengevaluasi probabilitas penerimaan
log_pv = 0.5*pr*T*log(pr/2)-T*gammaln(pr/2)-pr/2 ... *sum(log(zt)+1./zt)+(alpnu-1)*log(pr)-betnu*pr; post_pr = exp(log_pv); log_pv = 0.5*nu*T*log(nu/2)-T*gammaln(nu/2)-nu/2 ... *sum(log(zt)+1./zt)+(alpnu-1)*log(nu)-betnu*nu; post_o = exp(log_pv); ratio = post_pr/post_o; ap = min(1,ratio);
% pembangkitan variabel acak seragam
u = rand(1);
% pembaruan
if u <= ap, nu = pr; end
% --- pembangkitan sampel a
% mencari rata-rata dan variansi untuk distribusi proposal
hp1 = lamd;
m_a = bisection_nct(Rt,R2,a,b,c,hp1,zt,'a'); % rata-rata
d2a = 1/(2*m_a^2)+0.5*sum(1./(m_a+b*R2(1:T-1)).^2)... -0.5*(1-b)*R2(1)/(m_a^3*zt(1))-(0.25*c*Rt(1)*(1... -b)^2./((1-b)/m_a*zt(1))^(0.5)*m_a^(4)*zt(1)^2)... +c*Rt(1)*(1-b)./sqrt((1-b)./m_a*zt(1))*m_a^(3)*zt(1)... -sum(R2(2:T)./((m_a+b*R2(1:T-1)).^3.*zt(2:T)))... +0.75*sum(c*Rt(2:T)./(m_a+b*Rt(1:T... -1).^(2.5).*sqrt(zt(2:T)))); Da = min(-0.0001,d2a); s2_a = -1/Da; % variansi
% algoritma IC-MH
34
pr = truncnormrnd(1,m_a,sqrt(s2_a),1e-4,1);
% mengevaluasi probabilitas penerimaan
log_pa = -0.5*log(pr)-0.5*sum(log(pr+b*R2(1:T-1)))... -0.5*(1-b)*R2(1)/(pr*zt(1))... +sqrt(1-b/pr*zt(1)*c*Rt(1))... -0.5*sum((R2(2:T)./((pr+b*R2(1:T-1)).*zt(2:T)))... +(c*Rt(2:T)./(sqrt(pr+b*R2(1:T-1)).*sqrt(zt(2:T)))))... -lamd*pr; % F(pr) post_pr = exp(log_pa); log_pa = -0.5*log(a)-0.5*sum(log(a+b*R2(1:T-1)))... -0.5*(1-b)*R2(1)/(a*zt(1))-... +sqrt(1-b/a*zt(1)*c*Rt(1)) ... -0.5*sum((R2(2:T)./((a+b*R2(1:T-1)).*zt(2:T))) ... +(c*Rt(2:T)./(sqrt(a+b*R2(1:T-1)).*sqrt(zt(2:T)))))... -lamd*a; % F(a) post_o = exp(log_pa); ratio = post_pr/post_o; ap = min(1,ratio);
% pembangkitan variabel acak seragam
u = rand(1);
% pembaruan
if u <= ap, a = pr; end
% --- pembangkitan nilai acak b
% mencari rata-rata dan variansi untuk distribusi proposal
mup = alp; Vp = bet; hp1 = [mup Vp]; m_b = bisection_nct(Rt,R2,a,b,c,hp1,zt,'b'); % rata-rata d2b = -0.5/(1-m_b)^2+0.5*sum((R2(1:T-1).^2)./((a+m_b*R2(1:T... -1)).^2))-0.25*c*Rt(1)/((1... -m_b/a*zt(1)).^(1.5)*a^2*zt(1)^2)... -sum(((R2(1:T-1).^2).*(R2(2:T)))... ./((a+m_b*R2(1:T-1)).^3.*zt(2:T)))... +0.75*sum(R2(1:T-1).^(2)*c.*Rt(2:T)./(a+m_b*Rt(1:T... -1).^(2.5).*sqrt(zt(2:T))))... -(alp-1)/(m_b^2)-(bet-1)/(1-m_b)^2; Db = min(-0.0001,d2b); s2_b = -1/Db; % variansi % algoritma IC-MH % pembangkitan proposal b* pr = truncnormrnd(1,m_b,sqrt(s2_b),0,1);
% mengevaluasi probabilitas penerimaan
log_pb = 0.5*log(1-pr)-0.5*sum(log(a+pr*R2(1:T-1)))... -0.5*(1-pr)*R2(1)/(a*zt(1))... +sqrt(1-pr/a*zt(1))*c*Rt(1)... -0.5*sum((R2(2:T)./(a+pr*R2(1:T-1).*zt(2:T)))... +c*Rt(2:T)./sqrt(a+pr*R2(1:T-1)).*sqrt(zt(2:T)))... +(alp-1)*log(pr)+(bet-1)*log(1-pr); % F(pr) post_pr = exp(log_pb); log_pb = 0.5*log(1-b)-0.5*sum(log(a+b*R2(1:T-1)))... -0.5*(1-b)*R2(1)/(a*zt(1))... +sqrt(1-b/a*zt(1))*c*Rt(1)... -0.5*sum((R2(2:T)./(a+b*R2(1:T-1).*zt(2:T)))... +c*Rt(2:T)./sqrt(a+b*R2(1:T-1)).*sqrt(zt(2:T)))... +(alp-1)*log(b)+(bet-1)*log(1-b); %F(b) post_o = exp(log_pb); ratio = post_pr/post_o; ap = min(1,ratio);
% pembangkitan variabel acak seragam
u = rand(1);
% pembaruan
35
% pengestimasian sigma
volt = [a/(1-b); a+b*R2(1:T-1)];
% simpan a, b, c, dan nu if its > BI av(its-BI,1) = a; bv(its-BI,1) = b; cv(its-BI,1) = c; nuv(its-BI,1) = nu; zv = ((its-BI-1)*zv+zt)/(its-BI); vol = ((its-BI-1)*vol+volt)/(its-BI); end end toc
% --- Algoritma MCMC. Step 2: Menghitung rata-rata Monte Carlo
draws = [av bv cv nuv]; MP = mean(draws); SP = std(draws);
% ===== Integrated Autocorrelation Time (IACT) ============================ % Berapa banyak sampel yang harus dibangkitkan untuk mendapatkan sampel % yang independent (seberapa cepat konvergensi simulasi)
resultsIAT = IACT(draws); IAT = [resultsIAT.iact];
% ===== Uji Konvergensi Geweke ============================================
idraw1 = round(.1*N); resultCV = momentg(draws(1:idraw1,:)); meansa = [resultCV.pmean]; nsea = [resultCV.nse1]; idraw2 = round(.5*N)+1; resultCV = momentg(draws(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(draws,0.05); LB = [resultsHPD.LB]; UB = [resultsHPD.UB];
% % ===== Numerical Standard Error (NSE) ====================================
resultsNSE = NSE(draws); NSEd = [resultsNSE.nse];
%====================== Pengaturan Pencetakan Hasil ======================= %--- Statistik Parameter
in.cnames = char('a','b','c','nu');
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 Diagnostik\n'); mprint(tmp,in);
hasil.vol = vol; hasil.zv = zv; hasil.av = av;
36
hasil.bv = bv; hasil.cv = cv; hasil.nuv = nuv; hasil.draws = draws;%========== Calculate Marginal likelihood by Gelfand-Dey (1994) ===========
theta = draws'; [npar,ndraw] = size(theta); mvn_mean = mean(theta,2); mvn_cov = cov(theta'); inv_mvn_cov = inv(mvn_cov); %--- POSTERIOR % domain truncate_val = zeros(1,ndraw); for i = 1:ndraw draw_element = theta(:,i);
truncate_val(i) = (draw_element-mvn_mean)' * inv_mvn_cov...
* (draw_element-mvn_mean);
end
critical_value = chi2inv(0.99,npar);
truncate_index = truncate_val > critical_value;
source_pdf_log = mvn_pdf_log(theta,mvn_mean(:,ones(ndraw,1)),mvn_cov) ... - log(0.99); source_pdf_log(truncate_index) = -inf; %--- PRIOR % a prior_pdf_a_log = log(lamd)-lamd*av'; % b prior_pdf_b_log = -betaln(alp,bet)+(alp-1).*log(bv')+(bet-1).*log(1-bv'); % c
prior_pdf_c_log = -1/2*log(2*pi*varc) - 1/2*(cv'-muc).^2/varc;
% nu
prior_pdf_nu_log = -gammaln(alpnu)+alpnu.*log(betnu)+(alpnu-1).*log(nuv')-betnu.*nuv';
% LOG TOTALLY PRIOR
prior_pdf_log = sum(prior_pdf_a_log) + prior_pdf_b_log ... + prior_pdf_c_log + prior_pdf_nu_log; % LIKELIHOOD likelihood_log = zeros(1,ndraw); for i = 1:ndraw likelihood_log(i) = ARCHnct_likelihood(Rt,zt,draws(i,:)); end
GD_log = source_pdf_log - prior_pdf_log - likelihood_log; constant = max(GD_log);
ML_GD = -constant - log(mean(exp(GD_log - constant)))
3.2 Kode bisection
function mv = bisection_nu(hpv,zt)
% Tujuan : Mencari akar dari F’(v)= 0 menggunakan metode bagi dua %
% ---% Masukan : hpv = nilai prior v
% zt = [z_1, z_2, z_3, ….,z_T]
---37
% keluaran : mv = akar penyelesaian
eps_step = 1e-2; bb = 2.1;
ba = 100;
if diffFnu(hpv,zt,bb) == 0 % derivatif pertama
mv = bb; return; elseif diffFnu(hpv,zt,ba) == 0 mv = ba; return; elseif diffFnu(hpv,zt,bb)*diffFnu(hpv,zt,ba) > 0
error( 'diffFnu(a) and diffFnu(b) do not have opposite signs' );
end
while abs(ba - bb) >= eps_step
x = (ba + bb)/2; if diffFnu(hpv,zt,x) == 0 mv = x; return; elseif diffFnu(hpv,zt,x)*diffFnu(hpv,zt,ba) < 0 bb = x; else ba = x; end end mv=x;
3.3 Kode bisection NCT
function mab = bisection_nct(Rt,R2,a,b,c,hp1,zt,par)
% Tujuan : Mencari akar dari F’(a)=0 atau F’(b)=0 menggunakan metode % bagi dua % % ---% Masukan : Rt = returns % R2 = returns^2 % a = nilai a % b = nilai b % c = nilai miu % hp1 = nilai prior % zt = [z_1, z_2, z_3, ….,z_T] % par = 'a' atau 'b'
% ---% keluaran : mab = akar penyelesaian
eps_step = 1e-2; if par == 'a' bb = 1e-5; ba = 1; elseif par == 'b' bb = 0; ba = 1; end
if diffARCH_nct(Rt,R2,a,b,c,hp1,zt,bb,par) == 0 %derivatif pertama
mab = bb; return; elseif diffARCH_nct(Rt,R2,a,b,c,hp1,zt,ba,par) == 0 mab = ba; return; elseif diffARCH_nct(Rt,R2,a,b,c,hp1,zt,ba,par)*diffARCH_nct(Rt,R2,a,b,c,hp1,zt,bb,par) > 0
38
end
while abs(bb - ba) >= eps_step
x = (ba + bb)/2; if diffARCH_nct(Rt,R2,a,b,c,hp1,zt,c,par) == 0 mab = x; return; elseif diffARCH_nct(Rt,R2,a,b,c,hp1,zt,c,par)*diffARCH_nct(Rt,R2,a,b,c,hp1,zt,ba,par) < 0 bb = x; else ba = x; end end mab = x;
3.4 Kode untuk turunan pertama F(
)
function y = diffFnu(hpv,zt,nu)
% Tujuan : Mengitung F’(v)
% ---% Masukan : hpv = nilai prior
% zt = [z_1, z_2, z_3, ….,z_T]
% nu = nilai v
% --- % keluaran : y = nilai turunan pertama
T=length(zt);
%derivatif pertama
y = T/2*(log(nu/2)+1-psi(nu/2))-0.5*sum(log(zt)+1./zt)+(hpv(1)-1)/nu-hpv(2);
4.5 Kode untuk turunan pertama F(a) dan F(b)
function Fab = diffARCH_nct(Rt,R2,a,b,c,hp1,zt,bts,par)
% Tujuan : Mengitung F’(a) atau F’(b)
% ---% Masukan : Rt = returns % R2 = returns^2 % a = nilai a % c = nilai miu % hp1 = nilai prior % zt = [z_1, z_2, z_3, ….,z_T]
% bts = batas kiri/kanan interval pada metode bagi dua % par = 'a' atau 'b'
% ---% keluaran : Fab = nilai turunan pertama
if par =='a'% derivatif pertama terhadap a
a = bts; lamd = hp1; Fab = -1/(2*a)-0.5*sum(1./(a+b*R2(1:end-1)))... +0.5*(1-b)*R2(1)/(a^2*zt(1))... -2*(1-b)^2*R2(1)./(a^3+zt(1).^2)... +0.5*sum(((R2(2:end))./((a+b*R2(1:end-1)).^2.*zt(2:end)))... -c*Rt(2:end)./(a+b*R2(1:end-1)).^(1.5).*sqrt(zt(2:end)))... -lamd;
elseif par == 'b' % derivatif pertama terhadap b
b = bts; alp = hp1(1); bet=hp1(2); Fab = -1/(2*(1-b))... -0.5*sum(R2(1:end-1)./(a+b*R2(1:end-1)))... +R2(1)/(2*a*zt(1))... -0.5*c*Rt(1)/sqrt(1-b/a*zt(1))*a*zt(1)... +0.5*sum(R2(1:end-1).*R2(2:end)./((a+b*R2(1:end... -1)).^2.*zt(2:end)))-1.5*sum(R2(1:end... -1).^2*c.*Rt(2:end)./(a+b*R2(1:end-1)).^2.5.*zt(2:end))...
39
+(alp-1)/b-(bet-1)/(1-b);
end
3.6 Kode likelihood NCT
function [log_likelihood] = ARCHnct_likelihood(R,zt,draws)
% Tujuan : Mencari log likelihood ARCH(1) NCT %
% ---% Masukan : R = returns
% zt = [z_1, z_2, z_3, ….,z_T] % draws = [av bv cv nuv]
% ---% keluaran : log_likelihood T = max(size(R)); sig2 = zeros(T,1); sig2(1) = draws(1)/(1-draws(2)); var(1) = sig2(1)*zt(1); y2(1) = (R(1)-sqrt(var(1))*draws(3))^2;
log_likelihood = -0.5*log(2*pi*var(1)) -0.5*y2(1)/var(1);
for i=2:T
sig2(i) = draws(1) + draws(2)*R(i-1)^2; var(i) = sig2(i)*zt(i);
y2(i) = (R(i)-sqrt(var(i))*draws(3))^2;
log_likelihood = log_likelihood -0.5*log(2*pi*var(i)) -0.5*y2(i)/var(i);
end
3.7 Kode untuk memanggil hasil estimasi
clc clear all %data
data1=csvread('jpy_kursbeli.csv'); data1 = data1(end-1471:end); data2=csvread('eur_kursbeli.csv'); data3 = data3(end-1471:end); Rjpy=100*price2ret(data1); Rjpy=Rjpy-mean(Rjpy); Reur=100*price2ret(data2); Reur=Reur-mean(Reur); lamd=1; alpb=2.5; betb=3; alpnu=16; betnu=0.8; muc=0; varc=1;
HP=[lamd alpb betb muc varc alpnu betnu]; hasil = archnct_mcmc(Rjpy,HP); vol = hasil.vol ; zv = hasil.zv; av = hasil.av; bv = hasil.bv; cv = hasil.cv; nuv = hasil.nuv; draws = hasil.draws; % ========== Save data ==================================================== dlmwrite('F:\nct\HASIL\eur_nct_draws.csv',draws,'delimiter',',','precision','%0 .16f')
40
3.8 Kode Pendukung
Kode truncnormrnd, IACT, momentg, HPD, NSE, mprint, dan mvn_pdf_log dapat
dilihat dalam Nugroho (2014).
41
Lampiran 4. Kode Matlab untuk Estimasi Model ARCH(1) Skewed Student-t
4.1 Kode Utama
function hasil=archskt_mcmc(Rt,HP)
% Tujuan: Mengestimasi parameter-parameter dalam model ARCH(1) % R_t = sigma_t*(k*(zt-miu_z)+zt^0.5*xhi_t), xhi_t~N(0,1) % sigma_t^2 = a + b*R_{t-1}^2
% ---% Algoritma: MCMC
% ---% Masukan: Rt = Returns = 100*[(log(S_t)-log(S_{t-1}))- 1/T*sum((log(S_t)-
log(S_{t-1}))],
% dimana S_t = nilai kurs pada saat t
% HP = Hyperparameter = [lambda alpha_b beta_b miu_k var_k alpha_nu beta_nu], untuk prior
% a ~ exp(lambda), b ~ beta(alpha_b,beta_b), % k ~ Normal(miu_k,var_k),
% dan nu ~ Gamma(alpha_nu, beta_nu)
% ---% Keluaran: hasil.draws = draws
% --- I: Inisialisasi T = length(Rt); R2 = Rt.^2; % prior untuk a lamd = HP(1); % prior untuk b alp = HP(2); bet = HP(3); %prior untuk k muk=HP(4); vark=HP(5); % prior untuk nu alpnu = HP(6); betnu = HP(7); % nilai awal a = 0.1; b = 0.1; nu = 10; zt = 1./gamrnd(nu/2,2/nu,T,1); mz=nu/(nu-2); sig2t=[a/(1-b); a+b*R2(1:T-1)]; % banyak replikasi Nits = 15000; BI = 5000; N = Nits-BI;
% alokasi penyimpanan nilai-nilai acak
av = zeros(N,1); bv = zeros(N,1); kv = zeros(N,1); nuv = zeros(N,1); zv = zeros(T,1); vol = zeros(T,1);
% --- Algoritma MCMC. Step 1: Membangkitkan Rantai Markov
tic
for its = 1:Nits
% --- pembangkitan sampel k
42
Bt = sig2t.*zt; sum1 = sum(At.^2./Bt); sum2 = sum(-1./2*vark); Vk = 1./(sum1+sum2); Mk = Vk*sum(At.*Rt./Bt+muk/vark); k = normrnd(Mk,sqrt(Vk),1,1); % --- pembangkitan sampel z alpz = (nu+1)/2; betz = nu/2+R2/2+k*Rt.*sig2t.^(-0.5)*mz... +k^2.*mz^2/2; % pembangkitan proposal zprop = 1./gamrnd(alpz,1./betz);% mengevaluasi probabilitas penerimaan
gzold = k*Rt.*sig2t.^(-0.5)-0.5*k^2*zt+k^2*mz*zt; gznew = k*Rt.*sig2t.^(-0.5)-0.5*k^2*zprop+k^2*mz*zprop; ratio = exp(gznew-gzold);
% pembangkitan variabel acak seragam
u = rand(T,1); % pembaharuan minrat = min(1,ratio); ind = find(u<=minrat); zt(ind) = zprop(ind);
% mencari rata-rata dan variansi untuk proposal bersyarat
hpv = [alpnu betnu]; mv = bisection_nuSkt(Rt,sig2t,k,hpv,zt); % rata-rata ddv =sum(-4*k./(sig2t.^(0.5).*zt)*(mv-2)^(-4).*((mv-2)*(Rt- sig2t.^(0.5).*k.*zt... +sqrt(sig2t).*k.*(mv/(mv-2))).*sqrt(sig2t).*k) ); d2v = ddv +0.5*T/mv-T/4*psi(1,mv/2)-(alpnu-1)/mv^2; Dv = min(-0.0001,d2v); s2v = -1/Dv; %variansi % algoritma IC-MH
% pembangkitan proposal nu*
pr = truncnormrnd(1,mv,sqrt(s2v),2.1,40);
% mengevaluasi probabilitas penerimaan
log_pv = -0.5*sum((2*Rt*k.*sig2t.^(-0.5)*pr/(pr-2)... +k^2.*(-2.*zt*pr/(pr-2)+(pr/(pr-2))^2))./zt)... +0.5*pr*T*log(pr/2)-T*gammaln(pr/2) ... -pr/2*sum(log(zt)+1./zt)+(alpnu-1)*log(pr)-betnu*pr; post_pr = exp(log_pv); log_pv = -0.5*sum((2*Rt*k.*sig2t.^(-0.5)*(nu./(nu-2))... +k^2*(-2*zt*(nu/(nu-2))+(nu./(nu-2))^(2)))./zt)... +0.5*nu*T*log(nu/2)-T*gammaln(nu/2)-nu/2 ... *sum(log(zt)+1./zt)+(alpnu-1)*log(nu)-betnu*nu; post_o = exp(log_pv); ratio = post_pr/post_o; ap = min(1,ratio);
% pembangkitan variabel acak seragam
u = rand(1); % pembaruan if u <= ap, nu = pr; end mz = nu/(nu-2); % --- pembangkitan sampel a
% mencari rata-rata dan variansi untuk distribusi proposal
hp1 = lamd;
m_a = bisection_skt(Rt,R2,a,b,mz,k,hp1,zt,'a'); % rata-rata
d2a = 1/(2*m_a^2)+0.5*sum(1./(m_a+b*R2(1:T-1)).^2)...
-0.5*(1-b)*R2(1)/(m_a^3*zt(1))-(0.25*k*Rt(1)... *(1-b)^2)./(((1-b)/m_a*zt(1))^(1.5)*m_a^(4))...
+k*Rt(1)*(1-b)./sqrt((1-b)./m_a*m_a^(3)...
43
-sum(R2(2:T)./((m_a+b*R2(1:T-1)).^3.*zt(2:T)))... +0.75*sum(k*Rt(2:T)./(m_a+b*Rt(1:T-1).^(2.5)))... -0.75*sum((k*Rt(2:T).*mz)./(m_a... +b*Rt(1:T-1).^(2.5).*zt(2:T)))); Da = min(-0.0001,d2a);s2_a = -1/Da; % variansi
% algoritma IC-MH
% pembagkitan proposal a*
pr = truncnormrnd(1,m_a,sqrt(s2_a),1e-4,1);
% mengevaluasi probabilitas penerimaan
log_pa = -0.5*log(pr)-0.5*sum(log(pr+b*R2(1:T-1)))-... 0.5*(1-b)*R2(1)/(pr*zt(1))-... +sqrt((1-b)/pr)*k*Rt(1)... -(k*Rt(1)*mz)./(sqrt(pr/(1-b)).*zt(1))... -0.5*sum(R2(2:T)./((pr+b*R2(1:T-1)).*zt(2:T)) ... +(k*Rt(2:T)./(sqrt(pr+b*R2(1:T-1))))... -(k*Rt(2:T)*mz./(sqrt(pr+b*R2(1:T-1))).*zt(2:T)))... -lamd*pr; % F(pr) post_pr = exp(log_pa); log_pa = -0.5*log(a)-0.5*sum(log(a+b*R2(1:T-1)))-... 0.5*(1-b)*R2(1)/(a*zt(1))-... +sqrt((1-b)/a)*k*Rt(1)... -(k*Rt(1)*mz)./(sqrt(a/(1-b)).*zt(1))... -0.5*sum(R2(2:T)./((a+b*R2(1:T-1)).*zt(2:T))... +(k*Rt(2:T)./(sqrt(a+b*R2(1:T-1))))... -(k*Rt(2:T)*mz./(sqrt(a+b*R2(1:T-1))).*zt(2:T)))... -lamd*a; % F(a) post_o = exp(log_pa); ratio = post_pr/post_o; ap = min(1,ratio);
% pembangkitan variabel acak seragam
u = rand(1);
% pembaruan
if u <= ap, a = pr; end
% --- pembangkitan sampel b
% mencari rata-rata dan variansi untuk distribusi proposal
mup = alp; Vp = bet; hp1 = [mup Vp]; m_b = bisection_skt(Rt,R2,a,b,mz,k,hp1,zt,'b'); % rata-rata d2b = -0.5/(1-m_b)^2+0.5*sum((R2(1:T-1).^2)./((a+m_b*R2(1:T... -1)).^2))-0.25*k*Rt(1)/((1-m_b/a).^(1.5)*a^2)... +0.25*k*Rt(1)*mz/((1-m_b/a).^(1.5)*a^2.*zt(1))... -sum(((R2(1:T-1).^2).*(R2(2:T)))./((a+m_b*R2(1:T... -1)).^3.*zt(2:T)))+0.75*sum(R2(1:T... -1).^(2)*k.*Rt(2:T)./(a+m_b*Rt(1:T-1).^(2.5)))... -0.75*sum(R2(1:T-1).^(2)*k.*Rt(2:T)*mz./(a+m_b*Rt(1:T... -1).^(2.5).*zt(2:T)))-(alp-1)/(m_b^2)-(bet-1)/(1-m_b)^2; Db = min(-0.0001,d2b); s2_b = -1/Db; % variansi % algoritma IC-MH % pembangkitan proposal b* pr = truncnormrnd(1,m_b,sqrt(s2_b),0,1);
% mengevaluasi probabilitas penerimaan
log_pb =0.5.*log(1-pr)-0.5.*sum(log(a+pr.*R2(1:T-1)))... -0.5.*(1-pr).*R2(1)./(a*zt(1))... +sqrt((1-pr)/a).*k.*Rt(1)-k.*Rt(1).*mz./(sqrt(a/(1... -pr)).*zt(1))-0.5.*sum(R2(2:T)./(a+pr.*R2(1:T-... 1).*zt(2:T))+k.*Rt(2:T)./sqrt(a+pr.*R2(1:T-1))... -k.*Rt(2:T).*mz./sqrt(a+pr.*R2(1:T-1)).*zt(2:T))... +(alp-1)*log(pr)+(bet-1)*log(1-pr); % F(pr) post_pr = exp(log_pb);
44
log_pb = 0.5.*log(1-b)-0.5.*sum(log(a+b.*R2(1:T-1)))... -0.5.*(1-b).*R2(1)./(a*zt(1))... +sqrt((1-b)/a).*k.*Rt(1)-k.*Rt(1).*mz./(sqrt(a/(1... -b)).*zt(1))-0.5.*sum(R2(2:T)./(a+b.*R2(1:T... -1).*zt(2:T))+k.*Rt(2:T)./sqrt(a+b.*R2(1:T-1))... -k.*Rt(2:T).*mz./sqrt(a+b.*R2(1:T-1)).*zt(2:T))... +(alp-1)*log(b)+(bet-1)*log(1-b); %F(b) post_o = exp(log_pb); ratio = post_pr/post_o; ap = min(1,ratio);% pembangkitan variabel acak seragam
u = rand(1);
% pembaruan
if u <= ap, b = pr; end
% pengestimasian sigma
volt = [a/(1-b); a+b*R2(1:T-1)]; sig2t = volt; % simpan a, b, k, dan nu if its > BI av(its-BI,1) = a; bv(its-BI,1) = b; kv(its-BI,1) = k; nuv(its-BI,1) = nu; zv = ((its-BI-1)*zv+zt)/(its-BI); vol = ((its-BI-1)*vol+volt)/(its-BI); end end toc
% --- Algoritma MCMC. Step 2: Menghitung rata-rata Monte Carlo
draws = [av bv kv nuv]; MP = mean(draws); SP = std(draws);
% ===== Integrated Autocorrelation Time (IACT) ============================ % Berapa banyak sampel yang harus dibangkitkan untuk mendapatkan sampel % yang bebas (seberapa cepat konvergensi simulasi)
resultsIAT = IACT(draws); IAT = [resultsIAT.iact];
% ===== Uji Konvergensi Geweke ============================================
idraw1 = round(.1*N); resultCV = momentg(draws(1:idraw1,:)); meansa = [resultCV.pmean]; nsea = [resultCV.nse1]; idraw2 = round(.5*N)+1; resultCV = momentg(draws(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(draws,0.05); LB = [resultsHPD.LB]; UB = [resultsHPD.UB];
45
resultsNSE = NSE(draws); NSEd = [resultsNSE.nse];
%====================== Pengaturan Pencetakan Hasil ======================= %--- Statistik Parameter
in.cnames = char('a','b','k','nu');
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 Diagnostik\n'); mprint(tmp,in); hasil.vol = vol; hasil.zv = zv; hasil.av = av; hasil.bv = bv; hasil.kv = kv; hasil.nuv = nuv; hasil.draws = draws;
4.2 Kode bisection
function mv = bisection_nuSkt(Rt,sig2t,k,hpv,zt)% Tujuan : Mencari akar dari F’(v)= 0 menggunakan metode bagi dua %
% Masukan : Rt = returns % Sig2t = sigma_t^2
% k = nilai parameter skewness k % hpv = nilai prior v
% zt = [z_1, z_2, z_3, ….,z_T]
% ---% keluaran : mv = akar penyelesaian
eps_step = 1e-2; bb = 2.1;
ba = 100;
if diffFnuSkt(Rt,sig2t,k,hpv,zt,bb) == 0 % derivatif pertama
mv = bb; return; elseif diffFnuSkt(Rt,sig2t,k,hpv,zt,ba) == 0 mv = ba; return; elseif diffFnuSkt(Rt,sig2t,k,hpv,zt,bb).*diffFnuSkt(Rt,sig2t,k,hpv,zt,ba) > 0
error( 'diffFnuSkt(a) and diffFnuSkt(b) do not have opposite signs' );
end
while abs(ba - bb) >= eps_step
x = (ba + bb)/2; if diffFnuSkt(Rt,sig2t,k,hpv,zt,x) == 0 mv = x; return; elseif diffFnuSkt(Rt,sig2t,k,hpv,zt,x).*diffFnuSkt(Rt,sig2t,k,hpv,zt,ba) < 0 bb = x; else ba = x; end end mv=x;
46
4.3 Kode bisection SKT
function mab = bisection_skt(Rt,R2,a,b,mz,k,hp1,zt,par)
% Tujuan : Mencari akar dari F’(a)=0 atau F’(b)=0 menggunakan metode % bagi dua % % ---% Masukan : Rt = returns % R2 = returns^2 % a = nilai a % b = nilai b % mz = nilai miu_z
% k = nilai parameter skewness k % hp1 = nilai prior
% zt = [z_1, z_2, z_3, ….,z_T] % par = 'a' atau 'b'
% ---% keluaran : mab = akar penyelesaian
eps_step = 1e-2; if par == 'a' bb = 1e-5; ba = 1; elseif par == 'b' bb = 0; ba = 1; end
if diffARCH_skt(Rt,R2,a,b,mz,k,hp1,zt,bb,par) == 0 %derivatif pertama
mab = bb; return; elseif diffARCH_skt(Rt,R2,a,b,mz,k,hp1,zt,ba,par) == 0 mab = ba; return; elseif diffARCH_skt(Rt,R2,a,b,mz,k,hp1,zt,ba,par)*diffARCH_skt(Rt,R2,a,b,mz,k,hp1,zt,b b,par) > 0
error( 'diffARCH(ba) and diffARCH(bb) do not have opposite signs' );
end
while abs(bb - ba) >= eps_step
x = (ba + bb)/2; if diffARCH_skt(Rt,R2,a,b,mz,k,hp1,zt,x,par) == 0 mab = x; return; elseif diffARCH_skt(Rt,R2,a,b,mz,k,hp1,zt,x,par)*diffARCH_skt(Rt,R2,a,b,mz,k,hp1,zt,ba ,par) < 0 bb = x; else ba = x; end end mab = x;
47
4.4 Kode untuk turunan pertama F(
)
function y = diffFnuSkt(Rt,sig2t,k,hpv,zt,nu) % Tujuan : Mengitung F’(v) % % ---% Masukan : Rt = returns % sig2t = sigma_t^2
% k = nilai parameter skewness k % hpv = nilai prior
% zt = [z_1, z_2, z_3, ….,z_T]
% nu = nilai v
% --- % keluaran : y = nilai turunan pertama
T = length(zt);
y = sum(2./(sig2t.^(0.5).*zt)*k*(nu-2)^(-2).*(Rt... -sig2t.^(0.5)*k.*zt+sig2t*k*nu/(nu-2)))...
+T/2*(log(nu/2)+1-psi(nu/2))-0.5*sum(log(zt)+1./zt)... +(hpv(1)-1)/nu-hpv(2);
4.5 Kode untuk turunan pertama F(a) dan F(b)
function Fab = diffARCH_skt(Rt,R2,a,b,mz,k,hp1,zt,bts,par)
% Tujuan : Mengitung F’(a) atau F’(b)
% ---% Masukan : Rt = returns % R2 = returns^2 % a = nilai a % b = nilai b % mz = nilai miu_z
% k = nilai parameter skewness k % hp1 = nilai prior
% zt = [z_1, z_2, z_3, ….,z_T]
% bts = batas kiri/kanan interval pada metode bagi dua % par = 'a' atau 'b'
% ---% keluaran : Fab = nilai turunan pertama
if par =='a'% derivatif pertama terhadap a
a = bts; lamd = hp1; Fab = -1/(2*a)-0.5*sum(1./(a+b*R2(1:end-1)))... +0.5*(1-b)*R2(1)/(a^2*zt(1))... -0.5*k.*(1-b)^2*Rt(1)./((sqrt(1-b)./a).*a.^(2))... +0.5*k.*Rt(1).*mz./sqrt(a./(1-b)).*zt(1).*(1-b)... +0.5*sum(((R2(2:end))./((a+b*R2(1:end-1)).^2.*zt(2:end)))... -0.5*k*Rt(2:end)./(a+b*R2(1:end-1)).^(1.5)... +0.5*k.*Rt(2:end).*mz./(a+b*R2(1:end... -1)).^(1.5).*zt(2:end))-lamd;
elseif par == 'b' % derivatif pertama terhadap b
b = bts; alp = hp1(1); bet=hp1(2); Fab = -1/(2*(1-b))... -0.5*sum(R2(1:end-1)./(a+b*R2(1:end-1)))... +R2(1)/(2*a*zt(1))... -0.5*k*Rt(1)/sqrt((1-b)/a).*a... +0.5*k*Rt(1).*mz./(sqrt((1-b)./a).*a*zt(1))... +0.5*sum(R2(1:end-1).*R2(2:end)./((a+b*R2(1:end... -1)).^2.*zt(2:end)))... -0.5*sum(R2(1:end-1)*k.*Rt(2:end)./(a+b*R2(1:end-1)).^1.5)... +0.5*sum(R2(1:end-1)*k.*Rt(2:end)./(a+b*R2(1:end... -1)).^1.5.*zt(2:end))+(alp-1)/b-(bet-1)/(1-b);
48
end4.6 Kode untuk memanggil hasil estimasi
clc clear all %data
data1=csvread('jpy_kursbeli.csv'); data1 = data1(end-1471:end); data2=csvread('eur_kursbeli.csv'); data3 = data3(end-1471:end); Rjpy=100*price2ret(data1); Rjpy=Rjpy-mean(Rjpy); Reur=100*price2ret(data2); Reur=Reur-mean(Reur); lamd=1; alpb=2.5; betb=3; alpnu=16; betnu=0.8; muk=0; vark=1;
HP=[lamd alpb betb muk vark alpnu betnu]; hasil = archskt_mcmc(Reur,HP); draws = hasil.draws; % ========== Save data ==================================================== dlmwrite('D:\SKRIPSI\skt\HASIL\jpy_skt_draws.csv',draws,'delimiter',',','precis ion','%0.16f')