Análise e Decomposição de séries temporais da B3

Séries temporais são conjuntos de dados ordenados em função do tempo. Em outras palavras, são sequências de observações ou medidas coletadas em intervalos regulares ao longo de um período contínuo de tempo. Essas observações podem ser coletadas em qualquer área, como: finanças, economia, ciências naturais, medicina e muitas outras.

As séries temporais são frequentemente utilizadas para analisar e compreender padrões como: tendências, sazonalidades e flutuações que ocorrem ao longo do tempo. Elas são amplamente utilizadas em previsão, análise de risco, análise de desempenho e em diversos campos.

Analisando

Iremos analisar os dados de Volume(O número de ativos que foram comprados e vendidos em um determinado dia) da B3(Brasil Bolsa Balcão) de 02/01/2012 a 29/12/2022:

1) Importando as bibliotecas necessárias e o nosso dataset:

# Importação das bibliotecas
import pandas as pd
import matplotlib.pylab as plt
from statsmodels.tsa.seasonal import seasonal_decompose
from statsmodels.graphics.tsaplots import plot_acf, plot_pacf

# Importando os dados
dados = pd.read_csv('../Data/B3SA3.SA.csv', parse_dates = ['Date'], index_col='Date')
dados

2) Criando a série temporal da variável volume:

# Criação da série temporal
serieTemp = dados['Volume']
serieTemp.head()    

3) Exibindo a série temporal de todo o período:

# Visualização da serie temporal
plt.figure(figsize=(10,5))
plt.plot(serieTemp)

Saída:

➜ Através da imagem percebe-se que a série temporal é estacionária. isto é, a série varia  praticamente em torno de uma mesma média, variância.

➜ Percebe-se também um grande volume de negociações de 2014 a 2016 que ultrapassa os 600mi:

3.1) Podemos descobrir qual o valor de maior volume:

# O maior volume da B3 no período
max_value = serieTemp.max()
max_value

Saída:

621811002

➜ Aproximados 622 milhões de negociações.

3.2) E a data que ocorreu:

# Data de maior volume de negociação
max_index = serieTemp.idxmax()
max_index

Saída:

Timestamp('2014-12-02 00:00:00')

➜ Em 02/12/2014 ocorreu o maior volume de negociação entre o período de 2012 a 2022.

4) Visualizaçao da série temporal por ano(Somatório dos anos):

# Visualização dos valores por ano.
serieTempAno = serieTemp.resample('A').sum()
plt.figure(figsize=(10,5))
plt.plot(serieTempAno)

Saída:

➜ Observando a série em termos anuais, a mesma não apresenta sinais de estacionariedade. Isso porque uma série temporal a depender da escala de tempo observada pode mudar de comportamento.

➜ Há tendências de queda entre 2014 a 2018 e uma tendência de alta entre 2020 a 2022.

5) Observando a série temporal por mês(Somatório dos meses):

# Visulização dos valores por mês
serieTempMes = serieTemp.groupby(pd.Grouper(freq='M')).sum()
plt.figure(figsize=(10,5))
plt.plot(serieTempMes)

Saída:

➜ Em termos mensais há uma leve estacionariedade e sazonalidade.

Valores Móveis

6) Visualização dos valores móveis(Média, Médiana e Desvio Padrão)

# Média móvel no tempo
media_movel = serieTempMes.rolling(12).mean()
# Desvio padrão móvel no tempo
desvio_movel = serieTempMes.rolling(12).std()
# Mediana móvel no tempo
mediana_movel = serieTempMes.rolling(12).median()
# Gráfico
orig = plt.plot(serieTempMes, color='blue', label='Observado')
media = plt.plot(media_movel, color='red', label='Média Móvel')

plt.plot(mediana_movel, color='green', label='Mediana Móvel')
desvio = plt.plot(desvio_movel, color='black', label='Desvio Padrão Móvel')
plt.legend(loc='best')
plt.title('Estatísticas de rolagem')
plt.show(block=False)

Saída:

➜ Usamos a série temporal com valores mensais pois é consistente, sem lacunas de valores.

➜ A média e a mediana em torno da linha observada é um forte indício de série estacionária.

Autocorrelação

7) Visualização da autocorrelação:

# A autocorrelação é uma medida de correlação entre uma série temporal e uma versão defasada de si mesma.
# O lag é o número de períodos que a série temporal é defasada, número de períodos anteriores usados para calcular a autocorrelação.
# O lag 0 é a autocorrelação na defasagem 0, o que é sempre 1.
plot_acf(serieTemp.values, lags=60)
plt.xlabel('Lags')
plt.show()

Saída:

➜ A autocorrelação é a medida de comparação da série temporal com seus diferentes períodos.

➜ Lag é o numéro da defasagem em dias, exemplo: caso calcule o Lag entre o preço de hoje e o preço há uma semana, estará considerando o Lag de 7 dias.

➜ Padrão de Decaimento: A presença de autocorrelações significativas em defasagens iniciais, seguidas por uma diminuição gradual das autocorrelações à medida que as defasagens aumentam, pode indicar a necessidade de um modelo AR(Autoregressivo) para análise.

8) Visualização da autocorrelação parcial:

# A autocorrelação parcial é uma medida da correlação entre uma série temporal e uma versão defasada de si mesma, mas após remover os efeitos de correlações em defasagens intermediárias.
plot_pacf(serieTemp.values, lags=60)
plt.xlabel('Lags')
plt.ylabel('Autocorrelação Parcial')
plt.show()

Saída:

➜ Identificação da Ordem do Modelo MA: Se os dados decaem rapidamente após a defasagem zero e permanece insignificante para as defasagens subsequentes, isso sugere um possível modelo MA(Média Móvel) para análise.

Decomposição da Série Temporal

Decompor uma série temporal é um processo fundamental na análise e modelagem de dados sequenciais ao longo do tempo. Isso envolve desmembrar a série em suas componentes individuais, a fim de entender melhor os padrões subjacentes e as influências que afetam os dados ao longo do tempo.

1) Decomposição:

# A decomposição de uma série temporal é uma técnica que permite separar diferentes componentes de uma série temporal.
decomposicao = seasonal_decompose(serieTempMes)

1.1) Componente Tendência: 

# Tendência de uma série temporal
tendencia = decomposicao.trend
plt.figure(figsize=(10,5))
plt.plot(tendencia)

Saída:

1.2) Componente Sazonal:

# Sazonal de uma série temporal
sazonal = decomposicao.seasonal
plt.figure(figsize=(10,5))
plt.plot(sazonal)

Saída:

1.3) Componente Irregular(Aleatório):

# Erro(Aleatório)
aleatorio = decomposicao.resid
plt.figure(figsize=(10,5))
plt.plot(aleatorio)

Saída:

1.4) Visualização simultânea:

# Comparação da serie temporal com suas partes
plt.subplot(4,1,1)
plt.plot(serieTemp, label = 'Observed', color = '#111111')
plt.legend(loc = 'best')

# Visualização somente da tendência
plt.subplot(4,1,2)
plt.plot(tendencia, label = 'Trend', color='#7fff00')
plt.legend(loc = 'best')

# Visualização somente da sazonalidade
plt.subplot(4,1,3)
plt.plot(sazonal, label = 'Seasonal', color='#8470ff')
plt.legend(loc = 'best')

# Visualização somente do elemento aleatório
plt.subplot(4,1,4)
plt.plot(aleatorio, label = 'Random', color='#4682b4')
plt.legend(loc = 'best')
plt.tight_layout()

Saída:

Segue o link para acessar o código na integra: Código

Em conclusão, a análise de séries temporais emerge como uma ferramenta fundamental e poderosa para compreender padrões, tendências e flutuações em dados ao longo do tempo. Tendo papel crucial em várias áreas, como finanças, economia, meteorologia e saúde, permitindo previsões precisas e embasadas. No entanto, é importante ressaltar que essa análise não é uma ciência exata, pois as séries temporais muitas vezes estão sujeitas a ruídos e variabilidades complexas que podem desafiar a precisão das previsões. Os pesquisadores devem adotar uma abordagem cautelosa, constantemente avaliando e refinando suas técnicas à medida que novos insights e dados são incorporados.

Comentários

Formulário de contato

Nome

E-mail *

Mensagem *

Minha foto
Gustavo Câmara
Olá, meu nome é Gustavo e sou Analista de Dados, Desenvolvedor, Estudante de Engenharia de Software e apaixonado por tecnologia.

Postagens mais visitadas