Como extrair componentes de tendência e sazonalidade de uma série temporal

By | Data Science

Tendência e sazonalidade são os componentes não observáveis de uma série temporal que representam, respectivamente, o movimento de longo prazo e o padrão regular (queda/subida) de um determinado período da série de tempo. A extração desses componentes pode ser feita facilmente no R usando a decomposição STL, método desenvolvido por Cleveland et al. (1990).

Algumas vantagens desse método em relação aos métodos clássicos de decomposição, como SEATS e X-11, são:

  • Ao contrário do SEATS e do X-11, a decomposição STL lida com qualquer tipo de sazonalidade, não apenas dados mensais e trimestrais;
  • O componente sazonal pode variar ao longo do tempo e a taxa de mudança pode ser definida pelo usuário;
  • A suavidade do componente tendência-ciclo também pode ser controlada pelo usuário;
  • É robusto em caso de outliers (ou seja, pode ser especificado uma decomposição robusta), de modo que observações incomuns não afetem as estimativas dos componentes, com exceção da série "restante".

Em se tratando de séries de tempo econômicas, parece ser uma ótima opção para diversos contextos, dado que a grande maioria das séries foram afetadas pela pandemia da Covid-19 (além de outros choques usuais no caso da economia brasileira).

Destaca-se ainda que o procedimento pode ser feito de maneira completamente automatizada, graças ao belo trabalho da família de pacotes tidyverts.

Exemplo no R

Abaixo aplicamos a decomposição STL sobre a série temporal que traz a popularidade do termo de busca "vagas de emprego" no Google. É esperado que a série apresente de forma clara um padrão sazonal, dado o impulso frequente de contratações de festas de fim de ano.


# Pacotes -----------------------------------------------------------------

# Carregar pacotes utilizados
library(magrittr)
library(dplyr)
library(gtrendsR)
library(tsibble)
library(fabletools)
library(feasts)
library(ggplot2)

# Coleta de dados ---------------------------------------------------------

# Primeiro coletamos os dados de exemplo provenientes do Google Trends
# de forma online usando API com o pacote gtrendsR

# Termo de busca "vagas de emprego" no Google; índice de 0 a 100 representa
# a popularidade relativa ao longo do tempo
df_vagas <- gtrendsR::gtrends(
keyword = "vagas de emprego",
geo = "BR",
time = "all",
onlyInterest = TRUE
)

# Exibir classe do objeto
class(df_vagas)

# Tratamento de dados -----------------------------------------------------

# Em seguida realizamos alguns tratamentos, selecionando e convertendo as
# colunas, além de transformar o objeto para classe tsibble
vagas <- df_vagas %>%
magrittr::extract2(1) %>%
dplyr::mutate(
date = tsibble::yearmonth(date),
hits = as.numeric(hits),
.keep = "used"
) %>%
tsibble::as_tsibble(index = date)

# Exibindo as primeiras linhas
vagas

# Extrair componentes: sazonalidade e tendência ---------------------------

# Aplica modelo decomposição da série (STL decomposition) e transforma
# resultado para um objeto tabular de classe "dable"
componentes <- vagas %>%
fabletools::model(feasts::STL(hits, robust = TRUE)) %>%
fabletools::components()

# Exibir resultado
componentes

# Plotar resultado
fabletools::autoplot(componentes) +
ggplot2::labs(
title = 'Decomposição STL: termo "vagas de emprego" no Google',
x = NULL,
caption = "Dados: Google | Elaboração: analisemacro.com.br"
)

Os gráficos empilhados acima mostram, em primeiro, a série original do Google Trends, seguida abaixo pelos componentes de tendência e sazonalidade identificados automaticamente pelo método STL, além da série "restante" que informa a variação restante dos dados não identificada como sazonal ou tendencial.

Consulte a documentação de feasts::STL para detalhes sobre especificação dos parâmetros e opções.

Referências

R. B. Cleveland, W. S. Cleveland, J.E. McRae, and I. Terpenning (1990) STL: A Seasonal-Trend Decomposition Procedure Based on Loess. Journal of Official Statistics, 6, 3–73.

Hyndman, R.J., & Athanasopoulos, G. (2021) Forecasting: principles and practice, 3rd edition, OTexts: Melbourne, Australia. OTexts.com/fpp3. Accessed on <2021-12-02>.

 

Hackeando o R: agrupando gráficos no R

By | Hackeando o R

Uma das etapas mais importante da análise de dados é a apresentação visual. Sabe-se que tanto para quem necessita tirar conclusões a partir dos dados, e também para ouvintes de outros segmentos, a parte visual demonstra-se como essencial para o entendimento do tópico que está sendo discutido. No Hackeando o R de hoje, iremos mostrar como podemos encaixar gráficos de forma que se tenha uma apresentação amigável, simples e rápida, combinando gráficos em apenas uma única figura.

O pacote mais importante no R para a visualização de dados, como todos sabem, é o pacote {ggplot2}. Apesar de suas inumeráveis funcionalidades, alguns pacotes o ajudam a potencializar seu uso. Como mostraremos, os pacotes {patchwork} e o {gridExtra} o ajudam na tarefa especifica de combinar múltiplos gráficos.

library(gridExtra)
library(patchwork)
library(tidyverse)

Para começarmos com os exemplos, primeiro devemos atribuir a um objeto um gráfico feito a partir do {ggplot2}. Utilizaremos o dataset Economics como exemplo, criando três gráficos diferentes.

# Gráfico de linha

psav_line <- economics %>% 
  ggplot(aes(x = date, y = psavert))+
  geom_line()+
  theme_minimal()+
  labs(x = "",
       y = "",
       title = "Personal savings rate - USA")

# Histograma

psav_des <- economics %>% 
  ggplot(aes(psavert))+
  geom_density(binwidth = .1, 
                 fill = "darkblue",
                 colour = "black")+
  theme_minimal()+
  labs(x = "",
       y = "",
       title = "Personal savings rate - USA")

# Gráfico de linha

pce_line <- economics %>% 
  ggplot(aes(x = date, y = pce))+
  geom_line()+
  theme_minimal()+
  labs(x = "",
       y = "",
       title = "Personal consumption expenditures",
       subtitle = "in billions of dollars - USA")

Salvado nossos gráficos, podemos utilizar o pacote {patchwork}, no qual funciona utilizando operadores matemáticos. O "+" é utilizado para deixar os gráficos lado a lado, como uma coluna. O uso de "()" serve para agrupar os gráficos e o "/" para empilhar um em outro.

pce_line + (psav_line / psav_des)+
  plot_annotation(
    title = "Economics Dataset")

Veja como podemos mudar a orientação dos gráficos mudando os operadores:

pce_line + psav_line + psav_des +
  plot_annotation(
    title = "Economics Dataset")

Outro pacote que pode ajudar na combinação de gráficos é o {gridExtra}, que diferentemente do {patchwork}, utiliza-se a função grid.arrange para ordernar os gráficos.

Veja que por padrão, a função empilha os gráficos, como se fosse em formato de linhas.


grid.arrange(psav_line, psav_des)

Também pode se especificar para que sejam ordenados em formato de colunas, podendo também escolher quantas queira.


grid.arrange(pce_line, psav_line, psav_des, ncol= 3)

(*) Quer aprender mais sobre a linguagem R e como construir gráficos? confira nosso Curso de Introdução ao R para análise de dados.

________________________

Caged: emprego formal tem resultado positivo

By | Indicadores

Hoje ocorreu a divulgação do resultado do Novo Caged referente ao mês de Outubro. No resultado, vemos o saldo positivo de 253 mil empregos formais. Este é o 10º mês seguido em que o número de admitidos do Novo Caged supera o número de demissões, acumulando no ano a criação de 2,6 milhões de empregos formais líquidos.

Se você quer aprender a criar gráficos como este acima, de forma reprodutível, acesse nosso Curso de Análise de Conjuntura usando o R - Versão 5.0.
________________________

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

By | mercado financeiro

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.

________________________

Relatório #27 - IGP-M

By | Indicadores

O IGP-M é um índice de preços construído e divulgado pela Fundação Getúlio Vargas, como forma de monitorar o movimento de preços dos produtos em todos os seus estágios de produção. O IGP-M é composto por três indicadores, cada um representado um peso dentro do índice, sendo eles: IPA (60%), IPC (30%) e INCC (10%). No Relatório AM de hoje, iremos visualizar o movimento do IGP-M dentro do mês de novembro de 2021.

No mês de novembro, o IGP-M subiu 0,02% em relação ao mês de outubro. A desaceleração foi puxada, principalmente, pelo IPA, que na variação mensal, configurou uma queda de -0,29%, ao contrário dos outros índices, como no caso do IPC, que exibiu um aumento de 0,93% no mês de novembro, bem como o INCC, que subiu 0,71% no mês.

Podemos ver no gráfico abaixo o movimentos dos índices nos últimos meses.

No acumulado em 12 meses, o IGP-M exibiu uma variação de aproximadamente 17,9%. Apesar da diminuição nos últimos meses, temos ainda um valor alto, se comparado com os resultados acumulados nos últimos anos.

Podemos visualizar em conjunto a variação acumulada de todos os índices. Vê-se a queda do INCC e do IPA nos últimos meses, porém, há o aumento do IPC.

________________________

(*) Para entender mais sobre inflação e análise de conjuntura econômica, confira nosso Curso de Análise de Conjuntura usando o R - Versão 5.0.

________________________

Receba diretamente em seu e-mail gratuitamente nossas promoções especiais
e conteúdos exclusivos sobre Análise de Dados!

Assinar Gratuitamente
{"cart_token":"","hash":"","cart_data":""}