All Posts By

Vitor Wilher

Causalidade ou correlação: EWZ vs. Ibovespa

By | Clube AM

O `EWZ` é um fundo de investimento que replica um índice de ações brasileiras negociadas em Nova York, chamado `iShares MSCI Brazil Capped`, e tenta acompanhar o Ibovespa no Brasil. O `EWZ` é um `Exchange Traded Funds` (ETF) ou simplesmente *fundo de índices*. Por ser o principal ETF brasileiro, o EWZ é utilizado como uma espécie de termômetro da demanda internacional pelas ações brasileiras. Nesse exercício do Clube AM, vamos verificar se existe uma relação estatística entre o `EWZ` e o `Ibovespa`.

Usaremos os seguintes pacotes de R nesse exercício.


library(tidyverse)
library(quantmod)
library(timetk)
library(scales)
library(tidyquant)
library(BatchGetSymbols)
library(ggcorrplot)
library(vars)
library(aod)

Para começar, coletamos os dados diretamente do *yahoo finance*:


symbols = c('EWZ', '^BVSP')
prices = BatchGetSymbols(symbols,
first.date = '2016-01-02',
last.date = '2021-02-22') %>%
reduce(inner_join) %>%
drop_na()

Na sequência, podemos dar uma olhada nas séries...

E verificar se existe correlação entre as mesmas...


prices %>%
dplyr::select(ref.date, ticker, price.close) %>%
spread(ticker, price.close) %>%
dplyr::select(-ref.date) %>%
cor(use='na.or.complete') %>%
ggcorrplot(method='square',
colors = c("#e3120b", "white", '#91b8bd'),
lab=TRUE, lab_size = 7)

A seguir, colocamos um gráfico de correlação como abaixo.

A análise acima parece indicar uma correlação positiva entre as séries, o que era esperado, dada a construção do EWZ. Mas será que essa correlação implica em causalidade? Para testar isso, aplicamos o procedimento de Toda e Yamamoto (1995). De fato, conseguimos rejeitar a hipótese nula de não granger causa quando o sentido é do IBOVESPA para o EWZ, o que indica uma causalidade no sentido de Granger nessa direção. Algo que, por óbvio, era esperado.

____________________

(*) Os códigos completos do exercício estão disponíveis no Clube AM.

Modelos VAR no R

By | Dicas de R

Quem trabalha com modelagem e previsão provavelmente já teve que construir modelos baseados em vetores autorregressivos. Nessa Dicas de R - disponível toda quarta-feira aqui no blog da AM -vamos mostrar como é possível implementar esse tipo de modelo no R e utilizá-lo para fins de previsão. Essa aula, inclusive, faz parte do nosso novíssimo Curso de Previsão Macroeconométrica usando o R.

Em análises de séries temporais, é bastante comum considerar simultaneamente duas ou mais séries. Por exemplo, o nível de ociosidade da economia certamente tem influência sobre a taxa de crescimento dos preços, assim como um aumento da taxa de juros tem relação com a taxa de desemprego. Ademais, pode ser necessário em algumas ocasiões avaliar o quanto um choque em X_{t} afeta Y_{t}. Essas questões, bastante pertinentes no dia a dia, são tratadas dentro do que chamamos de análise multivariada de séries temporais. São objetivos básicos da análise multivariada de séries temporais:

  • Estudar as relações dinâmicas entre séries diversas;
  • Melhorar as previsões sobre uma variável específica.

Seja z_{t} = (z_{1t}, z_{2t}, ..., z_{kt})^{'} um vetor de dimensão k que contém séries temporais observadas em um período de tempo comum. Por exemplo, z_{1t} é o PIB trimestral brasileiro e z_{2t} é a taxa de desemprego também trimestral. Acaso, estudemos z_{1t} e z_{2t} conjuntamente poderemos verificar a dependência contenporânea e passada que existe entre essas duas variáveis. Poderemos verificar o quanto um choque no PIB afeta a taxa de desemprego e quanto tempo isso tende a durar. Analogamente, podemos estar interessados na relação entre a taxa de desemprego e a inflação.


desemprego = Quandl('BCB/24369', start_date='2012-03-01',
end_date='2018-12-01', order='asc', type='ts')
inflacao = Quandl('BCB/13522', start_date='2013-03-01',
end_date='2019-12-01', order='asc', type='ts')
data = data.frame(desemprego, inflacao)

A correlação entre as variáveis é -0,81, bastante elevada, mas isso, claro, não é o bastante para identificarmos a natureza da relação entre elas. Algumas questões devem ser levadas em consideração. Em primeiro lugar, para uma análise econométrica, precisamos definir se as séries são estacionárias. Essa primeira (grande) questão definirá o tipo de análise que faremos entre elas. Vamos supor que elas sejam estacionárias. Podemos, nesse caso, estimar um \textbf{Vetor Autoregressivo} de primeira ordem, de modo que:

(1)   \begin{align*} Unemployment_{t} = \delta_{1} + \gamma_{11}Unemployment_{t-1} + \gamma_{12}Inflation_{t-1} + \varepsilon_{1t} \\ Inflation_{t} = \delta_{2} + \gamma_{21}Inflation_{t-1} + \gamma_{22}Unemployment_{t-1} + \varepsilon_{2t} \end{align*}

O VAR(1) vai descrever a evolução dinâmica da interação entre a inflação e desemprego. Uma vez estimado esse modelo, poderemos nos perguntar se existe causalidade nessa relação, isto é, se inflação de fato ajuda a prever o desemprego, se o contrário ocorre ou se há uma simultaneidade. Nesse último caso, dizemos que existe uma causalidade bidirecional.

Ademais, esse tipo de análise também irá nos permitir estimar funções de impulso-resposta, onde analisamos a resposta a impulsos em uma das variáveis. Por exemplo, um choque no desemprego tem qual efeito sobre a inflação? E o caso contrário? Uma análise como essa pode ser muito interessante para avaliar a relação que existe entre duas ou mais variáveis, não é mesmo?

Um dos pressupostos, entretanto, do modelo acima é que as variáveis sejam estacionárias, no sentido que discutimos anteriormente. Isso significa que se essa hipótese for violada, teremos que partir para outro tipo de análise. No nosso Curso de Previsão Macroeconométrica usando o R, discutiremos a existência de cointegração entre duas ou mais variáveis, isto é, para o caso em que lidamos com séries não estacionárias, pode ser o caso de nos perguntarmos se existe uma relação entre de longo-prazo entre elas. Para o exemplo acima, se as séries não forem estacionárias, como de fato aparentam não ser, as mesmas podem estar relacionadas ao longo do tempo. Se for esse o caso, dizemos que as séries possuem uma tendência comum, o que nos permite avaliar a relação entre elas ao longo do tempo.

Para além disso, vamos agora ilustrar a aplicação de um modelo VAR a dados reais brasileiros. Estamos, por suposto, interessados em construir um modelo VAR que seja utilizado para fins de previsão da inflação mensal medida pelo IPCA. Para isso, vamos começar, como de praxe, carregando alguns pacotes.


### Pacotes
library(ggplot2)
library(forecast)
library(mFilter)
library(BETS)
library(vars)
library(scales)
library(gridExtra)
library(stargazer)

Os dados que precisaremos são coletados com uso do pacote \texttt{BETS} abaixo. Pegamos as séries de inflação, taxa Selic, taxa de câmbio e a produção industrial. Ademais, já tratamos as séries, preparando-as para o modelo VAR.


### Coletar os dados
inflacao <- BETSget(433)
selic <- BETSget(4189)
cambio <- BETSget(3697)
industria <- BETSget(21940)
# Transformações
dselic <- diff(selic)
dcambio <- diff(cambio)
# Criar e projetar hiato t+1
hp <- hpfilter(industria, freq=14400, type='lambda')
hiato <- ts(hp$cycle, start=start(industria), freq=12)
hiatof <- forecast(auto.arima(hiato, max.p=4, max.q=4,
seasonal = F), h=1, level=40)$mean
hiato <- ts(c(hiato, hiatof), start=start(industria), freq=12)
# Criar dummies sazonais
dummies <- window(ts(seasonaldummy(inflacao),
start=start(inflacao), freq=12), start=c(2007,01))
# Juntar séries
data <- window(ts.intersect(inflacao, dselic, dcambio, hiato),
start=c(2007,01))
colnames(data) <- c('inflacao', 'dselic', 'dcambio', 'hiato')

Um gráfico com as séries que utilizaremos é colocado abaixo.

Coletados e tratados os dados, o modelo VAR é então estimado com o código abaixo.


lag <- VARselect(data, lag.max=12, type='trend', season = 12)
var <- VAR(data, min(lag$selection), type='both', exogen = dummies)

Com o modelo em mãos, podemos gerar uma previsão como abaixo.


# Previsão
h <- 7
fvar <- stats::predict(var, n.ahead=h, ci=.4, dumvar=head(dummies,h))
fvar$fcst$inflacao

O output da previsão pode ser visto abaixo.

fcst lower upper CI
1 0.38 0.25 0.51 0.13
2 0.45 0.30 0.59 0.15
3 0.41 0.26 0.56 0.15
4 0.40 0.25 0.55 0.15
5 0.36 0.20 0.51 0.15
6 0.30 0.14 0.45 0.15
7 0.24 0.09 0.39 0.15

Esse tipo de modelagem é bastante utilizado entre profissionais que precisam de previsões acuradas no curto prazo para diversos tipos de variáveis. Ela é vista em detalhes nos nossos Cursos avançados de Macro Aplicada e de Análise de Séries Temporais.
____________________

O sofrimento da Petrobras no R

By | Comentário de Conjuntura

Bolsonaro, enfim, fez o que dele se esperava desde o início do mandato: "dilmou". A demissão do presidente da principal estatal brasileira foi um banho de água fria para investidores domésticos e estrangeiros. O problema aqui vai além da Petrobras em si e afeta praticamente toda a política econômica do atual governo. Em campanha, Bolsonaro flertou com o liberalismo, alimentando-se de um sentimento "antiestadismo" pós-operação Lava Jato. Eleito, porém, era visível o desconforto do Presidente da República com a agenda liberal. Era, portanto, questão de tempo que o seu passado intervencionista desse o ar da graça.

Investidores domésticos e estrangeiros, por óbvio, irão colocar isso no preço. Para ilustrar, vamos nesse Comentário de Conjuntura olhar as ações de três empresas estatais: Banco do Brasil, Eletrobras e Petrobras. Além disso, vamos ver o que aconteceu com o Ibovespa, dados os eventos recentes.

Os membros do Clube AM, como sempre, têm acesso aos códigos completos desse Comentário e também a um vídeo explicativo sobre como rodar os códigos.

Vamos começar, como de praxe, carregando alguns pacotes de R.


library(tidyverse)
library(quantmod)
library(timetk)
library(scales)
library(tidyquant)

Feito isso, podemos pegar os dados de ações dessas três estatais a partir da base de dados do yahoo finance.


symbols = c('PETR4.SA', 'BBAS3.SA', 'ELET6.SA')

prices = getSymbols(symbols, src='yahoo', from='2020-01-01') %>%
map(~Ad(get(.))) %>%
reduce(merge) %>%
`colnames<-` (symbols) %>%
tk_tbl(preserve_index = TRUE, rename_index = 'date') %>%
drop_na() %>%
gather(variavel, valor, -date)

Com os dados carregados, nós podemos gerar um gráfico da ação da Petrobras.

A ação da Petrobras sofreu uma queda de 21,5% nessa segunda-feira, mostrando o descontentamento do mercado com a interferência política do Palácio do Planalto sobre a estatal. Para além da Petrobras, será que tivemos queda nas outras estatais? O gráfico abaixo ilustra.

O Banco do Brasil também parece ter sofrido com o "efeito Petrobras": a ação do Banco teve queda de 11,6% nessa segunda-feira. A Eletrobrás, por outro lado, não parece ter sentido impacto relevante, ao menos por enquanto.

E o IBOVESPA?

O Índice Bovespa acabou sendo levado pelo mau humor dos investidores com a interferência política e fechou com queda de quase 5% nessa segunda-feira.

Difícil dizer como acabará o governo Bolsonaro, mas uma coisa parece cada vez mais clara para quem acompanha a política econômica: o flerte com o liberalismo está sepultado.

___________________

(*) Conheça o Clube AM e faça parte de um grupo exclusivo de compartilhamento de códigos e troca de informações entre os membros;

(**) Uma introdução à análise de dados no mercado financeiro é feita no nosso Curso de Mercado Financeiro e Gestão de Portfólios. As inscrições estão abertas para a Turma de Verão: aproveite!

equatiomatic: transformando modelos em equações LaTeX

By | Dicas de R

Quem trabalha com modelagem costuma ter que escrever equações de forma bastante rotineira. Para exercícios simples, é bastante tranquilo escrever uma ou outra equação em \LaTeX. O problema é quando você tem muitas equações no mesmo documento. Nessa Dicas de R - disponível toda quarta-feira aqui no blog da AM -vamos divulgar um novo pacote, o equatiomatic, que trata justamente desse problema.

library(equatiomatic)
library(palmerpenguins)
library(ggplot2)
library(latex2exp)

Usei a própria documentação do pacote para exemplificar o seu uso. Primeiro, rodamos um lm qualquer como o abaixo.


m <- lm(bill_length_mm ~ bill_depth_mm + flipper_length_mm, penguins)

Agora, basta usar a função extract_eq para que tenhamos acesso à equação.


extract_eq(m)

(1)   \begin{equation*} \operatorname{body\_mass\_g} = \alpha + \beta_{1}(\operatorname{bill\_length\_mm}) + \epsilon \end{equation*}

A equação extract_eq contém, inclusive, alguns argumentos que permitem a customização da equação a ser exibida. Para além disso, outra coisa legal do pacote é poder plotar gráficos com equações, como abaixo.


# Fit an lm model
m <- lm(body_mass_g ~ bill_length_mm, penguins)
# extract equation with `ital_vars = TRUE` to avoid the use of `\operatorname`
m_eq <- extract_eq(m, use_coef = TRUE, ital_vars = TRUE)
# swap escaped underscores for dashes
prep_eq <- gsub("\\\\_", "-", m_eq)
# swap display-style 
prep_eq <- paste("$", as.character(prep_eq), "$", sep = "")
# Plot
ggplot(penguins, aes(x = bill_length_mm, y = body_mass_g)) +
geom_point() +
geom_smooth(method = "lm") +
labs(title = "Relation between bill length and body mass",
subtitle = TeX(prep_eq))

____________

Um pdf e um script com todo o código desse exercício está disponível para os membros do Clube AM.

 

Raio-X da inflação brasileira usando o R

By | Comentário de Conjuntura

Na próxima quinta-feira, às 20h, eu farei uma aula ao vivo sobre estratégias de previsão da inflação mensal medida pelo IPCA. A aula faz parte do lançamento do nosso novo Curso de Previsão Macroeconométrica usando o R. Para garantir sua presença na aula, coloque seu nome na lista aqui para ser avisado. Nesse Comentário de Conjuntura, a propósito, fazemos um raio-x da inflação brasileira, tendo por foco o IPCA. O código completo está disponível para os membros do Clube AM.

Para começar, nós carregamos os pacotes de R que utilizaremos.


library(tidyverse)
library(readxl)
library(sidrar)
library(forecast)
library(tstools)
library(scales)
library(ggrepel)
library(BETS)
library(xtable)
library(lubridate)
library(RcppRoll)
library(knitr)
library(fpp3)
library(xts)
library(reshape2)
library(rbcb)

Com os pacotes carregados, podemos coletar os dados diretamente do SIDRA/IBGE para o RStudio com o código abaixo. Já aproveito para criar a inflação mensal e a inflação acumulada em 12 meses.


## Criar Inflação mensal e acumulada em 12 meses
ipca_indice = 
'/t/1737/n1/all/v/2266/p/all/d/v2266%2013' %>%
get_sidra(api=.) %>%
mutate(date = ymd(paste0(`Mês (Código)`, '01'))) %>%
select(date, Valor) %>%
mutate(mensal = round((Valor/lag(Valor, 1)-1)*100, 2),
anual = round((Valor/lag(Valor, 12)-1)*100, 2))

Como o índice pega toda a hiperinflação da década de 80, nós pegamos uma janela a partir de 2007 com o código a seguir.


## Criar amostra
ipca_subamostra = ipca_indice %>%
filter(date >= as.Date('2007-06-01'))

Uma tabela com os últimos resultados é colocada abaixo.

date Valor mensal anual
159 2020-08-01 5357.46 0.24 2.44
160 2020-09-01 5391.75 0.64 3.14
161 2020-10-01 5438.12 0.86 3.92
162 2020-11-01 5486.52 0.89 4.31
163 2020-12-01 5560.59 1.35 4.52
164 2021-01-01 5574.49 0.25 4.56

Os gráficos do número índice e da inflação mensal e acumulada em 12 meses são colocados abaixo.


Podemos dar um zoom na inflação mensal, como abaixo.

Uma análise estatística da inflação pode ser feita, a começar pelas estatísticas descritivas do nosso dataset.

date Valor mensal anual
Min. :2007-06-01 Min. :2669 Min. :-0.3800 Min. : 1.880
1st Qu.:2010-10-24 1st Qu.:3169 1st Qu.: 0.2500 1st Qu.: 4.190
Median :2014-03-16 Median :3911 Median : 0.4300 Median : 5.250
Mean :2014-03-17 Mean :4017 Mean : 0.4522 Mean : 5.473
3rd Qu.:2017-08-08 3rd Qu.:4855 3rd Qu.: 0.6025 3rd Qu.: 6.492
Max. :2021-01-01 Max. :5574 Max. : 1.3500 Max. :10.710

A seguir, podemos ver uma característica bastante conhecida da inflação que é a sua sazonalidade.

A seguir, nós vemos o boxplot e o histograma da inflação mensal medida pelo IPCA.

Na sequência, nós podemos importar os núcleos de inflação criados e acompanhados pelo Banco Central.


## Pegar núcleos
series = c(ipca_ex2 = 27838,
ipca_ex3 = 27839,
ipca_ms = 4466,
ipca_ma = 11426,
ipca_ex0 = 11427,
ipca_ex1 = 16121,
ipca_dp = 16122)

nucleos = get_series(series, start_date = '2006-07-01') %>%
purrr::reduce(inner_join)

Com os dados dos núcleos disponíveis, nós podemos criar um gráfico como abaixo.

A despeito do avanço da inflação cheia, a média dos sete núcleos do Banco Central ainda se situa abaixo da meta de inflação. A seguir, ilustramos todos os sete núcleos.

Como é possível ver pelo gráfico, todos os sete núcleos situam-se abaixo da meta de inflação, que esse ano é de 3,75%. Na sequência, vemos cada um dos sete grupos, na sua variação mensal.

E a variação acumulada em 12 meses.

Os núcleos de inflação são importantes para expurgar choques que ocorrem sobre o índice cheio. O que se vê pelos gráficos acima é que, de fato, os núcleos ainda estão mais comportados do que a inflação cheia, mas na margem, houve sim uma contaminação.

Outra informação importante é a difusão da inflação, isto é, o percentual de subitens que teve variação positiva no mês. Pelo gráfico acima, é possível ver que na margem há um avanço da difusão, já considerando uma média móvel de 12 meses dos dados.

Na sequência, nós podemos ver a contribuição dos 9 grupos para a inflação cheia. Os dados são coletados diretamente do SIDRA/IBGE.


## Baixar e tratar os dados
variacao =
'/t/7060/n1/all/v/63/p/all/c315/7170,7445,7486,7558,7625,7660,7712,7766,7786/d/v63%202' %>%
get_sidra(api=.) %>%
mutate(date = parse_date(`Mês (Código)`, format='%Y%m')) %>%
select(date, "Geral, grupo, subgrupo, item e subitem", Valor) %>%
pivot_wider(names_from = "Geral, grupo, subgrupo, item e subitem",
values_from = Valor)

peso =
'/t/7060/n1/all/v/66/p/all/c315/7170,7445,7486,7558,7625,7660,7712,7766,7786/d/v66%204' %>%
get_sidra(api=.) %>%
mutate(date = parse_date(`Mês (Código)`, format='%Y%m')) %>%
select(date, "Geral, grupo, subgrupo, item e subitem", Valor) %>%
pivot_wider(names_from = "Geral, grupo, subgrupo, item e subitem",
values_from = Valor)

contribuicao = (variacao[,-1]*peso[,-1]/100) %>%
mutate(date = variacao$date) %>%
select(date, everything())

Na sequência, geramos um gráfico com a variação mensal dos nove grupos.

Como se vê, houve um aumento considerável do grupo Alimentação e bebidas ao longo de 2020, o que contribuiu de forma peremptória para o avanço da inflação ao longo daquele ano. Na sequência, colocamos a contribuição de cada um dos grupos para a inflação mensal.

O gráfico acima ilustra a contribuição do grupo Alimentação e bebidas para a inflação mensal ao longo de 2020. A seguir, baixamos as classificações do IPCA diretamente do Banco Central.


series = c('Comercializáveis' = 4447,
'Não Comercializáveis' = 4448,
'Monitorados' = 4449,
'Não Duráveis' = 10841,
'Semi-Duráveis' = 10842,
'Duráveis' = 10843,
'Serviços' = 10844,
'Livres' = 11428)

classificacoes_ipca = get_series(series, start_date = '2007-01-01') %>%
purrr::reduce(inner_join)

Um gráfico com a variação acumulada em 12 meses é colocado abaixo.

Há uma assimetria entre as classificações do IPCA. Enquanto os preços livres tiveram um avanço nos últimos anos, os monitorados e não comercializáveis seguiram trajetória contrária. Na margem, contudo, essas classificações também mostram algum repique.

Para terminar esse `Raio-x da inflação brasileira`, vamos passar rapidamente pelos Índices Gerais de Preço (IGPs), construídos e divulgados mensalmente pela Fundação Getúlio Vargas. Os (IGPs) são formados por três índices: Índice de Preços por Atacado (IPA), Índice de Preço ao Consumidor (IPC) e Índice Nacional de Custo da Construção Civil (INCC). São divididos por período de coleta em IGP-10, IGP-M e IGP-DI.

Os números-índices do IGP-10, IGP-M e IGP-DI podem ser obtidos aplicando a seguinte fórmula no \mathbf{R}:

(1)   \begin{equation*} IGP_{i,t}=0,6*IPA_{i,t}+0,3*IPC_{i,t}+0,1*INCC_{i,t} \end{equation*}

Onde i pode ser 10, M ou DI.

O código a seguir pega os dados diretamente do Banco Central.


series = list('IGP-M'=189, 'IGP-DI'=190, 'IGP-10'=7447, 'IPC-Br'=191,
'INCC'=192, 'IPA'=225)

indices_gerais = get_series(series, start_date = '2007-01-01') %>%
purrr::reduce(inner_join) %>%
gather(variavel, valor, -date)

Na sequência, colocamos um gráfico que mostra os índices gerais e seus componentes no acumulado em 12 meses.

Como se vê, houve um salto no IPA, o índice de preços no atacado. Como o mesmo representa 60% dos índices gerais, houve um salto grande nesses índices ao longo de 2020. A tabela abaixo mostra a correlação entre os índices gerais, seus componentes e o IPCA.

IGP-10 IGP-DI IGP-M INCC IPA IPC-Br IPCA
IGP-10 1.0000000 0.9839832 0.9961309 0.4423330 0.9714577 0.2969412 0.3105496
IGP-DI 0.9839832 1.0000000 0.9947883 0.3984862 0.9930553 0.2648717 0.2771306
IGP-M 0.9961309 0.9947883 1.0000000 0.4198252 0.9855453 0.2778136 0.2909590
INCC 0.4423330 0.3984862 0.4198252 1.0000000 0.3182797 0.4864669 0.5081419
IPA 0.9714577 0.9930553 0.9855453 0.3182797 1.0000000 0.1571463 0.1702913
IPC-Br 0.2969412 0.2648717 0.2778136 0.4864669 0.1571463 1.0000000 0.9866917
IPCA 0.3105496 0.2771306 0.2909590 0.5081419 0.1702913 0.9866917 1.0000000

Para terminar, então, mostramos o gap entre o IPA e o IPCA no gráfico abaixo.

Membros do Clube AM têm acesso a todos os resultados dessas pesquisas, que contam com scripts automáticos ensinados no nosso Curso de Análise de Conjuntura usando o R.

_______________________

Cadastre-se em nossa Lista VIP para receber conteúdos exclusivos!

Fazer Inscrição
{"cart_token":"","hash":"","cart_data":""}