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.
1 2 3 4 5 | 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.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 | # 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.
1 2 3 4 5 6 7 8 9 | # 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.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | # 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.
________________________