InĀ [1]:
options(OutDec = ",") 
#==============================================================================
# Descricao
#==============================================================================
# Os dados a seguir correspondem aos indices diarios da BOVESPA de 3 de
# janeiro de 2011 a 10 de setembro de 2021.
#
# Os dados foram obtidos do sitio http://br.financas.yahoo.com/ 
# 
# Concentraremos nos indices (precos) de fechamento ("Close")
#
#==============================================================================
# Carregando pacotes
#==============================================================================
silence <- suppressPackageStartupMessages # Para omitir mensagens de alertas
silence(library(tseries))      # Teste de Jarque-Bera: 'jarque.bera.test'
silence(library(psych))        # Estatistica descritiva: 'describe'
silence(library(latticeExtra)) # Para construir dois graficos em um so'
silence(library(fGarch))       # Para os modelos ARCH e GARCH
InĀ [2]:
#==============================================================================
# Lendo os dados do arquivo BVSP.csv
#==============================================================================
BVSP  <- read.csv("../dados/BVSP.csv",header=TRUE,sep=",")
print(head(BVSP))

# Copiando os indices de fechamento como a serie de precos
preco <- BVSP$Close 
dias  <- as.Date(BVSP$Date) # Dias
n     <- length(preco)      # Numero de observacoes
        Date  Open  High   Low Close Adj.Close  Volume
1 2011-01-03 69310 70471 69305 69962     69962 1862400
2 2011-01-04 69962 70318 69560 70318     70318 2427200
3 2011-01-05 70311 71173 69802 71091     71091 2309200
4 2011-01-06 71093 71167 70469 70579     70579 2546000
5 2011-01-07 70580 70783 69718 70057     70057 1761000
6 2011-01-10 70056 70133 69666 70127     70127 1610800
InĀ [3]:
#==============================================================================
# Grafico da serie de precos
#==============================================================================
par(mfrow=c(1,1),lwd=2.0,cex.lab=1.5,cex.axis=1.5,lab=c(15,5,5),
    mar=c(5,5,2,2.5),xpd=T,cex.main=2.0,bty="n")
plot(dias,preco/1000,lwd=2,type="l",col="black",main="",xlab="Dias",
    ylab="PreƧo (milhares)",ylim=c(20,140),
    xlim=c(as.Date("2011-01-01"),as.Date("2021-12-31")))
No description has been provided for this image
InĀ [4]:
#==============================================================================
# Calculando o retorno de capitalizacao continua, ou simplesmente log-retorno
#==============================================================================
rt <- diff(log(preco))  # Calcula a primeira diferenca
N  <- length(rt)
InĀ [5]:
#==============================================================================
# Grafico da serie de log retornos: r_t = log(1+R_t) = log(P_t)-log(P_{t-1})
#==============================================================================
par(mfrow=c(1,1),lwd=2.0,cex.lab=1.5,cex.axis=1.4,lab=c(15,5,5),
    mar=c(5,5,2,2.5),xpd=T,cex.main=2.0,bty="n")
plot(dias[2:n],rt,lwd=2,col="black",main="",xlab="Dias",ylab="Log Retorno",
    type="l",xlim=c(as.Date("2011-01-01"),as.Date("2021-12-31")),
    ylim=c(-0.16,0.16))
No description has been provided for this image
InĀ [6]:
#==============================================================================
# ACF dos log retornos
#==============================================================================
par(mfrow=c(1,1),lwd=2.0,cex.lab=1.5,cex.axis=1.5,lab=c(10,5,5),
     mar=c(5,5,2,2.5),cex.main=2.0,bty="n")
acf(rt,lwd=2,col=1,lag.max=16,xlab="Defasagem",main="",ylim=c(-0.2,1))
No description has been provided for this image
InĀ [7]:
#==============================================================================
# ACF dos log retornos ao quadrado
#==============================================================================
par(mfrow=c(1,1),lwd=2.0,cex.lab=1.5,cex.axis=1.5,lab=c(10,5,5),
     mar=c(5,5,2,2.5),cex.main=2.0,bty="n")
acf(rt^2,lwd=2,col=1,lag.max=16,xlab="Defasagem",main="",ylim=c(-0.2,1))
No description has been provided for this image
InĀ [8]:
#==============================================================================
# Calculando varios momentos amostrais
#==============================================================================
options(digits=4)
r.describe      <- describe(rt)
r.media         <- r.describe[,3]
r.desvpad       <- r.describe[,4]
r.mediana       <- r.describe[,5]
r.assimetria    <- r.describe[,11]
r.exc.curtose   <- r.describe[,12]
STATS           <- cbind(r.media,r.desvpad,r.mediana,r.assimetria,
                       r.exc.curtose)
colnames(STATS) <- c("media","desvpad","mediana","assimetria","exc.curt")                       
rownames(STATS) <- "IBOVESPA"
print(STATS)
             media desvpad   mediana assimetria exc.curt
IBOVESPA 0,0001878 0,01616 0,0003192    -0,8946    12,23
InĀ [9]:
#==============================================================================
# Histograma dos log retornos
#==============================================================================
par(mfrow=c(1,1),lwd=2.0,cex.lab=1.5,cex.axis=1.5,lab=c(12,5,5),
    mar=c(5,5,2,2.5),xpd=T,cex.main=2.0,bty="n")
hist(rt,lwd=2,col=0,main="",xlab="Log Retornos",ylab="Densidade",prob=T,
    nclass=50,xlim=c(-0.17,0.17))
xseq <- seq(r.media-7*r.desvpad,r.media+7*r.desvpad,length=1000)
yseq <- dnorm(xseq,r.media,r.desvpad)
lines(xseq,yseq,lwd=3,col="red")
text(-0.09,25,"Certamente não normal",cex=1.2)
No description has been provided for this image
InĀ [10]:
#==============================================================================
# Boxplot dos log retornos
#==============================================================================
par(mfrow=c(1,1),lwd=2.0,cex.lab=1.5,cex.axis=1.5,lab=c(10,5,5),
    mar=c(5,5,2,2.5),xpd=T,cex.main=2.0,bty="n")
boxplot(rt,lwd=2,col="red",main="",ylab="Log Retornos",pch=16,
    ylim=c(-0.2,0.2))
No description has been provided for this image
InĀ [11]:
#==============================================================================
# Normal QQ-plot dos log retornos
#==============================================================================
par(mfrow=c(1,1),lwd=2.0,cex.lab=1.5,cex.axis=1.5,lab=c(10,5,5),
    mar=c(5,5,2,2.5),xpd=T,cex.main=2.0,bty="n")
qqnorm(rt,lwd=2,col="red",main="",xlab="Quantis teóricos",
    ylab="Quantis amostrais",pch=16,xlim=c(-4,4),ylim=c(-0.2,0.2))
qqline(rt,lwd=2,col="black",xlim=c(-4,4),xpd=F)
No description has been provided for this image
InĀ [12]:
#==============================================================================
# Estudaremos os modelos GARCH e depois ajustaremos diversos modelos com varias
# distribuicoes para os termos de erro, inclusive erros assimetricos. 
# Depois veremos mais uma vez a previsao.
#==============================================================================
# Ajuste de modelos GARCH 
#==============================================================================
defaultW <- getOption("warn")
options(warn = -1)
# Modelos ARCH
garch.1.0  <- garchFit( rt ~ garch(1,0), data=rt,trace=F)   #GARCH(1,0)
garch.2.0  <- garchFit( rt ~ garch(2,0), data=rt,trace=F)   #GARCH(2,0)
garch.3.0  <- garchFit( rt ~ garch(3,0), data=rt,trace=F)   #GARCH(3,0)
garch.4.0  <- garchFit( rt ~ garch(4,0), data=rt,trace=F)   #GARCH(4,0)
garch.5.0  <- garchFit( rt ~ garch(5,0), data=rt,trace=F)   #GARCH(5,0)
garch.6.0  <- garchFit( rt ~ garch(6,0), data=rt,trace=F)   #GARCH(6,0)
garch.7.0  <- garchFit( rt ~ garch(7,0), data=rt,trace=F)   #GARCH(7,0)
garch.8.0  <- garchFit( rt ~ garch(8,0), data=rt,trace=F)   #GARCH(8,0)
garch.9.0  <- garchFit( rt ~ garch(9,0), data=rt,trace=F)   #GARCH(9,0)
garch.10.0 <- garchFit( rt ~ garch(10,0),data=rt,trace=F)   #GARCH(10,0)
garch.11.0 <- garchFit( rt ~ garch(11,0),data=rt,trace=F)   #GARCH(11,0)
garch.12.0 <- garchFit( rt ~ garch(12,0),data=rt,trace=F)   #GARCH(12,0)
garch.13.0 <- garchFit( rt ~ garch(13,0),data=rt,trace=F)   #GARCH(13,0)
garch.14.0 <- garchFit( rt ~ garch(14,0),data=rt,trace=F)   #GARCH(14,0)
garch.15.0 <- garchFit( rt ~ garch(15,0),data=rt,trace=F)   #GARCH(15,0)

# Modelos GARCH
garch.1.1  <- garchFit( rt ~ garch(1,1),data=rt,trace=F)    #GARCH(1,1)
garch.1.2  <- garchFit( rt ~ garch(1,2),data=rt,trace=F)    #GARCH(1,2)
garch.1.3  <- garchFit( rt ~ garch(1,3),data=rt,trace=F)    #GARCH(1,3)
garch.1.4  <- garchFit( rt ~ garch(1,4),data=rt,trace=F)    #GARCH(1,4)

garch.2.1  <- garchFit( rt ~ garch(2,1),data=rt,trace=F)    #GARCH(2,1)
garch.2.2  <- garchFit( rt ~ garch(2,2),data=rt,trace=F)    #GARCH(2,2)

garch.3.1  <- garchFit( rt ~ garch(3,1),data=rt,trace=F)    #GARCH(3,1)
garch.3.2  <- garchFit( rt ~ garch(3,2),data=rt,trace=F)    #GARCH(3,2)
options(warn = defaultW)
InĀ [13]:
#==============================================================================
# Selecao de modelos via BIC
#==============================================================================

options(digits=6)
# ARCH
garch.1.0@fit$ics[2]  
garch.2.0@fit$ics[2]  
garch.3.0@fit$ics[2]  
garch.4.0@fit$ics[2]  
garch.5.0@fit$ics[2]  
garch.6.0@fit$ics[2]  
garch.7.0@fit$ics[2]  
garch.8.0@fit$ics[2]  
garch.9.0@fit$ics[2]  
garch.10.0@fit$ics[2]  
garch.11.0@fit$ics[2]  
garch.12.0@fit$ics[2]  
garch.13.0@fit$ics[2]  
garch.14.0@fit$ics[2]  
garch.15.0@fit$ics[2]  
#GARCH
garch.1.1@fit$ics[2]  # Menor valor, melhor ajuste: -5.64493  
garch.1.2@fit$ics[2]  
garch.1.3@fit$ics[2]   
garch.1.4@fit$ics[2] 
garch.2.1@fit$ics[2]  
garch.2.2@fit$ics[2]  
garch.3.1@fit$ics[2]  
garch.3.2@fit$ics[2]

# De acordo com o BIC, o melhor ajuste aos dados foi do modelo GARCH(1,1).
# Lembre-se que o tamanho da serie e' moderado (2613). 
# Portanto, a penalizacao por adicionar mais parametros e' maior (que no AIC).

# Conclusao momentanea: escolhemos o modelo GARCH(1,1) com erros normais.

summary(garch.1.1)
BIC: -5,56280326040788
BIC: -5,61099119503456
BIC: -5,6126921877549
BIC: -5,6142396302143
BIC: -5,61834537473096
BIC: -5,62248045952816
BIC: -5,62722084874104
BIC: -5,6247997698545
BIC: -5,62347056198723
BIC: -5,62740835182572
BIC: -5,62464205659441
BIC: -5,62232220557292
BIC: -5,62118092921593
BIC: -5,6176299484294
BIC: -5,61532671188704
BIC: -5,6449302639414
BIC: -5,6417670671042
BIC: -5,63875215588232
BIC: -5,63583251115809
BIC: -5,64260254408248
BIC: -5,64182359457313
BIC: -5,63946670557516
BIC: -5,63867198887282
Title:
 GARCH Modelling 

Call:
 garchFit(formula = rt ~ garch(1, 1), data = rt, trace = F) 

Mean and Variance Equation:
 data ~ garch(1, 1)
<environment: 0x5567385f8c98>
 [data = rt]

Conditional Distribution:
 norm 

Coefficient(s):
        mu       omega      alpha1       beta1  
4,4906e-04  1,0336e-05  8,4029e-02  8,7044e-01  

Std. Errors:
 based on Hessian 

Error Analysis:
        Estimate  Std. Error  t value Pr(>|t|)    
mu     4,491e-04   2,642e-04    1,700   0,0892 .  
omega  1,034e-05   2,237e-06    4,620 3,84e-06 ***
alpha1 8,403e-02   1,145e-02    7,341 2,12e-13 ***
beta1  8,704e-01   1,749e-02   49,757  < 2e-16 ***
---
Signif. codes:  0 ā€˜***’ 0,001 ā€˜**’ 0,01 ā€˜*’ 0,05 ā€˜.’ 0,1 ā€˜ ’ 1

Log Likelihood:
 7390,84    normalized:  2,82849 

Description:
 Sun Sep 21 12:54:22 2025 by user: ralph 


Standardised Residuals Tests:
                                 Statistic    p-Value
 Jarque-Bera Test   R    Chi^2  823,691381 0,00000000
 Shapiro-Wilk Test  R    W        0,982454 0,00000000
 Ljung-Box Test     R    Q(10)   11,041386 0,35430275
 Ljung-Box Test     R    Q(15)   16,408604 0,35542741
 Ljung-Box Test     R    Q(20)   25,823726 0,17171292
 Ljung-Box Test     R^2  Q(10)   27,245253 0,00238144
 Ljung-Box Test     R^2  Q(15)   28,066780 0,02115473
 Ljung-Box Test     R^2  Q(20)   30,045750 0,06911573
 LM Arch Test       R    TR^2    27,592416 0,00634339

Information Criterion Statistics:
     AIC      BIC      SIC     HQIC 
-5,65391 -5,64493 -5,65392 -5,65066 

InĀ [14]:
#==============================================================================
# Agora, analisaremos os residuos padronizados do modelo GARCH(1,1) ajustado.
# Verificacao das hipoteses
#==============================================================================

# Note que o teste de Jarque e Bera e o teste de Shapiro-Wilk rejeitam a 
# hipotese nula de normalidade

# Calculo dos residuos padronizados
resid <- garch.1.1@residuals/volatility(garch.1.1)
InĀ [15]:
#==============================================================================
# ACF dos residuos padronizados
#==============================================================================
par(mfrow=c(1,1),lwd=2.0,cex.lab=1.5,cex.axis=1.5,lab=c(10,8,5),
     mar=c(5,5,2,2.5),cex.main=2.0,bty="n")
acf(resid,xlab="Defasagem",main="",ylim=c(-0.2,1))
No description has been provided for this image
InĀ [16]:
#==============================================================================
# Histograma dos residuos padronizados
#==============================================================================
par(mfrow=c(1,1),lwd=2.0,cex.lab=1.5,cex.axis=1.5,lab=c(8,8,5),
     mar=c(5,5,2,2.5),cex.main=2.0,bty="n")
hist(resid,xlab="ResĆ­duos",main="",prob=T,ylab="Densidade",col="orange")
No description has been provided for this image
InĀ [17]:
#==============================================================================
# Boxplot dos residuos padronizados
#==============================================================================
par(mfrow=c(1,1),lwd=2.0,cex.lab=1.5,cex.axis=1.5,lab=c(8,8,5),
     mar=c(5,5,2,2.5),cex.main=2.0,bty="n")
boxplot(resid,ylab="ResĆ­duos",col="lightblue",ylim=c(-8,4))
No description has been provided for this image
InĀ [18]:
#==============================================================================
# QQ-Norm dos residuos padronizados
#==============================================================================
par(mfrow=c(1,1),lwd=2.0,cex.lab=1.5,cex.axis=1.5,lab=c(8,8,5),
    mar=c(5,5,2,2.5),cex.main=2.0,bty="n")
qqnorm(resid,main="",xlab="Percentis teóricos",xlim=c(-5,5),
    ylim=c(-5,5),ylab="Percentis amostrais",col="red",pch=15)
qqline(resid,lwd=2)
No description has been provided for this image
InĀ [19]:
#==============================================================================
# Histograma dos residuos padronizados ao quadrado
#==============================================================================
# Note que o teste de Ljung-Box nao rejeita a hipotese nula de autocorrelacao 
# zero para a serie r_t (R) em varias escolhas de m (nivel de 5%).

# O mesmo nao pode ser dito sobre os retornos ao quadrado (R^2).
# Mesmo assim, podemos verificar a ACF dos residuos ao quadrado.
par(mfrow=c(1,1),lwd=2.0,cex.lab=1.5,cex.axis=1.5,lab=c(8,8,5),
     mar=c(5,5,2,2.5),cex.main=2.0,bty="n")
acf(resid^2,xlab="Defasagem",main="",ylim=c(-0.2,1))

# Parece existir uma dependencia de defasagem 7 (e 10). 
# Talvez seja algum efeito do dia da semana (utilizar regressao binaria).

# Conclusao momentanea: continuamos com o modelo GARCH(1,1) com erros normais.
No description has been provided for this image
InĀ [20]:
#==============================================================================
# Resumo do ajuste
#==============================================================================
summary(garch.1.1)
Title:
 GARCH Modelling 

Call:
 garchFit(formula = rt ~ garch(1, 1), data = rt, trace = F) 

Mean and Variance Equation:
 data ~ garch(1, 1)
<environment: 0x5567385f8c98>
 [data = rt]

Conditional Distribution:
 norm 

Coefficient(s):
        mu       omega      alpha1       beta1  
4,4906e-04  1,0336e-05  8,4029e-02  8,7044e-01  

Std. Errors:
 based on Hessian 

Error Analysis:
        Estimate  Std. Error  t value Pr(>|t|)    
mu     4,491e-04   2,642e-04    1,700   0,0892 .  
omega  1,034e-05   2,237e-06    4,620 3,84e-06 ***
alpha1 8,403e-02   1,145e-02    7,341 2,12e-13 ***
beta1  8,704e-01   1,749e-02   49,757  < 2e-16 ***
---
Signif. codes:  0 ā€˜***’ 0,001 ā€˜**’ 0,01 ā€˜*’ 0,05 ā€˜.’ 0,1 ā€˜ ’ 1

Log Likelihood:
 7390,84    normalized:  2,82849 

Description:
 Sun Sep 21 12:54:22 2025 by user: ralph 


Standardised Residuals Tests:
                                 Statistic    p-Value
 Jarque-Bera Test   R    Chi^2  823,691381 0,00000000
 Shapiro-Wilk Test  R    W        0,982454 0,00000000
 Ljung-Box Test     R    Q(10)   11,041386 0,35430275
 Ljung-Box Test     R    Q(15)   16,408604 0,35542741
 Ljung-Box Test     R    Q(20)   25,823726 0,17171292
 Ljung-Box Test     R^2  Q(10)   27,245253 0,00238144
 Ljung-Box Test     R^2  Q(15)   28,066780 0,02115473
 Ljung-Box Test     R^2  Q(20)   30,045750 0,06911573
 LM Arch Test       R    TR^2    27,592416 0,00634339

Information Criterion Statistics:
     AIC      BIC      SIC     HQIC 
-5,65391 -5,64493 -5,65392 -5,65066 

InĀ [21]:
#==============================================================================
# Calculando varios momentos amostrais
#==============================================================================
options(digits=6)
r.describe      <- describe(resid)
r.media         <- r.describe[,3]
r.desvpad       <- r.describe[,4]
r.mediana       <- r.describe[,5]
r.assimetria    <- r.describe[,11]
r.exc.curtose   <- r.describe[,12]
STATS           <- cbind(r.media,r.desvpad,r.mediana,r.assimetria,
                       r.exc.curtose)
colnames(STATS) <- c("media","desvpad","mediana","assimetria","exc.curt")
rownames(STATS) <- "IBOVESPA"                         
print(STATS)

# Se os erros forem normais, entao os residuos devem ter media e mediana 0, 
# desvio padrao 1, assimetria 0 e excesso de curtose 0.

# Conclusao: podemos considerar outras distribuicoes para o termo de erro.
              media  desvpad   mediana assimetria exc.curt
IBOVESPA -0,0213976 0,999103 -0,008651  -0,419032   2,6153
InĀ [22]:
#==============================================================================
# Considere por um momento o modelo GARCH(1,1) como bem ajustado.
# Previsao 10 passos a frente com intervalo de previsao de 95%.
#==============================================================================
par(mfrow=c(1,1),lwd=2.0,cex.lab=1.1,cex.axis=1.1,lab=c(10,8,5),
     mar=c(5,5,2,2.5),cex.main=2.0,bty="n")
previsao <- predict(garch.1.1,n.ahead=10,plot=TRUE,conf=.95,nx=100)
No description has been provided for this image
InĀ [23]:
print(previsao)
   meanForecast meanError standardDeviation lowerInterval upperInterval
1   0,000449058 0,0163481         0,0163481    -0,0315926     0,0324907
2   0,000449058 0,0162919         0,0162919    -0,0314826     0,0323807
3   0,000449058 0,0162382         0,0162382    -0,0313772     0,0322753
4   0,000449058 0,0161867         0,0161867    -0,0312763     0,0321744
5   0,000449058 0,0161374         0,0161374    -0,0311796     0,0320778
6   0,000449058 0,0160902         0,0160902    -0,0310871     0,0319853
7   0,000449058 0,0160450         0,0160450    -0,0309986     0,0318967
8   0,000449058 0,0160018         0,0160018    -0,0309139     0,0318120
9   0,000449058 0,0159604         0,0159604    -0,0308328     0,0317309
10  0,000449058 0,0159208         0,0159208    -0,0307552     0,0316533
InĀ [24]:
#==============================================================================
# Grafico das volatilidades estimadas pelo modelo GARCH(1,1)
#==============================================================================
par(mfrow=c(1,1),lwd=2.0,cex.lab=1.4,cex.axis=1.5,lab=c(15,5,5),
    mar=c(5,5,2,2.5),xpd=T,cex.main=2.0,bty="n")
plot(dias[2:n],rt,lwd=2,col="black",main="",xlab="Dias",ylab="Log Retorno",
    type="l",xlim=c(as.Date("2011-01-01"),as.Date("2021-12-31")),
    ylim=c(-0.16,0.16))
No description has been provided for this image
InĀ [25]:
#==============================================================================
# Grafico das volatilidades estimadas pelo modelo GARCH(1,1)
#==============================================================================
par(mfrow=c(1,1),lwd=2.0,cex.lab=1.4,cex.axis=1.5,lab=c(15,8,5),
    mar=c(5,5,2,2.5),xpd=T,cex.main=2.0,bty="n")
plot(dias[2:n],volatility(garch.1.1),lwd=2,col="black",type="l",xlab="Dias",
    ylab="Volatilidade",xlim=c(as.Date("2011-01-01"),as.Date("2021-12-31")),
    ylim=c(0.01,0.08))
No description has been provided for this image
InĀ [26]:
#==============================================================================
# Agora, focaremos no modelo GARCH(1,1) com diferentes distribuicoes 
# para os erros 
#==============================================================================
# "norm"  : normal
# "snorm" : normal assimetrica 
# "ged"   : valor extremo
# "sged"  : valor extremo assimetrica
# "std"   : t-Student
# "sstd"  : t-Student assimetrica
#==============================================================================
defaultW <- getOption("warn")
options(warn = -1)
#GARCH(1,1)
garch11.norm  <- garchFit( rt ~ garch(1,1),data=rt,trace=F,cond.dist="norm")
garch11.snorm <- garchFit( rt ~ garch(1,1),data=rt,trace=F,cond.dist="snorm")
garch11.ged   <- garchFit( rt ~ garch(1,1),data=rt,trace=F,cond.dist="ged")
garch11.sged  <- garchFit( rt ~ garch(1,1),data=rt,trace=F,cond.dist="sged")
garch11.std   <- garchFit( rt ~ garch(1,1),data=rt,trace=F,cond.dist="std")
garch11.sstd  <- garchFit( rt ~ garch(1,1),data=rt,trace=F,cond.dist="sstd")
options(warn = defaultW)
InĀ [27]:
#==============================================================================
# Selecao de modelos via BIC
#==============================================================================
options(digits=6)
garch11.norm@fit$ics[2]   
garch11.snorm@fit$ics[2]
garch11.ged@fit$ics[2]
garch11.sged@fit$ics[2]
garch11.std@fit$ics[2]      # Menor valor, melhor ajuste: -5.67888
garch11.sstd@fit$ics[2]

summary(garch11.std)
BIC: -5,6449302639414
BIC: -5,64730564641214
BIC: -5,66840871903074
BIC: -5,6673271657735
BIC: -5,67888290824
BIC: -5,67659892359638
Title:
 GARCH Modelling 

Call:
 garchFit(formula = rt ~ garch(1, 1), data = rt, cond.dist = "std", 
    trace = F) 

Mean and Variance Equation:
 data ~ garch(1, 1)
<environment: 0x556731f47738>
 [data = rt]

Conditional Distribution:
 std 

Coefficient(s):
        mu       omega      alpha1       beta1       shape  
4,9677e-04  8,3178e-06  7,4207e-02  8,8768e-01  9,0245e+00  

Std. Errors:
 based on Hessian 

Error Analysis:
        Estimate  Std. Error  t value Pr(>|t|)    
mu     4,968e-04   2,545e-04    1,952 0,050930 .  
omega  8,318e-06   2,156e-06    3,858 0,000114 ***
alpha1 7,421e-02   1,222e-02    6,072 1,26e-09 ***
beta1  8,877e-01   1,801e-02   49,285  < 2e-16 ***
shape  9,025e+00   1,347e+00    6,698 2,11e-11 ***
---
Signif. codes:  0 ā€˜***’ 0,001 ā€˜**’ 0,01 ā€˜*’ 0,05 ā€˜.’ 0,1 ā€˜ ’ 1

Log Likelihood:
 7439,13    normalized:  2,84697 

Description:
 Sun Sep 21 12:54:41 2025 by user: ralph 


Standardised Residuals Tests:
                                 Statistic     p-Value
 Jarque-Bera Test   R    Chi^2  858,150555 0,000000000
 Shapiro-Wilk Test  R    W        0,982015 0,000000000
 Ljung-Box Test     R    Q(10)   11,308452 0,333997082
 Ljung-Box Test     R    Q(15)   16,863632 0,327081666
 Ljung-Box Test     R    Q(20)   26,330487 0,155172247
 Ljung-Box Test     R^2  Q(10)   29,638497 0,000981344
 Ljung-Box Test     R^2  Q(15)   30,599833 0,009933190
 Ljung-Box Test     R^2  Q(20)   32,562726 0,037659050
 LM Arch Test       R    TR^2    29,805347 0,002987072

Information Criterion Statistics:
     AIC      BIC      SIC     HQIC 
-5,69011 -5,67888 -5,69012 -5,68604 

InĀ [28]:
#==============================================================================
# Agora, analisaremos os residuos padronizados do modelo GARCH(1,1) ajustado.
# Verificacao das hipoteses
#==============================================================================

# Calculo dos residuos padronizados
resid <- garch11.std@residuals/volatility(garch11.std)

graus <- garch11.std@fit$par[5]    
InĀ [29]:
#==============================================================================
# ACF dos residuos padronizados
#==============================================================================
par(mfrow=c(1,1),lwd=2.0,cex.lab=1.4,cex.axis=1.5,lab=c(15,5,5),
    mar=c(5,5,2,2.5),cex.main=2.0,bty="n")
acf(resid,xlab="Defasagem",main="",ylim=c(-0.2,1),lag.max=16)
No description has been provided for this image
InĀ [30]:
#==============================================================================
# Histograma dos residuos padronizados
#==============================================================================
par(mfrow=c(1,1),lwd=2.0,cex.lab=1.4,cex.axis=1.5,lab=c(8,8,5),
    mar=c(5,5,2,2.5),cex.main=2.0,bty="n")
hist(resid,xlab="ResĆ­duos",main="",prob=T,ylab="Densidade",col="orange")
No description has been provided for this image
InĀ [31]:
#==============================================================================
# Boxplot dos residuos padronizados
#==============================================================================
par(mfrow=c(1,1),lwd=2.0,cex.lab=1.4,cex.axis=1.5,lab=c(8,8,5),
    mar=c(5,5,2,2.5),cex.main=2.0,bty="n")
boxplot(resid,ylab="ResĆ­duos",col="red",ylim=c(-8,5))
No description has been provided for this image
InĀ [32]:
#==============================================================================
# QQ-Norm dos residuos padronizados
#==============================================================================
par(mfrow=c(1,1),lwd=2.0,cex.lab=1.4,cex.axis=1.5,lab=c(8,8,5),
    mar=c(5,5,2,2.5),cex.main=2.0,bty="n")
qqplot(resid,rt(N,df=graus),main="",xlab="Percentis teóricos",
       ylab="Percentis amostrais",col="red",pch=15,xlim=c(-6,6),ylim=c(-6,6))
No description has been provided for this image
InĀ [33]:
#==============================================================================
# Histograma dos residuos padronizados ao quadrado
#==============================================================================
# Note que o teste de Ljung-Box nao rejeita a hipotese nula de autocorrelacao 
# zero para a serie r_t (R) em varias escolhas de m (nivel de 5%).

# O mesmo nao pode ser dito sobre os retornos ao quadrado (R^2).
# Mesmo assim, podemos verificar a ACF dos residuos ao quadrado.
par(mfrow=c(1,1),lwd=2.0,cex.lab=1.4,cex.axis=1.5,lab=c(8,8,5),
    mar=c(5,5,2,2.5),cex.main=2.0,bty="n")
acf(resid^2,xlab="Defasagem",main="",lag.max=16,ylim=c(-0.2,1))

# Parece existir uma dependencia de defasagem 7 (e 10). 
# Talvez seja algum efeito do dia da semana (utilizar regressao binaria).

# Conclusao momentanea: continuamos com o modelo GARCH(1,1) com erros t-Student.
No description has been provided for this image
InĀ [34]:
#==============================================================================
# Considere por um momento o modelo GARCH(1,1) como bem ajustado.
# Previsao 10 passos a frente com intervalo de previsao de 95%.
#==============================================================================
par(mfrow=c(1,1),lwd=2.0,cex.lab=1.4,cex.axis=1.5,lab=c(10,8,5),
    mar=c(5,5,2,2.5),cex.main=2.0,bty="n")
previsaost <- predict(garch11.std,n.ahead=10,plot=TRUE,conf=.95,nx=100)
No description has been provided for this image
InĀ [35]:
print(previsaost)
   meanForecast meanError standardDeviation lowerInterval upperInterval
1   0,000496769 0,0159884         0,0159884    -0,0313999     0,0323934
2   0,000496769 0,0159438         0,0159438    -0,0313109     0,0323044
3   0,000496769 0,0159008         0,0159008    -0,0312250     0,0322186
4   0,000496769 0,0158593         0,0158593    -0,0311422     0,0321358
5   0,000496769 0,0158193         0,0158193    -0,0310624     0,0320559
6   0,000496769 0,0157807         0,0157807    -0,0309854     0,0319790
7   0,000496769 0,0157435         0,0157435    -0,0309112     0,0319047
8   0,000496769 0,0157076         0,0157076    -0,0308396     0,0318332
9   0,000496769 0,0156730         0,0156730    -0,0307706     0,0317642
10  0,000496769 0,0156397         0,0156397    -0,0307041     0,0316977
InĀ [36]:
#==============================================================================
# Grafico das volatilidades estimadas pelo modelo GARCH(1,1)
#==============================================================================
par(mfrow=c(1,1),lwd=2.0,cex.lab=1.4,cex.axis=1.5,lab=c(15,5,5),
    mar=c(5,5,2,2.5),xpd=T,cex.main=2.0,bty="n")
plot(dias[2:n],rt,lwd=2,col="black",main="",xlab="Dias",ylab="Log Retorno",
    type="l",xlim=c(as.Date("2011-01-01"),as.Date("2021-12-31")),
    ylim=c(-0.16,0.16))
No description has been provided for this image
InĀ [37]:
#==============================================================================
# Grafico das volatilidades estimadas pelo modelo GARCH(1,1)
#==============================================================================
par(mfrow=c(1,1),lwd=2.0,cex.lab=1.4,cex.axis=1.5,lab=c(15,8,5),
    mar=c(5,5,2,2.5),xpd=T,cex.main=2.0,bty="n")
plot(dias[2:n],volatility(garch11.std),lwd=2,col="black",type="l",xlab="Dias",
    ylab="Volatilidade",xlim=c(as.Date("2011-01-01"),as.Date("2021-12-31")),
    ylim=c(0.01,0.08))
No description has been provided for this image