Séries Temporais

Introdução

Aqui vamos explorar o que é uma série temporal, suas principais características.

Características de Séries Temporais

Séries temporais se referem a dados observados em diferentes pontos no tempo. O uso de métodos estatísticos convencionais como o de regressão linear dependem e suposições de que as observações são independentes entre si, uma hipótese que não faz sentido quando se trabalha com observações no tempo: cada observação está correlacionada com as observações mais próximas no tempo. Assim, um choque no valor da ação que ocorre ontem tem efeitos no preço da ação hoje.

Na economia observamos a taxa semanal de juros, o preço de fechamento das ações, o índice de preço mensal, as vendas anuais, e por ai vai. Em meteorologia, observamos as temperaturas médias diárias, a precipitação anual, índices de seca e outros. Na agricultura temos o registro anual da colheita e da produção de leite, erosão do solo e valor das exportações. A lista de áreas em que séries temporais podem ser estudadas não tem fim.

O objetivo da análise de séries temporais são de: (1) entender ou modelar os mecanismos que produzem a série observada e (2) prever valores futuros de uma série com base na história da série, e quando possível, com relação a outras séries ou fatores.

Exemplos de Séries Temporais:

library(tidyverse)
library(tidyquant)
library(TSA)

Série Temporal de Volume Anual de Chuva

O primeiro passo de qualquer investigação de séries temporais sempre começa com a observação de um gráfico plotado ao longo do tempo. O exame da série na forma do gráfico geralmente sugere o método de análise que será utilizado para resumir os dados. No exemplo abaixo, vemos a média de precipitação em Los Angelos durante o período entre 1878 e 1992. É possível perceber uma variação consideração de chuvas ao longo dos anos – alguns anos com um volume de chuva mais alto, outros mais baixo.

data(larain)
larain <- data.frame(chuva_anual = as.matrix(larain), date = time(larain))
larain %>% 
  ggplot(aes(x = date, y = chuva_anual)) + 
  geom_line() + 
  geom_point() + 
  ggthemes::theme_fivethirtyeight() + 
  labs(x = "", y = "Precipitação em polegadas",
       title = "Chuva Anual em Los Angeles, 1878 - 1992",
       subtitle = "Em polegadas de Chuva por Ano")

Estamos interessados se os valores da chuva estão relacionados entre si. Será que ao conhecer o comportamento da chuva em um conjunto de anos podemos prever o que ocorrerá em anos consecultivos?

Podemos criar uma variável relativa a chuva do ano anterior. Assim, em 1877 observamos 17,41 polegadas de chuva, e a chuva do ano anterior somou 20,86 polegadsa de chuva.

larain <- larain %>% 
  mutate(chuva_ano_anterior = lag(chuva_anual)) 

larain %>% head()
##   chuva_anual date chuva_ano_anterior
## 1       20.86 1878                 NA
## 2       17.41 1879              20.86
## 3       18.65 1880              17.41
## 4        5.53 1881              18.65
## 5       10.74 1882               5.53
## 6       14.14 1883              10.74

Podemos colocar estas duas informações lado a lado com um gráfico de dispersão abaixo. É possível observar que é perfeitamente possível que um ano com um elevado volume de chuvas seja seguido por um ano com baixo volume, e vice-versa. Assim, o volume de chuva que ocorre em um ano não parece explicar muito bem o comportamento da chuva nos anos seguintes.

larain %>% 
  ggplot(aes(x = chuva_anual, y = chuva_ano_anterior)) + 
  geom_point() + 
  ggthemes::theme_fivethirtyeight() +
  labs(title = "Volume de Chuva em Los Angeles, 1876 - 1992",
       subtitle = "Relação entre a Chuva Anual e o Volume de Chuva no Ano Anterior")

Assim, essa série não parece ter nenhum tipo de tendência, que indicaria que o volume de chuva está aumentando ou diminuindo ao longo do tempo. Não parece existir correlação entre a chuva de um ano e do ano anterior, de modo que podemos ter um ano com um volume muito alto de chuva e no ano seguinte, um volume baixo. De um ponto de vista de modelagem e de previsão, está não é uma série muito interessante.

Série temporal de Ambundância de Coelhos Canadenses

Aqui notamos uma série com comportamento completamente distinto. A figura abaixo mostra uma série temporal da ambundância de coelhos canadenses para o período entre 1905 e 1934. Diferentemente da série anterior, as observações de um ano estão correlacionadas de maneira muito próxima com aquelas observadas nos anos anteriores. Um número grande em um ano é seguido de um número semelhante no ano seguinte.

data(hare)
hare <- data.frame(numero_coelhos = as.matrix(hare), data = time(hare))
hare %>% ggplot(aes(x = data, y = numero_coelhos)) + 
  geom_line() + 
  geom_point() + 
  ggthemes::theme_fivethirtyeight() + 
  labs(x = "Ano", y = "Ambundância",
       title = "Ambundância de Coelhos Canadenses, 1905-1934")
## Don't know how to automatically pick scale for object of type ts. Defaulting to continuous.

Temperatura Média Mensal no Estado do Iowa

A figura abaixo mostra a temperatura média registrada para uma cidade no estado americano do Iowa. Nela observamos uma movimento sazonal muito regular. Sazonalidade para valores mensais ocorre quando observações que são separadas por 12 meses estão relacionados de alguma maneira. Assim, as temperaturas em janeiro de 1910 estão relacionadas com as temperaturas de janeiro de 1911, 1912 e assim por diante. Todos os meses de janeiro e fevereiro são muito frios e são similares em valores de temperatura. Isto não quer dizer que todos os meses de janeiro terão a mesma temperatura, ou os meses de Junho terão sempre a mesma temperatura média. Assim, se quisermos encontrar um modelo para este tipo de série temos que acomodar estas variações mas preservar estas similaridades entre temperaturas dos mesmos meses.

data(tempdub)
tempdub <- data.frame(temperatura = as.matrix(tempdub), data = time(tempdub))

tempdub %>%
  ggplot(aes(x = data, y = temperatura)) + 
  geom_line() + 
  geom_point() + 
  ggthemes::theme_fivethirtyeight() + 
  labs(x = "Ano", y = "Temperatura",
       title = "Temperatura Média Mensal no Estado do Iowa, 1964-1976")

Conceitos Fundamentais

Aqui vamos descrever alguns conceitos fundamentais sobre a teoria de séries temporais. Em particular, entender o que é um processo estocástico, a média, a função de covariância, processos estocásticos e a função de autocorrelação.

Modelos Estatísticos

O objetivo principal da análise de séries temporais é desenvolver modelos matemáticos que ofereçam uma descrição plausível do dado amostral. Nós vamos assumir que uma série temporal pode ser definida como uma coleção de variáveis aleatórias indexadas de acordo com a ordem que elas são obtidas no tempo. Por exemplo, podemos considerar uma série temporal como uma sequência de variáveis aleatórias \(y_1, y_2, y_3, ...\), onde a variável aleatória \(y_1\) denota o valor tomado de uma série no primeiro período do tempo, a variável \(y_2\) denota o valor para o segundo período no tempo, e assim em diante. Em geral, uma coleção de variáveis aleatórias, \(\{Y_t\}\), indexada por \(t\) é referida como um processo estocástico.

Exemplo: Ruido Branco

Um tipo muito simples de série gerada por ser uma coleção de variáveis aleatoriamente não correlacionadas, \(w_t\), com média 0 e variância finita \(\sigma^2_w\).

ruido_branco = rnorm(200,0,1)
df = data.frame(ruido_branco = as.matrix(ruido_branco), x = time(ruido_branco)) 


df %>% 
  ggplot(aes(x = x, y = ruido_branco)) +
  geom_line() + 
  ggthemes::theme_fivethirtyeight() + 
  labs(x = "Tempo", y = "y",
       title = "Ruido Branco")

Média Móvel e Filtro

Podemos substituir a série de ruído branco \(w_t\) por uma média móvel que suaviza a série. Por exemplo, considere substituir \(w_t\) por uma média dos seus valores atuais e dos seus valores vizinhos no passado e no futuro. Assim, deixe que:

\[v_t = \frac{1}{3} (w_{t-1} + w_t + w_{t+1})\]

que faz com que a série tenha a aparência mostrada na figura abaixo. Uma inspeção da série mostra que uma versão mais suavizada da primeira série é produzida, refletindo o fato que oscilações grandes são menos aparentes.

df <- df %>% 
  mutate(media_movel = stats::filter(ruido_branco, sides = 2, filter = rep(1/3, 3)))

df %>% 
  ggplot(aes(x = x, y = media_movel)) +
  geom_line() + 
  ggthemes::theme_fivethirtyeight() + 
  labs(x = "Tempo", y = "y",
       title = "Média Móvel")

Autoregressões

Suponha que consideremos a série de ruído branco \(w_t\) como um input e calculamos o output usando uma equações de segunda-ordem

\[y_t = y_{t-1} - 0.9y_{t-2} + w_t\]

sucessivamente para \(t=1,2,...,500\). A equação acima representa uma regressão ou previsão dos valores atuais \(x_t\) de uma série temporal como uma função dos dois valores passados da série, e portanto, o termo autoregressivo é sugerido para este modelo. Temos aqui um problema com os valores iniciais da série uma vez que as condições iniciais são importantes \(x_0\) e \(x_{-1}\), mas assumindo que temos estes valores, podemos gerar uma susseção de valores apenas substituindo na equação acima. O resultado é exibindo na figura abaixo.

ruido_branco <- rnorm(250,0,1)
# as primeiras 50 observações são excluídas para evitar problemas de startup
autoregressivo <- stats::filter(ruido_branco, filter=c(1,-.9), method = "recursive")[-(1:50)]

df <- df %>% 
  mutate(autoregressivo = autoregressivo)

df %>% 
  ggplot(aes(x = x)) +
  geom_line(aes(y = autoregressivo)) + 
  ggthemes::theme_fivethirtyeight() + 
  labs(x = "Tempo", y = "y",
       title = "Autogressivo")

O modelo autoregressivo acima mostra um comportamento periodico da série que é similar ao exemplo da série de “discurso”. O modelo autoregressivo acima é suas generalizações podem ser utilizados como um modelo explicativo para muitos tipos de séries observadas.

Random Walk com Drift

Um modelo para analisar tendências como as vistas em temperaturas globais vistas nos exemplos da seção anterior é um modelo “random walk com drift”. Intuitivamente, em cada período do tempo, a variável toma um passo independente para cima ou para baixo, por isso o termo random walk. A variável vai subir ou descer? A probabilidade dos dois eventos é igual. Uma analogia comumente utilizada é a de um bêbado caminhando em zig-zag pela rua enquanto tenta se mover em frente: o caminho que ele segue é uma caminhada aleatória ou random walk.

Assim, o modelo de random walk pode ser definido pela equação:

\[y_t = \delta + y_{t-1} + w_t\]

para \(t = 1,2,...,...\) com condições iniciais \(y_0 = 0\) e onde \(w_t\)é um ruido branco. A constante \(\delta\) é chamada de drift, e quando \(\delta = 0\), chamamos o modelo simplesmente de random walk. Quando \(\delta =0\), o valor da série em \(t\) é o valor da variável no tempo \(t-1\) mais um movimento completamente aleatório determinado por \(w_t\). Note que podemos reescrever a equação do random walk com drift ao acumular a soma de vários ruídos brancos:

\[x_t = \delta t + \sum_{j=1}^t w_t\]

para \(t = 1,2,...\). Ou seja, a série é uma soma de passos erráticos. O random walk é um processo que fornece um bom modelo para fenômenos tão diversos quanto preço de ações ou a posição de particulas pequenas suspensas em um flúido (movimento Browniano).

A figura abaixo mostra 500 observações geradas a partir de um modelo com \(\delta= 0\) e com \(\delta = 0.2\) e com \(\delta_w = 1\).

set.seed(154)

ruido_branco  = rnorm(200)
random_walk = cumsum(ruido_branco)
ruido_branco_drift = ruido_branco + 0.2
random_walk_drift = cumsum(ruido_branco_drift)

df <- df %>% 
  mutate(random_walk = random_walk) %>% 
  mutate(random_walk_drift = random_walk_drift)

df %>% 
  ggplot(aes(x = x)) + 
  geom_line(aes(y = random_walk, color = "Random Walk")) +
  geom_line(aes(y = random_walk_drift, color = "Random Walk com Drift")) +
  ggthemes::theme_fivethirtyeight() + 
  labs(x = "Tempo", y = "",
       title = "Random Walk",
       subtitle = "Random Walk sem Drift e Random Walk com Drift",
       color = "Modelo:")

Sinal no Ruído

Muitos modelos realistas para gear séries temporais assumem um sinal com algum tipo de variação periodica, que é contaminada pela adição de um ruído aleatório. Por exemplo, considere um modelo do tipo:

\[y_t = 2 \cos (2 \pi \frac{t + 15}{50} + w_t\]

para \(t = 1,2,...,200\), onde o primeiro termo é o sinal. Abaixo temos um modelo aditivo simples na forma de \(y_t = s_t + w_t\), onde \(s_t\) denota algum sinal desconhecido e \(w_t\) denota um ruído branco. O problema de detectar um sinal e então extrair \(s_t\) é de grande interesse. Em economia, o sinal pode ser uma tendência ou um componente sazonal da série.

curva_onda = 2*cos(2*pi*1:200/50 + .6*pi)
df <- df %>% 
  mutate(curva_onda = curva_onda,
         curva_onda_ruido = curva_onda + ruido_branco,
         curva_onda_ruido_forte = curva_onda + 5*ruido_branco)


p1 <- df %>% 
  ggplot(aes(x = x, y = curva_onda)) +
  geom_line() +
  ggthemes::theme_fivethirtyeight() +
  labs(title = "Curva em Onda")

p2 <- df %>% 
  ggplot(aes(x = x, y = curva_onda_ruido)) + 
  geom_line() +
  ggthemes::theme_fivethirtyeight() +
  labs(title = "Curva em Onda  + Ruído")


p3 <- df %>% 
  ggplot(aes(x = x, y = curva_onda_ruido_forte)) +
  geom_line() +
  ggthemes::theme_fivethirtyeight() +
  labs(title = "Curva em Onda + Ruído Forte")

  
gridExtra::grid.arrange(p1, p2, p3)

Nos exemplos acima, tentamos motivar o uso das combinações de várias variáveis aleatórias que emulam dados de séries temporais do mundo real. Agora vamos introduzir várias medidas teoricas utilizadas para descrever como séries temporais se comportam. Como é usual em estatística, a descrição completa da série envolve uma função de distribuição multivariada a amostra conjunta dos valores \(y_1, y_2, ..., y_n\), enquanto que uma descrição mais econômica pode ser obtida em termos das funções média e de autocorrelação. Como a correlação é uma característica essencial da análise de séries temporais, as medidas de descrição mais uteis são aquelas expressadas em termos função de autocorrelação e função de autovariância.

Média, Variâncias e Covariâncias

Vamos discutir alguns conceitos importantes relacionados a todos os tipo de modelos estatísticos de série temporal. Especificamente podemos utilizar algumas medidas para descrever uma série temporal.

Função Média

A função média descreve o valor esperado de uma série temporal. Assim, para um processo estocástico \(\{ Y_t\}\), a função média é definida como:

\[\mu_t = E(Y_t)\] para \(t = 0,1,2,...\). Assim, \(\mu_t\) é o valor esperado do processo no tempo \(t\).

Exemplo 1: Função Média de Média Móvel

Para uma media móvel dada por \(\frac{1}{3}(w_{t-1} + w_t + w_{t+1})\), seu valor esperado (função média) é igual a zero, \(\mu_y = 0\). Assim, a função média ao redor de zero descreve bem o comportamento geral da média móvel. O mesmo pode ser dito do ruído branco.

df %>% 
  ggplot(aes(x = x, y = ruido_branco)) + 
  geom_line(aes(color = "Ruído Branco")) + 
  geom_hline(aes(yintercept = 0, color = "Função Média"), linetype = 2, size = 1.5) +
  ggthemes::theme_fivethirtyeight() +
  labs(x = "Tempo", y = "",
       title = "Média Móvel",
       subtitle = "Função Média da Média Móvel é Zero",
       color = "")

Exemplo 2: Função Média de Random Walk com Drift

Para um random walk com drift qual a função média? Dado que este modelo é dado por \(y_t = \delta t + \sum_{j=1}^t w_t\), como \(E(w_t) = 0\) e como \(\delta\) é uma constante, temos

\[\mu(yt) = \delta t\]

Assim, a função média de uma random walk com drift é uma linha reta com inclinação \(\delta\). Uma comparação de uma random walk com drift e sua função média pode ser vista abaixo:

df %>% 
  # criar a função média da random walk
  mutate(funcao_media_random_walk = .2*x) %>% 
  ggplot(aes(x = x)) + 
  geom_line(aes(y = random_walk_drift, color = "Random Walk com Drift")) +
  geom_line(aes(y = funcao_media_random_walk, color = "Função Média"), linetype = 2, size = 1.5) +
  ggthemes::theme_fivethirtyeight() + 
  labs(x = "Tempo", y = "",
       title = "Random Walk com Drift Delta = 0.2",
       subtitle = "A função Média é uma linha Reta com Inclinação Delta = 0.2",
       color = "Modelo:")

Exemplo 3: Função Média de um Sinal mais Ruído

A função média para um modelo aditivo na forma \(y_t = s_t + w_t\) é obtido por:

\[\mu_{yt} = E(y_t) = E[2 \cos(2\pi \frac{2t + 15}{50}) + w_t]\]

Novamente, \(E(w_t) = 0\) e os demais termos são constantes, logo:

\[\mu_{yt} = E(y_t) = 2 \cos(2\pi \frac{2t + 15}{50})\] Portanto, a média móvel é apenas o sinal sem o ruído.

df %>% 
  ggplot(aes(x = x)) +
  geom_line(aes(y = curva_onda, color = "Função Média"), size = 1.5, linetype = 2) +
  geom_line(aes(y = curva_onda_ruido, color = "Sinal com Ruído")) + 
  ggthemes::theme_fivethirtyeight() +
  labs(title = "Curva em Onda e Sua Função Média",
       subtitle = "A função Média é o Sinal sem Ruído",
       color = "")

Função de Autocovariância

A função de autocovariância \(\gamma_{t,s}\) é definida como:

\[\gamma_{t,s} = Cov(Y_t, Y_s)\]

para \(t,s=0,1,2,...\)

Onde \(Cov(Y_t,Y_s) = E[(Y_t - \mu_t)(Y_s - \mu_s)] = E[Y_t Y_s) - \mu_t \mu_s\). Assim, a função de autocovariância mostra a covariância de um processo consigo mesmo em dois pontos diferentes no tempo. Assim, para uma série mensal de preços, a função de autocovariância mostra a relação entre \(y_{jan}\) e \(y_{fev}\), que são os valores observados de preço para janeiro e fevereiro, respectivamente.

Portanto, a autocovariância mede a dependência linear entre dois pontos na mesma série observadas em pontos diferentes. Séries que são muito suavizadas exibem funções de autocovariância que permanecem altas mesmo quando o \(t\) e o \(s\) estão muito longes entre si, como as observações de janeiro e novembro do mesmo ano, na nossa série de preços mensais. Séries com muita agitação tendem a ter funções de autocovariância que são próximas de zero para valores muito distantes entre si.

Lembre que se \(s = t\), ou seja, se estivermos comparando uma observação no tempo consigo mesmo, a autovariância se reduz ao valor de variância, porque

\[\gamma_{y}(t,t) = E[(y_t - \mu_t)^2] = \text{Var}(x_t)\]

Exemplo 1: Autocovariância de Ruído Branco

Para uma série temporal ruído branco \(w_t\) que tem \(E(w_t)=0\), temos que

\[\gamma_w = Cov(w_s, w_t) = 0\] para \(s \neq t\). Assim, a relação linear entre duas observações é zero. O valor de uma observação num ponto no tempo não influencia em nada os valores observados nos demais pontos do tempo.

Exemplo 2: Autocovariância de uma Média Móvel

Considere nosso exemplo de uma média móvel. Assim,

\[\gamma_v (s,t) = cov(v_s, v_t) = cov \{ \frac{1}{3}(w_{s-1} + w_s + w_{s+1}), \frac{1}{3}(w_{t-1} + w_t + w_{t+1}) \}\] Quando \(s = t\), temos

\[\gamma_v (s,t) = \frac{1}{9}cov\{(w_{t-1} + w_t + w_{t+1}), (w_{t-1} + w_t + w_{t+1}) \}\]

\[\gamma_v (s,t) = \frac{1}{9}\[ cov(w_{t-1}, w_{t-1} + cov(w_{t} + w_t) + cov(w_{t+1} + w_{t+1}) \]\]

\[\gamma_v (s,t) = \frac{3}{9} \sigma^2_w\]

O mesmo exercício pode ser feito para \(s = t + 1\), quando analisamos observações que estão distantes uma observação entre si (janeiro e março, por exemplo), onde \(\gamma_v (t + 1, t) = \frac{2}{9}\sigma^2_w\). Quando as observaçãos estão separadas por dois períodos, \(|s-t| = 2\), temos \(\gamma_v(s,t) = \frac{1}{9}\sigma^2_w\), e quando as observações estão separadas por mais de dois períodos, \(|s-t| > 2\), temos \(\gamma_v(s,t) = 0\).

Assim, quando suavizamos um ruído branco utilizando uma média móvel, adicionamos um pouco de covariância, mas esta dependência linear se reduz com o aumento da separação entre os valores. Assim, a relação entre janeiro e fevereiro é mais forte que a relação entre janeiro e março. Contudo, a relação entre janeiro e abril seria igual a zero, dado que \(| \text{Jan} - \text{Abr} | > 2\).

Exemplo 3: Autocovariância de um Random Walk

Para um modelo random walk, \(y_t = \sum_{j = 1}^t w_t\), temos que

\[\gamma_y (s,t) = cov(y_s, y_t) = cov \left( \sum_{j=1}^2 w_j, \sum_{k=1}^t w_t\right) = \min\{s,t\} \sigma^2_w\]

porque o \(w_t\) são variáveis não correlacionadas entre si. Nota que, diferentemente dos exemplos anteriores, a função autocovariância de uma random walk depende no valor em particular de \(s\) e \(t\), e não na separação entre as observações ou no lag. Perceba também que a variãncia de uma random walk, \(var(y_t) = t \sigma^2_w\), aumenta sem limites quando \(t\) cresce. O efeito desta variância pode ser observada na figura para o random walk. Conforme \(t\) aumenta, mais e mais a variável se distancia da sua função média \(\delta t\).

df %>% 
  # criar a função média da random walk
  mutate(funcao_media_random_walk = .2*x) %>% 
  ggplot(aes(x = x)) + 
  geom_line(aes(y = random_walk_drift, color = "Random Walk com Drift")) +
  geom_line(aes(y = funcao_media_random_walk, color = "Função Média"), linetype = 2, size = 1.5) +
  ggthemes::theme_fivethirtyeight() + 
  labs(x = "Tempo", y = "",
       title = "Random Walk com Drift Delta = 0.2",
       subtitle = "Quanto maior o t, maior a distância entre a Série e sua Função Média",
       color = "Modelo:")

A Função de Autocorrelação (FAC)

A função de autocorrelação é definida como

\[\rho (s,t) = \frac{\gamma(s,t)}{\sqrt{\gamma(s,s)\gamma(t,t)}}\]

A FAC, ou ACF em inglês, mede a previsibilidade linear da série no tempo \(t\), usando apenas os valores de \(y_s\). Os valores de \(\rho\) estão no intervalo \([-1,1]\). Se pudermos prever \(y_t\) perfeitamente a partir de \(y_s\) através de uma relação linear \(y_t = \beta_0 + \beta_1 y_s\), então a correlação será \(+1\) quando \(\beta_1 > 0\), e a correlação será \(-1\) quando \(\beta_1 <0\). Portanto, temos uma medida grosseira da nossa habilidade de prever a série no tempo \(t\) utilizando os valores no tempo \(s\).

A Função de Covariância-Cruzada e de Correlação-Cruzada

De maneira geral, gostariamos de medir a previsibilidade de uma outra série \(y_t\) a partir da série \(x_s\). Assumindo que ambas as séries tem variância finita, nós temos a seguinte definição para a função de covariância cruzada:

\[\gamma_{x,y}(s,t) = cov(x_s, y_t) = E[(x_s - \mu_{xs}\]

A função de correlação cruzada (FCC) é dada por:

\[\rho_{xy}(s,t) = \frac{\gamma_{xt}(s,t)}{\sqrt{\gamma_{x}(s,s) \gamma_{y}(t,t)}}\]

Podemos inclusive extender a ideia acima para o caso de mais de duas séries.

Séries Temporais Estacionárias

As definições de função Média e função de autocovariância são gerais. Muitos dos exemplos anteriores parecem indicar que algum tipo de regularidade pode existir ao longo do tempo no comportamento de uma série temporal.

Séries Temporais Financeiras

Séries temporais financeiras, como preços de ações e taxas de câmbio, exibem o fenômeno de a aglomeração de volatilidade, isto é, períodos em que seus preços apresentam grandes oscilações por um extenso período de tempo, seguidas de períodos em que há relativa calma.

Como estes dados refletem o resultado do comércio entre compradores e vendedores, nos mercados de ações, por exemplo, várias fontes de notícias e outros eventos econômicos podem causar um impacto sobre o padrão da série temporal de preços de ativos. No mercado de ações, o aumento da volatilidade significa enormes perdas ou ganhos, e por conseguinte, maior incerteza.


Modelos GARCH

Podemos obter os dados diários do Índice Dow Jones para o período entre 2006 e 2016 utilizando o pacote TTR para baixar os dados do Yahoo.

#library(TTR)
#djia = getYahooData("^DJI", start=20060420, end=20160420, freq="daily")
#write.csv(djia, "dados/djia.csv")
djia = read.csv("dados/djia.csv")
djiar = diff(log(djia$Close))[-1]
plot(djia$Close, main="Retornos do Índice Dow Jones", type="n")
lines(djia$Close)


Modelo GARCH

Modelos ARMA foram utilizados para modelar a média condicional de um processo quando a variância condicional era constante. Nos problemas financeiros acima, a hipótese de variância condicional constante é violada. Modelos como Autoregressive Conditionally Heteroscedastic (ARCH) foram desenvolvidos para modelar mudanças na volatilidade. Estes podemos foram extendidos para um ARCH Generalizado, ou GARCH.

Neste tipo de problema, estamos preocupados em modelar o retorno ou a taxa de crescimento de uma série. Por exemplo, se \(x_t\) é o valor de um ativo no tempo \(t\), então o retorno ou ganho relativo, \(r_t\) de um ativo no tempo \(t\) é dado por:

\[r_t = \frac{x_t - x_{t-1}}{x_{t-1}}\]

Podemos calcular o retorno do valor do índice diário do Dow Jones utilizando a formula acima. Dado que \(x_t\) é o valor do índice no dia e \(r_t = (x_t - x_{t-1})/x_{t-1}\) é o retorno, então \(1 + r_t = x_t/x_{t-1}\) e \(\log(1+ r_t) = \log (x_t/x_{t-1}) = \log(x_t) - \log(x_{t-1}) \approx r_t\). Assim, djiar representa o retorno calculado a partir do banco de dados que acabamos de obter:

djiar = diff(log(djia$Close))[-1]
plot(djiar, main="Retornos do Índice Dow Jones", type="n")
lines(djiar)

Geralmente, para séries financeiras, o retorno \(r_t\) não tem uma variância constante, e períodos de alta volatilidade são aglomerados juntos. Em outras palavras, existe uma forte dependência de choques inesperados de variabilidade dos retornos em relação ao seu valor passado. A figura acima, mostra isto, os retornos são geralmente estáveis, exceto por períodos curtos em que a variabilidade é muito alta.

O modelo ARCH mais simples, o ARCH(1), modela o retorno como:

\[r_t = \sigma_t \epsilon_t\]

\[\sigma^2_t = \alpha_0 + \alpha_1 r_{t-1}^2\]

onde \(\epsilon_t\) é um ruído branco. Como podemos ver, o modelo ARCH(1) retorna um processo de ruído branco com variância condicional não constante. E a variância condicional (\(\sigma^2\)) depende nos valores passados da série. O modelo GARCH, mantem a mesma ideia de que \(r_t = \sigma_t \epsilon_t\), mas expande a definição da variância condicional para:

\[\sigma_t^2 = \alpha_0 + \alpha_1 r_{t-1}^2 + \beta_1 + \sigma^2_{t-1}\]

Análise GARCH dos Retornos Dow Jones

Vamos ajustar um modelo AR(1)-GARCH(1,1). Antes podemos mostrar o ACF, que indica que a série possui alguma autocorrelação:

library(fGarch)
acf(djiar)

E o ACF para os retornos ao quadrado:

acf(djiar^2)

Agora podemos estimar o modelo:

#djia.g <- garchFit(~arma(1,0) + garch(1,1), data = djiar, cond.dist = "std")
summary(djia.g)
## 
## Title:
##  GARCH Modelling 
## 
## Call:
##  garchFit(formula = ~arma(1, 0) + garch(1, 1), data = djiar, cond.dist = "std") 
## 
## Mean and Variance Equation:
##  data ~ arma(1, 0) + garch(1, 1)
## <environment: 0x00000000251b0a38>
##  [data = djiar]
## 
## Conditional Distribution:
##  std 
## 
## Coefficient(s):
##          mu          ar1        omega       alpha1        beta1        shape  
##  8.5864e-04  -5.5324e-02   1.6035e-06   1.2407e-01   8.7034e-01   5.9922e+00  
## 
## Std. Errors:
##  based on Hessian 
## 
## Error Analysis:
##          Estimate  Std. Error  t value Pr(>|t|)    
## mu      8.586e-04   1.470e-04    5.840 5.23e-09 ***
## ar1    -5.532e-02   2.023e-02   -2.735 0.006238 ** 
## omega   1.603e-06   4.444e-07    3.608 0.000308 ***
## alpha1  1.241e-01   1.655e-02    7.496 6.55e-14 ***
## beta1   8.703e-01   1.522e-02   57.179  < 2e-16 ***
## shape   5.992e+00   7.941e-01    7.546 4.51e-14 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Log Likelihood:
##  8245.701    normalized:  3.277306 
## 
## Description:
##  Fri Mar 12 18:35:12 2021 by user: Robson 
## 
## 
## Standardised Residuals Tests:
##                                 Statistic p-Value   
##  Jarque-Bera Test   R    Chi^2  309.9791  0         
##  Shapiro-Wilk Test  R    W      0.9820428 0         
##  Ljung-Box Test     R    Q(10)  16.78677  0.0792173 
##  Ljung-Box Test     R    Q(15)  26.39845  0.03403746
##  Ljung-Box Test     R    Q(20)  28.6461   0.09496521
##  Ljung-Box Test     R^2  Q(10)  15.42137  0.117438  
##  Ljung-Box Test     R^2  Q(15)  19.18456  0.2054919 
##  Ljung-Box Test     R^2  Q(20)  23.01099  0.2882551 
##  LM Arch Test       R    TR^2   15.08836  0.2366396 
## 
## Information Criterion Statistics:
##       AIC       BIC       SIC      HQIC 
## -6.549842 -6.535938 -6.549853 -6.544795
predict(djia.g, n.ahead=5, plot=TRUE, conf=.9, nx=100)

##   meanForecast   meanError standardDeviation lowerInterval upperInterval
## 1 0.0007280386 0.006107442       0.006107442  -0.008961130    0.01041721
## 2 0.0008183648 0.006229743       0.006220573  -0.009064829    0.01070156
## 3 0.0008133677 0.006340441       0.006331067  -0.009245443    0.01087218
## 4 0.0008136441 0.006448609       0.006439062  -0.009416771    0.01104406
## 5 0.0008136288 0.006554402       0.006544685  -0.009584621    0.01121188