Este texto trata da construção de exemplos de modelos GARCH multivariados. Para tanto, considere os modelos a seguir:
As próximas sessões apresentarão exemplos de tais modelos utilizando as bibliotecas ccgarch, rmgarch, MTS e gogarch do R.
Modelos BEKK(1,1) são da forma:
em que \(\textbf{A}_0\) é uma matriz triangular de tal maneira que \(\textbf{A}_0\textbf{A}_0^T\) é positiva deifinida.
A partir da formulação (1), considere os seguintes valores das matrizes:
\[ \textbf{A}_0 = \left( \begin{array}{ccc} 1 & 0.20 & 0.30 \\ 0 & 1.04 & 0.01 \\ 0 & 0 & 0.90 \end{array} \right)\\ \textbf{A}_1=\left( \begin{array}{ccc} 0.30 & 0.01 & 0.02 \\ -0.02 & 0.40 & 0.30 \\ -0.01 & -0.06 & 0.50 \end{array} \right)\\ \textbf{B}_1=\left( \begin{array}{ccc} 0.20 & -0.03 & 0.70\\ 0.01 & 0.30 & 0.01 \\ -0.10 & -0.06 & 0.50 \end{array} \right)\\ \Sigma_0=\textbf{I}_3 \]
O gráfico abaixo apresenta as séries simuladas com os parâmetros acima:
plot.ts(matrix.bekk.sim)
Utilizaremos o pacote MTS para estimar os parâmetros deste processo.
MTSOs ajustes para modelos BEKK são, em geral, muito custoso computacionalmente por conta da sua grande quantidade de parâmetros a serem estimados. Nesta seção utilizaremos o pacote MTS para estimar os parâmetros da série multivariada simulada na seção anterior.
Para o ajuste do modelo BEKK(1,1) utilizamos a seguinte sintaxe:
fit.bekk.mts<-BEKK11(matrix.bekk.sim)
As estimativas são dadas por:
## mu1 mu2 mu3 A011 A021 A031 A022
## -0.041286 0.036615 0.052380 1.086676 0.173640 0.392394 1.213758
## A032 A033 A11 A21 A31 A12 A22
## -0.036296 1.848755 0.100000 0.020000 0.020000 0.020000 0.100000
## A32 A13 A23 A33 B11 B21 B31
## 0.020000 0.020000 0.020000 0.100000 0.800000 0.020000 0.020000
## B12 B22 B32 B13 B23 B33
## 0.020000 0.800000 0.020000 0.020000 0.020000 0.800000
Modelos CCC-GARCH são da forma:
\(h_{ii,t}\) é um modelo GARCH univariado qualquer e \(\textbf{R}= \left[\rho_{i,j}\right],i,j=1,\dots,n\) e \(\rho_{i,i}=1,i=1,\dots,n\) é uma matriz simétrica, positiva definida.
Teremos que \(\textbf{H}_t\) será positiva definida se e só se todas as n variâncias condicionais forem positivas e \(\textbf{H}_t\ge 0\). Em particular um CCC-GARCH(1,1) seria da forma dada em (2), com \(h_{ii,t},i=1,\dots,n\) definidos por
\[
h_{ii,t}=w_i+a_i\epsilon^2_{i,t-1}+b_i h_{ii,t-1},i=1\dots,n
\]
Ou seja, cada \(h_{ii,t}\) é dado por um GARCH(1,1).
Utilizando o pacote ccgarch, simularemos um modelo CCC-GARCH(1,1) bivariado definido por: \[
\textbf{R}=\left(\begin{array}{cc} 1 & 0.3 \\ 0.3 & 1\end{array}\right) \\
h_{11,t}= 0.05 + 0.1 \epsilon^2_{1,t-1}+ 0.6 h_{11,t-1} \\
h_{22,t}= 0.02 + 0.05 \epsilon^2_{2,t-1}+ 0.75 h_{22,t-1}
\]
#### EXEMPLOS USANDO O PACOTE 'ccgarch'
# eccc.sim Arguments:
# 'nobs' a number of observations to be simulated (T)
# 'a' a vector of constants in the GARCH equation (N×1)
# 'A' an ARCH parameter matrix in the GARCH equation.
# Can be a diagonal matrix for the original CCC-GARCH model or a full
# matrix for the extended model (N×N)
# 'B' a GARCH parameter matrix in the GARCH equation.
# Can be a diagonal matrix for the original CCC-GARCH model or a full
# matrix for the extended model (N×N)
# 'R' a constant conditional correlation matrix (N×N)
# 'd.f' the degrees of freedom parameter for the t-distribution
# 'model' "diagonal" for the diagonal model and "extended" for the extended model
c.a1=c(0.05,0.02)
c.A1=matrix(c(0.1,0,0,0.05),ncol=2)
c.B1=matrix(c(0.6,0,0,0.75),ncol=2)
c.R1=matrix(c(1,0.3,0.3,1),ncol=2)
c.H1<-eccc.sim(nobs=1000, c.a1, c.A1, c.B1, c.R1, d.f=5, model="diagonal")
#'h' a matrix of the simulated conditional variances (T × N )
#'eps' a matrix of the simulated time series with (E)CCC-GARCH process (T × N )
plot.ts(c.H1$eps, main = "Processos simulados")
plot.ts(c.H1$h, main="Volatilidade observada nos processos simulados")
Para o processo simulado, vamos estimar os parâmetros utilizando o mesmo pacote, com a função eccc.estimation. Temos duas séries simuladas, e suporemos então que elas seguem um CCC-GARCH(1,1) e são regidas pelo processo:
Para estimar o processo, é necessário sugerir os ‘chutes’ iniciais para o algoritmo de otimização. Façamos então:
\[ \textbf{w}_0=\textbf{1}_2 \\ \textbf{A}_0=\textbf{I}_2 \\ \textbf{B}_0=\textbf{I}_2 \\ \textbf{R}_0=\textbf{I}_2 \\ \]
c.w0=c(1,1)
c.A0=diag(2)
c.B0=diag(2)
c.R0=diag(2)
c.fit1<-eccc.estimation(a=c.w0,A=c.A0,B=c.B0,R=c.R0,model="diagonal",dvar=c.H1$eps)
c.fit1$opt$convergence
## [1] 0
# $convergence == 0 ## Means convergence criteria has reached
Os resultados da estimação foram:
c.fit1$para.mat
## $a
## [1] 0.098422 0.030121
##
## $A
## [,1] [,2]
## [1,] 0.15865 0.00000
## [2,] 0.00000 0.12523
##
## $B
## [,1] [,2]
## [1,] 0.56705 0.00000
## [2,] 0.00000 0.71541
##
## $R
## [,1] [,2]
## [1,] 1.00000 0.34062
## [2,] 0.34062 1.00000
c.fit1$out
## a1 a2 A11 A22 B11 B22
## para.estimates 0.0984224 0.030121 0.158648 0.1252254 0.5670549 0.715409
## Inv. Hessian 0.0092265 0.028668 0.026686 0.0081792 0.0046248 0.047223
## Outer Prod. 0.0233127 0.031010 0.080782 0.0075643 0.0253676 0.056035
## Robust 0.0093408 0.035599 0.028977 0.0111236 0.0033475 0.065910
## R21
## para.estimates 0.340622
## Inv. Hessian 0.027924
## Outer Prod. 0.027862
## Robust 0.028438
Modelos DCC-GARCH são uma generalização do caso CCC-GARCH, isto é, temos a matris R não necessariamente fixa, ou seja, ela varia no tempo:
\(\textbf{D}_t\) é definida como em (2) e \(\textbf{R}_t\) tem expressão específica. Tse e Tsui(2002) sugerem \(\textbf{R}_t\) definida por (DCCt-GARCH)
Em que \(\textbf{R}= \left[\rho_{i,j}\right], i,j = 1,\dots,n\) e \(\rho_{i,i}=1,i=1,\dots,n\) é uma matriz simétrica, positiva definida e \(\Psi_{t-1}\) uma matriz de correlações de \(\epsilon_\tau\) definida convenientemente.
Já Engle(2002) propõe \(\textbf{R}_t\) como (DCCe-GARCH):
Com \(\textbf{Q}_t\) não negativa definida, de ordem \(n\times n\) definida de forma semelhante a \(\textbf{R}_t\) em (5), isto é:
\[\textbf{Q}_t=(1-\alpha-\beta)\textbf{Q}+\alpha \textbf{u}_{t-1}\textbf{u}^T_{t-1}+\beta\textbf{Q}_{t-1}\]
Para simular o processo DCC-GARCH, consideraremos os pacotes ccgarch. Compararemos o resultado da estimação através dos pacotes ccgarch, rmgarch e MTS, para que possamos comparar suas performances. A parametrização utilizada será aquela proposta por Engle ( veja equação 6).
#### EXEMPLOS USANDO O PACOTE 'ccgarch'
# dcc.sim Arguments:
# 'nobs' a number of observations to be simulated (T )
# 'a' a vector of constants in the vector GARCH equation (N × 1)
# 'A' an ARCH parameter matrix in the vector GARCH equation (N × N )
# 'B' a GARCH parameter matrix in the vector GARCH equation (N × N )
# 'R' an unconditional correlation matrix (N × N )
# 'dcc.para' a vector of the DCC parameters (2 × 1)
# 'd.f' the degrees of freedom parameter for the t-distribution
# 'model' a character string describing the model.
# "diagonal" for the diagonal model and "extended" for the extended
# (full ARCH and GARCH parameter matrices) model
d.a1=c(0.05,0.02)
d.A1=matrix(c(0.1,0,0,0.05),ncol=2)
d.B1=matrix(c(0.6,0,0,0.75),ncol=2)
d.R1=matrix(c(1,0.3,0.3,1),ncol=2)
d.alpha1 = 0.1
d.beta1 = 0.2
d.H1<-dcc.sim(nobs=1000, d.a1, d.A1, d.B1, d.R1, dcc.para=c(d.alpha1,d.beta1), d.f=5, model="diagonal")
# 'dcc' a matrix of the simulated dynamic conditional correlations (T × N 2 )
# 'h' a matrix of the simulated conditional variances (T × N )
# 'eps' a matrix of the simulated time series with DCC-GARCH process (T × N )
plot.ts(d.H1$eps, main = "Processos simulados")
plot.ts(d.H1$h, main="Volatilidade observada nos processos simulados")
plot.ts(d.H1$dcc, main="Dt")
ccgarchPara estimar os parâmetros do processo simulado acima, considere a função dcc.est do ccgarch, que estima os parâmetros via máxima verossimilhança em dois estágios. Assim como no caso do CCC-GARCH, utilizaremos as seguintes quantidades iniciais para o processo iterativo:
\[ \textbf{A}_0=\textbf{I}_2 \\ \textbf{B}_0=\textbf{I}_2 \\ \textbf{R}_0=\textbf{I}_2 \\ \alpha=0.5\\ \beta=0.5 \]
d.w0=c(0.2,0.2)
d.A0=diag(2)
d.B0=diag(2)
d.alpha0 = 0.5
d.beta0 = 0.5
d.fit1<-dcc.estimation(inia=d.w0,iniA=d.A0,iniB=d.B0,ini.dcc=d.w0,model="diagonal",dvar=d.H1$eps)
## ****************************************************************
## * Estimation has been completed. *
## * The outputs are saved in a list with components: *
## * out : the estimates and their standard errors *
## * loglik : the value of the log-likelihood at the estimates *
## * h : a matrix of estimated conditional variances *
## * DCC : a matrix of DCC estimates *
## * std.resid : a matrix of the standardised residuals *
## * first : the results of the first stage estimation *
## * second : the results of the second stage estimation *
## ****************************************************************
Os resultados da estimação seguem abaixo:
d.fit1$out
## a1 a2 A11 A22 B11 B22 dcc alpha
## estimates 0.056713 0.035230 0.16272 0.103749 0.669107 0.74201 0.124399
## std.err 0.026292 0.067298 0.12208 0.016182 0.035568 0.08875 0.031886
## dcc beta
## estimates 0.49716
## std.err 0.13897
rmgarchNovamente, utilizaremos a parametrização para \(\textbf{R}_t\) proposta por Engle (2002) (equação 6). Para estimar o processo rmgarch é necessário inicialmente declarar as especificações do modelo. Para tanto, considerando normalidade
spec1 = ugarchspec(distribution = "std")
mspec = multispec(c(spec1,spec1))
fitspec=dccspec(mspec,VAR=TRUE,lag=1,dccOrder=c(1,1),model="DCC",distribution="mvt")
d.fit2=dccfit(fitspec,d.H1$eps)
O resultado do modelo ajustado é o que se segue:
d.fit2
##
## *---------------------------------*
## * DCC GARCH Fit *
## *---------------------------------*
##
## Distribution : mvt
## Model : DCC(1,1)
## No. Parameters : 18
## [VAR GARCH DCC UncQ] : [6+8+3+1]
## No. Series : 2
## No. Obs. : 1000
## Log-Likelihood : -1339.9
## Av.Log-Likelihood : -1.34
##
## Optimal Parameters
## -----------------------------------
## Estimate Std. Error t value Pr(>|t|)
## [Asset_1].omega 0.041421 0.018185 2.2777 0.022742
## [Asset_1].alpha1 0.130846 0.048308 2.7086 0.006757
## [Asset_1].beta1 0.749729 0.085894 8.7285 0.000000
## [Asset_1].shape 5.113644 0.656502 7.7892 0.000000
## [Asset_2].omega 0.039443 0.025447 1.5500 0.121134
## [Asset_2].alpha1 0.101258 0.043287 2.3392 0.019323
## [Asset_2].beta1 0.725629 0.144726 5.0138 0.000001
## [Asset_2].shape 5.131066 0.675158 7.5998 0.000000
## [Joint]dcca1 0.136224 0.030722 4.4341 0.000009
## [Joint]dccb1 0.441155 0.088588 4.9798 0.000001
## [Joint]mshape 5.629992 0.450149 12.5069 0.000000
##
## Information Criteria
## ---------------------
##
## Akaike 2.7158
## Bayes 2.8041
## Shibata 2.7151
## Hannan-Quinn 2.7493
##
##
## Elapsed time : 2.8093
MTSO ajuste do modelo DCC-GARCH via pacote MTS é apresentado por Tsay(2014) e é realizado em duas etapas. Em primeiro lugar, ajusta-se um modelo GARCH é ajustado para as componentes da série multivariada e depois os paretros do modelo DCC-GARCH são estimados. Inicialmente, apenas o modelo DCC(1,1) está implementado. A sintaxe para o ajuste do processo simulado é:
mtspre.fit3=dccPre(d.H1$eps, include.mean = T, p = 0, cond.dist = "std")
## Sample mean of the returns: 0.023047 -0.019557
## Component: 1
## Estimates: 0.042374 0.13458 0.74396 5.0975
## se.coef : 0.016382 0.041482 0.07412 0.81529
## t-value : 2.5866 3.2443 10.037 6.2524
## Component: 2
## Estimates: 0.039859 0.10117 0.72462 5.017
## se.coef : 0.020426 0.038966 0.11472 0.77394
## t-value : 1.9514 2.5963 6.3162 6.4824
d.fit3=dccFit(mtspre.fit3$sresi, type = "Engle", theta = c(d.alpha0, d.beta0),
ub = c(0.92, 0.92), lb = c( 1e-04, 1e-04), cond.dist = "std", df = 5)
## Estimates: 0.44234 0.14215 5.5709
## st.errors: 0.13729 0.038773 0.50538
## t-values: 3.2219 3.6663 11.023
Os resultados para o ajuste do modelo simulado são apresentados a seguir:
names(d.fit3$estimates)<-c("theta1","theta2","df.t")
mtspre.fit3$est
## omega alpha1 beta1 shape
## [1,] 0.042374 0.13458 0.74396 5.0975
## [2,] 0.039859 0.10117 0.72461 5.0170
d.fit3$estimates
## theta1 theta2 df.t
## 0.44234 0.14215 5.57088
plot.ts(d.fit3$rho.t,cex.lab=0.5,cex.axis=0.8, main = "Dt")
Vimos tanto no exemplo do CCC-GARCH quanto no do DCC-GARCH que o pacote ccgarch não apresentou estimativas satisfatórias para os parâmetros dos modelos simulados, principalmente nos casos dos parâmetros do vetor a e da matriz A da equação (3) que define as componentes dos processos GARCH.
Da mesma forma, os pacotes rmgarch e MTS não apresentaram resultados próximos dos verdadeiros valores dos parâmetros. Dentre os três ajustes, o ajuste do pacote MTS foi o que apresentou menos discrepância, tendo maior viés na estimativa dos parâmetros do modelo DCC(1,1) do que nos modelos GARCH de sua primeira etapa.
Nos modelos GO-GARCH, estamos interessados em construir decomposições ortogonais para a matriz de covariâncias \(\Sigma_t\). Em outras palavras, buscamos a seguinte igualdade:
\[ Cov(r_t | \mathbb{F}_{t-1}) = \Sigma_t = M V_t M^T \]
em que \(V_t\) é a matriz de covariâncias das componentes latentes do processo, \(\textbf{b}_t=(b_{1t},b_{2t},\dots,b_{kt}),k \ge n\), i.e., \(V_t=Cov(\textbf{b}_t | \mathbb{F}_{t-1})\). Se a transformação acima existir, então as variáveis latentes podem ser expressas por:
Assumiremos que \(V_t\) é diagonal e que a variância não-condicional de \(\textbf{b}_t\) é a matriz identidade \(\textbf{I}_k\). Ainda, assumiremos que a matriz M é invariante no tempo.
Considere um processo composto por variáveis latentes \(b_{i,t},i=1,2,3\). Suporemos que estas variáveis são fatores independentes e seguem um GARCH(1,1) de parâmetros \(\alpha=0.2\) e- \(\beta=0.7\), cada uma delas. Utilizamos o pacote fGarch para simular cada uma destas variáveis:
gog.spec = garchSpec(model = list(alpha = 0.2, beta = 0.7))
gog.b1<-garchSim(gog.spec, n = 1000)
gog.b2<-garchSim(gog.spec, n = 1000)
gog.b3<-garchSim(gog.spec, n = 1000)
gog.bt<-cbind(gog.b1,gog.b2,gog.b3)
plot.ts(as.ts(gog.bt), main="Processos simulados")
A Matriz M apresentada em (7) é dada por:
\[ M= \left( \begin{array}{ccc} -0.4 & 0.1 & -0.3\\ 0.3 & 0.3 & -0.1\\ 0.4 & -0.1 & -0.5 \end{array} \right) \]
M=matrix(c(-0.4,0.1,-0.3,0.3,0.3,-0.1,0.4,-0.1,-0.5),ncol=3,byrow=T)
Assim, a partir da equação (7) teremos:
gog.rt<-t(M%*%t(bt))
gogarchEstimaremos os parâmetros do processo simulado no início da seção a partir do pacote gogarch do R. Os valores ajustados para os processos GARCH dos fatores encontram-se próximos aos valores reais utilizados na simulação do processo. A matriz Z estimada, de acordo com Van Der Weide (2002), deveria representar os valores da matriz M em (7) e a matriz U, a matriz rotacionada ortogonal.
system.time(fit1_gogarch<-gogarch(gog.rt*10^3,~garch(1,1),estby="ml"))
## user system elapsed
## 22.136 33.064 18.943
# Slots:
# opt: Object of class "list": List returned by nlminb.
# estby: Object of class "character": Estimation method.
# models: Object of class "list": List of univariate GARCH model fits.
# garchf: Object of class "formula": Garch formula used for uncorrelated component GARCH models.
# name: Object of class "character": The name of the original data object.
# X: Object of class "matrix": The data matrix.
# V: Object of class "matrix": Covariance matrix of X.
# Z: Object of class "matrix": Transformation matrix.
# H: Object of class "list": List of conditional variance/covariance matrices.
# U: Object of class "matrix": Orthogonal matrix.
# Y: Object of class "matrix": Extra cted component matrix.
# P: Object of class "matrix": Left singular values of Var/Cov matrix of X.
# Dsqr: Object of class "matrix": Square roots of eigenvalues on diagonal, else zero.
fit1_gogarch
##
## ****************
## *** GO-GARCH ***
## ****************
##
## Components estimated by: maximum likelihood
## Dimension of data matrix: (1000 x 3).
## Formula for component GARCH models: ~ garch(1, 1)
##
## Orthogonal Matrix U:
## [,1] [,2] [,3]
## [1,] 1.0478e-17 -0.67246 0.74014
## [2,] 1.7112e-01 -0.72922 -0.66254
## [3,] 9.8525e-01 0.12665 0.11507
##
## Linear Map Z:
## [,1] [,2] [,3]
## [1,] 0.69552 1.09863 -1.00335
## [2,] -0.85554 0.70368 0.96697
## [3,] 0.75676 0.55470 1.88181
##
## Estimated GARCH coefficients:
## omega alpha1 beta1
## y1 0.044246 0.22426 0.68510
## y2 0.196219 0.20642 0.71274
## y3 0.062684 0.20047 0.72584
##
## Convergence codes of component GARCH models:
## y1 y2 y3
## 1 1 1
rmgarchTambém é possível ajustar modelos GO-GARCH a partir do pacote rmgarch. Para tanto, especifiquemos os parâmetros do processo inicialmente:
gogarchspec2<-gogarchspec(mean.model=list(model="constant"),distribution.model="mvnorm")
O ajuste do modelo via rmgarch se da a partir da função gogarchfit. Inicialmente o pacote sugere a mudança de escala na matriz de dados, já que os valores originais próximos a zero (usual para log-retornos) apresentou muitos problemas de matrizes não invertíveis. Logo, ajustemos o modelo para a série de interesse re-escalada para \(r_t \times 1000\).
gogarchfit2<-gogarchfit(gogarchspec2,gog.rt*10^3)
gogarchfit2
##
## *------------------------------*
## * GO-GARCH Fit *
## *------------------------------*
##
## Mean Model : CONSTANT
## GARCH Model : sGARCH
## Distribution : mvnorm
## ICA Method : fastica
## No. Factors : 3
## No. Periods : 1000
## Log-Likelihood : -5331.36
## ------------------------------------
##
## U (rotation matrix) :
##
## [,1] [,2] [,3]
## [1,] -0.9153 0.403 0.00414
## [2,] -0.3998 -0.910 0.11297
## [3,] 0.0493 0.102 0.99359
##
## A (mixing matrix) :
##
## [,1] [,2] [,3]
## [1,] -1.30 -0.980 -0.166
## [2,] 1.01 -0.364 -1.007
## [3,] 1.54 -1.356 0.474
coef(gogarchfit2)
## F_1 F_2 F_3
## omega 0.074532 0.076493 0.083483
## alpha1 0.230000 0.196565 0.219733
## beta1 0.696784 0.728724 0.690486
O pacote constrói ainda as superfícies estimadas de relação entre as diferentes séries da matriz de dados, a partir dos fatores estimados: