Aktiekursforudsigelse brug af maskinindlæring og dyb læringsteknikker (med Python-koder)

introduktion

forudsigelse af, hvordan aktiemarkedet vil udføre, er en af de sværeste ting at gøre. Der er så mange faktorer involveret i forudsigelsen – fysiske faktorer vs. physhological, rationel og irrationel adfærd osv. Alle disse aspekter kombineres for at gøre aktiekurserne ustabile og meget vanskelige at forudsige med en høj grad af nøjagtighed.

kan vi bruge maskinlæring som en spilskifter på dette domæne? Brug af funktioner som de seneste meddelelser om en organisation, deres kvartalsvise indtægtsresultater osv., maskinlæringsteknikker har potentialet til at afdække mønstre og indsigter, som vi ikke så før, og disse kan bruges til at lave usvigelige nøjagtige forudsigelser.

aktiekursforudsigelse, LSTM, maskinlæring

i denne artikel vil vi arbejde med Historiske data om aktiekurserne i et børsnoteret selskab. Vi vil implementere en blanding af maskinlæringsalgoritmer for at forudsige den fremtidige aktiekurs for dette firma, startende med enkle algoritmer som gennemsnit og lineær regression, og gå derefter videre til avancerede teknikker som Auto ARIMA og LSTM.

kerneideen bag denne artikel er at vise, hvordan disse algoritmer implementeres. Jeg vil kort beskrive teknikken og give relevante links til at børste op på begreberne, når og når det er nødvendigt. Hvis du er nybegynder i verden af tidsserier, foreslår jeg at gennemgå følgende artikler først:

  • en omfattende Begyndervejledning til oprettelse af en Tidsserieprognose
  • en komplet Tutorial om Tidsseriemodellering
  • gratis kursus: Tidsserieprognoser ved hjælp af Python

projekt til at øve Tidsserieprognoser

tidsserieprognoser & modellering spiller en vigtig rolle i dataanalyse. Tidsserieanalyse er en specialiseret gren af statistikker, der anvendes i vid udstrækning inden for områder som økonometri & operationsforskning.

tidsserier bruges i vid udstrækning i analyser & datavidenskab. Dette er specielt designet tidsserieproblem for dig, og udfordringen er at forudsige trafik.

Øv dig nu

er du nybegynder på udkig efter et sted at starte din datavidenskabsrejse? Præsentere et omfattende kursus, fuld af viden og datalogi læring, kurateret til dig! Dette kursus dækker alt fra grundlæggende i maskinlæring til avancerede begreber ML, dyb læring og tidsserier.

  • certificeret AI & ML Blackbelt + Program

Indholdsfortegnelse

    1. forståelse af problemstillingen
    2. glidende gennemsnit
    3. lineær Regression
    4. k-nærmeste naboer
    5. Auto ARIMA
    6. Profet
    7. lang korttidshukommelse (LSTM)

forståelse af problemstillingen

vi dykker snart ind i implementeringsdelen af denne artikel, men først er det vigtigt at fastslå, hvad vi sigter mod at løse. Generelt er aktiemarkedsanalyse opdelt i to dele – grundlæggende analyse og teknisk analyse.

  • grundlæggende analyse involverer analyse af virksomhedens fremtidige rentabilitet på baggrund af dets nuværende forretningsmiljø og økonomiske resultater.
  • teknisk analyse inkluderer på den anden side læsning af diagrammerne og brug af statistiske tal til at identificere tendenser på aktiemarkedet.

som du måske har gættet, vil vores fokus være på den tekniske analysedel. Vi bruger et datasæt fra Kvandl (du kan finde Historiske data for forskellige lagre her), og til dette særlige projekt har jeg brugt dataene til ‘Tata Global Beverages’. Tid til at dykke ind!

Bemærk: her er det datasæt, jeg brugte til koden: Hent

vi indlæser først datasættet og definerer målvariablen for problemet:

#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()

der er flere variabler i datasættet – dato, åben, høj, lav, sidste, luk, total_trade_mængde og omsætning.

  • kolonnerne åbne og lukke repræsenterer start-og slutkursen, som aktien handles på en bestemt dag.
  • høj, lav og sidst repræsenterer den maksimale, mindste og sidste pris på aktien for dagen.
  • samlet handelsmængde er antallet af aktier, der er købt eller solgt i dag, og omsætning (Lacs) er omsætningen for det pågældende selskab på en given dato.

en anden vigtig ting at bemærke er, at markedet er lukket på fridage og helligdage.Bemærk ovenstående tabel igen, nogle datoværdier mangler-2/10/2018, 6/10/2018, 7/10/2018. Af disse datoer, 2. er en national helligdag, mens 6. og 7.falder på en helg.

resultatberegningen bestemmes normalt af slutkursen på en aktie for dagen, derfor vil vi betragte slutkursen som målvariablen. Lad os plotte målvariablen for at forstå, hvordan den formes i vores data:

#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')

i de kommende afsnit vil vi undersøge disse variabler og bruge forskellige teknikker til at forudsige den daglige slutkurs på aktien.

glidende gennemsnit

introduktion

‘gennemsnit’ er let en af de mest almindelige ting, vi bruger i vores daglige liv. For eksempel at beregne gennemsnitsmærkerne for at bestemme den samlede ydeevne eller finde gennemsnitstemperaturen i de sidste par dage for at få en ide om dagens temperatur – det er alle rutinemæssige opgaver, vi udfører regelmæssigt. Så dette er et godt udgangspunkt at bruge på vores datasæt til at lave forudsigelser.

den forventede slutkurs for hver dag vil være gennemsnittet af et sæt tidligere observerede værdier. I stedet for at bruge det enkle gennemsnit bruger vi den glidende gennemsnitsteknik, der bruger det nyeste sæt værdier for hver forudsigelse. Med andre ord, for hvert efterfølgende trin tages de forudsagte værdier i betragtning, mens den ældste observerede værdi fjernes fra sættet. Her er en simpel figur, der hjælper dig med at forstå dette med mere klarhed.

vi implementerer denne teknik på vores datasæt. Det første trin er at oprette en dataframe, der kun indeholder kolonnerne dato og luk pris, og derefter opdele den i tog-og valideringssæt for at bekræfte vores forudsigelser.

implementering

bare kontrol af RMSE hjælper os ikke med at forstå, hvordan modellen udførte. Lad os visualisere dette for at få en mere intuitiv forståelse. Så her er et plot af de forudsagte værdier sammen med de faktiske værdier.

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

inferens

RMSE-værdien er tæt på 105, men resultaterne er ikke særlig lovende (som du kan samle fra plottet). De forudsagte værdier er af samme rækkevidde som de observerede værdier i togsættet (der er en stigende tendens i starten og derefter et langsomt fald).

i det næste afsnit vil vi se på to almindeligt anvendte maskinindlæringsteknikker – lineær Regression og kNN, og se, hvordan de fungerer på vores aktiemarkedsdata.

lineær Regression

introduktion

den mest basale maskinlæringsalgoritme, der kan implementeres på disse data, er lineær regression. Den lineære regressionsmodel returnerer en ligning, der bestemmer forholdet mellem de uafhængige variabler og den afhængige variabel.

ligningen for lineær regression kan skrives som:

her, 1, 2,….kn repræsenterer de uafhængige variabler, mens koefficienterne LR1, LR2,…. Larsen repræsenterer vægten. Du kan henvise til følgende artikel for at studere lineær regression mere detaljeret:

  • en omfattende begyndere guide til lineær, højderyg og Lasso Regression.

til vores problemstilling har vi ikke et sæt uafhængige variabler. Vi har kun datoerne i stedet. Lad os bruge kolonnen Dato til at udtrække funktioner som – Dag, Måned, År, man/fre osv. og derefter passe en lineær regressionsmodel.

implementering

vi sorterer først datasættet i stigende rækkefølge og opretter derefter et separat datasæt, så enhver ny oprettet funktion ikke påvirker de originale data.

#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

dette skaber funktioner som:

‘År’,’ Måned’,’ Uge’,’ Dag’,’ ugedag’,’ Dagår’,’ Is_month_end’,’ Is_month_start’,’ Is_kvarter_end’,’ Is_kvarter_start’,’ Is_kvarter_start’,’Is_year_end’ og ‘Is_year_start’.

Bemærk: Jeg har brugt add_datepart fra fastai bibliotek. Hvis du ikke har det installeret, kan du blot bruge kommandoen pip install fastai. Ellers kan du oprette disse funktioner ved hjælp af simple for loops i python. Jeg har vist et eksempel nedenfor.

bortset fra dette kan vi tilføje vores eget sæt funktioner, som vi mener ville være relevante for forudsigelserne. For eksempel er min hypotese, at de første og sidste dage i ugen potentielt kan påvirke aktiens slutkurs langt mere end de andre dage. Så jeg har oprettet en funktion, der identificerer, om en given dag er mandag/fredag eller tirsdag/onsdag/torsdag. Dette kan gøres ved hjælp af følgende kodelinjer:

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

hvis ugedagen er lig med 0 eller 4, vil kolonneværdien være 1, ellers 0. På samme måde kan du oprette flere funktioner. Hvis du har nogle ideer til funktioner, der kan være nyttige til at forudsige aktiekursen, del venligst i kommentarsektionen.

vi vil nu opdele dataene i tog-og valideringssæt for at kontrollere modelens ydeevne.

#split into train and validationtrain = new_datavalid = new_datax_train = train.drop('Close', axis=1)y_train = trainx_valid = valid.drop('Close', axis=1)y_valid = valid#implement linear regressionfrom sklearn.linear_model import LinearRegressionmodel = LinearRegression()model.fit(x_train,y_train)

resultater

#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

RMSE-værdien er højere end den foregående teknik, hvilket tydeligt viser, at lineær regression har fungeret Dårligt. Lad os se på plottet og forstå, hvorfor lineær regression ikke har gjort det godt:

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

Indledning

lineær regression er en simpel teknik og ret let at fortolke, men der er et par åbenlyse ulemper. Et problem ved brug af regressionsalgoritmer er, at modellen overgår til kolonnen Dato og måned. I stedet for at tage hensyn til de tidligere værdier fra forudsigelsespunktet, vil modellen overveje værdien fra samme Dato for en måned siden eller den samme dato/måned for et år siden.

som det fremgår af plottet ovenfor, var der for januar 2016 og januar 2017 et fald i aktiekursen. Modellen har forudsagt det samme for januar 2018. En lineær regressionsteknik kan fungere godt for problemer som Big Mart-salg, hvor de uafhængige funktioner er nyttige til bestemmelse af målværdien.

k-nærmeste naboer

introduktion

en anden interessant ML-algoritme, som man kan bruge her, er kNN (k nærmeste naboer). Baseret på de uafhængige variabler finder kNN ligheden mellem nye datapunkter og gamle datapunkter. Lad mig forklare dette med et simpelt eksempel.

overvej højde og alder for 11 personer. På baggrund af givne funktioner (‘alder’ og ‘højde’) kan tabellen repræsenteres i et grafisk format som vist nedenfor:

for at bestemme vægten for ID #11 overvejer kNN vægten af de nærmeste naboer til dette ID. Vægten af ID # 11 forventes at være gennemsnittet af dets naboer. Hvis vi overvejer tre naboer (k=3) for nu, ville vægten for ID#11 være = (77+72+60)/3 = 69.66 kg.

for en detaljeret forståelse af kNN kan du henvise til følgende artikler:

  • Introduktion til k-nærmeste naboer: Forenklet

  • en praktisk introduktion til K-nærmeste Naboalgoritme til Regression

implementering

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

brug af samme tog og valideringssæt fra sidste afsnit:

#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)

resultater

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

der er ikke en stor forskel i RMSE-værdien, men et plot for de forudsagte og faktiske værdier bør give en mere klar forståelse.

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

inferens

RMSE-værdien svarer næsten til den lineære regressionsmodel, og plottet viser det samme mønster. Ligesom lineær regression identificerede kNN også et fald i Januar 2018, da det har været mønsteret i de seneste år. Vi kan med sikkerhed sige, at regressionsalgoritmer ikke har fungeret godt på dette datasæt.

lad os gå videre og se på nogle tidsserieprognoseteknikker for at finde ud af, hvordan de klarer sig, når de står over for denne udfordring med aktiekurser.

Auto ARIMA

introduktion

ARIMA er en meget populær statistisk metode til prognoser for tidsserier. ARIMA-modeller tager højde for de tidligere værdier for at forudsige de fremtidige værdier. Der er tre vigtige parametre i ARIMA:

  • p (tidligere værdier brugt til at forudsige den næste værdi)
  • k (tidligere prognosefejl brugt til at forudsige de fremtidige værdier)
  • d (rækkefølge af forskelle)

Parameter tuning til ARIMA bruger meget tid. Så vi bruger auto ARIMA,som automatisk vælger den bedste kombination af (p,K, d), der giver den mindste fejl. For at læse mere om, hvordan auto ARIMA fungerer, se denne artikel:

  • Byg højtydende Tidsseriemodeller ved hjælp af Auto ARIMA

implementering

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=)

resultater

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)

inferens

som vi så tidligere, bruger en auto ARIMA-model tidligere data til at forstå mønsteret i tidsserien. Ved hjælp af disse værdier fangede modellen en stigende tendens i serien. Selvom forudsigelserne ved hjælp af denne teknik er langt bedre end de tidligere implementerede maskinlæringsmodeller, er disse forudsigelser stadig ikke tæt på de reelle værdier.

som det fremgår af plottet, har modellen fanget en tendens i serien, men fokuserer ikke på sæsondelen. I det næste afsnit implementerer vi en tidsseriemodel, der tager højde for både trend og sæsonbestemthed i en serie.

Prophet

introduktion

der er en række tidsserieteknikker, der kan implementeres på aktieforudsigelsesdatasættet, men de fleste af disse teknikker kræver en masse dataforarbejdning, før modellen monteres. Prophet, designet og banebrydende af Facebook, er et tidsserieprognosebibliotek, der ikke kræver nogen forbehandling af data og er ekstremt enkel at implementere. Input til Profeten er en dataframe med to kolonner: dato og mål (ds og y).

Profeten forsøger at fange sæsonudsving i de tidligere data og fungerer godt, når datasættet er stort. Her er en interessant artikel, der forklarer Profeten på en enkel og intuitiv måde:

  • Generer hurtige og præcise Tidsserieprognoser ved hjælp af Facebook ‘ s Profet.

implementering

#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)

resultater

#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])

inferens

Prophet (som de fleste tidsserier prognoser teknikker) forsøger at fange tendensen og sæsonudsving fra tidligere data. Denne model fungerer normalt godt på datasæt i tidsserier, men lever ikke op til dets omdømme i dette tilfælde.

som det viser sig, har aktiekurserne ikke en særlig tendens eller sæsonbestemthed. Det afhænger meget af, hvad der i øjeblikket foregår på markedet, og dermed stiger og falder priserne. Derfor prognoser teknikker som ARIMA, SARIMA og Profeten ville ikke vise gode resultater for dette særlige problem.

lad os gå videre og prøve en anden avanceret teknik – Long Short Term Memory (LSTM).

lang korttidshukommelse (LSTM)

introduktion

LSTM ‘ er bruges i vid udstrækning til problemer med sekvensforudsigelse og har vist sig at være ekstremt effektive. Årsagen til, at de fungerer så godt, er fordi LSTM er i stand til at gemme tidligere oplysninger, der er vigtige, og glemme de oplysninger, der ikke er. LSTM har tre porte:

  • input gate: Indgangsporten tilføjer information til celletilstanden
  • glemporten: den fjerner de oplysninger, der ikke længere kræves af modellen
  • outputporten: outputporten ved LSTM vælger de oplysninger, der skal vises som output

for en mere detaljeret forståelse af LSTM og dens arkitektur kan du gennemgå nedenstående artikel:

  • Introduktion til lang korttidshukommelse

lad os nu implementere LSTM som en sort boks og kontrollere dens ydeevne på vores særlige data.

Implementering

#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)

Resultater

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])

Inferens

Hold Da Op! LSTM-modellen kan indstilles til forskellige parametre, såsom at ændre antallet af LSTM-lag, tilføje frafaldsværdi eller øge antallet af epoker. Men er forudsigelserne fra LSTM nok til at identificere, om aktiekursen vil stige eller falde? Bestemt ikke!

som jeg nævnte i starten af artiklen, påvirkes aktiekursen af nyhederne om virksomheden og andre faktorer som demonetisering eller fusion/spaltning af virksomhederne. Der er også visse immaterielle faktorer, som ofte kan være umulige at forudsige på forhånd.

slutnoter

tidsserieprognoser er et meget spændende felt at arbejde med, som jeg har indset i min tid med at skrive disse artikler. Der er en opfattelse i samfundet, at det er et komplekst felt, og mens der er et sandhedskorn derinde, er det ikke så svært, når du får fat i de grundlæggende teknikker.

Skriv et svar

Din e-mailadresse vil ikke blive publiceret.