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 pltO 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.