Previsão econômica com métodos de Suavização Exponencial

Suavização exponencial é um método para produzir previsões de séries temporais usando médias ponderadas com pesos de observações passadas. O diferencial destes métodos é que as observações mais recentes possuem um peso maior do que as mais antigas, o que tende a produzir previsões mais acuradas.

Nesse texto, apresentamos uma visão geral dos seguintes métodos:

  • Método de suavização exponencial simples
  • Método de tendência linear de Holt
  • Método de tendência linear amortecida
  • Método de sazonalidade aditiva e multiplicativa de Holt e Winters

Começamos apresentando a mecânica e intuição de cada método e, então, progredimos com a aplicação para previsão de séries temporais da economia do Brasil com distintas e complexas características. São demonstrados exemplos práticos em R e Python.

A referência técnica utilizada é o livro-texto de previsão de séries temporais intitulado “Forecasting: Principles and Practice” de Hyndman e Athanasopoulos (2021).

Para aprender mais e ter acesso a códigos confira o curso de Modelagem e Previsão usando Python ou comece do zero em análise de dados com a formação Do Zero à Análise de Dados com Python.

Método de suavização exponencial simples

O método de suavização exponencial simples (SES) é, como o nome sugere, o mais simples dos métodos, sendo aplicável a dados sem tendência ou sazonalidade com padrão claro.

Por exemplo, veja a série do Produto Interno Bruto - Taxa de variação real no ano:

Para modelar e prever essa série sem características de tendência ou sazonalidade claras, poderíamos utilizar o método do passeio aleatório, onde todas as previsões para o futuro são iguais ao último valor observado da série:

    \[\hat{y}_{T+h|T} = y_{T}\]

Dessa forma, o método do passeio aleatório assume que a última observação é a única e mais importante para produzir previsões para a série temporal. Todas as outras observações não possuem importância para prever o futuro. Podemos pensar que esse método é uma média ponderada onde todos os pesos são dados apenas para a última observação.

Outra possibilidade é prever a série temporal com o método da média, onde todas as previsões para o futuro são iguais à média dos dados observados:

    \[\hat{y}_{T+h|T} = \frac1T \sum_{t=1}^T y_t\]

Dessa forma, o método da média assume que todas as observações da série temporal possuem igual importância (pesos) para produzir previsões para o futuro.

Note que estes métodos são dois extremos e, na verdade, queremos um método que é um meio termo. É razoável pensar que pesos maiores devem ser dados para as observações mais recentes do que para observações do passado distante. Esse é o conceito por trás do método de suavização exponencial simples, onde as previsões são geradas utilizando médias ponderadas, onde os pesos decaem exponencialmente (os menores pesos são associados com as observações mais antigas):

    \[\hat{y}_{T+1|T} = \alpha y_T + \alpha(1-\alpha) y_{T-1} + \alpha(1-\alpha)^2 y_{T-2}+ \cdots\]

onde 0 \le \alpha \le 1 é o parâmetro de suavização que controla a taxa em que os pesos decaem até as observações mais antigas.

A ilustração abaixo retrata esse decaimento do valor de \alpha conforme as observações ficam mais antigas, por isso o método se chama "suavização exponencial":

Note que, conforme andamos para o passado, os pesos sobre as observações ficam próximas de zero muito rapidamente. Se o valor de \alpha for próximo de 1, maiores pesos serão dados para as observações do passado recente, caso contrário, se o valor de \alpha for próximo de 0, maiores pesos serão dados para as observações do passado distante.

Podemos observar como o decaimento exponencial para diferentes valores de \alpha atua sobre dados reais. Tomando como exemplo os dados do PIB e usando a Equação 1 do método de suavização exponencial simples:

O comportamento desse parâmetro é no mínimo interessante, não?

O método SES pode ser representado por essas equações:

A equação de previsão diz que a previsão para o período t + 1 é o nível estimado para o período t. A equação de suavização (ou nível) define a estimativa do nível a cada período t.

Note que esse processo precisa iniciar em algum momento, portanto um valor ótimo de início \ell_0 e um valor de \alpha precisa ser escolhido.

De forma similar a regressão linear, a escolha dos parâmetros ótimos podem ser feita minimizando a soma dos quadrado dos resíduos.

    \[\text{SQR}=\sum_{t=1}^T(y_t - \hat{y}_{t|t-1})^2=\sum_{t=1}^Te_t^2\]

Em termos de código, podemos estimar o método de suavização exponencial simples e gerar previsões, usando o exemplo de dados do PIB. Abaixo reportamos (a) o sumário do modelo, (b) as métricas de acurácia de treino/teste e (c) o gráfico de valores observados e estimados/previstos dentro da amostra e fora da amostra.

R

Código
Series: pib 
Model: ETS(A,N,N) 
  Smoothing parameters:
    alpha = 0.0001000181 

  Initial states:
     l[0]
 2.817876

  sigma^2:  10.7957

     AIC     AICc      BIC 
211.6478 212.4220 216.3139 
.model .type ME RMSE MAE MPE MAPE MASE RMSSE ACF1
ses Training 0.0004363 3.190418 2.554470 186.73657 325.5248 0.7444242 0.7314324 0.0267742
ses Test -2.5553774 3.961013 3.118939 36.85039 112.5396 NaN NaN 0.0702402

Note que o parâmetro \alpha estimado é aproximadamente zero, por isso a linha reta dentro da amostra. É possível definir o valor do parâmetro manualmente (veja a documentação do pacote).

Python

Código
ETS Results
Dep. Variable: pib No. Observations: 35
Model: ETS(ANN) Log Likelihood -90.268
Date: Fri, 25 Aug 2023 AIC 186.536
Time: 15:23:10 BIC 191.202
Sample: 01-01-1980 HQIC 188.147
- 01-01-2014 Scale 10.179
Covariance Type: approx
coef std err z P>|z| [0.025 0.975]
smoothing_level 0.0001 nan nan nan nan nan
initial_level 2.8180 0.540 5.217 0.000 1.759 3.877
Ljung-Box (Q): 0.38 Jarque-Bera (JB): 0.52
Prob(Q): 0.83 Prob(JB): 0.77
Heteroskedasticity (H): 0.27 Skew: -0.29
Prob(H) (two-sided): 0.03 Kurtosis: 2.84

Warnings:
[1] Covariance matrix calculated using numerical (complex-step) differentiation.

RMSE de treino: 3.1904176843135197
RMSE de teste: 3.961092520409291

Note que o parâmetro \alpha estimado é aproximadamente zero, por isso a linha reta dentro da amostra. É possível definir o valor do parâmetro manualmente (veja a documentação do pacote).

A linha preta no gráfico mostra os dados observados, enquanto que as linhas vermelha e azul mostram o ajuste dentro da amostra e a previsão fora da amostra, respectivamente, pelo método SES.

Note que avaliar pontos de previsão sem levar em consideração o intervalo de confiança pode esconder uma grande incerteza e levar a conclusões errôneas.

Método de tendência linear de Holt

Para contemplar séries temporais que apresentam tendência, o método de suavização exponencial de tendência linear de Holt foi desenvolvido.

Por exemplo, veja a série da População do Brasil:

Para modelar e prever essa série com característica de tendência clara, podemos utilizar o método tendência linear de Holt. Esse método possui uma equação de previsão e duas equações de suavização (uma para o nível e outra para a tendência):

onde:

- \ell_t é o nível estimado da série temporal
- b_t é a tendência estimada da série temporal
- \alpha é o parâmetro de suavização para o nível, restrito a 0\le\alpha\le1
- \beta^* é o parâmetro de suavização para a tendência, restrito a 0\le\beta^*\le1

Agora a previsão não é mais plana, mas com tendência. A previsão h passos a frente é igual ao último nível estimado mais h vezes a última tendência estimada. Dessa forma, a previsão é uma função linear de h.

Os parâmetros \alpha, \beta^*, \ell_0 e b_0 devem ser escolhidos de forma a minimizar a SQR.

Em termos de código, podemos estimar o método de tendência linear de Holt e gerar previsões, usando o exemplo de dados da população do Brasil. Abaixo reportamos (a) o sumário do modelo, (b) as métricas de acurácia de treino/teste e (c) o gráfico de valores observados e estimados/previstos dentro da amostra e fora da amostra.

R

Código
Series: pop 
Model: ETS(A,A,N) 
  Smoothing parameters:
    alpha = 0.9999 
    beta  = 0.9990316 

  Initial states:
    l[0]     b[0]
 160.965 2.581412

  sigma^2:  0.0065

      AIC      AICc       BIC 
-34.11905 -29.50366 -29.39685 
.model .type ME RMSE MAE MPE MAPE MASE RMSSE ACF1
holt Training -0.0456989 0.0718448 0.0507484 -0.0246847 0.0274228 0.0239254 0.0335204 0.1641402
holt Test -0.1830038 0.2763105 0.1967748 -0.0858301 0.0925869 NaN NaN 0.5460862