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")))
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))
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))
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))
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)
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))
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)
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))
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")
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))
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)
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.
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)
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))
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))
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)
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")
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))
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))
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.
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)
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))
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))