Previsão do mercado de ações usando aprendizado de máquina [Implementação passo a passo]
Publicados: 2021-02-26Índice
Introdução
Previsão e análise do mercado de ações são algumas das tarefas mais complicadas de se fazer. Existem várias razões para isso, como a volatilidade do mercado e tantos outros fatores dependentes e independentes para decidir o valor de uma determinada ação no mercado. Esses fatores tornam muito difícil para qualquer analista do mercado de ações prever a alta e a queda com altos graus de precisão.
No entanto, com o advento do Machine Learning e seus algoritmos robustos, os mais recentes desenvolvimentos de análise de mercado e previsão do mercado de ações começaram a incorporar essas técnicas na compreensão dos dados do mercado de ações.
Em suma, os algoritmos de aprendizado de máquina estão sendo amplamente utilizados por muitas organizações na análise e previsão de valores de ações. Este artigo passará por uma implementação simples de análise e previsão dos valores de estoque de uma loja de varejo online popular mundial usando vários algoritmos de aprendizado de máquina em Python.
Declaração do problema
Antes de entrarmos na implementação do programa para prever os valores do mercado de ações, vamos visualizar os dados sobre os quais estaremos trabalhando. Aqui, estaremos analisando o valor das ações da Microsoft Corporation (MSFT) da National Association of Securities Dealers Automated Quotations (NASDAQ). Os dados do valor do estoque serão apresentados na forma de um arquivo separado por vírgulas (.csv), que pode ser aberto e visualizado usando o Excel ou uma planilha.
A MSFT tem suas ações registradas na NASDAQ e tem seus valores atualizados durante todos os dias úteis do mercado de ações. Observe que o mercado não permite negociações aos sábados e domingos; portanto, há uma lacuna entre as duas datas. Para cada data, o Valor de Abertura da ação, os valores mais alto e mais baixo dessa ação nos mesmos dias são anotados, juntamente com o valor de fechamento no final do dia.
O valor de fechamento ajustado mostra o valor da ação após os dividendos serem lançados (muito técnico!). Além disso, também é dado o volume total das ações no mercado, com esses dados, cabe ao trabalho de um Machine Learning/Data Scientist estudar os dados e implementar diversos algoritmos que possam extrair padrões do histórico de ações da Microsoft Corporation dados.
Memória de curto prazo longa
Para desenvolver um modelo de Machine Learning para prever os preços das ações da Microsoft Corporation, utilizaremos a técnica de Long Short-Term Memory (LSTM). Eles são usados para fazer pequenas modificações nas informações por multiplicações e adições. Por definição, a memória de longo prazo (LSTM) é uma arquitetura de rede neural recorrente artificial (RNN) usada em aprendizado profundo.
Ao contrário das redes neurais feed-forward padrão, o LSTM possui conexões de feedback. Ele pode processar pontos de dados únicos (como imagens) e sequências de dados inteiras (como fala ou vídeo). Para entender o conceito por trás do LSTM, vamos dar um exemplo simples de uma análise de um cliente online de um telefone celular.
Suponha que queremos comprar o celular, geralmente nos referimos às avaliações da rede por usuários certificados. Dependendo do pensamento e das contribuições deles, decidimos se o celular é bom ou ruim e depois o compramos. Conforme vamos lendo os comentários, procuramos por palavras-chave como “incrível”, “boa câmera”, “melhor bateria de reserva” e muitos outros termos relacionados a um telefone celular.
Tendemos a ignorar as palavras comuns em inglês como “it”, “gave”, “this”, etc. Assim, quando decidimos comprar ou não o celular, lembramos apenas dessas palavras-chave definidas acima. Muito provavelmente, esquecemos as outras palavras.
Esta é a mesma maneira pela qual o Algoritmo de Memória de Longo Prazo Curto funciona. Ele apenas lembra as informações relevantes e as usa para fazer previsões ignorando os dados não relevantes. Dessa forma, temos que construir um modelo LSTM que essencialmente reconheça apenas os dados essenciais sobre esse estoque e deixe de fora seus outliers.
Fonte
Embora a estrutura de uma arquitetura LSTM dada acima possa parecer intrigante no início, é suficiente lembrar que LSTM é uma versão avançada de Redes Neurais Recorrentes que retém memória para processar sequências de dados. Ele pode remover ou adicionar informações ao estado da célula, cuidadosamente regulado por estruturas chamadas portas.
A unidade LSTM compreende uma célula, uma porta de entrada, uma porta de saída e uma porta de esquecimento. A célula memoriza valores em intervalos de tempo arbitrários e as três portas regulam o fluxo de informações para dentro e para fora da célula.
Implementação do Programa
Passaremos para a parte em que colocamos o LSTM em uso para prever o valor das ações usando Machine Learning em Python.
Passo 1 – Importando as Bibliotecas
Como todos sabemos, o primeiro passo é importar as bibliotecas necessárias para pré-processar os dados de estoque da Microsoft Corporation e as demais bibliotecas necessárias para construir e visualizar as saídas do modelo LSTM. Para isso, usaremos a biblioteca Keras no framework TensorFlow. Os módulos necessários são importados da biblioteca Keras individualmente.
#Importando as Bibliotecas
importar pandas como PD
importar NumPy como np
%matplotlib em linha
importe matplotlib. pyplot como plt
importar matplotlib
de sklearn. Importação de pré-processamento MinMaxScaler
de Keras. camadas importam LSTM, Dense, Dropout
de sklearn.model_selection importar TimeSeriesSplit
de sklearn.metrics importam mean_squared_error, r2_score
importe matplotlib. datas como mandatos
de sklearn. Importação de pré-processamento MinMaxScaler
do sklearn import linear_model
de Keras. Importação de modelos Sequencial
de Keras. Importação de camadas Dense
importar Keras. Back-end como K
de Keras. Importação de retornos de chamada EarlyStopping
de Keras. Otimizadores importam Adam
de Keras. Modelos importam load_model
de Keras. Importação de camadas LSTM
de Keras. utils.vis_utils import plot_model
Passo 2 – Obtendo a visualização dos dados
Usando a biblioteca do leitor Pandas Data, devemos carregar os dados de estoque do sistema local como um arquivo de valor separado por vírgula (.csv) e armazená-lo em um DataFrame pandas. Por fim, também veremos os dados.
#Obter o conjunto de dados
df = pd.read_csv(“MicrosoftStockData.csv”,na_values=['null'],index_col='Data',parse_dates=True,infer_datetime_format=True)
df.head()
Obtenha a certificação de IA online das melhores universidades do mundo - mestrados, programas de pós-graduação executiva e programa de certificação avançada em ML e IA para acelerar sua carreira.
Etapa 3 – Imprima a forma do DataFrame e verifique se há valores nulos.
Nesta outra etapa crucial, primeiro imprimimos a forma do conjunto de dados. Para certificar-se de que não há valores nulos no quadro de dados, verificamos por eles. A presença de valores nulos no conjunto de dados tende a causar problemas durante o treinamento, pois atuam como outliers causando uma grande variação no processo de treinamento.
#Imprima a forma do Dataframe e verifique se há valores nulos
print("Forma do quadro de dados: ", df. forma)
print("Valor Nulo Presente: ", df.IsNull().values.any())
>> Forma do Dataframe: (7334, 6)
>>Valor Nulo Presente: Falso
Encontro: Data | Abrir | Alto | Baixo | Fechar | Ajustar Fechar | Volume |
02-01-1990 | 0,605903 | 0,616319 | 0,598090 | 0,616319 | 0,447268 | 53033600 |
1990-01-03 | 0,621528 | 0,626736 | 0,614583 | 0,619792 | 0,449788 | 113772800 |
1990-01-04 | 0,619792 | 0,638889 | 0,616319 | 0,638021 | 0,463017 | 125740800 |
1990-01-05 | 0,635417 | 0,638889 | 0,621528 | 0,622396 | 0,451678 | 69564800 |
08-01-1990 | 0,621528 | 0,631944 | 0,614583 | 0,631944 | 0,458607 | 58982400 |
Etapa 4 - Plotando o valor de fechamento ajustado verdadeiro
O valor de saída final que deve ser previsto usando o modelo de aprendizado de máquina é o valor de fechamento ajustado. Este valor representa o valor de fechamento da ação naquele dia específico de negociação no mercado de ações.
#Plot o valor True Adj Close
df['Adj Close'].plot()
Etapa 5 – Definindo a variável de destino e selecionando os recursos
Na próxima etapa, atribuímos a coluna de saída à variável de destino. Nesse caso, é o valor relativo ajustado do Microsoft Stock. Além disso, também selecionamos as características que atuam como variável independente para a variável alvo (variável dependente). Para dar conta do propósito de treinamento, escolhemos quatro características, que são:
- Abrir
- Alto
- Baixo
- Volume
#Definir variável de destino
output_var = PD.DataFrame(df['Adj Close'])
#Selecionando os recursos
features = ['Abrir', 'Alto', 'Baixo', 'Volume']
Passo 6 – Dimensionamento
Para reduzir o custo computacional dos dados na tabela, reduziremos os valores de estoque para valores entre 0 e 1. Desta forma, todos os dados em grandes números são reduzidos, reduzindo assim o uso de memória. Além disso, podemos obter mais precisão reduzindo a escala, pois os dados não são espalhados em valores tremendos. Isso é realizado pela classe MinMaxScaler da biblioteca sci-kit-learn.
#Scaling
escalar = MinMaxScaler()
feature_transform = scaler.fit_transform(df[recursos])
feature_transform= pd.DataFrame(columns=features, data=feature_transform, index=df.index)
feature_transform.head()
Encontro: Data | Abrir | Alto | Baixo | Volume |
02-01-1990 | 0,000129 | 0,000105 | 0,000129 | 0,064837 |
1990-01-03 | 0,000265 | 0,000195 | 0,000273 | 0,144673 |
1990-01-04 | 0,000249 | 0,000300 | 0,000288 | 0,160404 |
1990-01-05 | 0,000386 | 0,000300 | 0,000334 | 0,086566 |
08-01-1990 | 0,000265 | 0,000240 | 0,000273 | 0,072656 |
Como mencionado acima, vemos que os valores das variáveis de recurso são reduzidos para valores menores em comparação com os valores reais fornecidos acima.
Passo 7 – Dividindo para um conjunto de treinamento e um conjunto de teste.
Antes de alimentar os dados no modelo de treinamento, precisamos dividir todo o conjunto de dados em treinamento e conjunto de teste. O modelo LSTM de aprendizado de máquina será treinado nos dados presentes no conjunto de treinamento e testado no conjunto de teste para precisão e retropropagação.
Para isso, usaremos a classe TimeSeriesSplit da biblioteca sci-kit-learn. Definimos o número de divisões como 10, o que denota que 10% dos dados serão usados como conjunto de teste e 90% dos dados serão usados para treinar o modelo LSTM. A vantagem de usar essa divisão de séries temporais é que as amostras de dados de séries temporais divididas são observadas em intervalos de tempo fixos.
#Splitting para conjunto de treinamento e conjunto de teste
timesplit= TimeSeriesSplit(n_splits=10)
para train_index, test_index em timesplit.split(feature_transform):
X_train, X_test = feature_transform[:len(train_index)], feature_transform[len(train_index): (len(train_index)+len(test_index))]
y_train, y_test = output_var[:len(train_index)].values.ravel(), output_var[len(train_index): (len(train_index)+len(test_index))].values.ravel()
Etapa 8 – Processando os dados para LSTM
Assim que os conjuntos de treinamento e teste estiverem prontos, podemos alimentar os dados no modelo LSTM assim que ele for construído. Antes disso, precisamos converter os dados do conjunto de treinamento e teste em um tipo de dados que o modelo LSTM aceitará. Primeiro convertemos os dados de treinamento e os dados de teste em matrizes NumPy e, em seguida, os remodelamos para o formato (Número de Amostras, 1, Número de Recursos), pois o LSTM exige que os dados sejam alimentados no formato 3D. Como sabemos, o número de amostras no conjunto de treinamento é 90% de 7334, que é 6667, e o número de recursos é 4, o conjunto de treinamento é reformulado para (6667, 1, 4). Da mesma forma, o conjunto de teste também é reformulado.
#Processar os dados para LSTM
trainX =np.array(X_train)
testeX =np.array(X_test)
X_train = trainX.reshape(X_train.shape[0], 1, X_train.shape[1])
X_test = testX.reshape(X_test.shape[0], 1, X_test.shape[1])
Passo 9 – Construindo o Modelo LSTM
Finalmente, chegamos ao estágio em que construímos o Modelo LSTM. Aqui, criamos um modelo Sequential Keras com uma camada LSTM. A camada LSTM tem 32 unidades e é seguida por uma camada Densa de 1 neurônio.
Usamos o Adam Optimizer e o Mean Squared Error como a função de perda para compilar o modelo. Esses dois são a combinação mais preferida para um modelo LSTM. Além disso, o modelo também é plotado e é exibido abaixo.
#Construindo o modelo LSTM
lstm = Sequencial()
lstm.add(LSTM(32, input_shape=(1, trainX.shape[1]), ativação='relu', return_sequences=False))
lstm.add(Dense(1))
lstm.compile(loss='mean_squared_error', otimizador='adam')
plot_model(lstm, show_shapes=True, show_layer_names=True)
Passo 10 – Treinando o Modelo
Finalmente, treinamos o modelo LSTM projetado acima nos dados de treinamento para 100 épocas com um tamanho de lote de 8 usando a função de ajuste.
#Treinamento de modelos
history = lstm.fit(X_train, y_train, epochs=100, batch_size=8, verbose=1, shuffle=False)
Época 1/100
834/834 [==============================] – 3s 2ms/passo – perda: 67,1211
Época 2/100
834/834 [==============================] – 1s 2ms/passo – perda: 70.4911
Época 3/100
834/834 [==============================] – 1s 2ms/passo – perda: 48.8155
Época 4/100
834/834 [==============================] – 1s 2ms/passo – perda: 21,5447
Época 5/100
834/834 [==============================] – 1s 2ms/passo – perda: 6,1709
Época 6/100
834/834 [==============================] – 1s 2ms/passo – perda: 1,8726
Época 7/100
834/834 [==============================] – 1s 2ms/passo – perda: 0,9380
Época 8/100
834/834 [==============================] – 2s 2ms/passo – perda: 0,6566
Época 9/100
834/834 [==============================] – 1s 2ms/passo – perda: 0,5369
Época 10/100
834/834 [==============================] – 2s 2ms/passo – perda: 0,4761
.
.
.
.
Época 95/100
834/834 [==============================] – 1s 2ms/passo – perda: 0,4542
Época 96/100
834/834 [==============================] – 2s 2ms/passo – perda: 0,4553
Época 97/100
834/834 [==============================] – 1s 2ms/passo – perda: 0,4565
Época 98/100
834/834 [==============================] – 1s 2ms/passo – perda: 0,4576
Época 99/100
834/834 [==============================] – 1s 2ms/passo – perda: 0,4588
Época 100/100
834/834 [==============================] – 1s 2ms/passo – perda: 0,4599
Por fim, vemos que o valor da perda diminuiu exponencialmente ao longo do tempo durante o processo de treinamento de 100 épocas e atingiu um valor de 0,4599
Etapa 11 - Previsão LSTM
Com nosso modelo pronto, é hora de usar o modelo treinado usando a rede LSTM no conjunto de teste e prever o Valor de fechamento adjacente da ação da Microsoft. Isso é realizado usando a função simples de previsão no modelo lstm construído.
#LSTM Previsão
y_pred= lstm.predict(X_test)
Etapa 12 - Valor de fechamento ajustado real vs previsto - LSTM
Finalmente, como previmos os valores do conjunto de teste, podemos traçar o gráfico para comparar os valores verdadeiros de Adj Close e o valor previsto de Adj Close pelo modelo LSTM Machine Learning.
#True vs Predicted Adj Close Value – LSTM
plt.plot(y_test, label='True Value')
plt.plot(y_pred, label='Valor LSTM')
plt.title(“Previsão por LSTM”)
plt.xlabel('Escala de Tempo')
plt.ylabel('Escalado em USD')
plt.legend()
plt.show()
O gráfico acima mostra que algum padrão é detectado pelo modelo de rede LSTM simples muito básico construído acima. Ao ajustar vários parâmetros e adicionar mais camadas LSTM ao modelo, podemos obter uma representação mais precisa do valor das ações de qualquer empresa.
Conclusão
Se você estiver interessado em saber mais sobre exemplos de inteligência artificial, aprendizado de máquina, confira o Programa PG Executivo do IIIT-B & upGrad em Machine Learning e IA , projetado para profissionais que trabalham e oferece mais de 450 horas de treinamento rigoroso, mais de 30 estudos de caso e atribuições, status de ex-alunos do IIIT-B, mais de 5 projetos práticos práticos e assistência de trabalho com as principais empresas.
Você pode prever o mercado de ações usando aprendizado de máquina?
Hoje, temos uma série de indicadores para ajudar a prever as tendências do mercado. No entanto, não precisamos procurar além de um computador de alta potência para encontrar os indicadores mais precisos para o mercado de ações. O mercado de ações é um sistema aberto e pode ser visto como uma rede complexa. A rede é composta pelas relações entre as ações, empresas, investidores e volumes de negócios. Ao usar um algoritmo de mineração de dados como a máquina de vetores de suporte, você pode aplicar uma fórmula matemática para extrair as relações entre essas variáveis. O mercado de ações está agora além da previsão humana.
Qual algoritmo é melhor para previsão do mercado de ações?
Para melhores resultados, você deve usar a Regressão Linear. A Regressão Linear é uma abordagem estatística que é usada para determinar a relação entre duas variáveis diferentes. Neste exemplo, as variáveis são preço e tempo. Na previsão do mercado de ações, o preço é a variável independente e o tempo é a variável dependente. Se uma relação linear entre essas duas variáveis puder ser determinada, é possível prever com precisão o valor da ação em qualquer ponto no futuro.
A previsão do mercado de ações é um problema de classificação ou regressão?
Antes de responder, precisamos entender o que significam as previsões do mercado de ações. É um problema de classificação binária ou um problema de regressão? Suponha que queremos prever o futuro de uma ação, onde futuro significa o próximo dia, semana, mês ou ano. Se o desempenho passado da ação em algum momento é a entrada e o futuro é a saída, então é um problema de regressão. Se o desempenho passado de uma ação e o futuro de uma ação são independentes, então é um problema de classificação.