Você está na página 1de 17

R-TimeSeries

1 Comandos R para anlises de


sries temporais
1.1 Introduo
O R um software livre de larga utilizao em Estatstica. Particularmente para Sries temporais, costuma-se, no
entanto, utilizar o Splus como software principal de anlise. Isto se d por conta de sua facilidade de utilizao, poder
de ajuste dos modelos e, principalmente, pela larga quantidade de modelos implementados nesta plataforma. Talvez a
principal ferramenta do Splus neste campo seja o pacote S+FinMetrics, que possui um grande nmero de modelos e
funes de aplicaes em series temporais financeiras. O Objetivo deste texto , de forma simples, descrever de que
forma alternativa podemos analisar sries temporais utilizando o software livre R . Como o R de cdigo aberto ele
tambem possui um amplo nmero de implementaes que nos auxiliam em tal tarefa. Portanto, diferente do Splus em que carregamos apenas a biblioteca FinMetrics para ter acesso a quase que a totalidade das funes S
implementadas para sries temporais - no R precisaremos carregar diversos pacotes diferentes, e utilizar aquele que
for mais conveniente para ajustar os modelos desejados. Outro ponto importante que nem sempre a soluo e
nica, no sentido de que possumos a mesma funo implementada (no necessariamente da mesma forma), em
pacotes diferentes. o caso do GARCH, por exemplo, que podemos ajustar utilizando o pacote tseries , rugarch ou
ainda o fGarch .

1.2 Pacotes (bibliotecas, packages, ou


libraries) utilizados neste texto:
library(stats)
library(e1071)

# Modelos
ARIMA
# Assimetria e

library(fGarch)

# Modelos de heterocedasticidade

library(tseries)

# Testes de RU

library(rugarch)

# Modelos EGARCH univariados

library(rmgarch)

# Modelos GARCH multivariados

library(MTS)
library(FitAR)

# Modelos
VARMA
# Ajuste de modelos AR. til para plotar Estatsticas de LjungBox vs Lags

library(evir)

# Calculo de Valores Extremos para VaR

library(urca)

# Testes de Cointegrao e de razes unitrias

# Outras bibliotecas

Curtose

interessantes:

library(astsa)

# Shumwa and Stoffer, 2011


y

library(finTS)

# Tsay, 2005

library(arfima)

# Fractional ARIMA Modeling

library(GECStableGarch) #

ARMAGARCH/APARCH models with GEV and stable distributions

library(gogarch)

# Generalized Orthogonal GARCH GOGARCH

library(gss)

# General smoothing Splines

library(evd)

# Calculo de Valores Extremos para VaR

library(fExtremes)

# Calculo de Valores Extremos para VaR

library(ismev)

# Calculo de Valores Extremos para VaR

library(ccgarch)
library(fArma)
library(fBasics)
library(fExtremes)
library(fUnitRoots)
library(tsDyn)
livrary(vars)

1.3 Anlise exploratria e manipulao:


Para transformar o argumento principal (data) em um objeto da classe ts :
ts(data = NA, start = 1, end = numeric(), frequency = 1,
deltat = 1, ts.eps = getOption("ts.eps"), class = , names = )

Para calcular estatsticas descritivas da srie:


summary(object, ..., digits = max(3, getOption("digits")3))

Desvio padro, Assimetria e Curtose:


sd(x, na.rm = FALSE) #Desvio Padro
skewness(x, na.rm = FALSE, type = 3) # Assimetria
kurtosis(x, na.rm = FALSE, type = 3) # Curtose
# OBS: Desvio Padrao. Se a srie possuir valores missing, coloque na.rm=TRUE

Varincia, Covarincia e Correlao


var(x, y = NULL, na.rm = FALSE, use)
cov(x, y = NULL, use = "everything",
method = c("pearson", "kendall", "spearman"))
cor(x, y = NULL, use = "everything",
method = c("pearson", "kendall", "spearman"))

Para tomar a diferena da srie, i.e., cria um novo objeto Y


t

=t t

:
1

diff(x, lag = 1, differences = 1, ...)

Quantis observados de X:
quantile(x, ...)

1.4 Grficos
Para imprimir grficos em um painel com a linhas e b colunas, com a e b inteiros positivos:
par(mfrow=c(a,b))

Grficos da srie:
ts.plot(..., gpars = list()) # Grfico da Serie hist(x, ...)
# Histograma da Srie

Para imprimir o grfico da distribuio Normal sobre a figura do histograma, faa:


curve(dnorm(x, mean = mean(x), sd=sd(x)),add=T)

O mesmo vale se desejar imprimir a curva de outras distribuies, substibuindo dnorm pela distribuio desejadas
e modificando os parmetros da distribuio de forma conveniente.
Grfico Quantil-Quantil para distribuio Normal:
qqnorm(y, ylim, main = "Normal QQ Plot",
xlab = "Theoretical Quantiles", ylab = "Sample Quantiles", plot.it
= TRUE, datax = FALSE, ...)

Comando para adicionar linha central no QQplot:


qqline(y, datax = FALSE, distribution = qnorm,
probs = c(0.25, 0.75), qtype = 7, ...)

Esta funo imprime graficos QQ no necessariamente Normais. Neste exemplo, temos um grafico QQ para
um distribuio t com 5 graus de liberdade:
qqplot(y, rt(300, df = 5))

Exemplos de modificaes nos grficos de ACF e PACF:


acf0<function(x,na.action=na.pass,lags=1:36,...)
{ #lags:horizonte dos lags
plot(acf(x,na.action=na.action,plot=F)[lags],lwd=5,lend=2,col="darkblue",...) axis(1,
tck = 1, col = "lightgrey", lty = "dotted")
}
name="Srie de logRetornos X"
par(mfrow=c(1,2))
acf0(x, na.action = na.pass,main=paste("ACF:",name))
pacf(x, na.action = na.pass,main=paste("PACF:",name),lwd=5,lend=2,col="darkblue")

Exemplo de sada dos grficos:

1.5 Testes:
1.5.1 Teste t:
t.test(x, y = NULL,
alternative = c("two.sided", "less", "greater"), mu =
0, paired = FALSE, var.equal = FALSE, conf.level =
0.95, ...)

1.5.1.1 Box-Pierce | Ljung-Box (pacote stats ):


Box.test(x, lag = 1, type = c("BoxPierce", "LjungBox"), fitdf = 0)

1.5.1.2 Box-Pierce | Ljung-Box (pacote FitAR ):

#LBQPlot(res, lag.max = 30)


#

res a srie que temos interesse de realizar os testes

lag.max o nmero de lags que se deseja imprimir o grfico

library(FitAR)
#

Exemplo com 1000 observaes geradas de uma normal(0,1)

res<rnorm(1000, mean=0,sd=1)
LBQPlot(res,15)

1.5.2 Testes de Normalidade:


#

Utilizando

library

`tseries`:

jarque.bera.test(x)
#

Utilizando a library `fBasics`: ksnormTest(x, title

= NULL, description = NULL) jbTest(x, title = NULL,


description = NULL) shapiroTest(x, title = NULL,
description = NULL)
normalTest(x, method = c("sw", "jb"), na.rm = FALSE)
jarqueberaTest(x, title = NULL, description = NULL)
dagoTest(x, title = NULL, description = NULL) adTest(x,
title = NULL, description = NULL) cvmTest(x, title = NULL,
description = NULL) lillieTest(x, title = NULL, description =
NULL) pchiTest(x, title = NULL, description = NULL)
sfTest(x, title = NULL, description = NULL)

1.5.3 Testes de Raizes Unitrias


1.5.3.1 Testes de Dickey-Fuller utilizando o pacote tseries
### Testes de DickeyFuller
adf.test(x, lags = 1, type = c("nc", "c", "ct"), title = NULL, description
= NULL)
# 'lags' define o nmero de razes unitarias a serem testadas
# 'type' Define o tipo de teste a ser realizado:
# 'nc' : Teste de DickeyFuller usual (Estatistica Tau)
# 'c' :

Teste de DickeyFuller

# 'ct' :

Teste de DickeyFuller

Aumentado
,
Aumentado
,

co
m
co
m

constante (Estatistica Tau_mu)


constante e tendencia (Estatistica Tau_tau)

1.5.4 Teste de Philips-Perron (usando o pacote tseries )


pp.test(x, alternative = c("stationary", "explosive"), type =
c("Z(alpha)", "Z(t_alpha)"), lshort = TRUE)
# 'alternative' define a Hiptese alternativa do teste
# 'stationary' : define H1: Phi < 1
# 'explosive'

: define H1: Phi > 1

1.6 Ajuste de modelos Univariados


1.6.1 Modelo ARIMA(p,d,q) com o pacote stats
arima(x, order = c(p,d,q))

Alternativamente, possvel utilizar as funes arma do pacote tseries , as funes do pacote astsa ou do pacote
tseries . grande a quantidade de pacotes que tem os algoritmos para modelos ARIMA implementados.

1.6.2 Modelo

SARIMA p( d, q,

) P( D, Q, s)

arima(x, order = c(p,d,q),


seasonal = list(order = c(P,D,Q), period = s))

1.6.3 Modelo ARIMA(p,d,q) com o pacote fArma


O pacote fArma possui a funo ArmaFit, que tambm possibilita o ajuste de modelos ARMA incompletos. A
sintaxe padro do tipo:
armaFit(x~arma(p,q), data, method = c("mle", "ols"), include.mean = TRUE,

fixed = NULL, title = NULL, description = NUL

(p,q) a ordem do modelo;


include.mean = TRUE adiciona a constante no modelo;

Em method , se escolhe o mtodo de estimao via Max. Verossimilhana ou Mnimos quadrados ordinrios;
fixed um vetor que contm NA na posio dos pmetros a serem estimados. Por exemplo, se quisermos estimar um

ARMA(p,q), com constante, teremos p+q+1 coeficientes a serem estimados e, consequentemente fixed ser um vetor com
p+q+1 posies, nas quais as p primeiras sero referentes aos coeficientes da parte AR, as posies p+1 at p+q sero
referentes parte MA e a posio p+q+1 ser referente constante. Para ilustrar, se quisermos um

ARMA(3,3) com constante, como definido abaixo e sem os coeficientes de

2t

2 e

1t

. Entao o meu vetor fixed


1

deve ser fixed=c(NA,0,NA,0,NA,NA,NA) . Para ficar mais claro, pode-se declarar: fixed=c(c(NA,0,NA),c(0,NA,NA),NA) .
3
(1 ) (

B X

3
) = (1 )

Alternativamente, pode-se utilizar a funo declarada a seguir. Veja a explicao sobre a estrutura do parmetro
coefs na declarao da funo.

Fit_Arima<function(formula,data=NULL,order,
coefs=NULL, include.mean=TRUE,...){
#Para definir os elementos 1a1 que sero estimados no modelo, defina: #O
parametro coefs uma lista com dois argumentos:
# $ar : vetor contendo os coefs da parte AR que devem entrar no modelo
# $ma : vetor contendo os coefs da parte MA que devem entrar no modelo
# Por exemplo, se quisermos um modelo Y_t = a_5 Y_{t5} + a_9 Y_{t9} b_2 e_{t2} b_4 e{t_4}
# coefs dever ser definido por: coefs = list(ar=c(5,9),ma=c(2,4))
# Montando a estrutura do argumento 'fixed' para ser passado para a funcao 'arima'
fixed=NULL
if(!is.null(coefs)){
fixed<rep(0,times=sum(order,include.mean))
if(include.mean==TRUE)
{ fixed[c(coefs$ar,order[1]+coefs$ma,length(fixed))]<NA
}
else
{ fixed[c(coefs$ar,order[1]+coefs$ma)]<NA
}
}
fit<armaFit(as.formula(formula), data=data, fixed=fixed, include.mean=include.mean,...)
return(fit)
}

1.6.4 Outra alternativa para ajustar o modelo ARMA incompleto


inc.arima<function(x,order=NULL,fixed=NULL,lag=NULL,name="LogRetornos de X")
{ if(!is.null(lag)){
# vetor de zeros do tamanho do numero de parametros a serem estimados
fixed<rep(0,times=sum(order,1))
# Preenchendo com 'NA' as posicoes dos parametros que desejamos que sejam estimados
fixed[c(coefs$ar,order[1]+coefs$ma,length(fixed))]<NA
fit<arima(x,order=order,fixed=fixed)

#Ajustando o

modelo

return(fit)
}
# Se o parametro `ccoefs` no for passado, entao ajusto o modelo completo. fit<
arima(x,order=order)
return(fit)
}

1.6.5 Ajuste de modelos ARMA(p,q)-GARCH(m,k)


utilizando o pacote fGarch
fit<garchFit(x ~ arma(p,q)+garch(m, k), data = banco_de_dados,
cond.dist = c("std"),include.mean=TRUE)
# O parametro 'cond.dist' define a distribuio dos erros a ser utilizada:
# 'norm'
# 'std'

: Erros normais
: Erros tstudent

# 'ged'

: Dists

de Erros Generalizados

# Para imprimir detalhes do ajuste, como tabela de analise de variancia


# e testes de LjungBox, aplique 'summary' ao modelo ajustado:
summary(fit)

1.6.6 Modelo EGARCH(1,1) utilizando o pacote rugarch


# Neste pacote, usual especificar todos os parametros inicialmente e informlos
# todos de uma vez funco de ajuste:
spec=ugarchspec(variance.model=list(model="eGARCH", garchOrder=c(1,1)),
mean.model=list(armaOrder=c(1,1), arfima=FALSE),
distribution.model="std")
# Especificacao dos parmetros
fit=ugarchfit(data=x,spec=spec) # Ajuste do modelo
summary(fit)

# Resultados detalhados do ajuste

1.6.7 Modelos TGARCH(m,k) utilizando o pacote

fGarch

O modelo TGARCH um caso especfico do modelo APARCH considerando delta=1 (Laurent,2004). Utilizamos o
pacote fGarch para ajustar um modelo APARCH(1,1), =1, que equivalente a um TGARCH(1,1):
require(fGarch)
fit_TGARCH<garchFit(formula = ~ arma(p,q)+aparch(1, 1), data = x,
cond.dist = c("std"),include.mean=TRUE,
include.delta=TRUE,delta=1)

1.6.8 Anlise de resduos para o modelo GARCH


Para avaliar se o modelo ARMA-GARCH ajustado est captando as dependncias anteriores do nvel e da
volatilidade, usualmente se constri os grficos ACF e PACF dos resduos e quadrados dos resduos. Ainda,
alternativamente aos pacotes fGarch e rugarch , o pacote tseries tambm possui uma funo garch . Aqui, a nica
ressalva com relao s funes do pacote fGarch , que produzem resduos no-padronizados, diferente dos outros
dois pacotes. Logo, suponha que temos um ajuste de um modelo via o pacote fGarch , digamos fit . Para obter
resultados equivalentes, comparveis e interpretveis, a sintaxe correta para se obter os resduos de um modelo
ajustado em fit at=residuals(fit_norm_cemig_at,standardize = T)) .
A partir, ento de at , pode se construir as anlises de at e at
acf(at) , pacf(at) , acf(at^2) , pacf(at^2) .

da forma usual, isto

1.6.9 Previses
Tanto para os modelos ARMA quanto para os modelos da famlia GARCH apresentados aqui, a sintaxe para se
obter previses :
predict(fit,n.ahead=h)

em que h o horizonte de previso e fit um objeto contendo o modelo ajustado.

1.7 VaR: Value-at-risk


1.7.1 Metodologia RiskMetrics
A seguinte funo pode ser facilmente programada no R para o clculo do VaR:

RMVaR<function(rt, lambda = 0.94, k = 1, long = TRUE, alpha = 0.95,range.optim=seq(0.9,1,0.001),plot=FALSE){


#

rt a srie de logretornos

se long == TRUE, entao estamos no caso de uma posicao comprada. Se long == FALSE, entao a posicao ser

considerada vendida
#

lambda o parmetro de suavizao

'alpha' a probabilidade fixada da distribuio Normal padrao Lembrete: o RiskMetrics supe erros no

rmais.
#

k o horizonte para o qual se deseja calcular o VaR

Se lambda == NULL, entao o programa executa a rotina para todos os valores em range.optim=seq(0.9,1,0.0

01)
Se lambda == NULL e plot == TRUE, entao o programa imprime a soma de quadrado dos resduos para os lamb da

em range.optim
# Se long=T, entao estou em uma posicao comprada e o VaR definido na cauda inferior, i.e., lower.tail=T.
# Se long=F, entao o VaR calculado na cauda superior e lower.tail = F.
Z=qnorm(0.05,lower.tail=long)
r2t<rt^2
T=length(r2t)
SQR<numeric()
VaR<numeric()
sigma2hat<
numeric()
sigma2hat[1]<r2t[1]
if(!is.null(lambda)){ # Entao nao ira para a otimizacao de lambda for(t in
2:T){
sigma2hat[t]<sigma2hat[t1]*lambda+(1lambda)*r2t[t1]
#print(paste("hello 24",t))
}
lambda_ = lambda S2t1<
sigma2hat[T]*lambda+(1lambda)*r2t[T] VaR<
sqrt(S2t1*k)*Z SQR<sum((sigma2hat
r2t)^2,na.rm = TRUE)
}
else { if(!is.null(range.optim)){
for( i in 1: length(range.optim)){
tmp<RMVaR(rt, lambda = range.optim[i], k = k, long = long, alpha =alpha)
VaR[i]<tmp[[1]]
SQR[i]<tmp[[2]]
}
if(plot==TRUE){
plot(range.optim,SQR, type="l", col="darkblue",lwd=2, main="RiskMetrics\n Sum of Squared Residuals",xl
ab="lambda",ylab="SQR")
abline(h=min(SQR),v=range.optim[SQR==min(SQR)],lty=2,col="gray")
}
}
else {
return("Error! You must specify 'lambda' or 'range.optim' ")
}
lambda=range.optim[SQR==min(S
QR)] lambda_=range.optim
print(paste("RiskMetrics The Minimum SQR is: ",round(min(SQR),4)," at lambda =",lambda))
}
return(list(VaR=VaR,SQR=SQR,lambda=lambda_))
}

Exemplo de Utilizao utilizando dados e log-retornos do Ibovespa:

load("VaR.RData")
RMVaR(r_ibov,long=F,k=30) #Clculo do VaR para periodo de 30 dias com o lambda padro, sugerido pelo RiskMetri cs,
i.e., lambda=0.94

$VaR

[1] 0.1962522

#
#

$SQR

[1] 0.01421295

#
#

$lambda

[1] 0.94

RMVaR(r_ibov,long=F,k=30,lambda=0.88) #Clculo do VaR para periodo de 30 dias com lambda = 0.88

$VaR

[1] 0.2004856

#
#

$SQR

[1] 0.01417891

#
#

$lambda

[1] 0.88

Optim<RMVaR(r_ibov,long=F,k=30,lambda=NULL,range.optim=seq(0.8,1,0.001),plot=T) # Clculo do VaR para periodo


de 30 dias com lambda selecionado iterativamente de acordo com a menor soma de quadrados dos residuos

## [1] "RiskMetrics The Minimum SQR is:

0.0142

at lambda = 0.901"

1.7.2 Funo para imprimir grfico de quantis empricos

qtEmpirico<function(x,p,long=TRUE,plot=T,nbreaks=30,print=TRUE,title="Empirical VaR")
{ dnst<density(x)
qt<quantile(x,p*long+(1p)*!long)
if(plot==T){
hist(x,breaks=nbreaks,col="lightgrey",border="white",freq=F,
ylim=c(0,max(dnst$y)),xlim=c(min(x),max(x)),main=title)
par(new=T)
if(long != TRUE){ ### Posicao Vendida
plot(dnst$x[dnst$x>qt],
dnst$y[dnst$x>qt],type="h",
ylim=c(0,max(dnst$y)),xlim=c(min(x),max(x)),
xaxt="n",yaxt="n",lwd=1,col="blue",ylab="",xlab="",main="")
}
else{ ### Posicao
comprada
plot(dnst$x[dnst$x<qt],
dnst$y[dnst$x<qt],type="h",
ylim=c(0,max(dnst$y)),xlim=c(min(x),max(x)),
xaxt="n",yaxt="n",lwd=0,col="blue",ylab="",xlab="",main="")
}
par(new=T)
plot(dnst,xaxt="n",yaxt="n",
ylim=c(0,max(dnst$y)),xlim=c(min(x),max(x)),
lwd=1,col="darkblue",ylab="",xlab="",main="")
}
if(print==TRUE)
{ print(paste0("Probability: ",p))
print(paste0("Position long?: ",long))
print(paste0("Empirical Quantile: ",round(qt,5)))
}
return(qt)
}
qtEmpirico(rnorm(500),0.05,long=T)

[1] "Probability: 0.05"

[1] "Position long?: TRUE"

[1] "Empirical Quantile: 1.75689"

#
#

5%
1.756889

1.7.3 Distribuio de Valores Extremos


O Pacote evir anlogo do R ao pacote evis do S-plus Assim, para estimar os parmetros da distribuio de Valores
extremos:
n

= n
1 (nlog (1 p ))n ,n 0
=n nlog (nlog (1 p )),n = 0
V aR k( ) =k V aR
V aR

utilizamos o comando gev :


gev(data,block)
data

o objeto contendo os dados que se deseja estimar a distribuio;

block o tamanho da janela utilizada para se calcular os mximos locais.

Pode-se ainda utilizar de forma adaptada a funo qtEmpirico(.) apresentada anteriormente para se calcular o VaR
via a distribuio de valores extremos estimada aqui.

1.8 Modelos Multivariados


Para toda esta seo, considere x um data.frame cotendo as sries de interesse, todas elas com mesmo tamanho;

1.8.1 Funo de correlao cruzada


Clculo das matrizes de covariancia e representao pictrica utilizando o pacote MTS :
ccm(x,level=T)

Se, level=F , ento ccm imprime somente a representao pictrica, sem os valores das matrizes.

1.8.2 Testes para escolha de modelos


Os comandos VARorder e VMAorder calculam as estatsticas AIC, BIC e HQ para diversas ordens dos modelos VAR(p) e
VMA(q) respectivamente.
VARorder(x)
VMAorder(x)

1.8.3 Ajuste dos Modelos


1.8.3.1 VAR(p) - Modelo AR multivariado com ordem p
VAR(x,p=p,include.mean=T)

1.8.3.2 VMA(q) - Modelo MA multivariado com ordem q


VMA(x,p=q,include.mean=T)

1.8.3.3 VAR(p) incompleto - Modelo AR multivariado com ordem p incompleto


VARs(x,p=p,include.mean=T,lags=coefs)

1.8.3.4 VMAs(q) incompleto - Modelo MA multivariado com ordem q incompleto


VMAs(x,p=q,include.mean=T,lags=coefs)

1.8.3.5 VARMA(,p,q)

VARMA(x,p=p,q=q,include.mean=T)

VARs(x, p=3,include.mean=TRUE,lags=c(1,3))

1.8.3.6 Qualidade de Ajuste dos modelos


MTSdiag(fit,adj=12)
Fit um objeto contendo o ajuste do modelo VAR, VMAR ou VARMA de interesse. MTS calcular as estatsticas de

Ljung-Box e Portmanteau para os resduos do modelo. Para detalhes, veja Tsay(2014).

1.8.3.7 Detalhes:
Em todos os 3 modelos acima, include.mean=T adiciona a constante no modelo. Se include.mean=F , ento o
modelo estimado no considerar a constante;
fixed um vetor com a mesma estrutura daquela apresentada para os modelos do pacote fArma , isto , ele deve

ser do tamanho do nmero de parametros a serem estimados e deve conter NA nas posies dos coeficientes de
interesse e zero nos que se deseja excluir.
Para os comandos VARs e VMAs , possivel omitir alguns coeficientes, como tinhamos no caso dos modelos
ARMA incompletos. Neste caso, coefs um vetor com as posies que se tem interesse que sejam ajustadas,
e.g., se
queremos um VAR(3) sem o coeficiente de Xt 2, executamos:

1.9 Co-integrao
Os testes de co-integrao desta seo sero realizados com o pacote urca do R.

1.9.1 Teste de Phillips & Ouliaris:


ca.po(X, demean = c("none", "constant", "trend"),lag = c("short", "long"))
X um objeto do tipo data.frame contendo as duas sries as quais se tem interesse de testar a existncia de

cointegrao.
Defina demean =constant para considerar as sries do modelo com constante (drift). Em outras palavras, utilize esta opo
se as sries envolvidas possurem mdia constante diferente de zero. A opo demean =trend considera o caso com sries
com tendncia e drift e o caso demean =none contempla a situao de sries ambas sem tendncia e drift. lag a opo
que define a ordem mxima do modelo VAR ajustado. Se lag='short' ento a ordem mxima do VAR
T

0.25

0.25

ajustado ser

[4(100 )

. Se lag='long' ento teremos a ordem mxima igual a

comprimento a srie.
A forma padro da funo

[12(100 )

, em que T indica o

ca.po utiliza a estatstica Pu (Veja Philips e Ouliaris, 1990) para realizar o teste. Desta
forma, o teste rejeita H: As sries no so co-integradas para valores grandes da estatistica Pu .
Exemplo(Morettin, 2013):
t1

X
= 2

X t2
X t3
T

ut

X
t2

+ 3

u
t3

+t

=X 2,t 1 +vt
=X 3,t 1 +wt
=(1, 2 , 3 ) = (1, 0.5,0.5)
=0.75ut 1 +t

# Simulando o sistema
beta=c(1,0.5,0.5)
u<arima.sim(n = 250, list(ar = c(0.75),ma=NULL), sd = 0.5) v<
rnorm(n=250, mean=0, sd=0.5)
w<rnorm(n=250, mean=0, sd=0.5)
X2<numeric()
X3<numeric()
for(t in 1:250){
if (t==1) {
X2[t] = 0 + v[t] # Inicializando com X2[0]=0
X3[t] = 0 + w[t] # Inicializando com X3[0]=0
}
else {
X2[t] = X2[t1] + v[t]
X3[t] = X3[t1] + w[t]
}
}
X1= beta[2]*X2beta[3]*X3+u # Relao de cointegrao
X<cbind(X1,X2,X3) # Cria a matriz de dados

library(urca)
cointest_X<ca.po(X, demean="constant") # Teste de P&O para o caso com constante
summary(cointest_X)

##
#

########################################

# Phillips and Ouliaris Unit Root Test #

########################################

Test of type Pu

detrending of series with constant only

Call:

lm(formula = z[, 1] ~ z[, 1])

#
#

##
## Residuals:
##

Min

1Q

## 2.03547 0.48997

Median

3Q

Max

0.01617 0.37825 1.73713

##
Coefficients:

Estimate Std. Error t value Pr(>|t|)

#
## (Intercept)
# z[, 1]X2
#
# z[, 1]X3
#

0.17036
0.40363

0.05546
0.02751

3.072 0.00237 **
14.673 < 2e16 ***

0.46881

0.00958

48.935 < 2e16 ***

Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 0.6677 on 247 degrees of freedom

Multiple Rsquared: 0.9187, Adjusted Rsquared: 0.9181

Fstatistic: 1396 on 2 and 247 DF, pvalue: < 2.2e16

##
##
Value of teststatistic is: 103.2199

#
#

Critical values of Pu are:

#
#
#
#
#

10pct

5pct

1pct

critical values 33.6955 40.5252 53.8731

O valor da estatstica 103.2199274 > 53.8731. Logo, rejeitamos H: No h co-integrao ao nvel 1%. O vetor de
co-integrao : (1, -0.4036312, -0.4688126) e a estimativa da constante 0.1703546.
necessrio ainda avaliar os resduos do modelo de correo de erros. O grfico dos resduos pode ser obtido

por: plot(cointest_X)

Se houver necessidade de se modelar estes resduos, ou de se realizar anlises adicionais, eles podem ser
obtidos atravs da propriedade res , e armazenados em um outro objeto. Por exemplo:
resid_coint<cointest_X@res # Armazenando os resduos do modelo ajustado em 'resid_coint'

Estatsticas descritivas para os resduos do MCE ajustado no


exemplo resid_coint
Min. :-2.03547
1st Qu.:-0.48997
Median : 0.01617
Mean : 0.00000
3rd Qu.: 0.37825
Max. : 1.73713

1.9.2 Teste de Johansen


Considerando o sistema multivariado dado por:
t = 1
t 1

+ + k t
k

+ + t +t ,(t = 1,T, )

O modelo vetorial de correo de erros especificado por:

X
t

Em que os vetores D t

= 1

X
t

,,t ,ie

teste, utilizando o pacote urca

+ + k 1 X

t k +1

+ kX

+ Dt +t ,t( = 1, T, )

i = I( 1 i ),i( = 1,k, )
i i,

= 1,k, so especificados como em (Johansen,1988). A sintaxe para este

joh_X<ca.jo(X, type = c("eigen", "trace"), ecdet = c("none", "const", "trend"), K = 2)


summary(joh_X)

Novamente, X do tipo data.frame . A opo type permite que se escolha qual estatstica ser utilizada. Utilize
type="eigen" para a estatstica do maior autovalor e type="trace" para a estatstica do trao. A opo ecdet contempla
os diversos casos possveis de adio de constantes e tendncias ao VECM. Veja (Zivot e Wang, 2006) para
detalhes. K a ordem do modelo VAR(k) a ser utilizada(Veja equao do sistema proposto acima) e suposta igual a
2 se suprimida.
O comando summary permite visualizar os detalhes do ajuste, como a martriz de cargas, o(s) vetor(es) co-integrados
e as estatsticas de teste. Novamente, rejeitamos a hiptese
do trao ou a do mximo autovalor.

H r:

r 0para valores grandes da estatstica, seja ela a

1.10 Referncias
Engle, R.F. and Granger, C.W.J. , Co-integration and Error Correction: Representation, Estimation, and
Testing, Econometrica, Vol. 55, No.2, pp. 251-76, 1987.
Hannan, E.J. and Quinn, B.G. , The Determination of the Order of an Autoregression, Journal of the Royal
Statistical Society. Series B (Methodological) V41(2):190195, Wiley, 1979.
Johansen, S., Statistical Analysis of cointegration vectors, Journal of Economic Dynamics and Control, 12, 231254, 1988.
Laurent S., Analytical Derivates of the APARCH Model, Computational Economics, V24, Issue 1, pp 51-57,
August 2004, Kluwer Academic Publishers.
Morettin P.A., Econometria Financeira, Blucher 2ed. Sao Paulo, 2013.
Morettin P.A. e Toloi, C.M.C, Anlise de Sries Temporais, Blucher, Sao Paulo, 2006.
Phillips, P.C.B. and Ouliaris, S., Asymptotic Properties of Residual Based Tests for Cointegration, Econometrica,
Vol. 58, No. 1, 165193, 1990.
Shumway R.H. and Stoffer D.S., Time Series Analysis and Its Applications: With R Examples, 3rd ed. Springer Texts
in Statistics, 2011.
Taylor, J.W., A Quantile Regression Neural Network Approach to Estimating the Conditional Density of Multiperiod

Returns, Journal of Forecasting, 19:299311, Wiley and Sons, 2000.


Tsay, R.S., Analysis of Financial Time Series, 2nd ed., Wiley, 2005.

Tsay, R.S., Multivariate Analysis of Time Series with R and Financial Applications, Wiley and Sons,
2014. Zivot, E., Wang, J., Modeling Financial Time Series with S-PLUS, 2nd ed., Springer, 2006.