Este artigo foi publicado como parte do Data Science Blogathon.
Introdução
é usado para prever valores futuros com base em valores observados anteriormente e uma das melhores ferramentas para análise de tendências e previsão do futuro.
O que são dados de série temporal?
É registrado em intervalos de tempo regulares e a ordem desses pontos de dados é importante. Por tanto, cualquier modelo predictivo basado en dados de series de tiempo tendrá el tiempo como variávelEm estatística e matemática, uma "variável" é um símbolo que representa um valor que pode mudar ou variar. Existem diferentes tipos de variáveis, e qualitativo, que descrevem características não numéricas, e quantitativo, representando quantidades numéricas. Variáveis são fundamentais em experimentos e estudos, uma vez que permitem a análise de relações e padrões entre diferentes elementos, facilitando a compreensão de fenômenos complexos.... Independente. A saída de um modelo seria o valor previsto ou classificação em um momento específico.
Análise de série temporal vs previsão de série temporal
Vamos falar sobre algumas possíveis confusões sobre a análise e previsão de séries temporais. A previsão de série temporal é um exemplo de modelagem preditiva, enquanto a análise de série temporal é uma forma de modelagem descritiva.
Para um novo investidor, a pesquisa geral associada ao mercado de ações ou ao mercado de ações não é suficiente para tomar a decisão. A tendência comum para o mercado de ações entre a sociedade é altamente arriscada para o investimento, então a maioria das pessoas não pode tomar decisões com base em tendências comuns. La variación estacional y el flujo constante de cualquier índiceo "Índice" É uma ferramenta fundamental em livros e documentos, que permite localizar rapidamente as informações desejadas. Geralmente, é apresentado no início de um trabalho e organiza os conteúdos de forma hierárquica, incluindo capítulos e seções. Sua correta preparação facilita a navegação e melhora a compreensão do material, tornando-se um recurso essencial para estudantes e profissionais de várias áreas.... ayudarán a los inversores nuevos y existentes a comprender y tomar la decisão de invertir en el mercado de valores.
Para resolver esses tipos de problemas, previsão de séries temporais é a melhor técnica.
Bolsa de Valores
Os mercados de ações são os locais onde os investidores individuais e institucionais se reúnem para comprar e vender ações em um local público.. Hoje em dia, essas trocas existem como mercados eletrônicos.
Essa oferta e demanda ajudam a determinar o preço de cada título ou os níveis em que os participantes no mercado de ações (investidores e comerciantes) estão dispostos a comprar ou vender.
O conceito por trás do funcionamento do mercado de ações é bastante simples.. Operando como uma casa de leilões, o mercado de ações permite que compradores e vendedores negociem preços e realizem transações.
Definição de 'estoque’
Uma ação ou ação (também conhecido como “capital” de uma empresa) é um instrumento financeiro que representa a propriedade de uma empresa
Aprendizado de máquina no mercado de ações
O mercado de ações é muito imprevisível, qualquer mudança geopolítica pode afetar a evolução das ações na bolsa de valores, vimos recentemente como o covid-19 impactou os preços das ações, então, em dados financeiros, é muito difícil fazer uma análise de tendência confiável. . La forma más eficiente de resolver este tipo de problemas es con la ayuda del aprendizaje automático y el aprendizado profundoAqui está o caminho de aprendizado para dominar o aprendizado profundo em, Uma subdisciplina da inteligência artificial, depende de redes neurais artificiais para analisar e processar grandes volumes de dados. Essa técnica permite que as máquinas aprendam padrões e executem tarefas complexas, como reconhecimento de fala e visão computacional. Sua capacidade de melhorar continuamente à medida que mais dados são fornecidos a ele o torna uma ferramenta fundamental em vários setores, da saúde....
Neste tutorial, vamos resolver este problema com o modelo ARIMA.
Para saber a sazonalidade, verifique meu blog anterior. E para obter uma compreensão básica do ARIMA, Eu recomendo que você leia este blog, isso ajudará você a entender melhor como funciona a análise de série temporal.
Implementar a previsão do preço das ações
usarei nsepy biblioteca para extrair dados históricos de SBIN.
Importações
import os import warnings warnings.filterwarnings('ignorar') from pylab import rcParams rcParams['figura.figsize'] = 10, 6 from statsmodels.tsa.stattools import adfuller from statsmodels.tsa.seasonal import seasonal_decompose from statsmodels.tsa.arima_model import ARIMA from pmdarima.arima import auto_arima from sklearn.metrics import mean_squared_error, mean_absolute_error import math import numpy as np from nsepy import get_history from datetime import date import matplotlib.pyplot as plt import seaborn as sns import pandas as pd
Execute o código abaixo para extrair os dados históricos:
sbin = get_history(símbolo ="SBIN",
start=data(2000,1,1),
end=date(2020,11,1))
sbin.head()

Os dados mostram o preço das ações do SBIN de 2020-1-1 para 2020-11-1. O objetivo é criar um modelo que prevea
o preço de fechamento das ações.
Creemos una visualización que mostrará el precio de cierre diario de la acción.
plt.figure(figsize =(10,6))
plt.grid(Verdade)
plt.xlabel('Datas')
plt.ylabel('Preços de Fecho')
plt.plot(sbin['Fechar'])
plt.title('Preço de fecho SBIN')
plt.show()

plt.figure(figsize =(10,6))
df_close = sbin['Fechar']
df_close.plot(estilo ="k.")
plt.title('Gráfico de dispersãoUm gráfico de dispersão é uma representação gráfica que mostra a relação entre duas variáveis. Cada ponto no gráfico corresponde a um par de valores, que permite identificar padrões, Tendências ou correlações. Esta ferramenta é útil em várias disciplinas, como estatísticas e pesquisas científicas, uma vez que facilita a análise visual dos dados e a compreensão da relação entre os elementos estudados.... do preço de fecho')
plt.show()

plt.figure(figsize =(10,6)) df_close = sbin['Fechar'] df_close.plot(estilo ="k.",kind='hist') plt.title(Hisograma do preço de fecho') plt.show()

Primeiro, precisamos verificar se uma série é estacionária ou não porque a análise de série temporal só funciona com dados estacionários.
Teste de estacionariedade:
Para identificar a natureza dos dados, vamos usar o hipótese nulaA hipótese nula é um conceito fundamental em estatística que estabelece uma declaração inicial sobre um parâmetro populacional. Seu objetivo é ser testado e, se refutado, nos permite aceitar a hipótese alternativa. Essa abordagem é essencial na pesquisa científica, pois fornece uma estrutura para avaliar evidências empíricas e tomar decisões baseadas em dados. Sua formulação e análise são cruciais em estudos estatísticos.....
H0: A hipótese nula: É uma declaração sobre a população que se acredita ser verdadeira ou usada para fazer um argumento, a menos que possa ser demonstrado que está incorreta além de uma dúvida razoável.
H1: A hipótese alternativa: É uma afirmação sobre a população que contradiz H0 e o que concluímos quando rejeitamos H0.
#Ho: não é estacionário
# H1: está parado
Se não rejeitarmos a hipótese nula, podemos dizer que a série é não estacionária. Isso significa que a série pode ser linear.
Se o desvio padrão e a média forem linhas planas (média constante e variância constante), a série fica estacionária.
de statsmodels.tsa.stattools import adfuller
def test_stationarity(séries do tempo):
#Determinando estatísticas rotativas
rolmean = timeseries.rolling(12).quer dizer()
rolstd = timeseries.rolling(12).std()
#Traçar estatísticas contínuas:
plt.plot(séries do tempo, color ="amarelo",rótulo ="Original")
plt.plot(rolmean, color ="vermelho", rótulo ="Média móvel")
plt.plot(rolstd, color ="Preto", rótulo ="Rolling Std")
plt.legend(loc ="melhor")
plt.title('Média Móvel e Desvio Padrão')
plt.show(bloco = falso)
imprimir("Resultados do teste dickey fuller")
adft = adfuller(séries do tempo,autolag='AIC')
# saída para dft vai nos dar sem definir quais são os valores.
#por isso escrevemos manualmente quais valores ele explica usando um loop para
saída = pd. Série(adft[0:4],índice =['Estatísticas de Teste','valor-p','No. de lags usados',Número de observações usadas'])
para chave,valores em adft[4].Itens():
saída['valor crítico (%s)'%chave] = valores
imprimir(saída)
test_stationarity(sbin['Fechar'])

Depois de analisar o gráfico acima, podemos ver o crescente desvio médio e padrão e, portanto, nossa série não está estacionária.
Results of dickey fuller test
Test Statistics -1.914523
valor p 0.325260
Não. de lags usados 3.000000
Número de observações utilizadas 5183.000000
valor crítico (1%) -3.431612
valor crítico (5%) -2.862098
valor crítico (10%) -2.567067
tipo d: float64
Vemos que o valor p é maior do que 0.05 então não podemos rejeitar o Hipótese nula. O que mais, as estatísticas do teste são maiores do que os valores críticos. então os dados não são estacionários.
Para análise de séries temporais, Separamos tendência e sazonalidade das séries temporais.
resultado = sazonal_decompor(df_close, modelo ="multiplicativo", freq = 30) fig = plt.figure() fig = result.plot() fig.set_size_inches(16, 9)

from pylab import rcParams
rcParams['figura.figsize'] = 10, 6
df_log = np.log(sbin['Fechar'])
movendo_avg = df_log.rolling(12).quer dizer()
std_dev = df_log.rolling(12).std()
plt.legend(loc ="melhor")
plt.title(Média móvel')
plt.plot(std_dev, color ="Preto", rótulo = "Desvio padrão")
plt.plot(movendo_avg, color ="vermelho", rótulo = "Quer dizer")
plt.legend()
plt.show()

Agora vamos criar um modelo ARIMA e treiná-lo com o preço de fechamento do estoque nos dados do trem. Así que dividamos los datos en TreinamentoO treinamento é um processo sistemático projetado para melhorar as habilidades, Conhecimento ou habilidades físicas. É aplicado em várias áreas, como esporte, Educação e desenvolvimento profissional. Um programa de treinamento eficaz inclui planejamento de metas, prática regular e avaliação do progresso. A adaptação às necessidades individuais e a motivação são fatores-chave para alcançar resultados bem-sucedidos e sustentáveis em qualquer disciplina.... y conjunto de teste e visualize-os.
train_data, test_data = df_log[3:int(len(df_log)*0.9)], df_log[int(len(df_log)*0.9):]
plt.figure(figsize =(10,6))
plt.grid(Verdade)
plt.xlabel('Datas')
plt.ylabel('Preços de Fecho')
plt.plot(df_log, 'verde', rótulo ="Dados de trem")
plt.plot(dados de teste, 'azul', rótulo ="Dados de teste")
plt.legend()

model_autoARIMA = auto_arima(train_data, start_p = 0, start_q = 0, teste ="adf", # use adftest para encontrar o 'd' ótimo max_p = 3, max_q = 3, # p e q máximos m = 1, # frequência da série d = Nenhum, # deixe o modelo determinar o 'd' sazonal = False, # Sem sazonalidade start_P=0, D=0, trace = True, error_action='ignorar', suppress_warnings = True, stepwise=True) imprimir(model_autoARIMA.summary())
Performing stepwise search to minimize aic ARIMA(0,1,0)(0,0,0)[0] interceptar : AIC=-16607.561, Time=2.19 sec ARIMA(1,1,0)(0,0,0)[0] interceptar : AIC=-16607.961, Time=0.95 sec ARIMA(0,1,1)(0,0,0)[0] interceptar : AIC=-16608.035, Time=2.27 sec ARIMA(0,1,0)(0,0,0)[0] : AIC=-16609.560, Time=0.39 sec ARIMA(1,1,1)(0,0,0)[0] interceptar : AIC=-16606.477, Time=2.77 sec Best model: ARIMA(0,1,0)(0,0,0)[0] Tempo total de ajuste: 9.079 seconds SARIMAX Results ============================================================================== Dep. Variável: y Não. Observações: 4665 Modelo: SARIMAX(0, 1, 0) Probabilidade de registro 8305.780 Encontro: Ter, 24 Novembro 2020 AIC -16609.560 Tempo: 20:08:50 BIC -16603.113 Amostra: 0 HQIC -16607.293 - 4665 Tipo de covariância: opg ============================================================================== coef std err z P>|Com| [0.025 0.975] ------------------------------------------------------------------------------ sigma2 0.0017 1.06e-06 1566.660 0.000 0.002 0.002 =================================================================================== Ljung-Box (Q): 24.41 Jarque-Bera (JB): 859838819.58 Prob(Q): 0.98 Prob(JB): 0.00 Heteroesquedesticidade (H): 7.16 Enviesar: -37.54 Prob(H) (de dois lados): 0.00 Curtose: 2105.12 ===================================================================================
model_autoARIMA.plot_diagnósticos(figsize =(15,8)) plt.show()

modelo = ARIMA(train_data, ordem=(3, 1, 2)) equipado = modelo.fit(disp=-1) imprimir(equipado.resumo())
ARIMA Model Results ============================================================================== Dep. Variável: D.Close No. Observações: 4664 Modelo: ARIMA(3, 1, 2) Probabilidade de registro 8309.178 Método: css-mle S.D.. de inovações 0.041 Encontro: Ter, 24 Novembro 2020 AIC -16604.355 Tempo: 20:09:37 BIC -16559.222 Amostra: 1 HQIC -16588.481 ================================================================================= coef std err z P>|Com| [0.025 0.975] --------------------------------------------------------------------------------- const 8.761e-06 0.001 0.015 0.988 -0.001 0.001 ar. L1. D.Close 1.3689 0.251 5.460 0.000 0.877 1.860 ar. L2. D.Close -0.7118 0.277 -2.567 0.010 -1.255 -0.168 ar. L3. D.Close 0.0094 0.021 0.445 0.657 -0.032 0.051 mamã. L1. D.Close -1.3468 0.250 -5.382 0.000 -1.837 -0.856 mamã. L2. D.Close 0.6738 0.282 2.391 0.017 0.122 1.226 Roots ============================================================================= Real Imaginary Modulus Frequency ----------------------------------------------------------------------------- AR.1 0.9772 -0.6979j 1.2008 -0.0987 AR.2 0.9772 +0.6979j 1.2008 0.0987 AR.3 74.0622 -0.0000j 74.0622 -0.0000 MA.1 0.9994 -0.6966j 1.2183 -0.0969 MA.2 0.9994 +0.6966j 1.2183 0.0969 -----------------------------------------------------------------------------
# Forecast
fc, se, conf = fitted.forecast(519, alfa=0,05) # 95% confiança
fc_series = pd. Série(Fc, índice=test_data.índice)
lower_series = pd. Série(Conf[:, 0], índice=test_data.índice)
upper_series = pd. Série(Conf[:, 1], índice=test_data.índice)
plt.figure(figsize =(12,5), dpi = 100)
plt.plot(train_data, rótulo ="Treinamento")
plt.plot(dados de teste, color ="azul", rótulo ="Preço real das ações")
plt.plot(fc_series, color ="laranja",rótulo ="Preço das ações prevista")
plt.fill_between(lower_series.índice, lower_series, upper_series,
color ="k", alfa=.10)
plt.title('Previsão do Preço da Ação SBIN')
plt.xlabel('Tempo')
plt.ylabel('Preço Real da Ação')
plt.legend(loc ="superior esquerdo", fontsize = 8)
plt.show()

conclusão
A previsão de séries temporais é realmente útil quando temos que tomar decisões futuras ou quando temos que fazer análises, podemos fazer isso rapidamente usando ARIMA, existem muitos outros modelos a partir dos quais podemos fazer previsões de séries temporais, mas ARIMA é realmente fácil de entender.
Espero que este artigo o ajude e economize uma boa quantidade de tempo.. Deixe-me saber se você tem alguma sugestão..
CÓDIGO FELIZ.
Prabhat Pathak (Perfil do linkedIn) é analista sênior e entusiasta da inovação.



