Transformers para Análise de Séries Temporais

Séries Temporais e a Evolução da Modelagem de Sequências

Analisar uma série temporal é, em essência, uma forma de “modelagem de sequências”. O objetivo é entender os padrões em dados ordenados no tempo para prever o que virá a seguir, e os diferentes tipos de modelos criados ao longo da história da análise de séries temporais até o dias atuais é extensivo.

Entre alguns deles, temos:

  1. Modelos Clássicos (Ex: ARIMA): Eficazes para séries com padrões lineares e estacionários, mas limitados ao capturar relações mais complexas e não-lineares.
  2. Redes Neurais Recorrentes (Ex: RNNs): Introduziram o conceito de “memória”, processando sequências passo a passo e mantendo um estado interno. No entanto, sofriam para reter informações de longo prazo, um problema conhecido como gradiente descendente.
  3. LSTMs e GRUs: Variações das RNNs com “portões” (gates) que controlam o fluxo de informação, melhorando a capacidade de aprender dependências de longo prazo. Apesar do grande avanço, elas ainda processam os dados de forma sequencial, o que pode ser um gargalo computacional.

É neste ponto que os Transformers surgem, quebrando o paradigma do processamento sequencial e introduzindo uma forma mais poderosa de “lembrar” o passado: a atenção.

* Caso deseje aprender mais sobre o que é Transformers, veja esse post.

Objetivo

Para obter o tutorial deste exercício faça parte do Clube AM e receba toda semana os códigos em R/Python, vídeos, tutoriais e suporte completo para dúvidas.

Mostraremos como aplicar esses conceitos em séries temporais usando a biblioteca darts. O foco será em entender a lógica por trás do uso prático dessa tecnologia.

Transformers em Séries Temporais: Como é Possível?

A transição dos Transformers do texto para as séries temporais é conceitualmente direta. Em NLP, um Transformer trata cada palavra (ou “token”) em uma frase como uma unidade. Em uma série temporal, cada observação (ex: o valor diário do câmbio) é tratada como um “token”.

A sequência de valores ao longo do tempo se torna uma “frase”, e o Transformer aprende a gramática e o contexto dessa “frase” temporal.

# Exemplo simbólico: sequência temporal como "frases"
# Cada valor é um "token" que o Transformer analisa em relação aos outros.
serie_juros = [12.50, 12.75, 13.25, 13.75, 13.75, 13.25, 12.75]

# O Transformer pode aprender que a primeira ocorrência de 12.75,
# mesmo distante, é um forte indicador para a ocorrência futura de 13.25,
# ignorando os valores intermediários se não forem relevantes.

Adaptar uma arquitetura de texto para números ordenados no tempo parece um salto, mas a analogia é direta: uma série temporal é tratada como uma frase, onde cada observação é uma palavra.

No entanto, essa adaptação traz desafios, vantagens e desvantagens.

Os Desafios e as Soluções

  • Problema: Falta de Noção de Ordem. Como mencionado, o self-attention é invariante à permutação.
    • Solução: O Positional Encoding é crucial. Ele injeta a informação temporal diretamente nos dados de entrada, permitindo que o modelo aprenda a importância da ordem.
  • Problema: Complexidade Quadrática. O self-attention compara cada ponto com todos os outros. Para uma série com N pontos, isso exige  cálculos. Para séries temporais muito longas (milhares ou milhões de pontos), isso se torna computacionalmente inviável.
    • Solução: Pesquisas recentes criaram variações mais eficientes, como o Informer e o LogSparse Transformer, que usam mecanismos de atenção “esparsos”, focando apenas nos pontos mais relevantes e reduzindo drasticamente a complexidade.
  • Problema: Dados Contínuos vs. Discretos. Texto é formado por tokens discretos (palavras). Séries temporais são contínuas.
    • Solução: Tratamos cada ponto de observação como um token discreto e o transformamos em um embedding, permitindo que o modelo opere sobre eles da mesma forma que faria com palavras.

Vantagens

  • Captura de Dependências de Longo Prazo: Esta é a maior vantagem sobre LSTMs. Um Transformer pode, teoricamente, conectar um evento de hoje (ex: uma queda na bolsa) a uma crise financeira ocorrida há vários anos, simplesmente porque o mecanismo de atenção pode criar uma ligação direta entre esses dois pontos no tempo, sem que a informação se degrade ao longo do caminho.
  • Paralelização: Ao contrário das RNNs, que precisam processar os dados sequencialmente, o Transformer processa a série inteira de uma vez. Isso o torna muito mais rápido para treinar em hardware moderno (GPUs/TPUs).
  • Interpretabilidade: Os mapas de atenção podem ser visualizados, permitindo entender em quais pontos do passado o modelo está “prestando mais atenção” para fazer uma previsão, o que ajuda a abrir a “caixa-preta”.

Desvantagens

  • Exigência de Dados: Transformers são modelos grandes com milhões de parâmetros. Eles precisam de grandes volumes de dados para serem treinados de forma eficaz e evitar o superajuste (overfitting).
  • Complexidade (fora da caixa): Como mencionado, a complexidade quadrática torna o Transformer “vanilla” inadequado para séries temporais muito longas. É necessário recorrer a variantes mais complexas e recentes.
  • Menos “Viés Indutivo” para o Tempo: RNNs são construídas com a premissa de sequencialidade. Transformers não têm essa premissa e dependem inteiramente do Positional Encoding para aprender a ordem. Em conjuntos de dados menores, essa falta de um viés estrutural pode levar a um desempenho inferior.

Darts

Darts é uma biblioteca Python de código aberto projetada para tornar a previsão e análise de séries temporais mais acessível e eficiente. Desenvolvida pela Unit8, ela oferece uma API consistente e simples, semelhante à do scikit-learn, que permite aos usuários aplicar uma vasta gama de modelos de previsão, desde os clássicos como ARIMA e Suavização Exponencial até modelos avançados de aprendizado profundo como LSTMs, N-BEATS e Transformers.

Principais Características:

  • API Unificada: A principal vantagem do Darts é sua interface fit() e predict() padronizada para todos os modelos, o que simplifica a experimentação e a comparação entre diferentes abordagens.
  • Suporte Amplo: Lida tanto com séries temporais univariadas quanto multivariadas e oferece suporte a previsões probabilísticas para quantificar a incerteza.
  • Backtesting e Avaliação: Inclui ferramentas robustas para backtesting de modelos, permitindo simular previsões históricas em janelas de tempo móveis e avaliar a performance com diversas métricas.
  • Integração: É compatível com estruturas de dados populares como Pandas DataFrames, NumPy arrays e PyTorch Tensors, facilitando a manipulação e o pré-processamento dos dados.

1. Instalação e Carregamento

Primeiro, vamos instalar a biblioteca. Você pode fazer isso com um simples comando pip. Depois de instalar, vamos importá-la para o nosso código.

CÓDIGO DISPONÍVEL PARA MEMBROS DO CLUBE AM

2. Criando Dados para Séries Temporais

A Darts trabalha com um objeto especial chamado TimeSeries. Ele é otimizado para manipulação de dados temporais. Vamos criar uma série temporal simples do zero para ver como funciona.

CÓDIGO DISPONÍVEL PARA MEMBROS DO CLUBE AM

3. Exemplo Mínimo de Previsão

Agora que temos uma série temporal, vamos fazer uma previsão. Usaremos um modelo simples e clássico chamado ExponentialSmoothing (Suavização Exponencial).

O processo é sempre o mesmo, não importa o modelo: 1. Dividir os dados em treino e teste. 2. Criar uma instância do modelo. 3. Treinar o modelo com os dados de treino (fit()). 4. Fazer a previsão (predict()).

CÓDIGO DISPONÍVEL PARA MEMBROS DO CLUBE AM

4. Previsão com Transformer

Vamos agora realizar a previsão da mesma série através do módulo Transformer.

Modelos de redes neurais, como o Transformer, funcionam muito melhor quando os dados estão em uma escala semelhante, geralmente entre 0 e 1. Isso ajuda o modelo a aprender mais rápido e de forma mais estável. Vamos começar normalizando nossos dados de treino e validação.

CÓDIGO DISPONÍVEL PARA MEMBROS DO CLUBE AM

Configurando o Modelo Transformer

Vamos treinar uma arquitetura Transformer. Embora ela tenha muitos parâmetros, vamos ajustar alguns dos mais importantes para séries temporais com apenas uma variável:

  • d_model: A dimensionalidade interna do modelo. O padrão é 512, um valor muito alto para uma série simples. Reduzimos para um valor menor, como 16, para evitar que o modelo se torne complexo demais.
  • nhead: O número de “cabeças” no mecanismo de atenção múltipla. Aumentar este número permite que o modelo foque em diferentes padrões nos dados ao mesmo tempo.

O objetivo é realizar uma previsão de um passo à frente no tempo.

CÓDIGO DISPONÍVEL PARA MEMBROS DO CLUBE AM

Avaliando o Modelo na Validação

Agora, vamos analisar as previsões no conjunto de validação. Para facilitar a visualização, vamos criar uma função que plota os dados reais, a previsão e o erro MAPE (Erro Percentual Absoluto Médio).

CÓDIGO DISPONÍVEL PARA MEMBROS DO CLUBE AM

Primeiro, vamos usar o modelo “atual”, ou seja, o modelo ao final do procedimento de treinamento:

CÓDIGO DISPONÍVEL PARA MEMBROS DO CLUBE AM

No entanto, é uma prática comum usar o modelo que teve o melhor desempenho no conjunto de validação durante o treinamento, e não necessariamente o último. A Darts salva este “melhor modelo” automaticamente para nós.

CÓDIGO DISPONÍVEL PARA MEMBROS DO CLUBE AM

Teste Robusto com Backtesting

Uma forma ainda mais robusta de avaliar um modelo é através do backtesting. A ideia é simular o uso do modelo no passado. Ele faz uma previsão para alguns passos, avança no tempo, faz outra previsão, e assim por diante, em todo o conjunto de dados.

Vamos fazer um backtest do nosso modelo para avaliar seu desempenho com um horizonte de previsão de 6 meses.

CÓDIGO DISPONÍVEL PARA MEMBROS DO CLUBE AM

Finalmente, calculamos o erro (MAPE) do backtest. Note que precisamos reverter a normalização (inverse_transform) para que o erro seja calculado na escala original dos dados, tornando-o interpretável.

CÓDIGO DISPONÍVEL PARA MEMBROS DO CLUBE AM
MAPE: 11.02%

Conclusão

Os Transformers representam uma mudança de paradigma na análise de séries temporais. Sua capacidade de capturar dependências complexas de longo prazo e a flexibilidade de sua arquitetura os tornam uma ferramenta indispensável para lidar com a complexidade dos dados do mundo real. Com o surgimento de bibliotecas acessíveis, a aplicação desses modelos poderosos está cada vez mais ao alcance de cientistas de dados e analistas financeiros.

Quer aprender mais?

Conheça nossa Formação do Zero à Análise de Dados Econômicos e Financeiros usando Python e Inteligência Artificial. Aprenda do ZERO a coletar, tratar, construir modelos e apresentar dados econômicos e financeiros com o uso de Python e IA.

Referências

  • AHMED, Sabeen; NIELSEN, Ian E.; TRIPATHI, Aakash; SIDDIQUI, Shamoon; RAMACHANDRAN, Ravi P.; RASOOL, Ghulam. Transformers in Time-Series Analysis: A TutorialCircuits, Systems, and Signal Processing, v. 42, n. 12, p. 7433-7466, 2023. Disponível em: https://researchwithrowan.com.
  • ALAMMAR, Jay; GROOTENDORST, Maarten. Hands-On Large Language Models: Language Understanding and Generation. Sebastopol: O’Reilly Media, 2024.
  • VASWANI, Ashish et al. Attention is All You Need. In: Advances in Neural Information Processing Systems (NIPS), 2017. Disponível em: https://deeprevision.github.io/posts/001-transformer.
  • UNIT8 SA. Darts - Quickstart Guide. Disponível em: https://unit8co.github.io/darts/quickstart/00-quickstart.html#Export-a-TimeSeries

Compartilhe esse artigo

Facebook
Twitter
LinkedIn
WhatsApp
Telegram
Email
Print

Comente o que achou desse artigo

Outros artigos relacionados

Como se comportou o endividamento e a inadimplência nos últimos anos? Uma análise utilizando a linguagem R

Neste exercício realizamos uma análise sobre a inadimplência dos brasileiros no período recente, utilizando a linguagem R para examinar dados públicos do Banco Central e do IBGE. Investigamos a evolução do endividamento, da inadimplência e das concessões de crédito, contextualizando-os com as dinâmicas da política monetária (Taxa Selic) e do mercado de trabalho (renda e desemprego).

Qual o hiato do produto no Brasil?

Entender o hiato do produto é fundamental para avaliar o ritmo da economia e as pressões inflacionárias no Brasil. Neste artigo, mostramos como estimar essa variável não observável a partir dos dados do PIB, explorando diferentes metodologias — de regressões simples a modelos estruturais — e discutindo as limitações e incertezas que cercam cada abordagem.

Determinantes do Preço do Ouro: VAR + Linguagem R

Este artigo realiza uma análise econométrica para investigar os determinantes dinâmicos do preço do ouro. Utilizando um modelo Vetorial Autorregressivo (VAR) em R, examinamos o impacto de variáveis como o dólar (DXY), a curva de juros e a incerteza global. Os resultados mostram que um fortalecimento inesperado do dólar tem um efeito negativo e significativo no curto prazo sobre os retornos do ouro, embora a maior parte de sua variância seja explicada por fatores intrínsecos ao seu próprio mercado.

Boletim AM

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

Boletim AM

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

como podemos ajudar?

Preencha os seus dados abaixo e fale conosco no WhatsApp

Boletim AM

Preencha o formulário abaixo para receber nossos boletins semanais diretamente em seu e-mail.