A teoria de finanças aponta que uma carteira de investimentos deve ser formada por ativos descorrelacionados. Essa é a melhor forma de obter uma ótima relação risco-retorno; ou, em outras palavras, de diminuir o risco da carteira para um dado nível de retorno, ou de aumentar o retorno para um dado nível de risco.
Há muitas formas de montar uma carteira diversificada. Existe, naturalmente, a diversificação geográfica, expondo a carteira a diversos países, diluindo, assim, o risco de cada país individualmente. Há também a diversificação por classes de ativos. Nessa lógica, uma carteira seria composta por títulos públicos e privados, moedas, commodities, ações e até mesmo criptoativos. Contudo, mesmo dentro de uma mesma classe de ativos, é possível pensar em diversificar de forma inteligente. Por exemplo, em relação ao mercado acionário, é desejável montar a carteira com ações expostas a diferentes fatores, e que não se movem, portanto, exatamente na mesma direção.
Nesse artigo, exploraremos a associação de ações brasileiras aos juros reais de longo prazo, de modo a identificar as que são mais e menos sensíveis à trajetória dos juros.
Primeiramente, instalaremos (caso não estejam instalados) e carregaremos, por meio do pacote pacman, os pacotes que serão necessários ao longo do presente estudo.
# instalar o pacote "pacman" caso ele não esteja instalado
if (!require("pacman")) install.packages("pacman")
# carregar e instalar (se necessário) os pacotes necessários
p_load(GetTDData, tidyverse, janitor, here, knitr, kableExtra, scales, tidyquant, rvest, downloader, utils, readxl, fuzzyjoin)
Utilizaremos as taxas de juros das NTNBs de prazos entre 7 e 13 anos como proxy dos juros reais. O pacote getTDData permite que façamos o download de arquivos que contêm preços e retornos de títulos públicos brasileiros, direto do site do Tesouro Direto.
# download dos arquivos referentes às NTNBs
download.TD.data(asset.codes = "NTN-B",
dl.folder = here("brazil", "data", "tesouro_direto"))
Após o download, faremos o R ler estes arquivos.
# carregar dados
ntnb <- read.TD.files(dl.folder = here("brazil", "data", "tesouro_direto"),
asset.codes = "NTN-B") %>%
as_tibble()
Notar que o argumento dl.folder direciona para o mesmo local em ambas as funções (download.TD.data e read.TD.files), pois o R deve procurar o arquivo no diretório aonde ele foi salvo na máquina. Vejamos os dados propriamente ditos.
# converter os nomes das colunas para um formato mais apropriado para máquinas
ntnb <- ntnb %>%
clean_names()
# visualizar o banco de dados
kable(head(ntnb)) %>%
kable_styling("striped", "bordered")
ref_date | yield_bid | price_bid | asset_code | matur_date |
---|---|---|---|---|
2005-08-11 | 0.0873 | 681.04 | NTN-B Principal 150515 | 2015-05-15 |
2005-08-12 | 0.0874 | 680.82 | NTN-B Principal 150515 | 2015-05-15 |
2005-08-15 | 0.0874 | 681.12 | NTN-B Principal 150515 | 2015-05-15 |
2005-08-16 | 0.0874 | 681.42 | NTN-B Principal 150515 | 2015-05-15 |
2005-08-17 | 0.0875 | 681.12 | NTN-B Principal 150515 | 2015-05-15 |
2005-08-18 | 0.0875 | 681.42 | NTN-B Principal 150515 | 2015-05-15 |
kable(tail(ntnb)) %>%
kable_styling("striped", "bordered")
ref_date | yield_bid | price_bid | asset_code | matur_date |
---|---|---|---|---|
2021-09-21 | 0.0481 | 4441.04 | NTN-B 150555 | 2055-05-15 |
2021-09-21 | 0.0481 | 4438.76 | NTN-B 150555 | 2055-05-15 |
2021-09-22 | 0.0487 | 4402.69 | NTN-B 150555 | 2055-05-15 |
2021-09-22 | 0.0487 | 4400.42 | NTN-B 150555 | 2055-05-15 |
2021-09-23 | 0.0484 | 4425.22 | NTN-B 150555 | 2055-05-15 |
2021-09-23 | 0.0484 | 4422.94 | NTN-B 150555 | 2055-05-15 |
A série temporal compreende ago/2008 a set/2021. Contudo, queremos apenas as NTNB-s (não queremos as NTNB Principal).
# selecionar apenas as NTNBs
ntnbs <- ntnb %>%
filter(!grepl("Principal", asset_code))
Na continuidade, criaremos uma variável que corresponderá à diferença entre a data de vencimento do título e a data de referência, expressa em anos (na verdade, duas, pois uma será a diferença arredondada).
# computar intervalo entre data de referência e vencimento do título
ntnbs <- ntnbs %>%
mutate(diff_years = interval(ref_date, matur_date) %>% as.numeric("years"),
diff_years_round = round(diff_years, 0))
kable(head(ntnbs), digits = 4) %>%
kable_styling("striped", "bordered")
ref_date | yield_bid | price_bid | asset_code | matur_date | diff_years | diff_years_round |
---|---|---|---|---|---|---|
2003-09-12 | 0.1079 | 1207.74 | NTN-B 150806 | 2006-08-15 | 2.9240 | 3 |
2003-09-15 | 0.1071 | 1210.92 | NTN-B 150806 | 2006-08-15 | 2.9158 | 3 |
2003-09-16 | 0.1068 | 1212.62 | NTN-B 150806 | 2006-08-15 | 2.9131 | 3 |
2003-09-17 | 0.1034 | 1223.50 | NTN-B 150806 | 2006-08-15 | 2.9103 | 3 |
2003-09-18 | 0.1036 | 1223.72 | NTN-B 150806 | 2006-08-15 | 2.9076 | 3 |
2003-09-19 | 0.1029 | 1226.74 | NTN-B 150806 | 2006-08-15 | 2.9049 | 3 |
Três anos de série temporal é o suficiente para os propósitos deste estudo. Faremos esta seleção temporal, e ficaremos apenas com as observações cujo intervalo entre a data de referência e o vencimento do título varia entre 7 e 13 anos. Isso porque queremos saber o impacto nos juros de longo prazo no desempenho das ações.
# selecionar a série temporal e o "duration" dos juros
real_return <- ntnbs %>%
filter(ref_date >= "2018-09-14" & ref_date <= "2021-09-17",
diff_years_round %in% c(7:13)) %>%
arrange(ref_date) %>%
distinct(ref_date, .keep_all = TRUE)
kable(head(real_return), digits = 4) %>%
kable_styling("striped", "bordered")
ref_date | yield_bid | price_bid | asset_code | matur_date | diff_years | diff_years_round |
---|---|---|---|---|---|---|
2018-09-14 | 0.0576 | 3197.43 | NTN-B 150826 | 2026-08-15 | 7.9179 | 8 |
2018-09-17 | 0.0583 | 3184.98 | NTN-B 150826 | 2026-08-15 | 7.9097 | 8 |
2018-09-18 | 0.0574 | 3203.40 | NTN-B 150826 | 2026-08-15 | 7.9069 | 8 |
2018-09-19 | 0.0571 | 3210.27 | NTN-B 150826 | 2026-08-15 | 7.9042 | 8 |
2018-09-20 | 0.0571 | 3211.32 | NTN-B 150826 | 2026-08-15 | 7.9014 | 8 |
2018-09-21 | 0.0568 | 3218.87 | NTN-B 150826 | 2026-08-15 | 7.8987 | 8 |
Vejamos graficamente como ficou o banco de dados.
# plotar gráfico das NTNB-s selecionadas
title <- expression(paste("Taxa de juros de NTNBs com ",
italic("duration"), " entre 7 e 13 anos"))
ggplot(real_return, aes(x = ref_date, y = yield_bid)) +
geom_line(color = "royalblue4") +
labs(x = "Data de referência",
y = "Taxa de juros",
title = title) +
scale_y_continuous(labels=scales::percent) +
theme_classic()
A vantagem dessa série temporal é que ela compreende dois ciclos: um de baixa (de 2018 a 2020); outro de alta (de 2020 até o presente momento). Finalmente, calcularemos o variação diária das taixas de juros das NTNBs.
# criar banco de dados com os retornos diários de títulos públicos
bond_return <- real_return %>%
tidyquant::tq_transmute(select = yield_bid,
mutate_fun = periodReturn,
period = "daily",
col_rename = "bonds_returns") %>%
as_tibble()
# mudar o nome da coluna
bond_return <- bond_return %>%
rename(date = ref_date)
kable(head(bond_return), digits = 4) %>%
kable_styling("striped", "bordered", full_width = F)
date | bonds_returns |
---|---|
2018-09-14 | 0.0000 |
2018-09-17 | 0.0122 |
2018-09-18 | -0.0154 |
2018-09-19 | -0.0052 |
2018-09-20 | 0.0000 |
2018-09-21 | -0.0053 |
Para que possamos baixar as cotações ajustadas dos papeis negociados na B3, primeiramente precisamos obtê-los. Faremos isso por meio de webscraping do site de múltiplos de ações Fundamentus.
# armazenar endereço de página da internet
url_tickers <- read_html("http://www.fundamentus.com.br/detalhes.php?papel=")
# obter os papeis
tickers <- url_tickers %>%
html_nodes("a") %>%
html_text()
Chegou-se ao argumento “a” (no comando html_nodes) por meio do aplicativo SelectorGadget. Para mais detalhes sobre como usar o aplicativo para fazer webscraping, recomendamos o curso Wrangling Data in the Tidyverse, oferecido pela Johns Hopkins University na plataforma educacional Coursera. Vejamos o vetor:
# ver o vetor
head(tickers, 15)
## [1] "" "empresa"
## [3] "fii" "Página inicial"
## [5] "Investimento consciente" "Mais Opções"
## [7] "Fatos Relevantes" "Últimos Resultados"
## [9] "FII - Pesquisar Imóveis" "Entre em contato"
## [11] "Fundamentus Mobile" "Papel"
## [13] "Nome Comercial" "Razão Social"
## [15] "AALR3 "
tail(tickers, 20)
## [1] "WLMM3" "WLMM4"
## [3] "WMBY3" "WSON33"
## [5] "YDUQ3" "Página inicial"
## [7] "Conheça o site" "Investimento Consciente"
## [9] "Entre em contato" "Últimos Resultados"
## [11] "Gráficos" "Detalhes"
## [13] "Histórico de cotações" "Acionistas"
## [15] "Principais Acionistas" "Administração"
## [17] "Fatos Relevantes" "Apresentações"
## [19] "Proventos" "Balanços Históricos"
Como se nota, o primeiro papel é AALR3, e o último, YDUQ3. Não precisamos dos dados anteriores e posteriores a estes valores. Além disso, há um espaço em branco indesejsável em AALR3. É possível que isso se repita em outros papeis.
# selecionar os papeis
tickers <- tickers[match("AALR3 ", tickers):match("YDUQ3", tickers)]
# eliminar espaço em branco
tickers <- str_replace_all(tickers, " ", "")
Por fim, para facilitar que as cotações sejam baixadas no site Yahoo Finance, coloquemos o identificador de ações brasileiras em nosso vetor (.SA).
# adicionar caracter
tickers <- paste0(tickers, sep = ".", "SA")
head(tickers)
## [1] "AALR3.SA" "ABCB3.SA" "ABCB4.SA" "ABEV3.SA" "ABRE3.SA" "ABYA3.SA"
Queremos obter cotações apenas dos papeis que foram negociados durante todo o período do estudo. O pacote tidyquant nos socorrerá neste momento.
# papeis que foram negociados entre 13 e 17 de setembro de 2018
stocks_start <- tq_get(tickers,
get = "stock.prices",
complete_cases = TRUE,
from = "2018-09-13",
to = "2018-09-17")
# papeis que foram negociados entre 16 e 20 de setembro de 2021
stocks_end <- tq_get(tickers,
get = "stock.prices",
complete_cases = TRUE,
from = "2021-09-16",
to = "2021-09-20")
# selecionar papeis que foram negociados em ambos os períodos
stocks_start_end <- stocks_start %>%
inner_join(stocks_end, by = "symbol") %>%
select(symbol) %>%
distinct(symbol) %>%
pull()
# obter cotações dos papeis selecionados durante todo o período de negociação
stocks_both <- tq_get(stocks_start_end,
get = "stock.prices",
complete_cases = TRUE,
from = "2018-09-13",
to = "2021-09-20")
kable(head(stocks_both)) %>%
kable_styling("striped", "bordered")
symbol | date | open | high | low | close | volume | adjusted |
---|---|---|---|---|---|---|---|
AALR3.SA | 2018-09-13 | 12.37 | 12.42 | 12.00 | 12.17 | 186200 | 12.04769 |
AALR3.SA | 2018-09-14 | 12.17 | 12.24 | 11.96 | 11.98 | 120500 | 11.85960 |
AALR3.SA | 2018-09-17 | 12.04 | 12.13 | 11.95 | 11.99 | 159100 | 11.86949 |
AALR3.SA | 2018-09-18 | 12.10 | 12.10 | 11.92 | 12.00 | 109000 | 11.87940 |
AALR3.SA | 2018-09-19 | 12.00 | 12.12 | 11.90 | 11.90 | 129000 | 11.78040 |
AALR3.SA | 2018-09-20 | 11.93 | 12.06 | 11.21 | 11.44 | 697100 | 11.32502 |
Contudo, também queremos apenas papeis com um nível mínimo de negociação. Como se trata de um estudo de correlação entre mercado acionário e taxa de juros, ações muito ilíquidas podem se comportar de uma maneira peculiar, não exatamente por conta de alguma característica da empresa ou de setor em que ela atua, mas simplesmente pelo fato de que se trata de um papel raramente negociado e/ou extremamente volátil. Não queremos que ações com estas características “poluam” noss estudo. Estabeleceremos como nível mínimo de negociação que ela tenha sido negociada pelo menos uma vez em cada semana.
# selecionar papeis que foram negociados em todas as semanas
stocks_subset <- stocks_both %>%
group_by(symbol, yr = year(date), mon = month(date), week = week(date)) %>%
summarise(volume_avg = mean(volume, na.rm = TRUE)) %>%
group_by(symbol) %>%
summarise(volume_min = min(volume_avg, na.rm = TRUE)) %>%
filter(volume_min > 0) %>%
select(symbol) %>%
pull()
stocks_filtered <- stocks_both %>%
filter(symbol %in% stocks_subset)
Agora, não precisamos mais do identificador .SA.
# eliminar ".SA" da coluna "symbol"
stocks_final <- stocks_filtered %>%
mutate(symbol = gsub("\\..*","", stocks_filtered$symbol))
Finalmente, podemos calcular os retornos diários das ações durante o período.
# calcular retornos diários das ações
daily_returns <- stocks_final %>%
group_by(symbol) %>%
tq_transmute(select = adjusted,
mutate_fun = periodReturn,
period = 'daily',
col_rename = 'stocks_returns')
kable(head(daily_returns), digits = 4) %>%
kable_styling("striped", "bordered", full_width = F)
symbol | date | stocks_returns |
---|---|---|
AALR3 | 2018-09-13 | 0.0000 |
AALR3 | 2018-09-14 | -0.0156 |
AALR3 | 2018-09-17 | 0.0008 |
AALR3 | 2018-09-18 | 0.0008 |
AALR3 | 2018-09-19 | -0.0083 |
AALR3 | 2018-09-20 | -0.0387 |
O último banco de dados que obteremos é o de classificação setorial das empresas, presente no site da B3. Ele está em formato compactado. Faremos o download dele, descompactaremo-lo e, por fim, faremos com que o R o leia. A desvantagem desse procedimento é que, ao descompactá-lo, o arquivo acaba assumindo um nome inconveniente - Setorial B3 15-09-2021 (portuguˆs). Mas, basta copiar e colar o nome do arquivo, que o R entende perfeitamente. Novamente, há que se tomar cuidado para que o destino do arquivo nos três comandos abaixo (download, unzip e read_excel) esteja corretamente representado, de acordo com o que acontece na máquina.
# armazenar url
url_b3 <- "https://bvmf.bmfbovespa.com.br/InstDados/InformacoesEmpresas/ClassifSetorial.zip"
# download de arquivo compactado
download(url_b3, dest = here("brazil", "data", "classif_setor.zip"), mode="wb")
# descompactar arquivo
unzip(zipfile = here("brazil", "data", "classif_setor.zip"),
exdir = here("brazil", "data"))
# read file into R
setor <- read_excel(
here("brazil", "data", "Setorial B3 15-09-2021 (portuguˆs).xlsx"))
Vejamos o arquivo.
# visualizar banco de dados
kable(head(setor), n = 10) %>%
kable_styling("striped", "bordered")
CLASSIFICAÇÃO SETORIAL DAS EMPRESAS NEGOCIADAS NA B3 | …2 | …3 | …4 | …5 |
---|---|---|---|---|
NA | NA | NA | NA | NA |
NA | NA | NA | NA | NA |
NA | NA | NA | NA | NA |
NA | NA | NA | NA | NA |
NA | NA | NA | NA | NA |
SETOR ECONÔMICO | SUBSETOR | SEGMENTO | LISTAGEM | NA |
kable(tail(setor, 20)) %>%
kable_styling("striped", "bordered")
CLASSIFICAÇÃO SETORIAL DAS EMPRESAS NEGOCIADAS NA B3 | …2 | …3 | …4 | …5 |
---|---|---|---|---|
NA | NA | SUL 116 PART | OPTS | MB |
NA | NA | YBYRA S/A | YBRA | MB |
NA | NA | NA | NA | NA |
(DR1) BDR Nível 1 | NA | NA | NA | NA |
(DR2) BDR Nível 2 | NA | NA | NA | NA |
(DR3) BDR Nível 3 | NA | NA | NA | NA |
(N1) Nível 1 de Governança Corporativa | NA | NA | NA | NA |
(N2) Nível 2 de Governança Corporativa | NA | NA | NA | NA |
(NM) Novo Mercado | NA | NA | NA | NA |
(MA) Bovespa Mais | NA | NA | NA | NA |
(M2) Bovespa Mais - Nível 2 | NA | NA | NA | NA |
(MB) Balcão Organizado Tradicional | NA | NA | NA | NA |
NA | NA | NA | NA | NA |
ATENÇÃO | NA | NA | NA | NA |
Este trabalho não é uma recomendação de investimento. | NA | NA | NA | NA |
As informações recebidas das empresas admitidas à negociação na B3 estão disponíveis para consulta em | NA | NA | NA | NA |
nosso site www.b3.com.br. | NA | NA | NA | NA |
Para mais esclarecimentos, sugerimos procurar sua corretora. Ela pode ajudá-lo a avaliar os riscos e benefícios | NA | NA | NA | NA |
potenciais das negociações com valores mobiliários. | NA | NA | NA | NA |
B3 S.A. - Brasil, Bolsa, Balcão | NA | NA | NA | NA |
Como se nota, o banco de dados não vem num formato apropriado, e teremos que fazer uma série de manipulações, para deixá-lo organizado: 1) alterar o nome das colunas; 2) deletar linhas; 3) preencher células em branco; 4) separar valores referentes ao segmento econômico dos valores referentes aos nomes das empresas. Façamos tudo isso agora de uma única vez.
# alterar o nome das colunas
colnames <- c("setor_economico", "subsetor", "segmento", "symbol", "listagem")
colnames(setor) <- colnames
# deletar as primeiras linhas
setor <- setor[-c(1:7),]
# retornar a posição de linhas que ainda precisarão ser excluídas
match("(DR1) BDR Nível 1", setor$setor_economico) - 1
## [1] 599
nrow(setor)
## [1] 616
# remover as últimas linhas
setor <- setor[-c(599:616),]
# preencher células em branco com os valores anterioes
setor <- setor %>%
fill(setor_economico, subsetor)
# remover linhas que não trazem informação nova
setor <- setor %>%
filter(setor_economico != "SETOR ECONÔMICO")
# remover linhas nas quais as colunas "segmento", "symbol" e "listagem" apresentam valores em branco
setor <- setor %>%
filter(!(is.na(segmento) & is.na(symbol) & is.na(listagem)))
# consertar a coluna "segmento"
setor <- setor %>%
mutate(segmento2 = case_when(
str_ends(segmento, "[:lower:]") ~ segmento)) %>%
fill(segmento2) %>%
rename(nome = segmento,
segmento = segmento2)
# remover linhas que apresenta valores em branco na coluna "symbol"
setor <- setor %>%
filter(!is.na(symbol))
# reorder colunas
setor <- setor %>%
select(setor_economico, subsetor, segmento, nome, symbol, listagem)
kable(head(setor)) %>%
kable_styling("striped", "bordered")
setor_economico | subsetor | segmento | nome | symbol | listagem |
---|---|---|---|---|---|
Petróleo, Gás e Biocombustíveis | Petróleo, Gás e Biocombustíveis | Exploração, Refino e Distribuição | 3R PETROLEUM | RRRP | NM |
Petróleo, Gás e Biocombustíveis | Petróleo, Gás e Biocombustíveis | Exploração, Refino e Distribuição | COSAN | CSAN | NM |
Petróleo, Gás e Biocombustíveis | Petróleo, Gás e Biocombustíveis | Exploração, Refino e Distribuição | DOMMO | DMMO | NA |
Petróleo, Gás e Biocombustíveis | Petróleo, Gás e Biocombustíveis | Exploração, Refino e Distribuição | ENAUTA PART | ENAT | NM |
Petróleo, Gás e Biocombustíveis | Petróleo, Gás e Biocombustíveis | Exploração, Refino e Distribuição | PET MANGUINH | RPMG | NA |
Petróleo, Gás e Biocombustíveis | Petróleo, Gás e Biocombustíveis | Exploração, Refino e Distribuição | PETROBRAS | PETR | N2 |
Agora que temos tudo de que precisamos, iremos montar nosso banco de dados.
# consolidar bancos de dados de ações e títulos públicos
df <- daily_returns %>%
left_join(bond_return, by = "date") %>%
drop_na()
# consolidar banco de dados anterior com o de classificação setorial
df <- df %>%
regex_inner_join(setor, by = "symbol") %>%
select(date, nome, symbol.x, setor_economico, subsetor, segmento,
stocks_returns, bonds_returns, -symbol.y, -listagem) %>%
rename(symbol = symbol.x)
kable(head(df), digits = 4) %>%
kable_styling("striped", "bordered")
date | nome | symbol | setor_economico | subsetor | segmento | stocks_returns | bonds_returns |
---|---|---|---|---|---|---|---|
2018-09-14 | ALLIAR | AALR3 | Saúde | Serviços Médico - Hospitalares, Análises e Diagnósticos | Serviços Médico - Hospitalares, Análises e Diagnósticos | -0.0156 | 0.0000 |
2018-09-17 | ALLIAR | AALR3 | Saúde | Serviços Médico - Hospitalares, Análises e Diagnósticos | Serviços Médico - Hospitalares, Análises e Diagnósticos | 0.0008 | 0.0122 |
2018-09-18 | ALLIAR | AALR3 | Saúde | Serviços Médico - Hospitalares, Análises e Diagnósticos | Serviços Médico - Hospitalares, Análises e Diagnósticos | 0.0008 | -0.0154 |
2018-09-19 | ALLIAR | AALR3 | Saúde | Serviços Médico - Hospitalares, Análises e Diagnósticos | Serviços Médico - Hospitalares, Análises e Diagnósticos | -0.0083 | -0.0052 |
2018-09-20 | ALLIAR | AALR3 | Saúde | Serviços Médico - Hospitalares, Análises e Diagnósticos | Serviços Médico - Hospitalares, Análises e Diagnósticos | -0.0387 | 0.0000 |
2018-09-21 | ALLIAR | AALR3 | Saúde | Serviços Médico - Hospitalares, Análises e Diagnósticos | Serviços Médico - Hospitalares, Análises e Diagnósticos | -0.0052 | -0.0053 |
Finalmente podemos “colocar a mão na massa”. Computaremos as correlações entre variações nos preços das ações e nas taxas de juros dos títulos de longo prazo, por: 1) setor econômico; 2) subsetor; 3) segmento; 4) papeis isoladamente.
# correlação por setor econômico
cor_sector <- df %>%
group_by(setor_economico) %>%
summarise(cor = cor(stocks_returns, bonds_returns))
# correlação por subsetor
cor_subsector <- df %>%
group_by(setor_economico, subsetor) %>%
summarise(cor = cor(stocks_returns, bonds_returns))
# correlação por segmento
cor_segment <- df %>%
group_by(setor_economico, subsetor, segmento) %>%
summarise(cor = cor(stocks_returns, bonds_returns))
# correlação por papeis isoladamente
cor_stocks <- df %>%
group_by(symbol) %>%
mutate(cor = cor(stocks_returns, bonds_returns)) %>%
select(nome, symbol, setor_economico, subsetor, segmento, cor) %>%
distinct(symbol, .keep_all = TRUE)
Feito isso, vejamos os resultados, começando pelas correlações por setor econômico.
# ordenar pelas menores correlações negativas por setor econômico
sort_sector <- cor_sector %>%
arrange(desc(cor))
kable(sort_sector, digits = 4) %>%
kable_styling("striped", "bordered", full_width = F, position = "center")
setor_economico | cor |
---|---|
Saúde | 0.0102 |
Financeiro | 0.0017 |
Utilidade Pública | -0.0409 |
Consumo Cíclico | -0.0588 |
Petróleo, Gás e Biocombustíveis | -0.0699 |
Tecnologia da Informação | -0.0909 |
Outros | -0.0950 |
Comunicações | -0.1140 |
Bens Industriais | -0.1412 |
Consumo não Cíclico | -0.1426 |
Materiais Básicos | -0.1558 |
As ações do setor de Saúde e Financeiro são menos sensíveis a aumento na taxa de juros. De fato, as pessoas não deixam de necessitar de cuidados médicos porque o custo do dinheiro ficou mais caro. Isso também está de acordo com o argumento de que a alta de juros é boa para os bancos, pois eles passam a ganhar mais com spreads. Seguradoras, que fazem parte do setor financeiro, também costumam se sair bem em época de aumento dos juros, pois elas têm muito dinheiro em caixa que rendem de acordo com o CDI.
Vejamos as correlações por subsetor.
# visualizar as maiores correlações negativas por subsetor
sort_subsector1 <- cor_subsector %>%
arrange(cor)
kable(head(sort_subsector1, 10), digits = 4) %>%
kable_styling("striped", "bordered", full_width = F, position = "center")
setor_economico | subsetor | cor |
---|---|---|
Consumo Cíclico | Viagens e Lazer | -0.2398 |
Consumo Cíclico | Hoteis e Restaurantes | -0.2280 |
Bens Industriais | Transporte | -0.2239 |
Consumo Cíclico | Automóveis e Motocicletas | -0.2075 |
Consumo não Cíclico | Bebidas | -0.2071 |
Materiais Básicos | Mineração | -0.1918 |
Tecnologia da Informação | Computadores e Equipamentos | -0.1872 |
Bens Industriais | Material de Transporte | -0.1867 |
Materiais Básicos | Siderurgia e Metalurgia | -0.1862 |
Consumo não Cíclico | Comércio e Distribuição | -0.1785 |
Vemos representados muitos subsetores que fazem parte do consumo cíclico (Viagens e Lazer, Hoteis e Restaurantes, Autmóveis e Motocicletas). Faz sentido, pois as receitas dessas companhias estão atrelados ao ciclo econômico. Em épocas de juros baixos, as pessoas consomem mais (compram mais carros, viajam mais).
# visualizar as menores correlações negativas por subsetor
sort_subsector2 <- cor_subsector %>%
arrange(desc(cor))
kable(head(sort_subsector2, 10), digits = 4) %>%
kable_styling("striped", "bordered", full_width = F, position = "center")
setor_economico | subsetor | cor |
---|---|---|
Saúde | Comércio e Distribuição | 0.0244 |
Financeiro | Intermediários Financeiros | 0.0062 |
Utilidade Pública | Energia Elétrica | -0.0369 |
Consumo Cíclico | Construção Civil | -0.0370 |
Petróleo, Gás e Biocombustíveis | Petróleo, Gás e Biocombustíveis | -0.0699 |
Tecnologia da Informação | Programas e Serviços | -0.0744 |
Consumo não Cíclico | Agropecuária | -0.0813 |
Utilidade Pública | Água e Saneamento | -0.0899 |
Bens Industriais | Máquinas e Equipamentos | -0.0939 |
Outros | Outros | -0.0950 |
Do contrário, como vimos, “Comércio e Distribuição” em Saúde e “Intermediários Financeiros” saíram-se bem em momentos de elevação de juros. Como é a correlação entre ações e juros por segmento econômico?
# visualizar as maiores correlações negativas por segmento
sort_segment1 <- cor_segment %>%
arrange(cor)
kable(head(sort_segment1, 10), digits = 4) %>%
kable_styling("striped", "bordered", full_width = F, position = "center")
setor_economico | subsetor | segmento | cor |
---|---|---|---|
Bens Industriais | Transporte | Transporte Rodoviário | -0.3006 |
Consumo Cíclico | Viagens e Lazer | Viagens e Turismo | -0.2779 |
Bens Industriais | Transporte | Transporte Aéreo | -0.2733 |
Bens Industriais | Transporte | Transporte Hidroviário | -0.2389 |
Consumo Cíclico | Hoteis e Restaurantes | Restaurante e Similares | -0.2280 |
Consumo Cíclico | Tecidos, Vestuário e Calçados | Vestuário | -0.2266 |
Consumo Cíclico | Comércio | Eletrodomésticos | -0.2248 |
Bens Industriais | Material de Transporte | Material Aeronáutico e de Defesa | -0.2217 |
Bens Industriais | Transporte | Serviços de Apoio e Armazenagem | -0.2205 |
Bens Industriais | Transporte | Transporte Ferroviário | -0.2116 |
Transporte, nas suas mais diversas modalidades (rodoviáiro, aéreo, hidroviário, ferroviário, bem como serviços de apoio e armazenagem) apareceu fortemente representado entre as maiores correlações negativas. Vestuário é um setor conhecido por depender bastante de crédito, que se torna mais oneroso em períodos de juros altos. Agora as maiores correlações positivas (ou as menores correlações negativas):
# visualizar as maiores correlações positivas por segmento
sort_segment2 <- cor_segment %>%
arrange(desc(cor))
kable(head(sort_segment2, 10), digits = 4) %>%
kable_styling("striped", "bordered", full_width = F, position = "center")
setor_economico | subsetor | segmento | cor |
---|---|---|---|
Saúde | Comércio e Distribuição | Medicamentos e Outros Produtos | 0.0244 |
Financeiro | Intermediários Financeiros | Bancos | 0.0062 |
Utilidade Pública | Energia Elétrica | Energia Elétrica | -0.0369 |
Consumo Cíclico | Construção Civil | Incorporações | -0.0370 |
Petróleo, Gás e Biocombustíveis | Petróleo, Gás e Biocombustíveis | Exploração, Refino e Distribuição | -0.0702 |
Materiais Básicos | Químicos | Fertilizantes e Defensivos | -0.0707 |
Petróleo, Gás e Biocombustíveis | Petróleo, Gás e Biocombustíveis | Equipamentos e Serviços | -0.0709 |
Tecnologia da Informação | Programas e Serviços | Programas e Serviços | -0.0744 |
Bens Industriais | Construção e Engenharia | Construção Pesada | -0.0778 |
Materiais Básicos | Siderurgia e Metalurgia | Artefatos de Cobre | -0.0797 |
Aqui há uma surpresa muito grande. Esperávamos que o setor de incorporações fosse altamente sensível aos juros (ações caindo quando os juros sobem). Mas não foi isso o que aconteceu. As ações deste setor estão entre as menores correlações negativas.
Para finalizar, e ainda mais importante, vejamos como cada papel se comportou individualmente, começando, como de costume, pelas maiores correlações negativas:
# visualizar as maiores correlações negativas por papeis
sort_stocks1 <- cor_stocks %>%
arrange(cor)
kable(head(sort_stocks1, 10), digits = 4) %>%
kable_styling("striped", "bordered", full_width = F, position = "center")
nome | symbol | setor_economico | subsetor | segmento | cor |
---|---|---|---|---|---|
CEMIG | CMIG3 | Utilidade Pública | Energia Elétrica | Energia Elétrica | -0.3191 |
LIGHT S/A | LIGT3 | Utilidade Pública | Energia Elétrica | Energia Elétrica | -0.3072 |
OUROFINO S/A | OFSA3 | Saúde | Medicamentos e Outros Produtos | Medicamentos e Outros Produtos | -0.3046 |
TEGMA | TGMA3 | Bens Industriais | Transporte | Transporte Rodoviário | -0.3006 |
M.DIASBRANCO | MDIA3 | Consumo não Cíclico | Alimentos Processados | Alimentos Diversos | -0.2955 |
COPASA | CSMG3 | Utilidade Pública | Água e Saneamento | Água e Saneamento | -0.2915 |
CEMIG | CMIG4 | Utilidade Pública | Energia Elétrica | Energia Elétrica | -0.2867 |
BR PROPERT | BRPR3 | Financeiro | Exploração de Imóveis | Exploração de Imóveis | -0.2789 |
CVC BRASIL | CVCB3 | Consumo Cíclico | Viagens e Lazer | Viagens e Turismo | -0.2779 |
SABESP | SBSP3 | Utilidade Pública | Água e Saneamento | Água e Saneamento | -0.2774 |
Vemos uma concentração grande de empresas de utilidade pública (energia elétrica, água e saneamento). Isso acontece porque normalmente são empresas com alto nível de endividamento atrelado ao CDI. Quando os juros aumentam, a dívida dessas empresas aumenta também e, consequentemente, as ações tendem a cair. Quanto às maiores correlações positivas:
# visualizar as maiores correlações positivas por papeis
sort_stocks2 <- cor_stocks %>%
arrange(desc(cor))
kable(head(sort_stocks2, 10), digits = 4) %>%
kable_styling("striped", "bordered", full_width = F, position = "center")
nome | symbol | setor_economico | subsetor | segmento | cor |
---|---|---|---|---|---|
PROFARMA | PFRM3 | Saúde | Comércio e Distribuição | Medicamentos e Outros Produtos | 0.0435 |
BANCO PAN | BPAN4 | Financeiro | Intermediários Financeiros | Bancos | 0.0427 |
CAMIL | CAML3 | Consumo não Cíclico | Alimentos Processados | Alimentos Diversos | -0.0047 |
RENOVA | RNEW3 | Utilidade Pública | Energia Elétrica | Energia Elétrica | -0.0129 |
TECNISA | TCSA3 | Consumo Cíclico | Construção Civil | Incorporações | -0.0163 |
RENOVA | RNEW4 | Utilidade Pública | Energia Elétrica | Energia Elétrica | -0.0192 |
IGB S/A | IGBR3 | Financeiro | Exploração de Imóveis | Exploração de Imóveis | -0.0267 |
PETRORIO | PRIO3 | Petróleo, Gás e Biocombustíveis | Petróleo, Gás e Biocombustíveis | Exploração, Refino e Distribuição | -0.0284 |
ENERGISA | ENGI3 | Utilidade Pública | Energia Elétrica | Energia Elétrica | -0.0325 |
ACO ALTONA | EALT4 | Bens Industriais | Máquinas e Equipamentos | Máq. e Equip. Industriais | -0.0388 |
Como vemos, o consumo de arroz (Camil) e a necessidade de medicamentos (Profarma) não é muito afetada por alta nas taxas de juros. O que destoa é a presença de Tecnisa (TCSA3) entre as menos sensíveis ao aumento de juros.
Se a ideia da construção de uma carteira de ações é diversificar, uma das possibilidades de diversificação é a seleção de papeis que são mais e menos sensíveis ao aumento nas taxas de juros. Esse estudo tenta dar alguma contribuição nesse sentido. Evidentemente, as possibilidades de exploração do banco de dados são múltiplas; aqui procuramos apenas apresentar como é possível trilhar um caminho nesse sentido. Uma das limitações deste estudo é o uso da taxa de juros das NTNB-s como proxy dos juros reais. O Valor Data calcula os juros reais a partir dos contratos de swap de juro de 360 dias, descontada a projeção de inflação de um ano. Outra limitação é que a função tq_get do pacote tidyquant é bastante lenta para obter dados de cotações dos papeis.
Agradeço ao professor Marcelo S. Perlin, da Universidade Federal do Rio Grande do Sul, que criou o pacote getTDData, por meio do qual obtemos os dados do Tesouro Direto, e que me apontou o caminho para sua existência.