All Posts By

Equipe

Modelagem e previsão com o {modeltime}

By | Data Science

O pacote {modeltime} é um framework para modelagem e previsão de séries temporais no R, com a possibilidade de integração com o ecossistema do {tidymodels} para uso de técnicas de machine learning. O pacote promete ser uma interface veloz e moderna que possibilita prever séries temporais em grande escala (i.e. 10+ mil séries).

Utilizando uma interface simples e integrada com outros pacotes populares na linguagem, é possível construir uma ampla gama de modelos de previsão univariados e multivariados, tradicionais ou "modernos", dentre eles:

  • ARIMA
  • Suavização exponencial (ETS)
  • Regressão linear (TSLM)
  • Autoregressão de rede neural (NNETAR)
  • Algoritmo Prophet
  • Support Vector Machines (SVM)
  • Random Forest
  • Boosted trees

Neste exercício, daremos uma breve introdução aplicada exemplificando o fluxo de trabalho do {modeltime} para modelagem e previsão, além de fornecer nossa opinião sobre o mesmo. Para se aprofundar nos detalhes de cada tópico confira os cursos de Séries Temporais e Modelos Preditivos da Análise Macro.

Fluxo de trabalho

O fluxo de trabalho do pacote {modeltime} para criar um modelo de previsão de séries temporais pode ser resumido em 5 etapas:

  1. Colete e prepare os dados no ambiente do R;
  2. Separe amostras de treino/teste para avaliar modelos;
  3. Crie e estime múltiplos modelos de previsão;
  4. Avalie os modelos (resíduos, acurácia no teste, etc.);
  5. Reestime os modelos na amostra completa e gere previsões.

Com esse fluxo em mente, vamos agora realizar um exercício prático e didático: construir um modelo de previsão para a taxa de inflação brasileira, medida pelo IPCA (% a.m.) do IBGE. O objetivo é apenas demonstrar as ferramentas ( {modeltime}) de maneira prática no R, não estamos preocupados em criar o melhor modelo possível e nem em avaliar especificações profundamente. Para tal dê uma olhada nos cursos da Análise Macro.

Para reproduzir o exercício você precisará dos seguintes pacotes de R:


Passo 1: dados

Nesse exercício vamos criar modelos de previsão para o IPCA (% a.m.), portanto começamos por coletar e tratar os dados de maneira online diretamente do Sidra/IBGE (veja um tutorial neste link). Nossa amostra parte de 1999 e vai até o último dado disponível.

Abaixo criamos um gráfico de linha simples da série temporal do IPCA (% a.m.), do qual podemos observar uma flutuação em torno de 0,5% e um padrão sazonal, além de outliers (veja mais sobre análise exploratória neste link):

Passo 2: separar amostras

Com o objetivo de avaliar os modelos que criaremos em termos de acurácia da previsão pontual, vamos criar duas amostras da série temporal do IPCA: a de treino é usada para estimar um modelo especificado e gerar previsões com o mesmo e a de teste é usada para comparar as previsões geradas com os dados observados (verdadeiros). Nesse exercício vamos fazer essa separação em 95% para treino e o restante para teste:

Passo 3: modelagem

Como exemplo, vamos criar dois modelos univariados simples: família (auto) ARIMA e um passeio aleatório como benchmark. No {modeltime} a modelagem é feita em 3 etapas:

  1. Especificar o modelo (usando funções como arima_reg() e outras);
  2. Definir o pacote a ser usado (alguns modelos são implementados em mais de um pacote, e você tem flexibilidade em escolher qual usar com a função set_engine());
  3. Estimar o modelo (usando a função genérica fit(y ~ date, data = df), onde date não é um regressor, é apenas para uso interno do {modeltime}).

Note que, por esse fluxo de trabalho, o {modeltime} traz a vantagem de integrar em um único lugar diversos outros pacotes/modelos (consulte a documentação).

Os modelos ficam salvos como objetos do tipo lista no R e ao imprimi-los temos os principais resultados:

Passo 4: avaliar modelos

Uma vez que os modelos tenham sido estimados, vamos então investigar brevemente suas especificações: focaremos apenas em testar a normalidade e autocorrelação dos resíduos dos modelos estimados e em calcular as métricas MAE e RMSE dos pontos de previsão pseudo fora da amostra (comparando com a amostra de teste).

Para tais tarefas de diagnóstico de modelos o {modeltime} disponibiliza algumas funções úteis:

  • modeltime_table() adiciona um ou mais modelos para criar uma "tabela de modelos";
  • modeltime_calibrate() calcula os resíduos dos modelos;
  • modeltime_residuals_test() aplica testes de normalidade/autocorrelação;
  • modeltime_forecast() gera previsões;
  • plot_modeltime_forecast() visualiza as previsões;
  • modeltime_accuracy() calcula métricas de acurácia.

Vamos começar aplicando os testes de normalidade (Shapiro-Wilk) e autocorrelação (Box-Pierce e Ljung-Box) dos resíduos:

O resultado é uma tabela com os p-valores de cada teste, que indicam que os resíduos do modelo auto ARIMA, ao nível de 5% de significância, não são normalmente distribuídos e não apresentam autocorrelação. Para dados econômicos esses resultados são, em grande parte, comuns, de modo que iremos ignorar aqui o problema de normalidade e seguir adiante.

Agora vamos verificar a performance preditiva dos modelos nesse esquema pseudo fora da amostra. Para tal, primeiro juntamos os modelos em uma tabela de modelos e geramos n previsões fora da amostra, onde n é o número de observações da amostra de teste. Abaixo plotamos o gráfico das previsões geradas:

Pela avaliação visual os modelos estão muito aquém do desejado, mas esse exercício é apenas didático e, conforme mencionado, não estamos interessados em criar um "super" modelo que desempenhe melhor que as expectativas do Focus/BCB.

Em seguida, usamos a tabela de modelos para comparar os pontos de previsões gerados com os valores observados da amostra de teste, computado as métricas MAE e RMSE:

Como esperado, o modelo ARIMA apresenta um RMSE menor em relação ao benchmark, para o horizonte e amostra utilizados. Portanto, se fossemos decidir um modelo final entre os dois, a escolha seria pelo ARIMA. Note que em exercícios mais robustos o mais interessante é que você faça essa avaliação usando validação cruzada por horizontes de previsão (1, 2, 3, ..., meses a frente).

Passo 5: previsão

Com os modelos treinados e avaliados, o último passo é reestimar o(s) modelo(s) usando a amostra completa de dados para gerar previsões (efetivamente) fora da amostra. Use a função modeltime_refit() para tal:

E assim terminamos o fluxo de trabalho para modelagem e previsão com o {modeltime}. O que você achou do pacote?

Comentários

Como qualquer pacote/software, o {modeltime} tem suas vantagens e desvantagens, aqui vou pontuar a minha visão.

  • Principais vantagens:
    • Interface simples para iniciantes;
    • Integra com o {tidymodels};
    • Ecossistema ativo de desenvolvimento.
  • Principais desvantagens:
    • Interface fora do comum dos pacotes econométricos (i.e. fit(y ~ date, data = df));
    • Documentação orientada a negócios/sem background estatístico;
    • Tem cerca de 3x mais dependências (pacotes) do que concorrentes como o {fabletools};
    • A comunidade de usuários é pequena (quando comparado pelo nº de perguntas no StackOverflow).

Em suma, se você é um iniciante o pacote {modeltime} deve ser ótimo para dar os primeiros passos no mundo de séries temporais e modelos de previsão, mas se você perguntar a uma pessoa mais experiente se esse é o pacote que ela prefere, provavelmente a resposta será não. Conforme você avança na área haverá a necessidade de ir além e essa lacuna provavelmente será preenchida por outro pacote. Contudo, se sua intenção não é mergulhar profundamente em séries temporais, basta instalar o pacote para começar usá-lo!

Saiba mais

Caso o assunto tenha despertado sua curiosidade, você pode se aprofundar nos tópicos com os cursos de Séries Temporais e Modelos Preditivos da Análise Macro.

Como exemplo, no curso de Modelos Preditivos utilizamos modelos de machine learning para a previsão do IPCA. Os resultados são sumarizados nessa dashboard (clique para acessar), em uma abordagem automatizada:

Para ter acesso aos códigos completos deste exercício e vários outros, faça parte do Clube AM.

 

 

Modelos ARIMA na abordagem bayesiana

By | Data Science

A boa e velha econometria nos proporciona métodos que são ótimos para relacionar variáveis e construir previsões, sendo quase sempre o primeiro ponto de partida para praticantes, além de ser a base de grande parte dos modelos "famosos" da atualidade. Como exemplo, em problemas de previsão de séries temporais a família de modelos ARIMA, popularizada por Box e Jenkins (1970), costuma ser a primeira opção que vem à mente.

Uma das suposições destes modelos é a de que os erros — ou seja, a diferença entre o que é observado e o que é estimado — seguem uma distribuição normal, o que no mundo real nem sempre é factível com os dados que temos em mãos. E então, o que fazer nessa situação? Devemos descartar os modelos ARIMA e usar outra classe de modelos? Ou devemos descartar os dados, pois, claramente, "eles não se encaixam no modelo"?

Bom, nada disso! Em primeiro lugar, eu afirmaria que os modelos ARIMA ainda podem ser úteis. Em segundo lugar, neste exercício apresentarei uma visão diferente no que se refere ao método de estimação do modelo, trazendo uma breve introdução à abordagem bayesiana. Por fim, exemplificarei com um modelo ARIMA simples as diferenças entre previsões geradas pelas duas visões, isto é, a frequentista versus a bayesiana.

O foco aqui é ser objetivo, apresentando brevemente os conceitos básicos, as vantagens e diferenças entre as abordagens, em uma tentativa bem humilde de fechar o gap entre as duas visões em termos introdutórios. Para mais detalhes e aprofundamento nos tópicos confira os cursos de Séries Temporais e Estatística Bayesiana.

ARIMA

Para não complicar, vamos considerar um modelo autoregressivo (AR) simples neste exercício. Como este modelo se parece?

yt = c + ϕ1yt-1 + ϕ2 yt-2 + + ϕpyt-p + εt

onde:

c → uma constante;

ϕ1, ⋯, ϕp → parâmetros desconhecidos do modelo;

εt → termo de erro que segue uma distribuição normal, εt N(μ, σ2).

O modelo é autoregressivo pois, como pode ser observado, se trata de uma regressão da variável contra ela mesma (defasagens). Esse modelo é comumente denominado com o acrônimo AR(p), onde p é a ordem de defasagens da variável de interesse yt e é um caso especial de um modelo ARIMA(p, 0, 0)1.

Ok, mas visualmente, como um processo AR(p) se parece?

Podemos visualizar uma série temporal que segue um processo, por exemplo, de AR(1) com uma simulação simples (estou usando o R para isso), conforme abaixo:

Estimador MQO

Você deve ter notado que valores para a constante e para o primeiro parâmetro do AR(1)e ϕ1 , "caíram do céu". Na vida real, fora da simulação, devemos estimar esses valores, eles são desconhecidos. Portanto, como os parâmetros do modelo são estimados?

Existem algumas maneiras de estimar os parâmetros do modelo, o padrão comum é através do estimador de mínimos quadrados ordinários (MQO), onde o objetivo é encontrar valores ótimos para os parâmetros e ϕp do modelo minimizando a soma dos quadrados dos resíduos, sob diversas premissas. Ao usar essa abordagem, os parâmetros do modelo autoregressivo são fixos: cada observação t da série temporal y é associada com um mesmo valor estimado do parâmetro ϕp.

Isso é factível? E se você acredita que o valor ϕp não deveria ser fixo? Como poderíamos incorporar essa crença ao modelo? É aqui que entra a abordagem bayesiana! Mas antes, vamos dar uma olhada em dados reais para tentar entender a importância e uma motivação adjacente do assunto.

Exemplo: IPCA

Como exemplo, abaixo apresento visualizações gráficas da série do IPCA sazonalmente ajustado, uma medida de inflação divulgada pelo IBGE, expresso em variação % ao mês.

Note que pela distribuição dos dados o IPCA apresenta uma média de aproximadamente 0,5% com uma cauda pesada à direita. Isso é característico do que chamam de outliers ou valores extremos e pode ser um problema em métodos econométricos. Além disso, a série apresenta uma autocorrelação significativa na primeira defasagem, o que pode ser um sinal para modelagem ARIMA, se supormos que tal classe de modelos univariados é suficiente em explicar a inflação.

Dada essa simples inspeção visual dos dados o que frequentistas e bayesianos poderiam tirar de conclusão? Um frequentista diria, dentre outras coisas, que a variância da série é a mesma para qualquer janela amostral, enquanto que um bayesiano diria que a variância pode variar.

Nessa mesma linha, um frequentista poderia estimar um modelo autoregressivo por MQO para explicar a inflação, mas ao fazê-lo estaria encontrando um valor fixo associado a defasagens da inflação, o que é equivalente a dizer que a maldita inércia inflacionária — um fenômeno econômico — não se alterou em todos esses mais de 20 anos de Plano Real. Isso é plausível? Certamente não é uma pergunta trivial de ser respondida, mas exercícios prévios do colega Vitor Wilher sugerem que a inércia inflacionária vem mudando recentemente.

Ou seja, são nesses pontos, para citar apenas alguns, que as abordagens divergem. Em outras palavras, frequentistas e bayesianos fazem diferentes suposições sobre os dados e sobre os parâmetros de um modelo em questão.

Portanto, voltando à questão, como a modelagem bayesiana incorpora sua visão sobre os parâmetros ao modelo?

A abordagem bayesiana

Na abordagem bayesiana, ao invés de tentarmos encontrar um valor ótimo para os parâmetros do modelo, nesse caso um AR(p), começaríamos por assumir um distribuição de probabilidade a priori para os mesmos e, então, usaríamos o teorema de Bayes. Ou seja, em nosso exemplo o que muda é que você assume uma distribuição a priori para os valores desconhecidos de c, ϕ1,,ϕp, σ2, antes mesmo dos dados serem observados.

Mas de onde essa distribuição a priori vem? Bom, há muito o que se discutir sobre esse ponto, mas em resumo:

  • Estudos prévios ou trabalhos publicados;
  • Intuição do analista/pesquisador;
  • Conhecimento da área/expertise;
  • Conveniência;
  • Métodos não paramétricos e outras fontes de dados.

Você pode pensar nessa distribuição a priori como uma crença/conhecimento prévio ou, no caso de você possuir estimativas prévias dos parâmetros do modelo, essas estimativas prévias se tornam a distribuição a priori.

Voltando ao exemplo do IPCA, supondo que queiramos estimar um modelo AR(1), yt = c + ϕ1yt-1 + εt, como definiríamos distribuições a priori para os parâmetros? Vamos começar admitindo que não sabemos muito sobre os parâmetros, apenas sabemos que para um AR(1) ser estacionário o parâmetro ϕ1 precisar ser menor do que 1 em módulo2, então vamos assumir distribuições genéricas:

Como é um primeiro modelo, vamos ser bem vagos sobre as escolhas. Partindo de um entendimento básico sobre o modelo, sabemos que o parâmetro  para caracterizar um processo estacionário e que a variância dos erros deve ser positiva. Dessa forma utilizaremos, respectivamente, a distribuição uniforme e a gamma inversa e, quando não, a normal, assumindo os valores abaixo:

Essas são as nossas priors, como é referido no jargão bayesiano. Visualmente, como essas distribuições se parecem? Vamos plotar um gráfico (novamente, estou usando o R aqui):

A interpretação destas distribuições a priori é de que não estamos informando em nosso modelo AR(1) bayesiano sobre quais poderiam ser os valores dos parâmetros. A estimativa final, pelo teorema de Bayes, dependerá dos dados observados e das priors assumidas. Vamos definir isso brevemente:

O que essa equação nos diz, em termos simples? A priori é a probabilidade de algo acontecer antes de incluirmos a probabilidade dos dados (verossimilhança), e a posteriori é a probabilidade após a incorporação dos dados. Ou seja, o teorema de Bayes nos fornece um método para atualizar nossa crença sobre parâmetros desconhecidos para cada informação nova (observações), condicionando a probabilidade aos dados observados.

Para estimar um modelo AR(p) na abordagem bayesiana será utilizado, geralmente, um método chamado Monte Carlo Markov Chain (MCMC). Apesar do nome apavorante, é um procedimento relativamente simples. O objetivo é "caminhar" aleatoriamente por um espaço de parâmetros para encontrar as estimativas e, assim, desenhar uma estimativa da posteriori, a nossa distribuição de principal interesse.

Comparação

Agora vamos comparar as estimativas de um modelo AR(1) para o IPCA geradas pela visão frequentista vs. bayesiana3. Indo direto ao ponto, abaixo plotamos os resultados:

Aqui eu omito a distribuição a posteriori, que representaria a incerteza da estimativa bayesiana, exibindo apenas a a estimativa média dessa distribuição.

Note que as estimativas pontuais dentro da amostra são praticamente idênticas (eu separei em dois gráficos para melhor visualizar cada linha), refletindo semelhanças nos parâmetros estimados da abordagem bayesiana e da frequentista. O valor estimado para a constante é aproximadamente 0,20 e 0,19, respectivamente, enquanto que o é 0,6 e 0,6. Por quê? A razão é decorrente do fato que a estimativa pontual do método frequentista, por MQO, é, em verdade, a mesma coisa que maximizar a probabilidade a posteriori de uma regressão linear bayesiana, que no caso representa a moda da distribuição.

Ok, mas comparamos somente estimativas pontuais um passo a frente dentro da amostra. O que acontece se compararmos ambas as abordagens em termos de previsão fora da amostra? No gráfico acima as últimas 12 observações do IPCA foram omitidas dos modelos, justamente para ter um período pseudo fora da amostra que nos permita gerar previsões e compará-las com os dados observados, podendo dessa forma avaliar a performance preditiva de cada modelo para dados que os mesmos ainda não conhecem.

Gerando previsões pseudo fora da amostra 12 períodos (meses) a frente, temos os seguintes resultados:

Comentários

Apesar de ambas as previsões serem visivelmente ruins — acredito eu que não devido ao método de estimação em si, mas sim por conta da especificação/modelo simples para os dados e pela janela amostral (choques) "desfavorável" —, podemos notar uma grande diferença nas previsões pontuais e nos intervalos. A abordagem frequentista simplesmente previu o retorno a média da série (o que nesse caso é menos pior), enquanto que a abordagem bayesiana previu uma deflação (o que não é a realidade brasileira no momento).

Pela simplicidade da especificação do modelo AR em questão não podemos esperar bons resultados, por qualquer método de estimação considerado, e uma comparação mais exigente e justa implementaria a técnica de validação cruzada, o que eu não fiz neste exercício. Além disso, questões adjacentes como a inspeção dos resíduos e dos parâmetros são importantes para diagnosticar o modelo, as quais também deixamos de lado aqui.

Em suma, estimamos um modelo AR(1) para o IPCA por dois métodos diferentes que fundamentalmente fazem a mesma coisa: eles usam a defasagem da inflação para explicá-la. A primeira abordagem foi um modelo autoregressivo clássico, usando o método dos mínimos quadrados ordinários (MQO). O segundo foi um mesmo modelo autoregressivo, mas com estimação bayesiana, explorando a ideia de usar distribuições a priori para obter estimativas pontuais de distribuições a posteriori. Apesar disso, os resultados não foram satisfatórios. Ou seja, há trabalho ainda a se fazer, além de outros modelos a se testar.

Se o assunto te interessou e se você quiser saber mais sobre os temas abordados, dê uma olhada nos cursos de Séries Temporais e Estatística Bayesiana. Para ter acesso aos códigos deste exercício faça parte do Clube AM.

 


1,2 Veja mais em Hyndman e Athanasopoulos (2021).

3 Aqui eu relaxei a restrição de distribuição uniforme para o parâmetro  por recomendação dos desenvolvedores do pacote utilizado e por falha de inicialização da estimação. A priori desse parâmetro passou então para .

 

Referências

Box, G. E. P., & Jenkins, G. M. (1970). Time series analysis: Forecasting and control. Holden-Day.

Durbin, J., & Koopman, S. J. (2012). Time series analysis by state space methods (Vol. 38). OUP Oxford.

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

O ovo ou a galinha? Teste de causalidade de Granger na granja

By | Data Science

O ovo ou a galinha é uma referência a um dilema clássico de causalidade que comumente surge da pergunta "O que veio primeiro, o ovo ou a galinha?" O dilema parte da observação de que a galinha nasce do ovo e o ovo é colocado pela galinha, de modo que seria difícil determinar a sequência dos acontecimentos. A resposta é apropriadamente endereçada pela biologia evolutiva, mas aqui faremos uso desse dilema mundano para trazer um pouco de luz com uma aplicação do teste de causalidade de Granger.

Causalidade no sentido de Granger

O teste de causalidade de Granger serve para verificar se uma série temporal é útil em termos de previsão de outra série temporal, ou seja, o termo "causalidade" deve ser pensado como "precedência temporal". Portanto, ara entender e aplicar o teste vale começar distinguindo:

  • O que o teste não é: o teste de causalidade de Granger não testa a causalidade no sentido estrito entre duas variáveis, ou seja, não estamos investigando inferência causal - tópico muito explorado em áreas da estatística e econometria - entre X e Y.
  • O que o teste é: no teste de causalidade de Granger a causalidade tem o sentido de precedência temporal, ou seja, com o teste podemos avaliar se uma variável X precede temporalmente uma variável  Y, quando valores defasados de X, além de valores defasados de Y, ajudam a prever o valor presente de Y. E essa informação de precedência temporal não necessariamente significa que uma variável causa a outra.

Por isso que é usado, quando identificamos precedência temporal com o teste, uma terminologia diferente para evitar confusão, ou seja, falamos que a "série X causa no sentido de Granger a série Y" ou "X Granger-causa Y".

Intuitivamente, com a aplicação do teste podemos dizer que uma série temporal X Granger-causa outra série temporal Y se as previsões dos valores de Y com base em seus próprios valores defasados e nos valores defasados de X forem "melhores" do que as previsões de Y baseadas apenas nos próprios valores defasados de Y. Formalmente, o teste compara dois modelos de regressão linear:

  • Modelo restritoyt = α0 + α1yt−1 + ⋯ + αmyt−m + errot
  • Modelo irrestritoyt = α0 + α1yt−1 + ⋯ + αmyt−m + β1xt-1 + ⋯ + βmxt−m + errot

O número de defasagens m deve ser especificado pelo usuário. Dessa forma, testa-se as hipóteses:

  • Hipótese nula: a série temporal X não Granger-causa a série Y
  • Hipótese alternativa: a série temporal X Granger-causa a série Y

Um teste F é então aplicado para determinar se os coeficientes dos valores passados de xt são conjuntamente iguais a zero (H0: β1 = ⋯ = βm = 0), produzindo um p-valor. Dessa forma, se o p-valor for menor que um determinado nível de significância (por exemplo, 5%), podemos rejeitar a hipótese nula e dizer que a série temporal X Granger-causa a série Y. Isso significa que os valores de previstos para Y baseados em suas próprias defasagens e em defasagens de X são melhores do que valores previstos para Y baseados somente em defasagens de Y. Usualmente aplica-se o teste em ambas as direções, ou seja, de X Y e de Y X.

Na prática, você deve testar se as séries de interesse são estacionárias (testes como ADF, PP, KPSS, etc.), diferenciar as séries se necessário e então aplicar o teste de causalidade de Granger nas séries estacionárias (diferenciadas ou não).

Supondo que o dilema do ovo e da galinha possa ser representado através dos dados disponibilizados por Zeileis e Hothorn (2002), isto é, as séries temporais anuais de população de galinhas em 1º de dezembro e produção de milhões de dúzias de ovos nos EUA expostas no gráfico acima, partimos agora para a aplicação prática do que foi exposto acima.

Este exercício tem inspiração nos trabalhos prévios de Thurman e Fisher (1988) e Shikida et al. (2011). Códigos para replicação estão disponíveis para membros do Clube AM.

Testes de estacionariedade

Em primeiro lugar, aplicamos os testes de estacionariedade ADF, KPSS e PP em diversas especificações para as séries de ovos e galinhas. Abaixo apresentamos os resultados resumidos, mostrando o número de diferenças para a série ser estacionária, ao nível de significância de 5%:

Como resultado, todos os testes concordam que as séries são não estacionárias. Dessa forma, tiramos a primeira diferença das mesmas antes de prosseguir.

Teste de Causalidade de Granger

O próximo passo é aplicar o teste de causalidade de Granger sobre as séries de ovos e galinhas "estacionárias". Como dito, um número de defasagens deve ser especificado e há várias formas de realizar isso (como o uso de critérios de informação), mas aqui simplesmente testamos de 1 a 5 defasagens e encontramos resultados similares. Abaixo apresentamos os resultados do teste de causalidade de Granger em ambas as direções, ovo → galinha e galinha → ovo, usando 4 galinhas/ovos "defasadas":

Analisando os resultados, na direção Ovo → Galinha rejeitamos a hipótese nula ao nível de 5%, ou seja, podemos dizer que há precedência temporal ou, mais formalmente, a série temporal Ovo Granger-causa a série temporal Galinha. Na direção oposta falha-se em rejeita a hipótese nula (portanto Galinha não Granger-causa Ovo). Informalmente, o que o teste está dizendo é que ovos precedem galinhas, o que é coerente com a resposta da biologia evolutiva.

Saiba mais

Espero que esse exercício tenha despertado o seu interesse sobre esses assuntos e outras possíveis aplicações. Saiba mais e se aprofunde nos tópicos através do curso de séries temporais. Tenha acesso aos códigos de replicação fazendo parte do Clube AM.

Referências

Shikida, C., de Araujo Junior, A. F., & de Figueiredo, E. A. (2011). Ovos e galinhas: revisitando um dilema secular a partir de dados brasileiros. Revista Economia & Tecnologia, 7(3).

Thurman, W. N., & Fisher, M. E. (1988). Chickens, eggs, and causality, or which came first. American journal of agricultural economics, 70(2), 237-238.

Zeileis, A., & Hothorn, T. (2002). Diagnostic Checking in Regression Relationships. R News 2: 7–10.

Text mining dos comunicados do FOMC: prevendo mudanças na política

By | Data Science

Neste exercício utilizaremos os statements do FOMC/FED para construir um índice de sentimentos, que busca quantificar sentimentos (i.e. positivo, negativo) através de informações textuais extraídas por técnicas de text mining. Em seguida, comparamos o índice com o principal instrumento de política monetária, a taxa de juros, e avaliamos sua utilidade em prever mudanças de política através do teste de causalidade de Granger.

Text mining

Se textos pudessem falar, o que eles diriam? Essa é a ideia central por trás das técnicas de text mining existentes, que buscam extrair insights de dados textuais (i.e. notícias, atas, comunicados, livros, etc.). Quando lemos um texto, usamos naturalmente nossa compreensão individual sobre o sentido emocional das palavras para inferir o sentimento/emoção de um trecho do texto (risco = negativo, ganho = positivo). Dessa forma, as técnicas de text mining se propõem a realizar essa mesma "inferência" de maneira quantitativa. Em outras palavras, nós escrevemos um código que "lê" um texto e informa em números, com base em classificações prévias ou por modelos, o sentimento do mesmo.

A técnica de text mining mais simples é a que contabiliza o número de palavras positivas/negativas em um dado texto e, a partir disso, calcula um índice de sentimentos como:

Sentimento = nº positivas - nº negativas

Valores positivos indicam sentimos positivos, valores negativos indicam sentimentos negativos e valor igual a zero indica neutralidade. Essa não é a única técnica de analisar sentimentos de um texto, mas é comumente a mais utilizada. Mas como definir se uma palavra de um texto é positiva ou negativa?

A análise de sentimento é uma grande área de pesquisa - muitas vezes vista como uma subárea do Processamento de Linguagem Natural (NLP, no inglês) - que, ao longo dos anos, vem possibilitando a pesquisadores e profissionais de mercado o uso de dicionários de sentimento, também chamados de "léxicos", que classificam um grande conjunto de palavras comumente usadas em documentos em positivas/negativas.

Exemplos de dicionários/léxicos para análise de sentimentos:

  • Loughran-McDonald sentiment lexicon (muito usado em textos de finanças);
  • Bing sentiment lexicon (de uso geral);
  • AFINN-111 dataset (mede o sentimento em uma escala de -5 a 5)

Veja as referências para mais detalhes.

Mas na prática, como esses dicionários se parecem? Abaixo apresentamos 12 palavras aleatórias (de um total de 4.150) do dicionário Loughran-McDonald e a classificação de sentimento correspondente:

Observe que o dicionário apresenta 7 possíveis classificações de sentimentos para as palavras: "negative", "positive", "uncertainty", "litigious", "constraining" e "superfluous". Entretanto, na prática o mais comum e simples é analisar o sentimento de um texto no "modo binário", ou seja, usando apenas as classificações de positivo/negativo. Portanto, como podemos utilizar este dicionário de maneira prática?

Em resumo, uma análise de sentimentos pode ser desenvolvida em 4 etapas:

  • Dados textuais: definir quais dados textuais serão alvo da análise, assim como identificar sua localização (online);
  • Pré-processamento: são rotinas de coleta e tratamento dos dados textuais, o que envolve a aplicação de técnicas de web scraping (veja um tutorial aqui), de tokenização (veja um tutorial aqui) e de manipulação de strings em geral;
  • Classificação de Sentimentos: cruza os dados textuais tratados, já representados na unidade (token) de palavras, com um dicionário/léxico de sentimentos e contabiliza o nº palavras positivas/negativas no texto;
  • Índice de Sentimentos: calcula o índice conforme a expressão matemática apresentada acima.

Os procedimentos expostos não exigem o uso de nenhum método de estimação estatística, apesar de haverem outras técnicas de text mining para tal, portanto são acessíveis a maioria das pessoas. A parte mais difícil para iniciantes são as etapas de coleta de dados (web scraping), principalmente se o conjunto de textos alvo da análise é grande em volume e/ou quantidade. Nestes casos, procedimentos manuais de coleta de dados são inviáveis e você precisa sair da zona de conforto da sua área de pesquisa/trabalho e entender alguns jargões das linguagens de desenvolvimento web. A boa notícia é que usando o R não precisamos necessariamente entender sobre essas outras linguagens, dado que existem pacotes/funções que fazem o trabalho por nós, em uma sintaxe quase que natural de se ler.

A seguir apresentamos algumas informações úteis sobre o procedimento de análise de sentimentos aplicada aos comunicados do FOMC/FED. Todo o código necessário para replicação está disponibilizado ao final deste material.

Web scraping

Em geral, as informações textuais estão disponíveis digitalmente, hospedadas em algum site na internet. Como exemplo deste exercício, utilizamos o site do FOMC/FED, que disponibiliza, dentre outros, os documentos referentes aos statements desde 1936. Estes documentos são divulgados logo após cada reunião da autoridade monetária e servem para comunicar sua decisão referente a taxa de juros da economia (FED Funds Target Rate).

Como exemplo, na imagem a seguir trazemos o primeiro statement que iremos utilizar no exercício:

No total, utilizamos uma amostra de 205 statements no período 1998 até 2022. O procedimento de web scraping destes documentos no site do FED pode ser desenvolvido de maneira automatizada usando o R, conforme o código ao final (para mais informações veja este tutorial).

Índice de Sentimentos

Na etapa de pré-processamento removemos as stop words comuns da língua inglesa ("the", "of", "in", etc.), pontuações e números. A tokenização é feita a nível de palavra por cada statement e, desse resultado, cruzamos os dados com a tabela do dicionário de Loughran-McDonald para contabilizar as palavras positivas/negativas. Por fim, o índice é calculado, conforme apresentado acima, e visualizações de dados como essa abaixo podem ser geradas:

No gráfico acima comparamos os movimentos da média móvel de 8 períodos do índice de sentimentos calculado, por ser uma série menos ruidosa, com a taxa de juros da economia norte-americana, ou seja, com os ciclos de expansão ou contração monetária. Podemos observar que o índice de sentimentos parece, em certa medida, "antecipar" os movimentos de política monetária. O período mais notório é o da crise financeira de 2008 (Grande Recessão), no qual o FED fez uso do instrumento denominado quantitative easing (QE) e reduziu a taxa de juros para o intervalo mínimo de 0% (Zero Lower Bound ou ZLB), enquanto que os sentimentos captados nos statements anteriores ao "estouro" da crise eram continuamente decrescentes, em sentido negativo.

Outra característica interessante que o índice de sentimentos traz é seu estado conforme os mandatos do FED. Nota-se que no último mandato (Yellen) e no atual (Powell) o índice não esteve uma única vez negativo, para qualquer dos statements analisados no período. Isso não significa que o sentimento não tenha variado no período. Por exemplo, observe que no mandato da Yellen o índice começa próximo ao pico do mandato anterior, atinge o pico da série histórica e cai até abaixo do seu início.

Note ainda que mesmo durante períodos de política de ZLB o índice capta a variação dos sentimentos expressos nos comunicados. Como exemplo recente, com a pressão inflacionária e o aumento da taxa de juros - e consequente saída do ZLB - os sentimentos estão se aproximando novamente da região negativa.

A questão que fica é: este humilde índice de sentimentos é capaz de antecipar as mudanças de política monetária?

Causalidade de Granger

De forma a testar estatisticamente se a interpretação gráfica que fiz acima faz algum sentido, agora eu aplico um teste de causalidade de Granger. O teste serve para verificar se uma série temporal é útil em termos de previsão de outra série temporal, ou seja, o termo "causalidade" deve ser pensado como "precedência temporal".

Intuitivamente, com a aplicação do teste podemos dizer que uma série temporal X Granger-causa outra série temporal Y se as previsões dos valores de Y com base em seus próprios valores defasados e nos valores defasados de X forem "melhores" do que as previsões de Y baseadas apenas nos próprios valores defasados de Y. Formalmente, o teste compara dois modelos de regressão linear:

  • Modelo restritoyt = α0 + α1yt−1 + ⋯ + αmyt−m + errot
  • Modelo irrestritoyt = α0 + α1yt−1 + ⋯ + αmyt−m + β1xt-1 + ⋯ + βmxt−m + errot

O número de defasagens m deve ser especificado pelo usuário. Dessa forma, testamos as hipóteses:

  • Hipótese nula: a série temporal X não Granger-causa a série Y
  • Hipótese alternativa: a série temporal X Granger-causa a série Y

Um teste F é então aplicado para determinar se os coeficientes dos valores passados de xt são conjuntamente iguais a zero (H0: β1 = ⋯ = βm = 0), produzindo um p-valor. Dessa forma, se o p-valor for menor que um determinado nível de significância (por exemplo, α = 0,05), podemos rejeitar a hipótese nula e dizer que a série temporal X Granger-causa a série Y. Isso significa que os valores de previstos para Y baseados em suas próprias defasagens e em defasagens de X são melhores do que valores previstos para Y baseados somente em defasagens de Y. Usualmente aplica-se o teste em ambas as direções, ou seja, de X Y e de Y X.

Aplicando o teste de causalidade de Granger sobre as séries do Índice de Sentimentos (IS, em nível, não a média móvel) e do FED Funds Rate (FFR, na primeira diferença), em ambas as direções, temos como resultado:

Analisando os resultados, na direção IS → FFR rejeitamos a hipótese nula ao nível de 5%, ou seja, podemos dizer que há precedência temporal ou, mais formalmente, a série temporal IS Granger-causa a série temporal FFR. Na direção oposta falha-se em rejeita a hipótese nula. Acredito que minha análise visual de antes está correta.

Código de replicação (R)

O código completo para replicação do exercício está disponível no Clube AM. Note que o procedimento de web scraping no site do FED está automatizado, não havendo garantias de funcionamento se houverem mudanças no mesmo. Além disso, você pode obter resultados diferentes dos aqui expostos conforme a amostra de textos extraídos do site for crescendo ao longo do tempo.

Para entender mais sobre os procedimentos deste exercício, você também pode tirar dúvidas com a nossa equipe dentro do Clube AM.

Referências

Granger, C. W. (1969). Investigating causal relations by econometric models and cross-spectral methods. Econometrica: journal of the Econometric Society, 424-438.

Hu, M., & Liu, B. (2004). Mining and summarizing customer reviews. In Proceedings of the tenth ACM SIGKDD international conference on Knowledge discovery and data mining (pp. 168-177).

Loughran, T., & McDonald, B. (2011). When is a liability not a liability? Textual analysis, dictionaries, and 10‐Ks. The Journal of finance, 66(1), 35-65.

Nielsen, F. Å. (2011). A new ANEW: Evaluation of a word list for sentiment analysis in microblogs. arXiv preprint arXiv:1103.2903.

Silge, J., & Robinson, D. (2017). Text mining with R: A tidy approach. O'Reilly Media, Inc.

Shapiro, A. H., & Wilson, D. (2021). Taking the Fed at its word: A new approach to estimating central bank objectives using text analysis. Federal Reserve Bank of San Francisco.

Wu, J. C., & Xia, F. D. (2016). Measuring the macroeconomic impact of monetary policy at the zero lower bound. Journal of Money, Credit and Banking, 48(2-3), 253-291.

 

Previsão da inflação (EUA) com fatores textuais do FOMC

By | Data Science

Reflexo da era da informação, atualmente não se faz mais política monetária sem uma boa dose de comunicados, atas, entrevistas, conferências, etc. Os chamados central bankers atuam, sobretudo, como comunicadores e qualquer pequena nuance em sua comunicação (futuros passos da política monetária) pode ser um sinal para alvoroço nos "mercados".

Nesse sentido, uma área da literatura econômica que vem prosperando busca investigar o chamado canal informacional (de transmissão) da política monetária, propiciando uma intersecção entre métodos econométricos e de machine learning. Como exemplo, Lucca e Trebbi (2009) exploram a relação entre mudanças nos comunicados (statements) do Federal Open Market Committee (FOMC) com variáveis macroeconômicas, como taxas de juros, mostrando que há poder preditivo no conteúdo informacional dos comunicados. De forma similar, Ferreira (2022) expande um modelo VAR usando fatores textuais extraídos dos comunicados do FOMC, mostrando que a técnica (denominada VAR-teXt) é útil para finalidade de previsão.

Mais informalmente, neste espaço da Análise Macro já exploramos a extração de sentimentos e de tópicos latentes dos comunicados do Banco Central do Brasil (BCB). De forma a avançar mais nessa área, no exercício de hoje exploramos, de forma similar a Ferreira (2022), a utilidade de tópicos latentes extraídos dos comunicados do FOMC, por um modelo LDA, na previsão da inflação norte-americana, medida pelo CPI. O objetivo é comparar um modelo econométrico simples, tal como um AR-GAP de Faust e Wright (2013), em especificações com e sem os fatores textuais.

Uma visão geral

O exercício de previsão em questão consiste em extrair os dados de interesse das devidas fontes (FRED-MD e FOMC/FED), realizar o pré processamento e extração de fatores textuais e, por fim, treinar duas especificações de modelos simples para o CPI: AR e AR-teXt (i.e., um modelo autoregressivo com fatores textuais como variáveis exógenas). O diagrama abaixo ilustra os principais procedimentos:

Recomenda-se a leitura prévia dos textos a seguir, assim como referências correspondentes, para uma boa compreensão do exercício proposto:

Dados e especificação

Os modelos são estimados em frequência trimestral, onde a variável de interesse, o CPI, é medido como a variação percentual em relação ao trimestre imediatamente anterior.

As fontes de dados são:

  • CPI (variável endógena) é proveniente do banco de dados FRED-MD (código CPIAUCSL), veja McCracken e NG (2016);
  • Tópicos textuais (variáveis exógenas) são extraídos através do modelo LDA, tendo como origem os statements do FOMC/FED.

As especificações dos modelos são:

Partindo da construção de uma medida de tendência, τt, do CPI, πt, definimos o "gap" da inflação como gt = πt − τt e consideramos essa medida nos modelos abaixo, tal como em Faust e Wright (2013).

  • AR(p): gt = α1 gt-1 + … + αpgt-p + ϵt
  • AR-teXt(p,s): gt = α1 gt-1 + … + αpgt-p + βsxt-s + ϵt

onde αi e βi são coeficientes dos modelos, xt são as variáveis exógenas e ϵt é o erro do modelo.

Em nosso exercício geramos previsão 10 trimestres à frente (pseudo fora da amostra) e, então, adicionamos de volta a tendência, τt, para obter a previsão "final". A amostra utilizada é de 1998 até a observação mais recente do ano atual, 2022.

Visualização de dados

Abaixo plotamos um gráfico de linha da série de interesse, o CPI dos Estados Unidos em variação percentual trimestral:

E na imagem a seguir trazemos a estrutura textual de apenas um dos statements do FOMC/FED que foram extraídos (web scraping) de forma online para construção dos fatores textuais.

Vale pontuar que a estrutura textual dos comunicados pode variar consideravelmente no tempo.

Resultados

Os procedimentos brevemente descritos acima foram implementados através da linguagem R usando, para estimação, o pacote {fable} (veja um tutorial aqui)). Os modelos foram treinados usando validação cruzada, considerando uma janela amostral crescente, partindo de 60 observações iniciais e adicionando 1 observação a cada iteração. O cálculo de métricas de acurácia foi realizado por horizonte preditivo (1, 2, ..., 10 trimestres).

A seguir resumimos os resultados de acurácia em um gráfico que mostra o RMSE por horizonte de previsão dos dois modelos considerados:

Comentários

  • Modelo com fatores textuais parece performar melhor no curto prazo em relação ao benchmark (AR);
  • Os resultados apresentados estão em linha com o encontrado por Ferreira et al. (2020), que considera uma abordagem vetorial com diferente método de estimação (e aqui não aplicamos testes estatísticos para comparar previsões);
  • Pontua-se que a performance do modelo proposto, AR-teXt, pode ser consideravelmente sensível a escolha do número de tópicos definidos, assim como ao tratamento dos dados textuais;
  • O modelo de tópicos LDA é intensivo computacionalmente.

Códigos de R para replicação estão disponíveis para membros do Clube AM da Análise Macro.

Referências

Faust, J., & Wright, J. H. (2013). Forecasting inflation. In Handbook of economic forecasting (Vol. 2, pp. 2-56). Elsevier.

Ferreira, L. N. (2022). Forecasting with VAR-teXt and DFM-teXt Models: exploring the predictive power of central bank communication. BCB Working Paper Serie No. 559.

Lucca, D. O., & Trebbi, F. (2009). Measuring central bank communication: an automated approach with application to FOMC statements. National Bureau of Economic Research (No. w15367).

McCracken, M. W., & Ng, S. (2016). FRED-MD: A monthly database for macroeconomic research. Journal of Business & Economic Statistics, 34(4), 574-589.

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

Assinar Gratuitamente