Previsão do preço das ações e previsão do preço das ações usando LSTM empilhado

Conteúdo

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ável 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 índice 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 profundo.

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()
66911pic-1-5764006
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()
29909pic2-5264251
plt.figure(figsize =(10,6))
df_close = sbin['Fechar']
df_close.plot(estilo ="k.")
plt.title('Gráfico de dispersão do preço de fecho')
plt.show()
29006scattter20plot-5883203
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()
39933hist-gram-5004076

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

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'])
69039pic5-6509270
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)
18405pic6-6395540
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()
36363pic7-6657619

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 Treinamento 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()
88876pic8-9455734
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()
20054pic9-6726978
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()
39008pic2012-7065525

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.

Assine a nossa newsletter

Nós não enviaremos SPAM para você. Nós odiamos isso tanto quanto você.

Datapeaker