summary(cars)
## speed dist
## Min. : 4.0 Min. : 2.00
## 1st Qu.:12.0 1st Qu.: 26.00
## Median :15.0 Median : 36.00
## Mean :15.4 Mean : 42.98
## 3rd Qu.:19.0 3rd Qu.: 56.00
## Max. :25.0 Max. :120.00
Pacotes, base de dados, preparações para os gráficos
rm(list = ls())
library(dplyr)
##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
library(BatchGetSymbols)
## Warning: package 'BatchGetSymbols' was built under R version 4.3.3
## Loading required package: rvest
##
library(ggplot2)
## Warning: package 'ggplot2' was built under R version 4.3.2
library(tidyverse)
## Warning: package 'purrr' was built under R version 4.3.2
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ forcats 1.0.0 ✔ stringr 1.5.0
## ✔ lubridate 1.9.2 ✔ tibble 3.2.1
## ✔ purrr 1.0.2 ✔ tidyr 1.3.0
## ✔ readr 2.1.4
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ readr::guess_encoding() masks rvest::guess_encoding()
## ✖ dplyr::lag() masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(stargazer)
##
## Please cite as:
##
## Hlavac, Marek (2022). stargazer: Well-Formatted Regression and Summary Statistics Tables.
## R package version 5.2.3. https://CRAN.R-project.org/package=stargazer
library(kableExtra)
##
## Attaching package: 'kableExtra'
##
## The following object is masked from 'package:dplyr':
##
## group_rows
tema_proprio = function(){
theme(panel.background = element_rect(fill = 'white', color = 'black'),
panel.grid = element_line(color = 'lightgray'),
legend.position = 'top', plot.title = element_text(hjust= 0.5))
}
bvsp = BatchGetSymbols("^BVSP", first.date = as.Date('2007-01-01'))$df.tickers %>%
select(price.close, ref.date)
## Warning: `BatchGetSymbols()` was deprecated in BatchGetSymbols 2.6.4.
## ℹ Please use `yfR::yf_get()` instead.
## ℹ 2022-05-01: Package BatchGetSymbols will soon be replaced by yfR. More
## details about the change is available at github
## <<www.github.com/msperlin/yfR> You can install yfR by executing:
##
## remotes::install_github('msperlin/yfR')
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
##
## Running BatchGetSymbols for:
## tickers =^BVSP
## Downloading data for benchmark ticker
## ^GSPC | yahoo (1|1) | Not Cached | Saving cache
## ^BVSP | yahoo (1|1) | Not Cached | Saving cache - Got 96% of valid prices | Feels good!
sp500 = BatchGetSymbols("^GSPC", first.date = as.Date('2007-01-01'))$df.tickers %>%
select(price.close, ref.date)
##
## Running BatchGetSymbols for:
## tickers =^GSPC
## Downloading data for benchmark ticker
## ^GSPC | yahoo (1|1) | Found cache file
## ^GSPC | yahoo (1|1) | Found cache file - Got 100% of valid prices | Good job!
Por enquanto, temos as pontuações de fechamento de mercado do S&P 500 e Bovespa. Vamos ver graficamente a evolução das pontuações de fechamento
bvsp_grafico = ggplot(bvsp, aes(x = ref.date, y = price.close)) +
geom_line() + tema_proprio() +
labs(x = '', y = '', title = 'Ibovespa')
bvsp_grafico
sp500_grafico = ggplot(sp500, aes(x = ref.date, y = price.close)) +
geom_line() + tema_proprio() +
labs(x = '', y = '', title = 'SP500')
sp500_grafico
Vamos olhar agora para os retornos diários de cada um dos índices.
primeiro_valor = c(bvsp[1,1], sp500[1,1])
bvsp = bvsp %>%
mutate(retorno_simplesbvsp = 1+ (price.close - lag(price.close))/lag(price.close),
retorno_compostobvsp = 1 + (price.close - primeiro_valor[1])/primeiro_valor[1])
sp500 = sp500 %>%
mutate(retorno_simplessp = 1+ (price.close - lag(price.close))/lag(price.close),
retorno_compostosp = 1 + (price.close - primeiro_valor[2])/primeiro_valor[2])
base_final = inner_join(bvsp, sp500, by = 'ref.date')
base_para_grafico = base_final %>%
pivot_longer(cols = c(retorno_simplesbvsp, retorno_simplessp),
names_to = 'CategoriaSimples', values_to = 'ValorSimples') %>%
pivot_longer(cols = c(retorno_compostobvsp, retorno_compostosp),
names_to = 'CategoriaComposto', values_to = 'ValorComposto') %>%
select(-contains('price'))
grafico_simples = base_para_grafico %>% ggplot(aes(x = ref.date, y = ValorSimples,
group = CategoriaSimples, color = CategoriaSimples)) +
geom_line() +
scale_color_manual(name = '', values = c('green', 'red'),
labels = c('Ibovespa', 'SP500')) +
tema_proprio() + labs(x = '', y = '', title = 'Retorno Simples')
grafico_simples
## Warning: Removed 2 rows containing missing values or values outside the scale range
## (`geom_line()`).
Uma análise desatenta aqui pode levar a uma conlusão não lógica de que o
retorno do Ibovespa seria maior que o do S&P500 ao longo do tempo.
Porém, o máximo de informação que podemos possivelmente inferir daqui é
que o mercado brasileiro de ações, pelo cálculo do Índice da B3 (que
difere um pouco do metódo da Standard & Poor’s), tende a ser mais
volátil que o americano,visto que se tratam aqui de retornos diários, o
que é de se esperar pela composição setorial dos principais títulos de
cada mercado. Ademais, o gráfico parece nos indicar a presença de
correlação entre as séries, mas vamos verificar isso na prática
posteriormanete com testes de cointegração Vamos analisar então agora os
retornos acumulados, que efetivamente trazem uma informação melhor sobre
em qual mercado deveria se atuar, a pedidos dos clientes
grafico_composto = base_para_grafico %>% ggplot(aes(x = ref.date, y = ValorComposto,
group = CategoriaComposto, color = CategoriaComposto)) +
geom_line() +
scale_color_manual(name = '', values = c('green', 'red'),
labels = c('Ibovespa', 'SP500')) +
tema_proprio() + labs(x = '', y = '', title = 'Retorno Composto')
grafico_composto
Nota-se, como esperado, que o retorno acumulado do S&P500 tende a
ser maior que o do Ibovespa, com um breve período mais sustentado de
outperfomance no período pós crise de 2008. Vamos ver se existe
correlação entre os dois índices em um nível diário através da regressão
abaixo
regressao = lm(data = base_final, price.close.y ~ price.close.x)
summary(regressao)
##
## Call:
## lm(formula = price.close.y ~ price.close.x, data = base_final)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1078.50 -421.35 50.86 405.28 1268.88
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -6.509e+02 2.423e+01 -26.87 <2e-16 ***
## price.close.x 4.042e-02 3.058e-04 132.16 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 515.6 on 4204 degrees of freedom
## Multiple R-squared: 0.806, Adjusted R-squared: 0.8059
## F-statistic: 1.747e+04 on 1 and 4204 DF, p-value: < 2.2e-16
O resultados indicam alta significância de uma correlação positiva entre os retornos diários de ambas as séries, o que não é muito surpreendente. Em geral, espera-se que em questões diárias, os mercados brasileiros tendam a reagir as mesmas notícias que impactam signficativamente o mercado americano (por exemplo, mercados acionários do mundo inteiro são diretamente impactados pelas decisões de corte ou não de taxa de juros pelo FED).
Vamos verificar essa relação com um teste de cointegração de Engle-Granger, que nos permite analisar se as séries são de fato cointegradas ou se trata de uma correlação espúria
aTSA::coint.test(base_final$price.close.x, base_final$price.close.y)
## Response: base_final$price.close.x
## Input: base_final$price.close.y
## Number of inputs: 1
## Model: y ~ X + 1
## -------------------------------
## Engle-Granger Cointegration Test
## alternative: cointegrated
##
## Type 1: no trend
## lag EG p.value
## 9.0000 -2.7787 0.0641
## -----
## Type 2: linear trend
## lag EG p.value
## 9.000 -0.426 0.100
## -----
## Type 3: quadratic trend
## lag EG p.value
## 9.000 -0.132 0.100
## -----------
## Note: p.value = 0.01 means p.value <= 0.01
## : p.value = 0.10 means p.value >= 0.10
Ao que tudo indica, podemos dizer com confiança que a correlação entre os retornos diários não é espúria. Ainda sim, considerando uma escolha de mercado para investimento, a não ser que os clientes estejam buscando incorporar maior volatilidade em seus próprios portfólios, o mercado americano ainda seria o mais adequado para se operar.