Model Volatilitas ARCH(1) untuk Returns dengan Error...
Transcript of Model Volatilitas ARCH(1) untuk Returns dengan Error...
23
LAMPIRAN
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
),,,,|(,|)( 1 tttttIGt RRbazgzfzp ,
25
dengan 2
1
,
,,...,2,)(2
)(
,1,2
)1(
2
1
2
1
2
2
1
TtbRa
bRaR
ta
aRb
t
ttt
.,...,2,exp
,1,)1(
exp
),,,,|(
21
21
21
21
2
1
1
1
1
TtzbRa
R
taz
Rb
RRbazg
tt
t
ttt
Dalam hal ini, posterior zt tidak mengikuti suatu distribusi tertentu, maka parameter zt
dibangkitkan dengan menggunakan metode IC-MH dengan proposalnya yaitu
),(~*
tt IGz dan rasio penerimaannya yaitu:
),,,,|(
),,,,|(,
1
1
**
ttt
ttttt
RRbazg
RRbazgzzr
.
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
itu diambil dengan .
27
Lampiran 2. Skema MCMC untuk model ARCH(1) Skewed Student-t
1. Inisialisasi a0, b0, 0, dan z0.
2. Membangkitkan nilai acak RZ,,,,| kba .
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 RZ,,,,| kab
Distribusi posterior bersyarat untuk a diberikan oleh
Diambil logaritma distribusi posterior bersyarat untuk b:
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
itu diambil dengan .
30
4. Membangkitkan nilai acak RZ,,,,| bak
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 R,,,,| kbazt
Distribusi posterior bersyarat untuk diberikan oleh
dengan , , t=1,...,T
Nilai dibangkitkan menggunakan metode IC-MH, dengan proposalnya yaitu
dan rasio penerimaannya yaitu .
31
6. Membangkitkan nilai acak RZ,,,,| bak
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 .
7. Kembali ke langkah 2
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
% pembagkitan proposal a*
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
if u <= ap, b = pr; end
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
error( 'diffARCH(ba) and diffARCH(bb) do not have opposite signs' );
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
At = sig2t.^(0.5).*(zt-mz);
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)...
-(0.75)*k*Rt(1)*mz)./((m_a/(1-b))^(2.5)*zt(1)*(1-b)^(2))...
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];
% % ===== Numerical Standard Error (NSE) ====================================
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
end
4.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')
4.7 Kode Pendukung
Kode truncnormrnd, IACT, momentg, HPD, NSE, dan mprint dapat dilihat dalam
Nugroho (2014).
49
Lampiran 5. Sertifikat Seminar
50