Criando uma função de correlação móvel entre ativos financeiros

No post de hoje, iremos mostrar como é possível calcular a correlação móvel entre ativos financeiros. O objetivo do calculo é acompanhar a relação entre os ativos ao longo do tempo, de forma que, para quem possua uma carteira de ativos saiba quais deles eventualmente se tornem negativamente correlacionado, e portanto, tenham uma carteira diversificada e com baixo risco.

Para quem não sabe, a correlação mede a associação linear entre duas variáveis, ou seja, se há uma correlação positiva entre dois ativos, então ambos, eventualmente se direcionam para a mesma direção, e vice-versa. Importante lembrar que isto não significa qualquer ideia de causalidade.

Para uma carteira de investimentos, estamos obviamente interessados em ativos que se correlacionam negativamente, afim de diminuir o risco da carteira.

Carregamos os pacotes essenciais.

library(Quandl)
library(quantmod)
library(tidyverse)
library(timetk)
library(tidyquant)

Para nosso código, primeiro, devemos buscar os preços dos nossos ativos. Neste post, buscamos 3 ações, o dólar e também a ibovespa.

# Define os tickers das ações coletadas

tickers = c('PETR4.SA', 'ABEV3.SA', 'BBDC4.SA')

# Define o período da coleta

start = '2016-01-01'

# Coleta os preços das ações

prices = getSymbols(tickers, src='yahoo',
                    from= start,
                    warning=FALSE) %>%
  map(~Ad(get(.))) %>%
  reduce(merge) %>%
  `colnames<-` (tickers)

# Transforma os preços diários em mensais, e os transforma em tibble

prices_monthly <- prices %>% 
  to.monthly(indexAt = "lastof",
             OHLC = FALSE) %>% 
  tk_tbl(preserve_index = TRUE,
         rename_index = "date")


# Coleta os dados do IBOVESPA

ibov <- getSymbols("^BVSP", src = "yahoo",
                   from = start,
                   warning = FALSE,
                   auto.assign = FALSE) %>% 
  Ad()


# Transforma o IBOV diário em mensal, e o transforma em tibble

ibov_monthly <- ibov %>% 
  to.monthly(indexAt = "lastof",
             OHLC = FALSE) %>% 
  tk_tbl(preserve_index = TRUE,
         rename_index = "date")


# Coleta o preço do Dólar e o transforma em tibble

cambio = Quandl('BCB/3697',
                order='asc', 
                start_date = start) %>% 
  as.tibble()
  


# Junta todos os preços em um tibble

all_prices <- ibov_monthly %>% 
  inner_join(cambio, by = c("date" = "Date")) %>% 
  inner_join(prices_monthly) %>% 
  rename(cambio = "Value",
         ibov = "BVSP.Adjusted") 

Após realizar toda a coleta e tratamento dos dados, iremos calcular os retornos desses ativos.

# Calcula o retorno contínuo

returns_long <- all_prices %>% 
  pivot_longer(names_to = "asset",
               values_to = "prices",
               -date) %>% 
  group_by(asset) %>% 
  tq_transmute(mutate_fun = periodReturn,
               type = "log")

Por fim, criamos a nossa função de correlação móvel, utilizando a função slidify do pacote {timetk}. Em seguida, calculamos a correlação dos ativos em relação ao Ibovespa e visualizamos no gráfico o resultado.

# Cria uma função de correlação móvel

rolling_cor <- slidify(~cor(.x, .y, use = "complete.obs"), .period = 6, .align = "right")


# Transforma em formato wide

returns_wide <- returns_long %>% 
  pivot_wider(names_from = "asset",
                       values_from = "monthly.returns") 


# Calcula a correlação móvel de cada ativo em relação ao Ibovespa

corr_ibov <- returns_wide %>% 
  transmute(date  = date,
    Dólar = rolling_cor(ibov, cambio),
         PETR4 = rolling_cor(ibov, PETR4.SA),
         ABEV3 = rolling_cor(ibov, ABEV3.SA),
         BBDC4 = rolling_cor(ibov, BBDC4.SA))


# Plota

corr_ibov %>% 
  drop_na() %>% 
  pivot_longer(-date) %>% 
ggplot(aes(x = date, y = value, color = name))+
  geom_line(size = 1)+
  theme_minimal()+
  labs(x = "",
       y = "Correlação",
       title = " Correlação móvel com o IBOVESPA Mensal",
       cation = "Dados: Yahoo Finance e Banco Central do Brasil | Elaboração: analisemacro.com.br",
       color = "Ativo")

________________________

(*) Quer saber mais sobre Mercado Financeiro? Confira nossos curso de Finanças Quantitativas.

________________________

Compartilhe esse artigo

Facebook
Twitter
LinkedIn
WhatsApp
Telegram
Email
Print

Comente o que achou desse artigo

Outros artigos relacionados

Simplificando análises de dados manuais do Excel usando o Python

Tratar e analisar dados no Excel pode ser um verdadeiro caos, mesmo que você precise fazer coisas simples como cruzar duas tabelas de dados. Uma solução melhor é o uso de scripts em Python, que possibilitam a automação de tarefas repetitivas e manuais. Neste artigo mostramos um exemplo simples, comparando o Excel versus Python.

Como automatizar o tratamento de dados feito no Excel usando o Python?

Segundo a pesquisa “State of Data Science”, profissionais de dados gastam 3 horas/dia (38% do tempo) apenas preparando os dados, antes mesmo de analisá-los. Neste artigo advogamos que este gasto de tempo pode ser drasticamente reduzido ao utilizar ferramentas open source, como Pandas e Python, para automatizar tarefas repetitivas que costumam ser feitas em Excel.

como podemos ajudar?

Preencha os seus dados abaixo e fale conosco no WhatsApp

Boletim AM

Preencha o formulário abaixo para receber nossos boletins semanais diretamente em seu e-mail.