Previsione del mercato azionario utilizzando l'apprendimento automatico [implementazione passo passo]
Pubblicato: 2021-02-26Sommario
introduzione
La previsione e l'analisi del mercato azionario sono alcuni dei compiti più complicati da fare. Ci sono diverse ragioni per questo, come la volatilità del mercato e tanti altri fattori dipendenti e indipendenti per decidere il valore di un particolare titolo sul mercato. Questi fattori rendono molto difficile per qualsiasi analista del mercato azionario prevedere l'aumento e il calo con livelli di precisione elevati.
Tuttavia, con l'avvento del Machine Learning e dei suoi robusti algoritmi, le ultime analisi di mercato e gli sviluppi di Stock Market Prediction hanno iniziato a incorporare tali tecniche nella comprensione dei dati del mercato azionario.
In breve, gli algoritmi di apprendimento automatico sono ampiamente utilizzati da molte organizzazioni per analizzare e prevedere i valori delle azioni. Questo articolo esaminerà una semplice implementazione dell'analisi e della previsione dei valori delle azioni di un negozio al dettaglio online popolare in tutto il mondo utilizzando diversi algoritmi di apprendimento automatico in Python.
Dichiarazione problema
Prima di entrare nell'implementazione del programma per prevedere i valori del mercato azionario, visualizziamo i dati su cui lavoreremo. Qui, analizzeremo il valore delle azioni di Microsoft Corporation (MSFT) dalla National Association of Securities Dealers Automated Quotations (NASDAQ). I dati sul valore delle azioni verranno presentati sotto forma di un file separato da virgole (.csv), che può essere aperto e visualizzato utilizzando Excel o un foglio di calcolo.
MSFT ha le sue azioni registrate nel NASDAQ e ha i suoi valori aggiornati durante ogni giorno lavorativo del mercato azionario. Nota che il mercato non consente il trading di sabato e domenica; quindi c'è un divario tra le due date. Per ciascuna data vengono annotati il Valore di Apertura del titolo, i valori Massimo e Minimo di quel titolo negli stessi giorni, insieme al Valore di Chiusura alla fine della giornata.
Il valore di chiusura rettificato mostra il valore del titolo dopo la pubblicazione dei dividendi (troppo tecnico!). Inoltre, viene fornito anche il volume totale delle azioni sul mercato. Con questi dati, spetta al lavoro di un Machine Learning/Data Scientist studiare i dati e implementare diversi algoritmi in grado di estrarre modelli dallo storico delle azioni di Microsoft Corporation dati.

Memoria a lungo termine
Per sviluppare un modello di Machine Learning per prevedere i prezzi delle azioni di Microsoft Corporation, utilizzeremo la tecnica della memoria a lungo termine (LSTM). Sono usati per apportare piccole modifiche alle informazioni mediante moltiplicazioni e addizioni. Per definizione, la memoria a lungo termine (LSTM) è un'architettura di rete neurale ricorrente (RNN) artificiale utilizzata nel deep learning.
A differenza delle reti neurali feed-forward standard, LSTM ha connessioni di feedback. Può elaborare singoli punti dati (come immagini) e intere sequenze di dati (come voce o video). Per comprendere il concetto alla base di LSTM, prendiamo un semplice esempio di recensione online di un telefono cellulare da parte di un cliente.
Supponiamo di voler acquistare il Mobile Phone, di solito ci riferiamo alle recensioni nette degli utenti certificati. A seconda del loro pensiero e dei loro input, decidiamo se il cellulare è buono o cattivo e quindi lo acquistiamo. Mentre continuiamo a leggere le recensioni, cerchiamo parole chiave come "incredibile", "buona fotocamera", "miglior backup della batteria" e molti altri termini relativi a un telefono cellulare.
Tendiamo a ignorare le parole comuni in inglese come "it", "gave", "this", ecc. Pertanto, quando decidiamo se acquistare o meno il cellulare, ricordiamo solo queste parole chiave sopra definite. Molto probabilmente, dimentichiamo le altre parole.
Questo è lo stesso modo in cui funziona l'algoritmo della memoria a lungo termine. Ricorda solo le informazioni rilevanti e le usa per fare previsioni ignorando i dati non rilevanti. In questo modo, dobbiamo costruire un modello LSTM che essenzialmente riconosca solo i dati essenziali su quel titolo e ne trascuri i valori anomali.
Fonte
Sebbene la struttura sopra indicata di un'architettura LSTM possa sembrare intrigante all'inizio, è sufficiente ricordare che LSTM è una versione avanzata di Recurrent Neural Networks che conserva la memoria per elaborare sequenze di dati. Può rimuovere o aggiungere informazioni allo stato cellulare, attentamente regolato da strutture chiamate porte.
L'unità LSTM comprende una cella, una porta di ingresso, una porta di uscita e una porta di dimenticanza. La cella ricorda i valori su intervalli di tempo arbitrari e le tre porte regolano il flusso di informazioni in entrata e in uscita dalla cella.
Attuazione del programma
Passeremo alla parte in cui utilizzeremo LSTM per prevedere il valore delle azioni utilizzando Machine Learning in Python.
Passaggio 1: importare le librerie
Come tutti sappiamo, il primo passo è importare le librerie necessarie per preelaborare i dati di stock di Microsoft Corporation e le altre librerie necessarie per costruire e visualizzare gli output del modello LSTM. Per questo, utilizzeremo la libreria Keras nel framework TensorFlow. I moduli richiesti vengono importati singolarmente dalla libreria Keras.
#Importare le biblioteche
importa panda come PD
importa NumPy come np
%matplotlib in linea
importa matplotlib. pyplot come plt
importa matplotlib
da sklearn. Importazione di preelaborazione MinMaxScaler
di Keras. i livelli importano LSTM, Dense, Dropout
da sklearn.model_selection importa TimeSeriesSplit
da sklearn.metrics import mean_squared_error, r2_score
importa matplotlib. date come mandati
da sklearn. Importazione di preelaborazione MinMaxScaler
da sklearn import linear_model
di Keras. Importazione modelli sequenziale
di Keras. I livelli importano Denso
importa Keras. Backend come K
di Keras. Le richiamate importano EarlyStopping
di Keras. Gli ottimizzatori importano Adam
di Keras. I modelli importano load_model
di Keras. I livelli importano LSTM
di Keras. utils.vis_utils importa plot_model
Passaggio 2: visualizzazione dei dati
Utilizzando la libreria del lettore di dati Pandas, caricheremo i dati delle scorte del sistema locale come file Comma Separated Value (.csv) e li memorizzeremo in un DataFrame pandas. Infine, esamineremo anche i dati.
#Ottieni il set di dati
df = pd.read_csv("MicrosoftStockData.csv",na_values=['null'],index_col='Date',parse_dates=True,infer_datetime_format=True)
df.head()
Ottieni la certificazione AI online dalle migliori università del mondo: master, programmi post-laurea esecutivi e programma di certificazione avanzata in ML e AI per accelerare la tua carriera.
Passaggio 3: stampare la forma DataFrame e verificare la presenza di valori Null.
In questo ulteriore passaggio cruciale, stampiamo prima la forma del set di dati. Per assicurarci che non ci siano valori nulli nel frame di dati, li controlliamo. La presenza di valori nulli nel set di dati tende a causare problemi durante l'addestramento poiché agiscono come valori anomali causando un'ampia varianza nel processo di addestramento.
#Stampa forma dataframe e verifica valori nulli
print("Forma dataframe: ", forma df.)
print("Null Value Present: ", df.IsNull().values.any())
>> Forma frame dati: (7334, 6)
>>Null Value Present: Falso
Data | Aprire | Alto | Basso | Vicino | Agg Chiudi | Volume |
02-01-1990 | 0.605903 | 0.616319 | 0,598090 | 0.616319 | 0,447268 | 53033600 |
03-01-1990 | 0.621528 | 0.626736 | 0,614583 | 0.619792 | 0,449788 | 113772800 |
04-01-1990 | 0.619792 | 0.638889 | 0.616319 | 0.638021 | 0,463017 | 125740800 |
05-01-1990 | 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 |
Passaggio 4: tracciare il valore di chiusura corretto corretto
Il valore di output finale che deve essere previsto utilizzando il modello di Machine Learning è il valore di chiusura rettificato. Questo valore rappresenta il valore di chiusura del titolo in quel particolare giorno di negoziazione del mercato azionario.
#Traccia il valore di chiusura dell'adj vero
df['Chiudi adj'].plot()
Passaggio 5: impostazione della variabile target e selezione delle funzionalità
Nel passaggio successivo, assegniamo la colonna di output alla variabile di destinazione. In questo caso, è il valore relativo rettificato di Microsoft Stock. Inoltre, selezioniamo anche le caratteristiche che fungono da variabile indipendente rispetto alla variabile target (variabile dipendente). Per tenere conto dello scopo della formazione, scegliamo quattro caratteristiche, che sono:

- Aprire
- Alto
- Basso
- Volume
#Imposta variabile di destinazione
output_var = PD.DataFrame(df['Chiudi adj'])
#Selezione delle caratteristiche
caratteristiche = ['Aperto', 'Alto', 'Basso', 'Volume']
Passaggio 6: ridimensionamento
Per ridurre il costo di calcolo dei dati nella tabella, riduciamo i valori stock a valori compresi tra 0 e 1. In questo modo, tutti i dati in grandi numeri vengono ridotti, riducendo così l'utilizzo della memoria. Inoltre, possiamo ottenere una maggiore precisione ridimensionando poiché i dati non sono distribuiti in valori enormi. Questo viene eseguito dalla classe MinMaxScaler della libreria sci-kit-learn.
#Ridimensionamento
scaler = MinMaxScaler()
feature_transform = scaler.fit_transform(df[caratteristiche])
feature_transform= pd.DataFrame(colonne=features, data=feature_transform, index=df.index)
feature_transform.head()
Data | Aprire | Alto | Basso | Volume |
02-01-1990 | 0.000129 | 0.000105 | 0.000129 | 0,064837 |
03-01-1990 | 0.000265 | 0.000195 | 0.000273 | 0,144673 |
04-01-1990 | 0.000249 | 0.000300 | 0.000288 | 0.160404 |
05-01-1990 | 0.000386 | 0.000300 | 0.000334 | 0,086566 |
08-01-1990 | 0.000265 | 0.000240 | 0.000273 | 0,072656 |
Come accennato in precedenza, vediamo che i valori delle variabili di funzionalità vengono ridimensionati a valori inferiori rispetto ai valori reali indicati sopra.
Passaggio 7: suddivisione in un set di allenamento e in un set di test.
Prima di inserire i dati nel modello di addestramento, è necessario suddividere l'intero set di dati in set di addestramento e test. Il modello Machine Learning LSTM sarà addestrato sui dati presenti nel set di addestramento e testato sul set di test per accuratezza e backpropagation.
Per questo, utilizzeremo la classe TimeSeriesSplit della libreria sci-kit-learn. Impostiamo il numero di suddivisioni su 10, il che indica che il 10% dei dati verrà utilizzato come set di test e il 90% dei dati verrà utilizzato per il training del modello LSTM. Il vantaggio dell'utilizzo di questa suddivisione delle serie temporali è che i campioni di dati delle serie temporali parziali vengono osservati a intervalli di tempo fissi.
#Splitting to Training set e Test set
timesplit= TimeSeriesSplit(n_splits=10)
per train_index, test_index in 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()
Passaggio 8: elaborazione dei dati per LSTM
Una volta che i set di addestramento e test sono pronti, possiamo inserire i dati nel modello LSTM una volta creato. Prima di ciò, è necessario convertire i dati di training e test set in un tipo di dati che il modello LSTM accetterà. Prima convertiamo i dati di addestramento e testiamo in array NumPy, quindi li rimodelliamo nel formato (Numero di campioni, 1, Numero di funzionalità) poiché LSTM richiede che i dati vengano inseriti in forma 3D. Come sappiamo, il numero di campioni nel set di addestramento è il 90% di 7334, che è 6667, e il numero di funzioni è 4, il set di addestramento viene rimodellato in (6667, 1, 4). Allo stesso modo, anche il set di test viene rimodellato.
#Elabora i dati per LSTM
trenoX =np.array(X_treno)
testX =np.array(X_test)
X_train = trenoX.reshape(X_train.shape[0], 1, X_train.shape[1])
X_test = testX.reshape(X_test.shape[0], 1, X_test.shape[1])
Passaggio 9: costruire il modello LSTM
Infine, arriviamo alla fase in cui costruiamo il modello LSTM. Qui creiamo un modello Keras sequenziale con un livello LSTM. Lo strato LSTM ha 32 unità ed è seguito da uno strato denso di 1 neurone.
Usiamo Adam Optimizer e Mean Squared Error come funzione di perdita per la compilazione del modello. Questi due sono la combinazione più preferita per un modello LSTM. Inoltre, anche il modello viene tracciato e visualizzato di seguito.
#Costruire il modello LSTM
lstm = sequenziale()
lstm.add(LSTM(32, input_shape=(1, trainX.shape[1]), activation='relu', return_sequences=False))
lstm.add(Dense(1))
lstm.compile(loss='mean_squared_error', ottimizzatore='adam')
plot_model(lstm, show_shapes=True, show_layer_names=True)
Passaggio 10: addestrare il modello
Infine, addestriamo il modello LSTM progettato sopra sui dati di allenamento per 100 epoche con una dimensione batch di 8 utilizzando la funzione di adattamento.
#Formazione modello
history = lstm.fit(X_train, y_train, epochs=100, batch_size=8, verbose=1, shuffle=False)
Epoca 1/100
834/834 [================================] – 3s 2ms/passo – perdita: 67.1211
Epoca 2/100
834/834 [================================] – 1s 2ms/passo – perdita: 70.4911
Epoca 3/100
834/834 [================================] – 1s 2ms/passo – perdita: 48.8155
Epoca 4/100
834/834 [================================] – 1s 2ms/passo – perdita: 21.5447
Epoca 5/100
834/834 [================================] – 1s 2ms/passo – perdita: 6.1709
Epoca 6/100
834/834 [================================] – 1s 2ms/passo – perdita: 1.8726
Epoca 7/100
834/834 [================================] – 1s 2ms/passo – perdita: 0,9380
Epoca 8/100
834/834 [================================] – 2s 2ms/passo – perdita: 0,6566
Epoca 9/100
834/834 [================================] – 1s 2ms/passo – perdita: 0,5369
Epoca 10/100
834/834 [================================] – 2s 2ms/passo – perdita: 0,4761
.
.
.
.
Epoca 95/100
834/834 [================================] – 1s 2ms/passo – perdita: 0,4542
Epoca 96/100
834/834 [================================] – 2s 2ms/passo – perdita: 0,4553
Epoca 97/100
834/834 [================================] – 1s 2ms/passo – perdita: 0,4565
Epoca 98/100
834/834 [================================] – 1s 2ms/passo – perdita: 0,4576
Epoca 99/100
834/834 [================================] – 1s 2ms/passo – perdita: 0,4588
Epoca 100/100
834/834 [================================] – 1s 2ms/passo – perdita: 0,4599
Infine, vediamo che il valore della perdita è diminuito esponenzialmente nel tempo durante il processo di addestramento di 100 epoche e ha raggiunto un valore di 0,4599
Passaggio 11 – Pronostico LSTM
Con il nostro modello pronto, è il momento di utilizzare il modello addestrato utilizzando la rete LSTM sul set di test e prevedere il valore di chiusura adiacente del titolo Microsoft. Questo viene eseguito utilizzando la semplice funzione di predict sul modello lstm costruito.
Pronostico #LSTM
y_pred= lstm.predict(X_test)
Passaggio 12 – Valore di chiusura dell'adj vero e previsto – LSTM
Infine, poiché abbiamo previsto i valori del set di test, possiamo tracciare il grafico per confrontare sia i valori veri di Adj Close che il valore previsto di Adj Close dal modello LSTM Machine Learning.
#True vs Predicted Adj Close Value – LSTM
plt.plot(y_test, label='Vero valore')
plt.plot(y_pred, label='Valore LSTM')
plt.title ("Pronostico di LSTM")
plt.xlabel('Scala temporale')

plt.ylabel('Scaled USD')
plt.leggenda()
plt.show()
Il grafico sopra mostra che alcuni pattern vengono rilevati dal modello di rete LSTM singolo molto semplice costruito sopra. Mettendo a punto diversi parametri e aggiungendo più livelli LSTM al modello, possiamo ottenere una rappresentazione più accurata del valore delle azioni di una determinata società.
Conclusione
Se sei interessato a saperne di più su esempi di intelligenza artificiale e apprendimento automatico, dai un'occhiata al programma Executive PG di IIIT-B e upGrad in Machine Learning e AI , progettato per i professionisti che lavorano e offre oltre 450 ore di formazione rigorosa, oltre 30 casi di studio e incarichi, stato di Alumni IIIT-B, oltre 5 progetti pratici pratici e assistenza sul lavoro con le migliori aziende.
Puoi prevedere il mercato azionario usando l'apprendimento automatico?
Oggi abbiamo una serie di indicatori per aiutare a prevedere le tendenze del mercato. Tuttavia, non dobbiamo guardare oltre un computer ad alta potenza per trovare gli indicatori più accurati per il mercato azionario. Il mercato azionario è un sistema aperto e può essere visto come una rete complessa. La rete è costituita dalle relazioni tra azioni, società, investitori e volumi di scambio. Utilizzando un algoritmo di data mining come la macchina del vettore di supporto, puoi applicare una formula matematica per estrarre le relazioni tra queste variabili. Il mercato azionario è ormai al di là delle previsioni umane.
Quale algoritmo è il migliore per la previsione del mercato azionario?
Per ottenere i migliori risultati, dovresti usare la regressione lineare. La regressione lineare è un approccio statistico utilizzato per determinare la relazione tra due diverse variabili. In questo esempio, le variabili sono prezzo e tempo. Nella previsione del mercato azionario, il prezzo è la variabile indipendente e il tempo è la variabile dipendente. Se è possibile determinare una relazione lineare tra queste due variabili, è possibile prevedere con precisione il valore del titolo in qualsiasi momento futuro.
La previsione del mercato azionario è un problema di classificazione o regressione?
Prima di rispondere, dobbiamo capire cosa significano le previsioni del mercato azionario. È un problema di classificazione binaria o un problema di regressione? Supponiamo di voler prevedere il futuro di un'azione, dove futuro indica il giorno, la settimana, il mese o l'anno successivi. Se la performance passata del titolo in un determinato momento è l'input e il futuro è l'output, allora è un problema di regressione. Se la performance passata di un'azione e il futuro di un'azione sono indipendenti, allora è un problema di classificazione.