'Sample festlegen
sample s0 12/31/1999 4/30/2018
sample s1 1/7/2000 4/30/2018


'Zeitreihen definieren
series y1=aus
series y2=chi

!itermle = 1000

smpl s0

'univariates GARCH(1,1) Model für die Zeitreihen erstellen
equation eq_y1.arch(1,1,thrsh=1,m=1000,c=1e-5,h) y1 c y1(-1)
equation eq_y2.arch(1,1,thrsh=1,m=1000,c=1e-5,h) y2 c y2(-1)

'Residuen extrahieren
eq_y1.makeresids z1
eq_y2.makeresids z2

'GARCH Term extrahieren
eq_y1.makegarch() garch1
eq_y2.makegarch() garch2

'standardisieren der Residuen von z zu z* (z1n und z2n genannt)
series z1n = z1/garch1^0.5
series z2n = z2/garch2^0.5

'erstellen der Residuen für asymmetrien im DCC GARCH
series az1n=@recode(z1n<0,z1n*z1n,0)
series az2n=@recode(z2n<0,z2n*z2n,0)

'definieren der Matrix Q_bar=E(zn*zn´) Komponenten und der Stichproben Äquivalente
series qbar11 = @mean(z1n*z1n)
series qbar12 = @mean(z1n*z2n)
series qbar21 = @mean(z2n*z1n)
series qbar22 = @mean(z2n*z2n)

'definieren der Matrix N_bar
series nbar11 = @mean(az1n*az1n)
series nbar12 = @mean(az1n*az2n)
series nbar21 = @mean(az2n*az1n)
series nbar22 = @mean(az2n*az2n)

'definieren der (zn*zn´) Matrix Komponenten
series z11n = z1n*z1n
series z12n = z1n*z2n
series z21n = z2n*z1n
series z22n = z2n*z2n

'definieren der (nn*nn´) Matrix Komponenten
series az11n = az1n*az1n
series az12n = az1n*az2n
series az21n = az2n*az1n
series az22n = az2n*az2n

'Initialisieren der Elemente von Qt
series q11 = @var(z1)
series q12 = @cov(z1,z2)
series q21 = @cov(z2,z1)
series q22 = @var(z2)

'definieren der Anfangswerte der Koeffizienten
coef(1) alpha
coef(1) beta
coef(1) gamma


'Anfangswerte der Koeffizienten aus univariatem GARCH
alpha(1) = 0.04
beta(1) = 0.94
gamma(1) = 0.02

'LOG LIKELIHOOD
'likelihood einrichten
'1) ein leeres Objekt öffnen und es mit "dcc" benennen
'2) spezifizieren des Log_Likelihood Modells durch Anhängen
'.....................................................................................................................

logl dcc
dcc.append @logl logl

'definieren der Elemente der Matrix Qt
dcc.append  q11 = (qbar11 - (alpha(1))^2*qbar11 - (beta(1))^2*qbar11 - (gamma(1))^2*nbar11) + (alpha(1))^2*z11n(-1) + (gamma(1))^2*az11n(-1) + (beta(1))^2*q11(-1)
dcc.append  q12 = (qbar12 - (alpha(1))^2*qbar12 - (beta(1))^2*qbar12 - (gamma(1))^2*nbar12) + (alpha(1))^2*z12n(-1) + (gamma(1))^2*az12n(-1) + (beta(1))^2*q12(-1)
dcc.append  q21 = (qbar21 - (alpha(1))^2*qbar21 - (beta(1))^2*qbar21 - (gamma(1))^2*nbar21) + (alpha(1))^2*z21n(-1) + (gamma(1))^2*az21n(-1) + (beta(1))*2*q21(-1)
dcc.append  q22 = (qbar22 - (alpha(1))^2*qbar22 - (beta(1))^2*qbar22 - (gamma(1))^2*nbar22) + (alpha(1))^2*z22n(-1) + (gamma(1))^2*az22n(-1) + (beta(1))^2*q22(-1)

'Input für detQQQ vorbereiten
dcc.append  q12n = ((qbar12 - (alpha(1))^2*qbar12 - (beta(1))^2*qbar12 + (gamma(1))^2*nbar12) + (alpha(1))^2*z12n(-1) + (gamma(1))^2*az12n(-1) + (beta(1))^2*q12(-1))/((abs(q11)^0.5)*(abs(q22)^0.5))
dcc.append  q21n = ((qbar21 - (alpha(1))^2*qbar21 - (beta(1))^2*qbar21 + (gamma(1))^2*nbar21) + (alpha(1))^2*z21n(-1) + (gamma(1))^2*az21n(-1) + (beta(1))*2*q21(-1))/((abs(q22)^0.5)*(abs(q11)^0.5))


'Aufbau der Log Likelihood Funktion unter der Annahme das die Residuen ~ N(0,H)

'DIe Loglikelihood Funktion ist L*=-0.5*Die Summe von t=1 bis T von [ln(|Rt|)+et´Rt^-1et]

'defnieren der determinanten der Korrelationsmatrix (Rt =QQQ-Matrix)
dcc.append detQQQ = 1-q12n*q21n
dcc.append detQQQ=@abs(detQQQ)


dcc.append cofact11 = 1*1
dcc.append cofact12 = (-1)*q21n
dcc.append cofact21 = (-1)*q12n
dcc.append cofact22 = 1*1

dcc.append invQQQ11 = cofact11/detQQQ
dcc.append invQQQ12 = cofact12/detQQQ
dcc.append invQQQ21 = cofact21/detQQQ
dcc.append invQQQ22 = cofact22/detQQQ

dcc.append znQQQzn11 = z1n*invQQQ11*z1n
dcc.append znQQQzn12 = z1n*invQQQ12*z2n
dcc.append znQQQzn21 = z2n*invQQQ21*z1n
dcc.append znQQQzn22 = z2n*invQQQ22*z2n

'Anhängen der Log Likelihood Funktion
'statt log(detQQQ) wird log(abs(detQQQ)) genutzt
dcc.append logl = -0.5*(log(abs(detQQQ))+(znQQQzn11+znQQQzn21+znQQQzn12+znQQQzn22))

'definieren des Zeiraumes für die Schätzung
smpl s1

'schätzen des Modell
dcc.ml(b,showopts, m=!itermle, c=1e-5)

'Output anzeigen lassen
show dcc.output

'löschen nicht mehr benötigter Variablen
delete z1n z2n
delete az1n az2n
delete z11n z12n z21n z22n
delete az11n az12n az21n az22n
delete cofact*
delete qbar*
delete nbar*
delete s0 s1
delete invQQQ*
delete znQQQzn*
