2016-03-26 2 views
0

Ich versuche, ein Programm in Oxmetrics schreiben, die ein multivariates GARCH-Modell schätzt. Mein multivariates GARCH-Modell hat die unbedingte Kovarianzmatrix (sollte die X-Variable sein) als Eingabe, aber ich bin mir nicht sicher, wie ich die korrekte Matrix bei jeder Iteration richtig spezifizieren soll.Oxmetrics, Matrizen als Eingabe in Loglikelihood-Funktion (GARCH)

Mein Programm sieht wie folgt nun:

//Global variable; visible also in the likelihood function 

decl X; 


//Likelihood contributions 

garch_likelihood_contributions(likval_t, par) 

{ 

//Local variables 
decl covar, lik, H,C,A, i; 

//Parameters 
C = par[0]; 
A = par[1]; 


//conditional covariance sequence 
H   = constant(.NaN,2,2); 
H   = C*C'+ exp(-A)*H[0][]+A*exp(-A)*X[0][]; 
H[][0] = 0;   //Initial value 
X[][0] = sumc(covar[m])/2071; // Not correct specified yet, should be the sample average of the covariance matrices // 

for(decl i=1; i<columns(X); ++i) 

    { 

     H[0][i] = C*C'+ exp(-A)*H[i-1][]+A*exp(-A)*X[i-1][]; 

    } 

//likelihood contributions 
lik = constant(.NaN,columns(X),1);     

    lik[0] = 0.5*log(determinant(H[][i-1]))+ 0.5*X[1][]*invert(H[][i-1])*X[1][]'; 
    for(decl i=1;i<2071;++i) 
    { 

     lik[i] = 0.5*log(determinant(H[][i-1])) + 0.5*X[i-1][]*invert(H[][i-1])*X[i-1][]'; // her stod X[i+1] 
    } 
// adFunc[0]  = lik; 
// return !ismissing(adFunc[0]); 
} 

    decl likval_t; 
    //Return vector of likelihood-contributions 
    likval_t[0] = lik; 

//Return success 
return 1; 
} 

//Likelihood function 
garch_likelihood(par, likval, avScore, amHessian) 
{ 
//Local variables 
decl likval_t; 

//Likelihood contributions 
garch_likelihood_contributions(&likval_t, par); 

//Return likelihood-value 
likval[0] = double(sumc(likval_t)); 

//Return success 
return 1; 
} 

main() 
{ 
//Declare variables 
decl data; 
decl loglik, par; 
decl C, A, covar; 
decl vol, r, S_t, K, P; 

//Load data: 

data = loadmat("covariances.in7")'; 
P  = data[0][0:]; 

covar = data[0:1][0:]; 


X   = constant(.NaN,2,2); 
for (decl i = 0, i < columns(P), i+2 ) 
    { 
    j[i] = <0,2;0,2> 
    X[i]= vech(j[i]); 

    } 

//Initial values for parameters 
par  = 0.1|0.5;     //i.e. (omega, alpha, beta). Try out different starting values! 

//Settings for likelihood estimation 
MaxControlEps(1e-6,1e-4);  
MaxControl(20000, 1, 1); 

//Maximize likelihood function 
print("\n\n","Maximizing likelihood: \n"); 
MaxBFGS(garch_likelihood, &par, &loglik, 0, 1); 

print("%r",{"C","A"} 
    ,"%c",{"MLE"}, 
    par); 
println("\nMaximized likelihood: ", loglik); 
} 

Im Haupt, sollten Sie bemerkt, dass ich versucht habe, für jede Iteration die Variable X als 2x2-Matrix zu spezifizieren. Die Idee ist, dass die Schleife für jedes i die 2 ersten Cloumns und Zeilen aus dem Datenblatt "covariances.in7" in X zuordnet. Der Schritt für die Schleife sollte 2 sein, so dass i = 1,3,5,7 ect.

Bitte schreiben Sie Ihre Gedanken, es ist sehr geschätzt.

Mit freundlichen Grüßen,

Kristian

Antwort

0

Ich bin jetzt bewusst, dass ich die folgenden, um meine Schleife zu schreiben, jede zweite Beobachtung zu prüfen;

X   = constant(.NaN,2,2); 
for (decl i = 0, i < columns(P), ++i ) 
{ 
j[i] = <0,2;0,2> 
X[i]= vech(j[i]); 
i=i+1; 
}