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
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]:
#==============================================================================
# A serie de precos e log retornos em um unico grafico
#==============================================================================
obj1 <- xyplot(rt ~ dias,type="l",lwd=2,col=1,xlab="Dias",
ylab="Log Retorno")
obj2 <- xyplot(preco ~ dias,type="l",lwd=2,col="red",ylab="PreƧos")
doubleYScale(obj1,obj2,add.ylab2=TRUE,use.style=FALSE)
InĀ [7]:
#==============================================================================
# Grafico da serie de log retornos ao quadrado
#==============================================================================
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[2:n],rt^2,lwd=2,col=1,main="",xlab="Dias",
ylab="Log Retorno ao Quadrado",type="l",
xlim=c(as.Date("2011-01-01"),as.Date("2021-12-31")))
InĀ [8]:
#==============================================================================
# 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Ā [9]:
#==============================================================================
# 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Ā [10]:
#==============================================================================
# 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Ā [11]:
#==============================================================================
# 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Ā [12]:
#==============================================================================
# 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Ā [13]:
#==============================================================================
# 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Ā [14]:
#==============================================================================
# Testando a hipotese de distribuicao normal para os log retornos
#==============================================================================
# Lembre-se de verificar de novo a assimetria e a curtose
print(STATS[1,4:5])
print("========================")
# Nivel de significancia dos testes
alpha <- 0.05
N <- length(rt) # Tamanho da serie de log retornos
# Testando a assimetria zero
print("Teste de assimetria")
tSr <- STATS[1,4]/sqrt(6/N) # Razao t-Student
print(abs(tSr) > qnorm(1-alpha/2)) # Testanto (TRUE=Rejeitar, FALSE=Nao rejeitar)
valorpSr <- 2*(1-pnorm(abs(tSr))) # Valor p
print(valorpSr)
print("========================")
# Testando a excesso de curtose zero
print("Teste de curtose")
tKr <- STATS[1,5]/sqrt(24/N) # Razao t-Student
print(abs(tKr) > qnorm(1-alpha/2)) # Testanto (TRUE=Rejeitar, FALSE=Nao rejeitar)
valorpKr <- 2*(1-pnorm(abs(tKr))) # Valor p
print(valorpKr)
print("========================")
# Testando a normalidade - teste de Jarque Bera
print("Teste de Jarque-Bera: normalidade")
JB <- tSr^2 + tKr^2
print(JB > qchisq(1-alpha,2)) # Testanto (TRUE=Rejeitar, FALSE=Nao rejeitar)
print(jarque.bera.test(rt)) # Verificar o valor p (mesma conclusao)
assimetria exc.curt -0,8946 12,2347 [1] "========================" [1] "Teste de assimetria" [1] TRUE [1] 0 [1] "========================" [1] "Teste de curtose" [1] TRUE [1] 0 [1] "========================" [1] "Teste de Jarque-Bera: normalidade" [1] TRUE Jarque Bera Test data: rt X-squared = 16677, df = 2, p-value <2e-16
InĀ [15]:
#==============================================================================
# Teste para efeitos ARCH
#==============================================================================
# Passo 1 em nossa analise
#==============================================================================
# Vimos pela ACF dos retornos uma coorelacao serial fraca.
# Teste de Ljung-Box para os retornos
# Lembre-se da hipotese nula (H_0): independencia dos retornos
ell <- floor(log(N)) # ell =~ log(N) como valor mais pratico
print(ell)
for(i in 1:ell)
print(Box.test(rt, lag = i, type = "Ljung-Box"))
# Conclusao: rejeitamos a hipotese nula de independencia dos retornos.
# Precisamos modelar a media. Utilizaremos um modelo AR.
[1] 7 Box-Ljung test data: rt X-squared = 26, df = 1, p-value = 4e-07 Box-Ljung test data: rt X-squared = 31, df = 2, p-value = 2e-07 Box-Ljung test data: rt X-squared = 31, df = 3, p-value = 7e-07 Box-Ljung test data: rt X-squared = 32, df = 4, p-value = 2e-06 Box-Ljung test data: rt X-squared = 41, df = 5, p-value = 8e-08 Box-Ljung test data: rt X-squared = 55, df = 6, p-value = 4e-10 Box-Ljung test data: rt X-squared = 75, df = 7, p-value = 1e-13
InĀ [16]:
#==============================================================================
# Passo 2 em nossa analise
#==============================================================================
# Ajuste de um modelo AR
r.ar <- ar.mle(rt)
p <- r.ar$order
a <- r.ar$res[(p+1):N] # residuos nao padronizados
n2 <- length(a)
print(r.ar) # O melhor modelo foi um AR(10) segundo o AIC
Call:
ar.mle(x = rt)
Coefficients:
1 2 3 4 5 6 7 8 9 10
-0,085 0,032 0,006 -0,013 0,045 -0,054 0,069 -0,026 0,025 0,041
Order selected 10 sigma^2 estimated as 0,000254
InĀ [17]:
#==============================================================================
# Verificando a 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(a,xlab="Defasagem",main="",lwd=2,col=1,lag.max=15,ylim=c(-0.2,1))
InĀ [18]:
#==============================================================================
# Calculando varios momentos amostrais dos residuos padronizados
# do modelo AR(10)
#==============================================================================
options(digits=4)
sigma2 <- r.ar$var # variancia do erro estimada
sigma <- sqrt(sigma2) # desvio padrao do erro estimado
resid <- a/sigma # residuos padronizados
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 (zero), desvio padrao 1 (um),
# assimetria 0 (zero) e excesso de curtose 0 (zero).
# Possivelmente a presenca de nao normalidade.
media desvpad mediana assimetria exc.curt IBOVESPA -0,0002323 1,002 0,0007451 -0,7339 10,34
InĀ [19]:
#==============================================================================
# Passo 3 em nossa analise
#==============================================================================
# Teste de Ljung-Box para os residuos (resid) do modelo AR(10)
# Lembre-se da hipotese nula (H_0): independencia dos residuos
for(i in (p+1):(p+ell+1))
print(Box.test(resid, lag = i, type = "Ljung-Box",fitdf = p))
# Agora, os p-valores sao todos grandes.
# Conclusao: nao rejeitamos a hipotese nula de independencia dos residuos
Box-Ljung test data: resid X-squared = 1,4, df = 1, p-value = 0,2 Box-Ljung test data: resid X-squared = 1,5, df = 2, p-value = 0,5 Box-Ljung test data: resid X-squared = 5,1, df = 3, p-value = 0,2 Box-Ljung test data: resid X-squared = 7,2, df = 4, p-value = 0,1 Box-Ljung test data: resid X-squared = 7,3, df = 5, p-value = 0,2 Box-Ljung test data: resid X-squared = 10, df = 6, p-value = 0,1 Box-Ljung test data: resid X-squared = 10, df = 7, p-value = 0,2 Box-Ljung test data: resid X-squared = 13, df = 8, p-value = 0,1
InĀ [20]:
#==============================================================================
# Passo 4 em nossa analise
#==============================================================================
# Teste para efeitos ARCH
# Teste de Ljung-Box para os residuos ao quadrado do modelo AR(10)
# Lembre-se da hipotese nula (H_0): independencia dos residuos ao quadrado
resid2 <- resid^2
for(i in 1:ell)
print(Box.test(resid2, lag = i, type = "Ljung-Box"))
# Os p-valores sao todos pequenos.
# Conclusao: rejeitamos a hipotese nula de independencia dos residuos
# ao quadrado.
Box-Ljung test data: resid2 X-squared = 424, df = 1, p-value <2e-16 Box-Ljung test data: resid2 X-squared = 882, df = 2, p-value <2e-16 Box-Ljung test data: resid2 X-squared = 1159, df = 3, p-value <2e-16 Box-Ljung test data: resid2 X-squared = 1351, df = 4, p-value <2e-16 Box-Ljung test data: resid2 X-squared = 1504, df = 5, p-value <2e-16 Box-Ljung test data: resid2 X-squared = 1530, df = 6, p-value <2e-16 Box-Ljung test data: resid2 X-squared = 1738, df = 7, p-value <2e-16
InĀ [21]:
#==============================================================================
# Verificando a ACF dos 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(resid2,xlab="Defasagem",main="",lwd=2,col=1,lag.max=16,ylim=c(-0.2,1))
InĀ [22]:
#==============================================================================
# PACF dos quadrados dos retornos
#==============================================================================
# Verificando a ACF dos 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")
pacf(resid2,xlab="Defasagem",main="",lwd=2,col=1,lag.max=16,ylab="PACF",
xlim=c(0,16),ylim=c(-0.2,0.5))
InĀ [23]:
#==============================================================================
# Se o modelo for um AR(p) para os residuos ao quadrado
#==============================================================================
ar.mle(resid2,order.max=20)
Call:
ar.mle(x = resid2, order.max = 20)
Coefficients:
1 2 3 4 5 6 7 8 9 10
0,262 0,240 0,091 0,057 -0,007 -0,164 0,195 0,009 0,065 0,035
11 12 13 14
-0,040 0,072 -0,063 -0,049
Order selected 14 sigma^2 estimated as 8,53
InĀ [24]:
#==============================================================================
# Ajuste de modelos ARCH (na verdade modelos GARCH)
#==============================================================================
defaultW <- getOption("warn")
options(warn = -1)
ajuste1 <- garchFit(rt~arma(2,0)+garch(1,0), data=rt,trace=F) #AR(2)+ARCH(1)
ajuste2 <- garchFit(rt~arma(2,0)+garch(2,0), data=rt,trace=F) #AR(2)+ARCH(2)
ajuste3 <- garchFit(rt~arma(2,0)+garch(3,0), data=rt,trace=F) #AR(2)+ARCH(3)
ajuste4 <- garchFit(rt~arma(2,0)+garch(4,0), data=rt,trace=F) #AR(2)+ARCH(4)
ajuste5 <- garchFit(rt~arma(2,0)+garch(5,0), data=rt,trace=F) #AR(2)+ARCH(5)
ajuste6 <- garchFit(rt~arma(2,0)+garch(6,0), data=rt,trace=F) #AR(2)+ARCH(6)
ajuste7 <- garchFit(rt~arma(2,0)+garch(7,0), data=rt,trace=F) #AR(2)+ARCH(7)
ajuste8 <- garchFit(rt~arma(2,0)+garch(8,0), data=rt,trace=F) #AR(2)+ARCH(8)
ajuste9 <- garchFit(rt~arma(2,0)+garch(9,0), data=rt,trace=F) #AR(2)+ARCH(9)
ajuste10 <- garchFit(rt~arma(2,0)+garch(10,0),data=rt,trace=F) #AR(2)+ARCH(10)
ajuste11 <- garchFit(rt~arma(2,0)+garch(11,0),data=rt,trace=F) #AR(2)+ARCH(11)
options(warn = defaultW)
InĀ [25]:
#==============================================================================
# Selecao de modelos via BIC
#==============================================================================
# ajuste1@fit$llh # log verossimilhanca
options(digits=6)
ajuste1@fit$ics[2]
ajuste2@fit$ics[2]
ajuste3@fit$ics[2]
ajuste4@fit$ics[2]
ajuste5@fit$ics[2]
ajuste6@fit$ics[2]
ajuste7@fit$ics[2]
ajuste8@fit$ics[2]
ajuste9@fit$ics[2]
ajuste10@fit$ics[2] # Menor valor, melhor ajuste
ajuste11@fit$ics[2]
# O modelo AR(2) + ARCH(10) tem o melhor ajuste pelo BIC=-5.62297784
# Note que alguns coeficientes AR sao estatisticamente nao significativos
summary(ajuste10) # Ver testes de Ljung-Box para R, R^2 e teste LM
BIC: -5,55722821508121
BIC: -5,60535357281339
BIC: -5,60751272042737
BIC: -5,6089010802718
BIC: -5,6128670833882
BIC: -5,61735140758828
BIC: -5,622728437947
BIC: -5,62004809871382
BIC: -5,61861169799691
BIC: -5,62297784988305
BIC: -5,61996239580215
Title:
GARCH Modelling
Call:
garchFit(formula = rt ~ arma(2, 0) + garch(10, 0), data = rt,
trace = F)
Mean and Variance Equation:
data ~ arma(2, 0) + garch(10, 0)
<environment: 0x55adcfe6dd70>
[data = rt]
Conditional Distribution:
norm
Coefficient(s):
mu ar1 ar2 omega alpha1 alpha2
5,3869e-04 -3,8397e-02 3,6123e-03 9,4649e-05 5,2388e-02 1,5404e-01
alpha3 alpha4 alpha5 alpha6 alpha7 alpha8
2,0343e-02 2,1830e-02 4,9147e-02 7,1816e-02 6,9982e-02 1,0000e-08
alpha9 alpha10
3,1894e-02 1,1208e-01
Std. Errors:
based on Hessian
Error Analysis:
Estimate Std. Error t value Pr(>|t|)
mu 5,387e-04 2,620e-04 2,056 0,039745 *
ar1 -3,840e-02 2,038e-02 -1,884 0,059549 .
ar2 3,612e-03 2,124e-02 0,170 0,864942
omega 9,465e-05 8,306e-06 11,395 < 2e-16 ***
alpha1 5,239e-02 1,978e-02 2,648 0,008094 **
alpha2 1,540e-01 2,675e-02 5,759 8,45e-09 ***
alpha3 2,034e-02 1,810e-02 1,124 0,261009
alpha4 2,183e-02 1,979e-02 1,103 0,270099
alpha5 4,915e-02 2,043e-02 2,406 0,016147 *
alpha6 7,182e-02 2,443e-02 2,940 0,003284 **
alpha7 6,998e-02 2,132e-02 3,283 0,001029 **
alpha8 1,000e-08 2,470e-02 0,000 1,000000
alpha9 3,189e-02 1,869e-02 1,706 0,087981 .
alpha10 1,121e-01 2,978e-02 3,764 0,000167 ***
---
Signif. codes: 0 ā***ā 0,001 ā**ā 0,01 ā*ā 0,05 ā.ā 0,1 ā ā 1
Log Likelihood:
7401,5 normalized: 2,83257
Description:
Wed Sep 17 19:37:58 2025 by user: ralph
Standardised Residuals Tests:
Statistic p-Value
Jarque-Bera Test R Chi^2 566,733408 0,00000e+00
Shapiro-Wilk Test R W 0,985446 1,02074e-15
Ljung-Box Test R Q(10) 6,945799 7,30552e-01
Ljung-Box Test R Q(15) 11,795279 6,94454e-01
Ljung-Box Test R Q(20) 21,416331 3,73002e-01
Ljung-Box Test R^2 Q(10) 6,435658 7,77430e-01
Ljung-Box Test R^2 Q(15) 7,427226 9,44693e-01
Ljung-Box Test R^2 Q(20) 9,506107 9,76270e-01
LM Arch Test R TR^2 7,107423 8,50434e-01
Information Criterion Statistics:
AIC BIC SIC HQIC
-5,65442 -5,62298 -5,65448 -5,64303
InĀ [26]:
#==============================================================================
# Reduzindo a parte AR
#==============================================================================
defaultW <- getOption("warn")
options(warn = -1)
ajuste10a <- garchFit(rt ~ garch(10,0),data=rt,trace=F)
ajuste10b <- garchFit(rt ~ arma(1,0)+garch(10,0),data=rt,trace=F)
ajuste10c <- ajuste10
options(warn = defaultW)
InĀ [27]:
#==============================================================================
# Selecao de modelos via BIC
#==============================================================================
options(digits=6)
ajuste10a@fit$ics[2] # Menor BIC
ajuste10b@fit$ics[2]
ajuste10c@fit$ics[2]
summary(ajuste10a)
BIC: -5,62740835182572
BIC: -5,62580291166039
BIC: -5,62297784988305
Title:
GARCH Modelling
Call:
garchFit(formula = rt ~ garch(10, 0), data = rt, trace = F)
Mean and Variance Equation:
data ~ garch(10, 0)
<environment: 0x55adcd7c6e58>
[data = rt]
Conditional Distribution:
norm
Coefficient(s):
mu omega alpha1 alpha2 alpha3 alpha4
5,3518e-04 9,5124e-05 5,8519e-02 1,5762e-01 1,6817e-02 2,1772e-02
alpha5 alpha6 alpha7 alpha8 alpha9 alpha10
4,9101e-02 6,8923e-02 6,7717e-02 1,0000e-08 3,2807e-02 1,0856e-01
Std. Errors:
based on Hessian
Error Analysis:
Estimate Std. Error t value Pr(>|t|)
mu 5,352e-04 2,612e-04 2,049 0,040472 *
omega 9,512e-05 8,322e-06 11,431 < 2e-16 ***
alpha1 5,852e-02 1,977e-02 2,959 0,003082 **
alpha2 1,576e-01 2,688e-02 5,863 4,53e-09 ***
alpha3 1,682e-02 1,767e-02 0,952 0,341319
alpha4 2,177e-02 1,999e-02 1,089 0,276209
alpha5 4,910e-02 2,039e-02 2,408 0,016022 *
alpha6 6,892e-02 2,416e-02 2,852 0,004340 **
alpha7 6,772e-02 2,101e-02 3,223 0,001268 **
alpha8 1,000e-08 2,341e-02 0,000 1,000000
alpha9 3,281e-02 1,876e-02 1,749 0,080289 .
alpha10 1,086e-01 2,961e-02 3,666 0,000246 ***
---
Signif. codes: 0 ā***ā 0,001 ā**ā 0,01 ā*ā 0,05 ā.ā 0,1 ā ā 1
Log Likelihood:
7399,42 normalized: 2,83177
Description:
Wed Sep 17 19:39:46 2025 by user: ralph
Standardised Residuals Tests:
Statistic p-Value
Jarque-Bera Test R Chi^2 553,928897 0,00000e+00
Shapiro-Wilk Test R W 0,985649 1,36437e-15
Ljung-Box Test R Q(10) 9,737649 4,63804e-01
Ljung-Box Test R Q(15) 14,362932 4,98201e-01
Ljung-Box Test R Q(20) 24,625342 2,16142e-01
Ljung-Box Test R^2 Q(10) 6,120293 8,05057e-01
Ljung-Box Test R^2 Q(15) 7,203244 9,51762e-01
Ljung-Box Test R^2 Q(20) 9,281258 9,79415e-01
LM Arch Test R TR^2 6,894358 8,64515e-01
Information Criterion Statistics:
AIC BIC SIC HQIC
-5,65436 -5,62741 -5,65440 -5,64460
InĀ [28]:
#==============================================================================
# Refazendo os ajustes de modelos ARCH sem a parte AR(2)
#==============================================================================
defaultW <- getOption("warn")
options(warn = -1)
ajuste1rt <- garchFit(rt ~ garch(1,0), data=rt,trace=F) #ARCH(1)
ajuste2rt <- garchFit(rt ~ garch(2,0), data=rt,trace=F) #ARCH(2)
ajuste3rt <- garchFit(rt ~ garch(3,0), data=rt,trace=F) #ARCH(3)
ajuste4rt <- garchFit(rt ~ garch(4,0), data=rt,trace=F) #ARCH(4)
ajuste5rt <- garchFit(rt ~ garch(5,0), data=rt,trace=F) #ARCH(5)
ajuste6rt <- garchFit(rt ~ garch(6,0), data=rt,trace=F) #ARCH(6)
ajuste7rt <- garchFit(rt ~ garch(7,0), data=rt,trace=F) #ARCH(7)
ajuste8rt <- garchFit(rt ~ garch(8,0), data=rt,trace=F) #ARCH(8)
ajuste9rt <- garchFit(rt ~ garch(9,0), data=rt,trace=F) #ARCH(9)
ajuste10rt <- garchFit(rt ~ garch(10,0),data=rt,trace=F) #ARCH(10)
ajuste11rt <- garchFit(rt ~ garch(11,0),data=rt,trace=F) #ARCH(11)
options(warn = defaultW)
InĀ [29]:
#==============================================================================
# Selecao de modelos via BIC
#==============================================================================
# ajuste1rt@fit$llh # log verossimilhanca
options(digits=6)
ajuste1rt@fit$ics[2]
ajuste2rt@fit$ics[2]
ajuste3rt@fit$ics[2]
ajuste4rt@fit$ics[2]
ajuste5rt@fit$ics[2]
ajuste6rt@fit$ics[2]
ajuste7rt@fit$ics[2]
ajuste8rt@fit$ics[2]
ajuste9rt@fit$ics[2]
ajuste10rt@fit$ics[2] # Menor valor, melhor ajuste
ajuste11rt@fit$ics[2]
summary(ajuste10rt)
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
Title:
GARCH Modelling
Call:
garchFit(formula = rt ~ garch(10, 0), data = rt, trace = F)
Mean and Variance Equation:
data ~ garch(10, 0)
<environment: 0x55adcf5aa7d8>
[data = rt]
Conditional Distribution:
norm
Coefficient(s):
mu omega alpha1 alpha2 alpha3 alpha4
5,3518e-04 9,5124e-05 5,8519e-02 1,5762e-01 1,6817e-02 2,1772e-02
alpha5 alpha6 alpha7 alpha8 alpha9 alpha10
4,9101e-02 6,8923e-02 6,7717e-02 1,0000e-08 3,2807e-02 1,0856e-01
Std. Errors:
based on Hessian
Error Analysis:
Estimate Std. Error t value Pr(>|t|)
mu 5,352e-04 2,612e-04 2,049 0,040472 *
omega 9,512e-05 8,322e-06 11,431 < 2e-16 ***
alpha1 5,852e-02 1,977e-02 2,959 0,003082 **
alpha2 1,576e-01 2,688e-02 5,863 4,53e-09 ***
alpha3 1,682e-02 1,767e-02 0,952 0,341319
alpha4 2,177e-02 1,999e-02 1,089 0,276209
alpha5 4,910e-02 2,039e-02 2,408 0,016022 *
alpha6 6,892e-02 2,416e-02 2,852 0,004340 **
alpha7 6,772e-02 2,101e-02 3,223 0,001268 **
alpha8 1,000e-08 2,341e-02 0,000 1,000000
alpha9 3,281e-02 1,876e-02 1,749 0,080289 .
alpha10 1,086e-01 2,961e-02 3,666 0,000246 ***
---
Signif. codes: 0 ā***ā 0,001 ā**ā 0,01 ā*ā 0,05 ā.ā 0,1 ā ā 1
Log Likelihood:
7399,42 normalized: 2,83177
Description:
Wed Sep 17 19:40:56 2025 by user: ralph
Standardised Residuals Tests:
Statistic p-Value
Jarque-Bera Test R Chi^2 553,928897 0,00000e+00
Shapiro-Wilk Test R W 0,985649 1,36437e-15
Ljung-Box Test R Q(10) 9,737649 4,63804e-01
Ljung-Box Test R Q(15) 14,362932 4,98201e-01
Ljung-Box Test R Q(20) 24,625342 2,16142e-01
Ljung-Box Test R^2 Q(10) 6,120293 8,05057e-01
Ljung-Box Test R^2 Q(15) 7,203244 9,51762e-01
Ljung-Box Test R^2 Q(20) 9,281258 9,79415e-01
LM Arch Test R TR^2 6,894358 8,64515e-01
Information Criterion Statistics:
AIC BIC SIC HQIC
-5,65436 -5,62741 -5,65440 -5,64460
InĀ [30]:
#==============================================================================
# Analisando os residuos padronizados deste modelo
# Verificacao das hipoteses
#==============================================================================
# Note que o teste de Ljung-Box nao rejeita a hipotese nula de
# autocorrelacao para varias escolhar de m
# Por outro lado, 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 <- ajuste10rt@residuals/volatility(ajuste10rt)
InĀ [31]:
#==============================================================================
# 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="",bty="n",lwd=2,ylim=c(-0.2,1))
InĀ [32]:
#==============================================================================
# Histograma 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")
hist(resid,xlab="ResĆduos",main="",prob=T,ylab="Densidade",col="orange",lwd=2)
InĀ [33]:
#==============================================================================
# Boxplot 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")
boxplot(resid,ylab="ResĆduos",col="lightblue",ylim=c(-8,4))
InĀ [34]:
#==============================================================================
# QQ-Norm 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")
qqnorm(resid,main="",xlab="Percentis teóricos",xlim=c(-4,4),ylim=c(-4,4),
ylab="Percentis amostrais",col="red",pch=15)
qqline(resid,lwd=2)
InĀ [35]:
#==============================================================================
# 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: a hipotese de normalidade nao vale.
# Como proceder daqui? (Veremos depois.)
media desvpad mediana assimetria exc.curt IBOVESPA -0,0256564 0,999863 -0,0144858 -0,353383 2,13795
InĀ [36]:
#==============================================================================
# Considere por um momento o modelo ARCH(10) 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.5,cex.axis=1.5,lab=c(10,8,5),
mar=c(5,5,2,2.5),cex.main=2.0,bty="n")
previsao <- predict(ajuste10rt,n.ahead=10,plot=T,conf=.95,nx=100)
InĀ [37]:
print(previsao)
meanForecast meanError standardDeviation lowerInterval upperInterval 1 0,000535183 0,0154870 0,0154870 -0,0298188 0,0308891 2 0,000535183 0,0145913 0,0145913 -0,0280632 0,0291336 3 0,000535183 0,0155115 0,0155115 -0,0298668 0,0309372 4 0,000535183 0,0170825 0,0170825 -0,0329460 0,0340163 5 0,000535183 0,0186086 0,0186086 -0,0359371 0,0370075 6 0,000535183 0,0144613 0,0144613 -0,0278085 0,0288789 7 0,000535183 0,0161802 0,0161802 -0,0311774 0,0322477 8 0,000535183 0,0193127 0,0193127 -0,0373171 0,0383874 9 0,000535183 0,0157274 0,0157274 -0,0302900 0,0313603 10 0,000535183 0,0157878 0,0157878 -0,0304083 0,0314787