Aktienkursvorhersage und Aktienkursprognose mit Stacked LSTM

Inhalt

Dieser Artikel wurde im Rahmen der Data Science Blogathon.

Einführung

wird verwendet, um zukünftige Werte basierend auf zuvor beobachteten Werten vorherzusagen und eines der besten Tools für Trendanalysen und Zukunftsprognosen.

Was sind Zeitreihendaten??

Es wird in regelmäßigen Zeitabständen aufgezeichnet und die Reihenfolge dieser Datenpunkte ist wichtig. Deswegen, Jedes Vorhersagemodell, das auf Zeitreihendaten basiert, hat die Zeit als Variable Unabhängig. Die Ausgabe eines Modells wäre der vorhergesagte Wert oder Rang zu einem bestimmten Zeitpunkt.

Zeitreihenanalyse vs. Zeitreihenprognose

Sprechen wir über mögliche Verwirrung bei der Zeitreihenanalyse und -prognose. Zeitreihenprognosen sind ein Beispiel für prädiktive Modellierung, während die Zeitreihenanalyse eine Form der deskriptiven Modellierung ist.

Für einen neuen Investor, die allgemeine Recherche im Zusammenhang mit der Börse oder dem Aktienmarkt reicht nicht aus, um die Entscheidung zu treffen. Der gemeinsame Trend zum Aktienmarkt in der Gesellschaft ist hoch riskant für Investitionen, daher können die meisten Menschen keine Entscheidungen basierend auf gemeinsamen Trends treffen. Die saisonale Variation und der konstante Fluss Index Sie werden neuen und bestehenden Anlegern helfen, die Entscheidung zu verstehen und zu treffen, in den Aktienmarkt zu investieren.

Um diese Art von Problemen zu lösen, Zeitreihenprognosen sind die beste Technik.

Börse

Aktienmärkte sind die Orte, an denen private und institutionelle Anleger zusammenkommen, um Aktien an einem öffentlichen Ort zu kaufen und zu verkaufen.. Heute, diese Börsen existieren als elektronische Marktplätze.

Dass Angebot und Nachfrage dazu beitragen, den Preis jedes Wertpapiers oder das Niveau zu bestimmen, auf dem die Teilnehmer am Aktienmarkt (Investoren und Händler) sind bereit zu kaufen oder zu verkaufen.

Das Konzept hinter der Funktionsweise der Börse ist recht einfach.. Funktioniert ähnlich wie ein Auktionshaus, die Börse ermöglicht es Käufern und Verkäufern, Preise zu verhandeln und Transaktionen durchzuführen.

Definición destock

Eine Aktion oder Aktion (auch bekannt als „Hauptstadt“ eines Unternehmens) ist ein Finanzinstrument, das das Eigentum an einem Unternehmen darstellt

Maschinelles Lernen an der Börse

Der Aktienmarkt ist sehr unberechenbar, jede geopolitische Veränderung kann die Entwicklung der Aktien an der Börse beeinflussen, Wir haben kürzlich gesehen, wie sich Covid-19 auf die Aktienkurse ausgewirkt hat, Daher ist es bei Finanzdaten sehr schwierig, eine zuverlässige Trendanalyse durchzuführen. . Der effizienteste Weg, diese Art von Problemen zu lösen, ist mit Hilfe von maschinellem Lernen und tiefes Lernen.

In diesem Tutorial, Wir werden dieses Problem mit dem ARIMA-Modell lösen.

Um die Saisonalität zu kennen, Check meinen vorherigen Blog. Und um ein grundlegendes Verständnis von ARIMA zu bekommen, Ich würde dir empfehlen diesen Blog zu lesen, Dies wird Ihnen helfen, besser zu verstehen, wie die Zeitreihenanalyse funktioniert.

Implementieren Sie die Aktienkursprognose

ich werde benützen nsep Bibliothek zum Extrahieren historischer Daten aus SBIN.

Importe

Importieren von OS
Importwarnungen
Warnungen.Filterwarnungen('ignorieren')
aus pylab importieren rcParams
rcParams['figure.figsize'] = 10, 6
von statsmodels.tsa.stattools import adfuller
von statsmodels.tsa.seasonal import season_decompose
von statsmodels.tsa.arima_model import ARIMA
von pmdarima.arima importieren auto_arima
aus sklearn.metrics import mean_squared_error, mittlerer_absoluter_Fehler
Mathematik importieren
numpy als np importieren
aus nsepy import get_history
ab DatumZeit Importdatum
import matplotlib.pyplot als plt
Seegeboren als sns importieren
Pandas als pd importieren
Führen Sie den folgenden Code aus, um die historischen Daten zu extrahieren:
sbin = get_history(Symbol="SBIN",
                   Start=Datum(2000,1,1),
                   Ende=Datum(2020,11,1))
sbin.kopf()
66911Bild-1-5764006
Die Daten zeigen den Aktienkurs von SBIN von 2020-1-1 zu 2020-11-1. Das Ziel ist es, ein Modell zu erstellen, das Vorhersagen macht
der Schlusskurs der Aktie.

Lassen Sie uns eine Visualisierung erstellen, die den täglichen Schlusskurs der Aktie anzeigt.

plt.figur(Feigengröße=(10,6))
plt.grid(Wahr)
plt.xlabel('Dates')
plt.ylabel('Close Prices')
plt.plot(sbin['Close'])
plt.titel('SBIN closing price')
plt.zeigen()
29909Bild2-5264251
plt.figur(Feigengröße=(10,6))
df_close = sbin['Close']
df_close.plot(Stil="k.")
plt.titel('Streudiagramm des Schlusskurses")
plt.zeigen()
29006scatter20plot-5883203
plt.figur(Feigengröße=(10,6))
df_close = sbin['Close']
df_close.plot(Stil="k.",kind='hist')
plt.titel('Hisogram of closing price')
plt.zeigen()
39933Hist-Gramm-5004076

Zuerst, Wir müssen prüfen, ob eine Reihe stationär ist oder nicht, da die Zeitreihenanalyse nur mit stationären Daten funktioniert.

Test der Stationarität:

Um die Art der Daten zu identifizieren, wir werden die benutzen Nullhypothese.

H0: Die Nullhypothese: Es handelt sich um eine Aussage über die Bevölkerung, die für wahr gehalten oder zur Argumentation verwendet wird, es sei denn, sie kann zweifelsfrei als falsch nachgewiesen werden.

H1: Die Alternativhypothese: Es ist eine Aussage über die Bevölkerung, die widersprüchlich ist h0 und was wir schließen, wenn wir ablehnen h0.

#Ho: es ist nicht stationär

# H1: ist gestoppt

Wenn wir die Nullhypothese nicht verwerfen, wir können sagen, dass die Reihe nicht stationär ist. Dies bedeutet, dass die Reihe linear sein kann.

Wenn sowohl die Standardabweichung als auch der Mittelwert flache Linien sind (konstanter Mittelwert und konstante Varianz), die Reihe wird stationär.

von statsmodels.tsa.stattools import adfuller
def test_stationarity(Zeitfolgen):
    #Rolling-Statistiken ermitteln
    rolmean = timeseries.rolling(12).bedeuten()
    rolstd = timeseries.rolling(12).std()
    #Rolling-Statistiken darstellen:
    plt.plot(Zeitfolgen, Farbe="Gelb",Etikett="Original")
    plt.plot(rolmean, Farbe="rot", Etikett="Rollendes Mittel")
    plt.plot(rolstd, Farbe="Schwarz", Etikett="Rolling Std")
    plt.legende(loc ="Beste")
    plt.titel('Rolling Mean and Standard Deviation')
    plt.zeigen(block=Falsch)
    drucken("Ergebnisse des Dickey-Fuller-Tests")
    adft = adfuller(Zeitfolgen,autolag='AIC')
    # Die Ausgabe für dft wird uns liefern, ohne die Werte zu definieren.
    #Daher schreiben wir manuell, welche Werte es mit einer for-Schleife erklärt
    Ausgang = pd.Serie(adft[0:4],index=['Test Statistics','p-Wert','Nein. of lags used','Number of observations used'])
    für Schlüssel,werte in adft[4].Produkte():
        Ausgang['critical value (%S)'%key] = Werte
    drucken(Ausgang)

test_stationarität(sbin['Close'])
69039Bild5-6509270
Nach der Analyse der obigen Grafik, Wir können den zunehmenden Mittelwert und die Standardabweichung sehen und daher ist unsere Reihe nicht stationär.
Ergebnisse des Dickey-Fuller-Tests
Teststatistik                  -1.914523
p-Wert                           0.325260
Nein. von Lags verwendet                  3.000000
Anzahl der verwendeten Beobachtungen    5183.000000
kritischer Wert (1%)              -3.431612
kritischer Wert (5%)              -2.862098
kritischer Wert (10%)             -2.567067
dtyp: float64

Wir sehen, dass der p-Wert größer ist als 0.05 also können wir das nicht ablehnen Nullhypothese. Was ist mehr, Teststatistiken sind größer als kritische Werte. die Daten sind also nicht stationär.

Zur Zeitreihenanalyse, Wir trennen Trend und Saisonalität von den Zeitreihen.

result = saisonal_decompose(df_close, Modell="multiplikativ", Frequenz = 30)
fig = plt.figur()  
fig = result.plot()  
fig.set_size_inches(16, 9)
18405Bild6-6395540
aus pylab importieren rcParams
rcParams['figure.figsize'] = 10, 6
df_log = np.log(sbin['Close'])
Moving_avg = df_log.rolling(12).bedeuten()
std_dev = df_log.rolling(12).std()
plt.legende(loc ="Beste")
plt.titel('Moving Average')
plt.plot(std_dev, Farbe ="Schwarz", Etikett = "Standardabweichung")
plt.plot(Moving_avg, Farbe="rot", Etikett = "Bedeuten")
plt.legende()
plt.zeigen()
36363Bild7-6657619

Jetzt erstellen wir ein ARIMA-Modell und trainieren es mit dem Schlusskurs der Aktie in den Zugdaten. Lassen Sie uns also die Daten aufschlüsseln in Ausbildung und testen, einstellen und visualisieren.

train_data, test_data = df_log[3:int(len(df_log)*0.9)], df_log[int(len(df_log)*0.9):]
plt.figur(Feigengröße=(10,6))
plt.grid(Wahr)
plt.xlabel('Dates')
plt.ylabel('Closing Prices')
plt.plot(df_log, 'green', Etikett="Zugdaten")
plt.plot(Testdaten, 'blue', Etikett="Testdaten")
plt.legende()
88876Bild8-9455734
model_autoARIMA = auto_arima(train_data, start_p=0, start_q=0,
test="adf",       # use adftest to find optimal 'd'
max_p=3, max_q=3, # maximal p und q
m=1,              # Häufigkeit der Serie
d=Keine,           # let model determine 'd'
saisonal=Falsch,   # Keine Saisonalität
start_P=0, 
D=0, 
trace=Wahr,
error_action='ignorieren',  
suppress_warnings=Wahr, 
schrittweise=Wahr)
drucken(model_autoARIMA.summary())
Durchführen einer schrittweisen Suche zum Minimieren von aic
 ARIMA(0,1,0)(0,0,0)[0] abfangen   : AIC=-16607.561, Zeit=2,19 Sek.
 ARIMA(1,1,0)(0,0,0)[0] abfangen   : AIC=-16607.961, Zeit = 0,95 Sek.
 ARIMA(0,1,1)(0,0,0)[0] abfangen   : AIC=-16608.035, Zeit=2,27 Sek.
 ARIMA(0,1,0)(0,0,0)[0]             : AIC=-16609.560, Zeit=0,39 Sek.
 ARIMA(1,1,1)(0,0,0)[0] abfangen   : AIC=-16606.477, Zeit=2,77 Sek.

Bestes Modell:  ARIMA(0,1,0)(0,0,0)[0]          
Gesamtanpassungszeit: 9.079 Sekunden
                               SARIMAX-Ergebnisse
================================================ ============================
Ab. Variable:                      und nein. Beobachtungen:                 4665
Modell:               SARIMAX(0, 1, 0)   Log-Wahrscheinlichkeit                8305.780
Datum:                Di, 24 November 2020   AIC                         -16609.560
Zeit:                        20:08:50   BIC                         -16603.113
Stichprobe:                             0   HQIC                        -16607.293
                               - 4665                                         
Kovarianztyp:                  opg
================================================ ============================
                 coef std err z P>|Mit|      [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
Heteroskedastizität (h):               7.16   Schiefe:                           -37.54
Prob(h) (zweiseitig):                  0.00   Kurtosis:                      2105.12
================================================ =================================
model_autoARIMA.plot_diagnostics(Feigengröße=(15,8))
plt.zeigen()
20054Bild9-6726978
Modell = ARIMA(train_data, bestellen=(3, 1, 2))
ausgestattet = model.fit(disp = -1)
drucken(montiert.Zusammenfassung())
                             Ergebnisse des ARIMA-Modells
================================================ ============================
Ab. Variable:                D.Schließen Nein. Beobachtungen:                 4664
Modell:                 ARIMA(3, 1, 2)   Log-Wahrscheinlichkeit                8309.178
Methode:                       css-ml S.D.. von Innovationen              0.041
Datum:                Di, 24 November 2020   AIC                         -16604.355
Zeit:                        20:09:37   BIC                         -16559.222
Stichprobe:                             1   HQIC                        -16588.481
                                                                              
================================================ ===============================
                    coef std err z P>|Mit|      [0.025      0.975]
---------------------------------------------------------------------------------
Konstante 8.761e-06      0.001      0.015      0.988      -0.001       0.001
ar.L1.D.Schließen     1.3689      0.251      5.460      0.000       0.877       1.860
ar.L2.D.Schließen    -0.7118      0.277     -2.567      0.010      -1.255      -0.168
ar.L3.D.Schließen     0.0094      0.021      0.445      0.657      -0.032       0.051
ma.L1.D.Schließen    -1.3468      0.250     -5.382      0.000      -1.837      -0.856
ma.L2.D.Schließen     0.6738      0.282      2.391      0.017       0.122       1.226
                                    Wurzeln
================================================ ===========================
                  Reale imaginäre Modulfrequenz
-----------------------------------------------------------------------------
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
-----------------------------------------------------------------------------
# Vorhersage

fc, Ich kenne, conf = angepasst.Vorhersage(519, Alpha=0,05)  # 95% Vertrauen
fc_series = pd.Series(fc, index=test_data.index)
lower_series = pd.Series(conf[:, 0], index=test_data.index)
upper_series = pd.Series(conf[:, 1], index=test_data.index)
plt.figur(Feigengröße=(12,5), dpi=100)
plt.plot(train_data, Etikett="Ausbildung")
plt.plot(Testdaten, Farbe="Blau", Etikett="Aktueller Aktienkurs")
plt.plot(fc_series, Farbe="Orange",Etikett="Vorhergesagter Aktienkurs")
plt.fill_between(lower_series.index, untere_serie, obere_serie, 
                 Farbe="k", alpha=.10)
plt.titel('SBIN Stock Price Prediction')
plt.xlabel(Uhrzeit)
plt.ylabel('Actual Stock Price')
plt.legende(loc ="Oben links", Schriftgröße=8)
plt.zeigen()
39008Bild2012-7065525

Fazit

Zeitreihenprognosen sind sehr nützlich, wenn wir zukünftige Entscheidungen treffen oder Analysen durchführen müssen, Wir können es schnell mit ARIMA . machen, Es gibt viele andere Modelle, mit denen wir Zeitreihenprognosen durchführen können, aber ARIMA ist wirklich leicht zu verstehen.

Ich hoffe, dieser Artikel hilft Ihnen und spart Ihnen viel Zeit. Lassen Sie es mich wissen, wenn Sie Vorschläge haben..

GLÜCKLICHES CODIEREN.

Prabhat Pathak (LinkedIn Profil) ist Senior Analyst und Innovationsenthusiast.

Abonniere unseren Newsletter

Wir senden Ihnen keine SPAM-Mail. Wir hassen es genauso wie du.

Datenlautsprecher