previsão de preços de ações usando a aprendizagem de máquinas e técnicas de aprendizagem profunda (com códigos Python)

introdução

previsão de como o mercado de ações irá realizar é uma das coisas mais difíceis de fazer. Há tantos fatores envolvidos na previsão-fatores físicos vs. comportamento fishológico, racional e irracional, etc. Todos estes aspectos se combinam para tornar os preços das acções voláteis e muito difíceis de prever com um elevado grau de precisão.

podemos usar a aprendizagem de máquinas como um modificador de jogos neste domínio? Usando recursos como os últimos anúncios sobre uma organização, seus resultados de receita trimestral, etc., técnicas de aprendizagem de máquinas têm o potencial de desenterrar padrões e insights que não vimos antes, e estes podem ser usados para fazer previsões irrefutavelmente precisas.Neste artigo, trabalharemos com dados históricos sobre os preços das acções de uma empresa cotada na bolsa. Vamos implementar uma mistura de algoritmos de aprendizagem de máquinas para prever o futuro preço de ações desta empresa, começando com algoritmos simples como média e regressão linear, e depois passar para técnicas avançadas como Auto ARIMA e LSTM.

a ideia principal por trás deste artigo é mostrar como estes algoritmos são implementados. Descreverei brevemente a técnica e fornecerei ligações relevantes para aperfeiçoar os conceitos conforme E quando necessário. No caso de ser um recém-chegado ao mundo das séries cronológicas, sugiro que reveja os seguintes artigos primeiro.:

  • a comprehensive beginner’s guide to create a Time Series Forecast
  • A Complete Tutorial on Time Series Modeling
  • Free Course: Time Series Forecasting using Python

Project to Practice Time Series Forecasting

Time Series forecasting & modeling plays an important role in data analysis. A análise de séries cronológicas é um ramo especializado de estatísticas utilizadas extensivamente em campos como Econometria & pesquisa de operações.

as séries cronológicas estão a ser amplamente utilizadas em análises & a ciência dos dados. Este é um problema específico de séries cronológicas para você e o desafio é prever o tráfego.

prática actual

é um principiante à procura de um local para iniciar a sua viagem de ciência dos dados? Apresentando um curso abrangente, cheio de conhecimento e aprendizagem de ciência dos dados, curados apenas para você! Este curso abrange tudo, desde o básico de aprendizagem de máquinas a conceitos avançados de ML, aprendizagem profunda e séries temporais.

  • Certificada AI & ML Blackbelt Programa+

Tabela de Conteúdo

    1. A compreensão do Problema Instrução
    2. Média móvel
    3. Regressão Linear
    4. k-Vizinhos mais próximos
    5. Auto ARIMA
    6. o Profeta
    7. Longo de Memória de Curto Prazo (LSTM)

a Compreensão do Problema Instrução

vamos mergulhar a parte de implementação deste artigo, em breve, mas primeiro, é importante estabelecer o que estamos tentando resolver. Em termos gerais, a análise do mercado bolsista divide – se em duas partes-Análise Fundamental e Análise Técnica.

  • Análise Fundamental envolve analisar a rentabilidade futura da empresa com base no seu ambiente de negócios atual e desempenho financeiro.
  • a análise técnica, por outro lado, inclui a leitura dos gráficos e a utilização de dados estatísticos para identificar as tendências no mercado bolsista.

como você poderia ter adivinhado, nosso foco será na parte da análise técnica. Vamos usar um conjunto de dados de Quandl (você pode encontrar dados históricos para vários estoques aqui) e para este projeto em particular, eu usei os dados para ‘Tata Global Beverages’. Hora de mergulhar!

Nota: Aqui é o conjunto de dados que usei para o código: Baixar

primeiro Nós vamos carregar o conjunto de dados e definir a variável-alvo para o problema:

#import packagesimport pandas as pdimport numpy as np#to plot within notebookimport matplotlib.pyplot as plt%matplotlib inline#setting figure sizefrom matplotlib.pylab import rcParamsrcParams = 20,10#for normalizing datafrom sklearn.preprocessing import MinMaxScalerscaler = MinMaxScaler(feature_range=(0, 1))#read the filedf = pd.read_csv('NSE-TATAGLOBAL(1).csv')#print the headdf.head()

Existem várias variáveis no conjunto de dados – data, aberta, alta, baixa, por último, fechar, total_trade_quantity, e o volume de negócios.

  • as colunas abertas e fechadas representam o preço inicial e final a que as acções são negociadas num determinado dia.
  • Alta, Baixa e última representam o preço máximo, mínimo e último da ação para o dia.
  • quantidade total de transacções é o número de acções compradas ou vendidas no dia e o volume de negócios (Lacs) é o volume de negócios da empresa em causa numa determinada data.

outra coisa importante a notar é que o mercado é fechado nos fins de semana e feriados.Reparem na tabela acima, faltam alguns valores de data-2/10/2018, 6/10/2018, 7/10/2018. Destas datas, 2 é um feriado nacional, enquanto 6ª e 7ª outono em um fim de semana.

o cálculo dos lucros ou perdas é geralmente determinado pelo preço de encerramento de um estoque para o dia, portanto, vamos considerar o preço de encerramento como a variável alvo. Vamos parcela variável-alvo para entender como ele está se moldando em nossos dados:

#setting index as datedf = pd.to_datetime(df.Date,format='%Y-%m-%d')df.index = df#plotplt.figure(figsize=(16,8))plt.plot(df, label='Close Price history')

Nas próximas seções, vamos explorar essas variáveis e usar diferentes técnicas para prever o preço de fechamento diário das ações.

Média móvel

Introdução

‘Média’ é facilmente uma das coisas mais comuns que usamos no nosso dia-a-dia. Por exemplo, calcular as marcas médias para determinar o desempenho global, ou encontrar a temperatura média dos últimos dias para ter uma idéia sobre a temperatura de hoje – tudo isso são tarefas rotineiras que fazemos em uma base regular. Então este é um bom ponto de partida para usar em nosso conjunto de dados para fazer previsões.

o preço de encerramento previsto para cada dia será a média de um conjunto de valores previamente observados. Em vez de usar a média simples, estaremos usando a técnica de média móvel que usa o mais recente conjunto de valores para cada previsão. Em outras palavras, para cada passo subsequente, os valores previstos são levados em consideração ao remover o mais antigo valor observado do conjunto. Aqui está uma figura simples que vai ajudá-lo a entender isso com mais clareza.

vamos implementar esta técnica no nosso conjunto de dados. O primeiro passo é criar um dataframe que contém apenas a data e fechar colunas de preços, em seguida, dividi-lo em conjuntos de trem e validação para verificar nossas previsões.

implementação

apenas verificar o RMSE não nos ajuda a compreender como o modelo funcionou. Vamos visualizar isso para obter uma compreensão mais intuitiva. Então aqui está um gráfico dos valores previstos juntamente com os valores reais.

#plotvalid = 0valid = predsplt.plot(train)plt.plot(valid])

inferência

o valor RMSE é próximo de 105, mas os resultados não são muito promissores (como você pode obter a partir do gráfico). Os valores previstos são da mesma gama que os valores observados no conjunto de comboios (há uma tendência de aumento inicialmente e, em seguida, uma diminuição lenta).

na próxima seção, vamos olhar para duas técnicas de aprendizagem de máquinas comumente usadas-regressão Linear e kNN, e ver como eles funcionam em nossos dados do mercado de ações.

Regressão Linear

introdução

o algoritmo mais básico de aprendizagem de máquinas que pode ser implementado nestes dados é a regressão linear. O modelo de regressão linear retorna uma equação que determina a relação entre as variáveis independentes e a variável dependente.

a equação para a regressão linear pode ser escrita como:

aqui, x1, x2, … xn representam as variáveis independentes enquanto os coeficientes θ1, θ2,… θn representam os pesos. Você pode se referir ao seguinte artigo para estudar regressão linear em mais detalhes:

  • um guia abrangente de Iniciantes Para a regressão Linear, Ridge e Lasso.

para a nossa Declaração de problemas, não temos um conjunto de variáveis independentes. Em vez disso, só temos as datas. Vamos usar a coluna de data para extrair recursos como-Dia, Mês, Ano, mon/fri etc. e então encaixar um modelo de regressão linear.

implementação

primeiro ordenaremos o conjunto de dados em ordem ascendente e então criaremos um conjunto de dados separado para que qualquer nova funcionalidade criada não afecte os dados originais.

#setting index as date valuesdf = pd.to_datetime(df.Date,format='%Y-%m-%d')df.index = df#sortingdata = df.sort_index(ascending=True, axis=0)#creating a separate datasetnew_data = pd.DataFrame(index=range(0,len(df)),columns=)for i in range(0,len(data)): new_data = data new_data = data
#create featuresfrom fastai.structured import add_datepartadd_datepart(new_data, 'Date')new_data.drop('Elapsed', axis=1, inplace=True) #elapsed will be the time stamp

isto cria funcionalidades como::

‘Ano’, ‘Mês’, ‘Semana’, ‘Dia’, ‘Dayofweek’, ‘Dayofyear’, ‘Is_month_end’, ‘Is_month_start’, ‘Is_quarter_end’, ‘Is_quarter_start’, ‘Is_year_end’, e ‘Is_year_start’.

nota: eu usei o add_ datepart da biblioteca fastai. Se não o tiver instalado, pode simplesmente usar o comando pip install fastai. Caso contrário, você pode criar este recurso usando simples para loops em python. Eu mostrei um exemplo abaixo.Além disso, podemos adicionar o nosso próprio conjunto de características que acreditamos serem relevantes para as previsões. Por exemplo, minha hipótese é que os primeiros e Últimos Dias da semana poderiam potencialmente afetar o preço de fechamento das ações muito mais do que os outros dias. Então eu criei um recurso que identifica se um determinado dia é Segunda-feira / sexta-feira ou terça-feira / Quarta-feira / quinta-feira. Isto pode ser feito usando as seguintes linhas de código:

new_data = 0for i in range(0,len(new_data)): if (new_data == 0 or new_data == 4): new_data = 1 else: new_data = 0

se o dia da Semana for igual a 0 ou 4, o valor da coluna será 1, caso contrário 0. Da mesma forma, você pode criar várias funcionalidades. Se você tem algumas idéias para recursos que podem ser úteis na previsão do preço das ações, por favor, partilhe na seção de comentários.

vamos agora dividir os dados em conjuntos de comboio e validação para verificar o desempenho do modelo.Resultados

#make predictions and find the rmsepreds = model.predict(x_valid)rms=np.sqrt(np.mean(np.power((np.array(y_valid)-np.array(preds)),2)))rms

121.16291596523156

o valor RMSE é maior do que a técnica anterior, o que mostra claramente que a regressão linear foi mal executada. Vejamos o enredo e entender o porquê de regressão linear não tem feito bem:

#plotvalid = 0valid = predsvalid.index = new_data.indextrain.index = new_data.indexplt.plot(train)plt.plot(valid])

Inferência

regressão Linear é uma técnica simples e muito fácil de interpretar, mas existem algumas óbvias desvantagens. Um problema no uso de algoritmos de regressão é que o modelo ultrapassa a coluna de data e mês. Em vez de levar em conta os valores anteriores do ponto de Previsão, o modelo irá considerar o valor a partir da mesma data há um mês, ou a mesma data/mês há um ano.

conforme observado na parcela acima, em janeiro de 2016 e janeiro de 2017, houve uma queda no preço das ações. O modelo previu o mesmo para janeiro de 2018. Uma técnica de regressão linear pode executar bem para problemas como as vendas do Big Mart onde as características independentes são úteis para determinar o valor alvo.

K-vizinhos mais próximos

introdução

outro algoritmo de ML interessante que se pode usar aqui é o kNN (K vizinhos mais próximos). Com base nas variáveis independentes, a kNN Encontra a semelhança entre novos pontos de dados e antigos pontos de dados. Permitam-me que explique isto com um exemplo simples.

considere a altura e a idade para 11 pessoas. Sobre a base de recursos (‘Idade’ e ‘Altura’), a tabela pode ser representado em um formato gráfico, como mostrado abaixo:

Para determinar o peso para a ID #11, kNN considera o peso dos vizinhos mais próximos desta IDENTIFICAÇÃO. O peso de ID #11 é previsto para ser a média de seus vizinhos. Se considerarmos três vizinhos (k = 3) por agora, o peso para ID # 11 seria = (77+72+60)/3 = 69.66 kg.

para uma compreensão detalhada do kNN, você pode se referir aos seguintes artigos:

  • Introdução aos vizinhos mais próximos: Simplificado

  • Uma Introdução Prática ao K-Vizinhos mais próximos Algoritmo para a Regressão

Implementação

#importing librariesfrom sklearn import neighborsfrom sklearn.model_selection import GridSearchCVfrom sklearn.preprocessing import MinMaxScalerscaler = MinMaxScaler(feature_range=(0, 1))

Usando o mesmo trem e conjunto de validação da última seção:

#scaling datax_train_scaled = scaler.fit_transform(x_train)x_train = pd.DataFrame(x_train_scaled)x_valid_scaled = scaler.fit_transform(x_valid)x_valid = pd.DataFrame(x_valid_scaled)#using gridsearch to find the best parameterparams = {'n_neighbors':}knn = neighbors.KNeighborsRegressor()model = GridSearchCV(knn, params, cv=5)#fit the model and make predictionsmodel.fit(x_train,y_train)preds = model.predict(x_valid)

Resultados

#rmserms=np.sqrt(np.mean(np.power((np.array(y_valid)-np.array(preds)),2)))rms
115.17086550026721

não Existe uma enorme diferença no valor de RMSE, mas um terreno para a previsão de valores reais e deve fornecer uma mais clara compreensão.

#plotvalid = 0valid = predsplt.plot(valid])plt.plot(train)

inferência

o valor RMSE é quase semelhante ao modelo de regressão linear e o gráfico mostra o mesmo padrão. Tal como a regressão linear, a kNN também identificou uma queda em janeiro de 2018, uma vez que este tem sido o padrão nos últimos anos. Podemos dizer com segurança que os algoritmos de regressão não tiveram um bom desempenho neste conjunto de dados.

vamos em frente e olhar para algumas técnicas de previsão de séries cronológicas para descobrir como eles funcionam quando confrontados com este Desafio de previsão de preços de ações.

auto ARIMA

Introduction

ARIMA is a very popular statistical method for time series for forecasting. Os modelos ARIMA levam em conta os valores passados para prever os valores futuros. Existem três parâmetros importantes ARIMA:

  • p (últimos valores usados para prever o próximo valor)
  • q (passado de erros de previsão utilizado para prever os valores futuros)
  • d (ordem de diferenciação)

Parâmetro de ajuste para ARIMA consome muito tempo. Então vamos usar o auto ARIMA que automaticamente seleciona a melhor combinação de (P,q,d) que fornece o menor erro. Para ler mais sobre como funciona o auto ARIMA, consulte este artigo:

  • Compilação de Alto Desempenho de Modelos de Série de Tempo usando o Auto ARIMA

Implantação

from pyramid.arima import auto_arimadata = df.sort_index(ascending=True, axis=0)train = datavalid = datatraining = trainvalidation = validmodel = auto_arima(training, start_p=1, start_q=1,max_p=3, max_q=3, m=12,start_P=0, seasonal=True,d=1, D=1, trace=True,error_action='ignore',suppress_warnings=True)model.fit(training)forecast = model.predict(n_periods=248)forecast = pd.DataFrame(forecast,index = valid.index,columns=)

Resultados

rms=np.sqrt(np.mean(np.power((np.array(valid)-np.array(forecast)),2)))rms
44.954584993246954
#plotplt.plot(train)plt.plot(valid)plt.plot(forecast)

Inferência

Como vimos anteriormente, um automóvel modelo ARIMA usa dados do passado para compreender o padrão da série temporal. Usando estes valores, o modelo captou uma tendência crescente na série. Embora as previsões que utilizam esta técnica sejam muito melhores do que as dos modelos de aprendizagem automática anteriormente implementados, estas previsões ainda não estão perto dos valores reais.

como é evidente a partir da parcela, o modelo captou uma tendência na série, mas não se concentra na parte sazonal. Na próxima seção, vamos implementar um modelo de série cronológica que leva em conta a tendência e sazonalidade de uma série.

o Profeta

Introdução

Há um número de série de tempo, técnicas que podem ser implementadas na bolsa de valores de previsão conjunto de dados, mas a maioria destas técnicas requer uma grande quantidade de dados pré-processamento antes da montagem do modelo. Prophet, projetado e pioneiro pelo Facebook, é uma biblioteca de previsão de séries temporais que não requer nenhum pré-processamento de dados e é extremamente simples de implementar. A entrada para Prophet é um dataframe com duas colunas: Data e alvo (ds e y).

Prophet tenta capturar a sazonalidade nos dados passados e funciona bem quando o conjunto de dados é grande. Aqui está um artigo interessante que explica profeta de uma forma simples e intuitiva:

  • gerar previsões rápidas e precisas de Séries Temporais usando o Profeta do Facebook.

Implantação

#importing prophetfrom fbprophet import Prophet#creating dataframenew_data = pd.DataFrame(index=range(0,len(df)),columns=)for i in range(0,len(data)): new_data = data new_data = datanew_data = pd.to_datetime(new_data.Date,format='%Y-%m-%d')new_data.index = new_data#preparing datanew_data.rename(columns={'Close': 'y', 'Date': 'ds'}, inplace=True)#train and validationtrain = new_datavalid = new_data#fit the modelmodel = Prophet()model.fit(train)#predictionsclose_prices = model.make_future_dataframe(periods=len(valid))forecast = model.predict(close_prices)

Resultados

#rmseforecast_valid = forecastrms=np.sqrt(np.mean(np.power((np.array(valid)-np.array(forecast_valid)),2)))rms
57.494461930575149
#plotvalid = 0valid = forecast_valid.valuesplt.plot(train)plt.plot(valid])

Inferência

o Profeta (como a maioria das técnicas de previsão de séries de tempo) tenta capturar a tendência e a sazonalidade, a partir de dados passados. Este modelo geralmente tem um bom desempenho em conjuntos de dados de séries cronológicas, mas não consegue estar à altura da sua reputação neste caso.

ao que parece, os preços das acções não têm uma tendência ou sazonalidade particulares. Depende muito do que se passa actualmente no mercado e, por conseguinte, os preços sobem e descem. Assim, técnicas de Previsão como ARIMA, SARIMA e Prophet não mostram bons resultados para este problema particular.

vamos em frente e tentar outra técnica avançada-memória de longo prazo (LSTM).

memória de longo prazo (LSTM)

introdução

LSTMs são amplamente utilizados para problemas de previsão de sequências e têm provado ser extremamente eficazes. A razão pela qual eles trabalham tão bem é porque o LSTM é capaz de armazenar informações passadas que são importantes, e esquecer a informação que não é. A LSTM tem três portões.:

  • o portão de entrada: O portão de entrada adiciona informações para a célula estado
  • esquecer-se do portão: Ele remove a informação de que não é mais necessário pelo modelo
  • A saída do portão: Portão de Saída em LSTM seleciona a informação a ser mostrada como saída

Para uma compreensão mais detalhada de LSTM e de sua arquitetura, você pode ir até o artigo abaixo:

  • Introdução ao Longo de Memória de Curto Prazo

Por agora, vamos implementar LSTM como uma caixa preta e verificar o seu desempenho no nosso particular de dados.

Implantação

#importing required librariesfrom sklearn.preprocessing import MinMaxScalerfrom keras.models import Sequentialfrom keras.layers import Dense, Dropout, LSTM#creating dataframedata = df.sort_index(ascending=True, axis=0)new_data = pd.DataFrame(index=range(0,len(df)),columns=)for i in range(0,len(data)): new_data = data new_data = data#setting indexnew_data.index = new_data.Datenew_data.drop('Date', axis=1, inplace=True)#creating train and test setsdataset = new_data.valuestrain = datasetvalid = dataset#converting dataset into x_train and y_trainscaler = MinMaxScaler(feature_range=(0, 1))scaled_data = scaler.fit_transform(dataset)x_train, y_train = , for i in range(60,len(train)): x_train.append(scaled_data) y_train.append(scaled_data)x_train, y_train = np.array(x_train), np.array(y_train)x_train = np.reshape(x_train, (x_train.shape,x_train.shape,1))# create and fit the LSTM networkmodel = Sequential()model.add(LSTM(units=50, return_sequences=True, input_shape=(x_train.shape,1)))model.add(LSTM(units=50))model.add(Dense(1))model.compile(loss='mean_squared_error', optimizer='adam')model.fit(x_train, y_train, epochs=1, batch_size=1, verbose=2)#predicting 246 values, using past 60 from the train datainputs = new_data.valuesinputs = inputs.reshape(-1,1)inputs = scaler.transform(inputs)X_test = for i in range(60,inputs.shape): X_test.append(inputs)X_test = np.array(X_test)X_test = np.reshape(X_test, (X_test.shape,X_test.shape,1))closing_price = model.predict(X_test)closing_price = scaler.inverse_transform(closing_price)

Resultados

rms=np.sqrt(np.mean(np.power((valid-closing_price),2)))rms
11.772259608962642
#for plottingtrain = new_datavalid = new_datavalid = closing_priceplt.plot(train)plt.plot(valid])

Inferência

Uau! O modelo LSTM pode ser ajustado para vários parâmetros, tais como mudar o número de camadas LSTM, adicionando o valor de desistência ou aumentando o número de epochs. Mas as previsões da LSTM são suficientes para identificar se o preço das ações vai aumentar ou diminuir? Claro que não!Como mencionei no início do artigo, o preço das ações é afetado pelas notícias sobre a empresa e outros fatores como a demonetização ou fusão/cisão das empresas. Existem também certos factores intangíveis que muitas vezes são impossíveis de prever antecipadamente.

End Notes

Time series forecasting is a very intriguing field to work with, as I have realized during my time writing these articles. Há uma percepção na comunidade de que é um campo complexo, e enquanto há um grão de verdade lá dentro, não é tão difícil assim que você começa o jeito das técnicas básicas.

Deixe uma resposta

O seu endereço de email não será publicado.