Muitos iniciantes desejam trabalhar com Séries Temporais utilizando a linguagem R, mas acabam sempre com dificuldades devido a quantidade de classes diferentes que lidam com esse tipo de dados. Afinal, qual utilizar? No post de hoje, mostramos as principais diferenças entre as classes de Séries Temporais e vasculhamos os pacotes que fazem usos delas.
Séries Temporais no R
O R foi criado com a finalidade de ser uma ferramenta facilitadora de análise de dados, principalmente por métodos estatísticos, auxiliando portanto na análise de séries temporais. A linguagem, por padrão, possui objetos para armazenar dados de diversos tipos de classes, com seus respectivos propósitos, em cursos introdutórios, são conhecidos as classes:
- matrix
- data frame
- list
Entretanto, existem classes especiais que se tornaram próprias para o uso de séries temporais. De certa forma, seguiram um processo evolutivo, entretanto, com cada uma possuindo suas propriedades únicas e conjuntos diferentes de pacotes e funções criados para o uso de cada classe. Começaremos com a classe padrão para Séries Temporais, contida no pacote {stats} do R, os objetos ts (Time Series).
Objetos ts
Os objetos ts são representados por vetores ou matrizes, e possuem atributos adicionais, principalmente as datas equiespaçadas em um índice, referenciando cada observação. É possível criar um objeto ts a partir da função ts(), usando como argumentos o vetor da série contendo os valores de cada observação, o ano/mês de inicio e a possibilidade de escolher a frequência (1 para anual, 4 para trimestral, 12 para mensal e 52 para semanal).
Vejamos a criação do objeto abaixo e o seu output.
# Objetos ts y <- ts(c(123,39,78,52,110), start=2012) y # Time Series: # Start = 2012 # End = 2016 # Frequency = 1 # [1] 123 39 78 52 110
O objeto possui diversos métodos que auxiliam na compreensão dos dados da série. Podemos extrair a frequência, a data de início, a data de fim, o vetor de tempo e criar uma janela de tempo. Para a manipulação dos dados utiliza-se as ferramentas proporcionados pelo R base.
frequency(y) # [1] 1 start(y) # [1] 2012 1 end(y) # [1] 2016 1 time(y) # Time Series: # Start = 2012 # End = 2016 # Frequency = 1 # [1] 2012 2013 2014 2015 2016 window(y, 2014) # Time Series: # Start = 2014 # End = 2016 # Frequency = 1 # [1] 78 52 110
É possível criar um gráfico de Séries Temporais facilmente por meio da função padrão do R, plot. Veja que é necessário somente o objeto como input na função, sem a necessidade de escolher os eixos.
plot.ts(y)
xts
O objeto xts é considerado uma evolução do objeto ts , bem como das matrizes. É também considerado "irmã" dos objetos de classe zoo (também utilizado para manipulações de Séries Temporais). Se assemelha visualmente com os objetos data frame, entretanto, possui algumas diferenças: a data sempre estará no índice do objeto e o filtro sempre manterá o formato de matriz do objeto.
Vejamos abaixo como é possível alterar a classe de 'ts' para 'xts', bem como criar filtros por meio do índice de tempo.
</pre> # Objeto xts library(xts) y.xts <- as.xts(y) # [,1] # 2012-01-01 123 # 2013-01-01 39 # 2014-01-01 78 # 2015-01-01 52 # 2016-01-01 110 y.xts['2014'] # [,1] # 2014-01-01 78 y.xts['2014/'] # [,1] # 2014-01-01 78 # 2015-01-01 52 # 2016-01-01 110 <pre>
Da mesma forma que o objeto de classe 'ts', o objeto 'xts' também possui um método próprio para criar gráficos com plot. Vemos que o resultado se difere do anterior, possuindo dois eixos e blocos para demarcar o espaço dos valores.
plot.xts(y.xts)
O interessante dos objetos da classe xts é a possibilidade de seu uso para dados financeiros, principalmente do tipo OHLC (Open, High, Low, Close). O famoso pacote quantmod, utilizado para importar séries financeiras e econômicas de diversas fontes, possui como padrão a classe xts. Vejamos um exemplo abaixo de dados coletados por meio do yahoo finance da empresa MGLU3 com a função getSymbols.
</pre> library(quantmod) getSymbols("MGLU3.SA") head(MGLU3.SA) # MGLU3.SA.Open MGLU3.SA.High MGLU3.SA.Low MGLU3.SA.Close MGLU3.SA.Volume MGLU3.SA.Adjusted # 2011-05-02 0.503125 0.518750 0.503125 0.514062 280003200 0.463173 # 2011-05-03 0.515625 0.521562 0.506250 0.509375 33670400 0.458950 # 2011-05-04 0.510000 0.515000 0.510000 0.515000 39203200 0.464018 # 2011-05-05 0.512812 0.512812 0.510000 0.511875 35097600 0.461202 # 2011-05-06 0.510937 0.511875 0.500000 0.508125 38672000 0.457824 # 2011-05-09 0.506562 0.507812 0.501250 0.503125 667680 0.453319 <pre>
O resultado possui o formato padrão dos objetos xts, entretanto, com diversas colunas.
Com as possibilidade do uso do xts para séries financeiras, criou-se diversos pacotes que auxiliam na manipulação, criação de indicadores e também no uso de otimização portfólio e cálculos econométricos, sendo algum deles os:
- TTR
- PortfolioAnalytics
- PerformanceAnalytics
Vejamos abaixo a utilização do {quantmod} para a manipulação de dados financeiros com o xts. A partir do método to.monthly é possível alterar o período dos dados de diário para mensal. Essa função é usada para obter a última cotação do dia de um mês.
Outra possibilidade é a utilização da função chartSeries para criar um gráfico contendo todas as informações dos dados OHLC de uma série financeira.
</pre> head(to.monthly(MGLU3.SA)) # MGLU3.SA.Open MGLU3.SA.High MGLU3.SA.Low MGLU3.SA.Close MGLU3.SA.Volume MGLU3.SA.Adjusted # mai 2011 0.503125 0.521562 0.474375 0.500000 630386080 0.450503 # jun 2011 0.495937 0.555000 0.493125 0.507812 296041600 0.457542 # jul 2011 0.509062 0.528125 0.426250 0.429687 293266592 0.387150 # ago 2011 0.437500 0.445312 0.325937 0.401562 338796800 0.361810 # set 2011 0.429687 0.474375 0.359375 0.366875 424745600 0.330557 # out 2011 0.364062 0.420312 0.345625 0.418750 360428800 0.377296 chartSeries(MGLU3.SA) <pre>
tibble
O tibble é uma classe de objetos da família de pacotes {tidyverse}. O objetivo da classe é trabalhar com a análise de dados, não sendo específico o seu uso para séries temporais, entretanto, devido a usabilidade do tidyverse, se tornou útil para manipulações e cálculos das séries.
Vejamos abaixo a facilidade de transformar um objeto do tipo xts para tibble, por meio da função tk_tbl do pacote {timetk}. É necessário relembrar que funções seguem o uso com determinadas classes, portanto, objetos de classe xts não funcionam nas funções do tidyverse e vice-versa.
</pre> library(timetk) mglu <- MGLU3.SA |> tk_tbl(preserve_index = TRUE, rename_index = "date") head(mglu) # A tibble: 6 × 7 # date MGLU3.SA.Open MGLU3.SA.High MGLU3.SA.Low MGLU3.SA.Close MGLU3.SA.Volume MGLU3.SA.Adjusted # <date> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> # 1 2011-05-02 0.503 0.519 0.503 0.514 280003200 0.463 # 2 2011-05-03 0.516 0.522 0.506 0.509 33670400 0.459 # 3 2011-05-04 0.51 0.515 0.51 0.515 39203200 0.464 # 4 2011-05-05 0.513 0.513 0.51 0.512 35097600 0.461 # 5 2011-05-06 0.511 0.512 0.5 0.508 38672000 0.458 # 6 2011-05-09 0.507 0.508 0.501 0.503 667680 0.453 <pre>
Com o confronto entre o crescimento do tidyverse e a necessidade de utilizar funções que só podem ser usadas em um objeto xts, criou-se o pacote {tidyquant}, que funciona com um wrapper das funções que utilizam o xts, porém, para objetos da classe tibble/dataframe.
Vejamos o uso da função tq_get (wrapper do getSymbols do {quantmod}) para capturar os dados da MGLU3 do yahoo finance. O resultado será um objeto tibble do tipo OHLC. A partir das funções tq_transmute ou tq_mutate, utiliza-se as funções dos pacotes xts para aplicar as manipulações no objeto de classe tibble.
</pre> library(tidyquant) mglu <- tq_get("MGLU3.SA") mglu_monthly <- mglu |> tq_transmute(mutate_fun = periodReturn, period = "monthly") # função do quantmod head(mglu_monthly) # A tibble: 6 × 2 # date monthly.returns # <mth> <dbl> # 1 2012 jan 0.0559 # 2 2012 fev 0.183 # 3 2012 mar 0.00928 # 4 2012 abr -0.0485 # 5 2012 mai -0.180 # 6 2012 jun 0.00750 <pre>
tsibble
Por fim, como uma evolução do tibble, porém, para uso definido para séries temporais, existe o objeto tsibble, utilizado principalmente para o Forecast (previsão) de séries temporais. É a classe padrão para objetos da família de pacotes tidyverts e a ferramenta usada por Hyndman e Athanasopoulos (2011).
Vejamos abaixo o código, utilizamos a função as_tibble para transformar o objeto de classe tibble em tsibble. Há apenas uma correção que deve ser feita antes de utilizada, como pode ser vista em seu uso em conjunto com a função gg_tsdisplay, que demonstra o erro dessa transformação.
</pre> # Tsibble library(tsibble) mglu_tsibble <- as_tsibble(mglu_monthly) gg_tsdisplay(mglu_tsibble, y = monthly.returns) # Error in `check_gaps()`: # ! .data contains implicit gaps in time. You should check your data and convert implicit gaps into explicit missing values using `tsibble::fill_gaps()` if required. # Run `rlang::last_error()` to see where the error occurred. <pre>
Para evitar esse problema, o ideal é que seja alterado o tipo de dado da coluna de data por meio de funções do próprio pacote. Veja que no caso do exemplo, utiliza-se a função yearmonth. Há diversas funções para cada frequência, sendo necessário a leitura da documentação do pacote.
</pre> library(dplyr) mglu_monthly <- mglu_monthly |> mutate(date = yearmonth(date)) mglu_tsibble <- as_tsibble(mglu_monthly, index = date) head(mglu_tsibble) # A tsibble: 6 x 2 [1M] # date monthly.returns # <mth> <dbl> # 1 2012 jan 0.0559 # 2 2012 fev 0.183 # 3 2012 mar 0.00928 # 4 2012 abr -0.0485 # 5 2012 mai -0.180 # 6 2012 jun 0.00750 <pre>
Com a classe definida como tsibble no objeto, é possível utilizar as funções da família do tidyverse/tidyverts. Veja abaixo a geração de um gráfico de séries temporais por meio do autoplot, isso somente é possível com classes que possuem a data bem definida como chave ou índice, como é o caso de objetos ts, xts e tsibble.
</pre> library(feasts) autoplot(mglu_tsibble) <pre>
Os pacotes do tidyverts também possibilitam o uso de outras funções para a geração de gráficos para análise de séries temporais, como é o caso da função gg_tsdisplay, que gera três gráficos diferentes, um de linha com pontos, outro de autocorrelação e outro de sazonalidade.
gg_tsdisplay(mglu_tsibble, y = monthly.returns)
Por fim, como dito, os pacotes possibilitam o uso de dados para o Forecast, como no caso abaixo, em é seguido o Workflow do tidyverts para a criação de três modelos de séries temporais univariados de previsão.
</pre> library(fable) mglu_tsibble |> model( ets = ETS(monthly.returns), arima = ARIMA(monthly.returns), snaive = SNAIVE(monthly.returns) ) |> forecast(h = '2 months') |> autoplot(filter(mglu_tsibble, year(date) > 2020)) <pre>
Quer saber mais?
Veja nossa trilha de cursos Ciência de Dados para Economia e Finanças.
Referências
Hyndman, R. J., & Athanasopoulos, G. (2021). Forecasting: principles and practice. OTexts. 3º ed.