Objetivo

Realizar a Análise dos dados e executar uma série temporal e verificar seu comportamento, para isso foi utilizado o conjunto de dados do sivep, para este fim foi utilizado 0o software RStudio e as linguagens R e linguagens Python.

library(fpp2)
require(forecast)
require(tseries)
require(Kendall)
library(lmtest)
library(readxl)
library(openxlsx)
library(timeSeries)
library(ggplot2)

Introdução

Você se lembra quando nasceu? Bom você se lembra por tudo você já passou na vida? Tudo o que viveu seus primeiros passos tudo aquilo que você aprendeu até chegar esse atual momento? Quando fazemos isso sabe o que estamos analisando? Estamos analisando o seu comportamento ao longo do tempo, e assim como esse exemplo é o que acontece em uma série temporal ela tenta explicar o comportamento de uma variável ao longo do tempo.

Oque é uma série temporal?

É um conjunto de observações coletadas sequencialmente ao longo do tempo em intervalos regulares (horas,dias,meses,anos). Exemplo: casos novos de covid ao longo do tempos , numero de internações em unidades hospitalares por horas ,entre outros.

Como Analisar Uma Série Temporal?

A maneira tradicional de analisar uma série temporal é através da sua decomposição nas componentes de tendência , ciclo e sazonalidade.

tendência: Indica a direção, o comportamente e a velocidade um período de tempo: se a série cresce ou descresce ao longo do tempo.

Sazonalidade:Indica como as variações repetitivas e períodicas ocorrem numa série temporal.Há padroes que ocorrem durante o tempo que se repete a cada período idêntico de tempo(como anos,meses e semanas)

Ruido:Refere-se a quedas ou saltos estranhos numa série temporal, normalmente o ruído pode caracterizar-se por eventos externos e imprevisiveis que impactam a série temporal.

Estacionaridade:Indica se uma série tem um comportamento aleatório ao longo do tempo ou não, uma série é estacionaria se seus valores para média, variância e covariância permanece contantes ap longo do tempo da dimensão espacial.

Oque é auto-correlação temporal?

Presume-se o que aconteceu hoje tem relação com o que aconteceu ontem e assim sucesivamente ou seja , cada passo está correlacionado na própria várriavel , ou seja , outocorrelação .

Carregando o Banco de Dados

Importando as principais bibliotecas que serão utilizadas

import pandas as pd 
import matplotlib.pyplot as plt
from statsmodels.tsa.seasonal import seasonal_decompose 
import yfinance as yf
import matplotlib.pyplot as plt

O pacote Yfinance Será utilizado para puxar os dados das ações a função yf.Ticker desse pacote extrai o ticket da ação deseja , no nosso caso vamos utlizar a ação da bolsa de valores brasileira(Ibovespa)

ticket= yf.Ticker('^BVSP')
#df=ticket.history(period='3y',interval ='lm0')
#periodo de data definido 
df = ticket.history(interval ='1d',start='2019-01-01',end='2022-03-08')

A função ticket.history junto com os paranetros passados Nos traz as informações diárias nos últimos 3 anos até o momento atual . Oque quero observar com isso ? será que a guerra entre Russia e Ucrania vem impactando consideravelmente a bolsa de valores brasileira?

Observando os primeiros 10 valores

open= abertura do mercado

hight = a alta do mercado

low = queda do mercado

close= fechamento das acões

volume = volume de transações

dividends =dividendos do mercado,Basicamente, dividendos são parte do lucro líquido ajustado de uma empresa dividido entre os acionistas.

stock split = stock split

Decompisção Temporal

Seja uma série temporal cuja o modelo aditivo se dá de forma :

\[Z_t= sazonalidade_t + tendencia_t + ciclo_t + ε_t\]

a decomposição temporal é dada pela separação dessas variáveis

decomposicao=seasonal_decompose(df[['Close']],model='additive',period=30,extrapolate_trend=30)

Vamos utilizar a função seasonal_decompese() para decompor a nossa série temporal,lembrando que estamos analisando apenas o fechamento da bolsa brasileira, além disso, como o nosso modelo escolhido foi o modelp aditivo,vamos usar o parâmetro model= addtive , temos o parâmetro period=30 que irá calcular a tendência ,sazonalidade,média móvel com base nesses 30 dias, que é um mês comercial(mês comercial tem 30 dias), por último temos o parâmetro extrapolate_trend=30 evita que durante o cálculo a coluna fique nula, caso isso aconteça, a coluna será preenchida com o próprio dado.

Analisando o fechamento da bolsa de valor

df[['Close']].plot()

A somas desses termos nos retorna a própria série temporal

decomposicao.seasonal + decomposicao.resid+decomposicao.trend
## Date
## 2019-01-02     91012.0
## 2019-01-03     91564.0
## 2019-01-04     91841.0
## 2019-01-07     91699.0
## 2019-01-08     92032.0
##                 ...   
## 2022-02-25    113142.0
## 2022-03-02    115174.0
## 2022-03-03    115166.0
## 2022-03-04    114474.0
## 2022-03-07    111593.0
## Length: 787, dtype: float64

Plotle dos dados que serão observados



df[['Close']].plot()

Plot da Decomposição da série



decomposicao.plot()

Aqui podemos ver os gráficos decompostos , onde o primeiro gráfico é a série original , trend é a tendência , Seasonal é a sazonalidade e resid é o ruído .

Teste Mann-Kendall

O teste Mann-Kendall verifica se realmente existe tendência na nossa série.

Hipóteses:

\(H_0:\) Não há tendência presente nos dados. \(P\ge0,05\)

\(H_1:\) Uma tendência está presente nos dados que pode ser de aumento ou de diminuição \(P< 0,05\)

df<-py$df


dfi<-ts(df, start = c(2019, 1), end = c(2022, 3), 
                           frequency = 12)
MannKendall(dfi)
## tau = -0.227, 2-sided pvalue =5.7092e-08

como \(p_{valor}<0,05\) temos que há uma forte tendencia positiva há o longo do tempo .

fig,(ax1,ax2,ax3,ax4) =plt.subplots(4,1,figsize =(12,8))
decomposicao.observed.plot(ax=ax1)
decomposicao.trend.plot(ax=ax2)
decomposicao.seasonal.plot(ax=ax3)
decomposicao.resid.plot(ax=ax4)
plt.tight_layout()
ax,fig = plt.subplots(figsize=(15,8))
plt.plot(decomposicao.observed)
plt.plot(decomposicao.trend)

decomposicao.observed= nossa série

linha laranja= representa a tendência

pelo gráfico podemos observar uma tendência de crecimento , mas existe outras possibilidades para que possamos identifica a tendência em nossa série ,podemos por exemplo realizar uma regressão , onde teremos

Assumindo agora que nós temos dados mensais podemos rodar a seguinte regressão: \[FEC_t = α + βMes_t + ε_t\]

Calculando a TendÊncia Linear dá Série

por que devemos calcular a tendência linear da nossa série? calculando a tendência linear

vamos conseguir explicar melhor o comportamento de tendência da nossa série , ou seja, caso tenhamos uma tendência linear positiva isto provavelmente indicará que estamos em um momento de valorização da bolsa, já se encontrarmos uma tendência negativo isto indicará que estamos em um momento de desvalorização da bolsa

df<-py$df


dfi<-ts(df, start = c(2019, 1), end = c(2022, 3), 
                           frequency = 12)

fec.ts<-df[4]

rownames(fec.ts)<-as.Date(rownames(fec.ts))

dfi<-ts(fec.ts, start = c(2019, 1), end = c(2022, 3), 
                           frequency = 12)


fec.ts$mes<-months(as.Date(rownames(fec.ts)))

fec.ts$data<-as.Date(rownames(fec.ts))

fec<-lm(formula = fec.ts$Close ~ fec.ts$data)

summary(fec)
## 
## Call:
## lm(formula = fec.ts$Close ~ fec.ts$data)
## 
## Residuals:
##    Min     1Q Median     3Q    Max 
## -39581  -5470    693   7312  19279 
## 
## Coefficients:
##               Estimate Std. Error t value Pr(>|t|)    
## (Intercept) -2.440e+05  2.075e+04  -11.76   <2e-16 ***
## fec.ts$data  1.893e+01  1.123e+00   16.85   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 10570 on 785 degrees of freedom
## Multiple R-squared:  0.2656, Adjusted R-squared:  0.2647 
## F-statistic: 283.9 on 1 and 785 DF,  p-value: < 2.2e-16

logo,\(FEC_t\) será a nossa tendência linear. Em seguida temos as três séries no mesmo gráfico.

dfi <- ts(df$Close, start = c(2019,1),end = c(2022,3), freq=12)


#definindo os anos 
anos <- seq(as.Date("2019/1/1"),as.Date("2022/03/1"),"months")



n<-1:39

pred<-lm(dfi~n)

dfide<-decompose(dfi)
plot(anos,dfi, type="l",main = " Ibovespa",ylab="Valores")
#plot(anos,pred$fitted.values)
lines(anos, pred$fitted.values, col= "red", lwd=2,lty=2)
lines(anos, dfide$trend, col= "blue", lwd=2,lty=2)
lines(anos,pred$residuals, type="l")

legend("topleft", legend = c("série original", "tendencia linear","tendencia da decomposição"),
       col = c("black","red" ,"blue"), lty = 1:2, cex = 0.6)

como podemos ver temos um Tendência linear positiva , logo ,a bolsa de valores Ibovespa vem se valorizando,pode ser um bom momento para investir na bolsa ,vamos observar com mais detalhes a frente

Suavização Exponencial Simples

Os métodos de suavização exponencial são uma extensão do método ingênuo, em que as previsões são produzidas usando médias ponderadas de observações passadas, com os pesos decaindo exponencialmente à medida que as observações envelhecem. Em palavras simples, pesos maiores são dados às observações mais recentes e vice-versa. O valor do parâmetro de suavização para o nível é decidido pelo parâmetro ‘alpha’

library(readr)
library(ggplot2)
library(forecast)
library(fpp2)
library(TTR)
library(dplyr)


se_model <- ses(dfi, h = 12)
summary(se_model)
## 
## Forecast method: Simple exponential smoothing
## 
## Model Information:
## Simple exponential smoothing 
## 
## Call:
##  ses(y = dfi, h = 12) 
## 
##   Smoothing parameters:
##     alpha = 0.7923 
## 
##   Initial states:
##     l = 91138.9634 
## 
##   sigma:  1101.086
## 
##      AIC     AICc      BIC 
## 693.1419 693.8276 698.1326 
## 
## Error measures:
##                    ME     RMSE      MAE       MPE      MAPE      MASE
## Training set 207.3601 1072.482 797.4747 0.2123327 0.8324012 0.3199569
##                      ACF1
## Training set -0.007127257
## 
## Forecasts:
##          Point Forecast    Lo 80     Hi 80    Lo 95     Hi 95
## Apr 2022       97546.57 96135.47  98957.67 95388.48  99704.66
## May 2022       97546.57 95746.22  99346.91 94793.17 100299.96
## Jun 2022       97546.57 95427.30  99665.83 94305.43 100787.71
## Jul 2022       97546.57 95150.46  99942.68 93882.03 101211.10
## Aug 2022       97546.57 94902.44 100190.69 93502.73 101590.40
## Sep 2022       97546.57 94675.78 100417.36 93156.07 101937.06
## Oct 2022       97546.57 94465.74 100627.39 92834.85 102258.28
## Nov 2022       97546.57 94269.14 100823.99 92534.17 102558.96
## Dec 2022       97546.57 94083.68 101009.45 92250.54 102842.59
## Jan 2023       97546.57 93907.66 101185.47 91981.34 103111.79
## Feb 2023       97546.57 93739.77 101353.36 91724.58 103368.55
## Mar 2023       97546.57 93578.98 101514.15 91478.67 103614.46
plot(dfi)
lines(se_model$fitted,pch = 18, col = "blue", type = "b", 
      lty = 2, lwd = 1,xlab="X-axis label", ylab="valores")
# 4. Add a legend to the plot and set legend lty
legend("topleft", legend = c("Dados Originais", "SEHW"),
       col = c("black", "blue"), lty = 1:2, cex = 0.6,)

aqui temos que o modelo de suavização simples não se ajustou adequadamente a série

library(readr)
library(ggplot2)
library(forecast)
library(fpp2)
library(TTR)
library(dplyr)






se_model <- ses(dfi, h = 12)
summary(se_model)
## 
## Forecast method: Simple exponential smoothing
## 
## Model Information:
## Simple exponential smoothing 
## 
## Call:
##  ses(y = dfi, h = 12) 
## 
##   Smoothing parameters:
##     alpha = 0.7923 
## 
##   Initial states:
##     l = 91138.9634 
## 
##   sigma:  1101.086
## 
##      AIC     AICc      BIC 
## 693.1419 693.8276 698.1326 
## 
## Error measures:
##                    ME     RMSE      MAE       MPE      MAPE      MASE
## Training set 207.3601 1072.482 797.4747 0.2123327 0.8324012 0.3199569
##                      ACF1
## Training set -0.007127257
## 
## Forecasts:
##          Point Forecast    Lo 80     Hi 80    Lo 95     Hi 95
## Apr 2022       97546.57 96135.47  98957.67 95388.48  99704.66
## May 2022       97546.57 95746.22  99346.91 94793.17 100299.96
## Jun 2022       97546.57 95427.30  99665.83 94305.43 100787.71
## Jul 2022       97546.57 95150.46  99942.68 93882.03 101211.10
## Aug 2022       97546.57 94902.44 100190.69 93502.73 101590.40
## Sep 2022       97546.57 94675.78 100417.36 93156.07 101937.06
## Oct 2022       97546.57 94465.74 100627.39 92834.85 102258.28
## Nov 2022       97546.57 94269.14 100823.99 92534.17 102558.96
## Dec 2022       97546.57 94083.68 101009.45 92250.54 102842.59
## Jan 2023       97546.57 93907.66 101185.47 91981.34 103111.79
## Feb 2023       97546.57 93739.77 101353.36 91724.58 103368.55
## Mar 2023       97546.57 93578.98 101514.15 91478.67 103614.46

A saída acima mostra que a suavização exponencial simples tem o mesmo valor para todas as previsões. Como o valor alfa não está próximo de 1, as previsões estão mais afastadas das observações mais recentes. Vamos agora avaliar o desempenho do modelo nos dados de teste.

plotagem do modelo

library(readr)
library(ggplot2)
library(forecast)
library(fpp2)
library(TTR)
library(dplyr)








plot(se_model)

aqui temos a privisão feita com base a suavização exponecial

Método de tendência de Holt

Esta é uma extensão do método de suavização exponencial simples que considera o componente de tendência ao gerar previsões. Este método envolve duas equações de suavização, uma para o nível e outra para o componente de tendência.

A primeira linha de código abaixo cria o modelo de inverno do holt e o armazena em um objeto ‘holt_model’. A segunda linha imprime o resumo e as previsões para os próximos 12 meses.

holt_model <-HoltWinters(dfi,beta = F,gamma = F)


plot(dfi)
lines(holt_model$fitted[,1],pch = 18, col = "blue", type = "b", 
      lty = 2, lwd = 1)

holt_model <-holt(dfi, h = 7)


plot(holt_model)

podemos ver aqui que temos de fato uma tendencia de aumento ao logo do tempo , o seja , provavelmente seria interessante no atual momento adiquirir ações da Ibovepes para vender futuramente

Cálculo da Média Movel

media_movel5d=df['Close'].rolling(5).mean()
media_movel14d=df['Close'].rolling(14).mean()
media_movel21d=df['Close'].rolling(21).mean()

media_movel30d=df['Close'].rolling(30).mean()

Plotagem da Média Móvel

O indicador médias móveis é um dos principais indicadores técnicos para tentar prever o início de uma tendência No preço de um ativo . As médias móveis se divide em médias curtas e médias longas, média curta tem 5 a 20 dias ela acompanha de forma mais próximo preço do ativo ,já a média loga tem de 20 a 60 dias

fig,ax =plt.subplots(figsize=(12,5))
plt.plot(media_movel5d,'red')
plt.plot(media_movel30d,'black')
plt.plot(df['Close'])

A plotagem com ambas as médias de longa e curta distância são bastante utilizadas nas áreas de investimento ,Onde os pontos se cruzam será analisado se a tendência é positiva ou negativa para indicar o investimento ou venda de uma ação.

conclusão

Podemos observar Os resultados tanto para modelo de suavização quanto modelo de hot tendência onde é possível um investidor escolher ou não investir em uma determinada ação com base no gráfico da predição da tendência, segundo os nosso gráficos, podemos de fato continuar investindo nas ações pois ainda estamos em uma forte tendência de crescimento .

Acesse meus outros projetos :

Relatório sobre os testes paramétricos e não paramétricos :

Análise Exploratória na linguagem Python :

Referências

Dividendos: o que são? Dá para viver disso?. Disponível em: https://blog.nubank.com.br/dividendos/ . Acesso em: 21 de março de 2022.

Stock-split (desdobramento de ações). Proteste_Investe. Disponível em: https://www.deco.proteste.pt/investe/lexicon/s/stock-split/ . Acesso em: 21 de março de 2022.

APLICAÇÃO DO MODELO DE PREVISÃO DE DEMANDA HOLTWINTERS EM UMA REGIONAL DE CORTE E DOBRA DE AÇO http://www.abepro.org.br/biblioteca/tn_wic_206_219_28345.pdf . Acesso em: 21 de março de 2022.