Prediksjon Av Aksjekurser Ved Hjelp Av Maskinlæring Og Dype Læringsteknikker (Med Python-koder)

Introduksjon

Å Forutsi hvordan aksjemarkedet vil prestere er en av de vanskeligste tingene å gjøre. Det er så mange faktorer involvert i prediksjonen-fysiske faktorer vs. fytologisk, rasjonell og irrasjonell oppførsel, etc. Alle disse aspektene kombineres for å gjøre aksjekursene volatile og svært vanskelig å forutsi med høy grad av nøyaktighet.

Kan vi bruke maskinlæring som en spillveksler i dette domenet? Bruke funksjoner som de siste kunngjøringene om en organisasjon, deres kvartalsinntekter, etc., maskinlæringsteknikker har potensial til å avdekke mønstre og innsikt vi ikke så før, og disse kan brukes til å gjøre unerringly nøyaktige spådommer.

 aksjekursprognose, LSTM, maskinlæring

i denne artikkelen vil vi jobbe med historiske data om aksjekursene til et børsnotert selskap. Vi vil implementere en blanding av maskinlæringsalgoritmer for å forutsi fremtidig aksjekurs for dette selskapet, og starter med enkle algoritmer som gjennomsnitt og lineær regresjon, og deretter gå videre til avanserte teknikker som Auto ARIMA og LSTM.

kjerneideen bak denne artikkelen er å vise hvordan disse algoritmene implementeres. Jeg vil kort beskrive teknikken og gi relevante lenker for å friske opp begrepene som og når det er nødvendig. I tilfelle du er en nykommer til world of time series, foreslår jeg å gå gjennom følgende artikler først:

  • en omfattende nybegynnerguide for å lage En Tidsserieprognose
  • En Komplett Opplæring Om Tidsseriemodellering
  • Gratis Kurs: Tidsserieprognoser ved Hjelp Av Python

Prosjekt For Å Øve Tidsserieprognoser

Tidsserieprognoser & modellering spiller en viktig rolle i dataanalyse. Tidsserieanalyse er en spesialisert gren av statistikk som brukes mye I felt Som Økonometri & Operasjonsforskning.

Tidsserier blir mye brukt i analytics & datavitenskap. Dette er spesielt utviklet tidsserieproblem for deg, og utfordringen er å prognose trafikk.

Øv Nå

er du nybegynner på jakt etter et sted å starte datavitenskapsreisen din? Presentere et omfattende kurs, full av kunnskap og datavitenskapslæring, kuratert bare for deg! Dette kurset dekker alt fra grunnleggende Om Maskinlæring Til Avanserte konsepter AV ML, Dyp Læring og Tidsserier.

  • Sertifisert AI & ML Blackbelt + Program

Innholdsfortegnelse

    1. Forstå Problemstillingen
    2. Glidende Gjennomsnitt
    3. Lineær Regresjon
    4. K-Nærmeste Naboer
    5. Auto ARIMA
    6. Profet
    7. Langtidsminne (Lstm))

Forstå Problemstillingen

vi vil dykke inn i implementeringsdelen av denne artikkelen snart, men først er det viktig å fastslå hva vi tar sikte på å løse. I stor grad er aksjemarkedsanalyse delt inn i To deler – Fundamental Analyse og Teknisk Analyse.

  • Fundamental Analyse innebærer å analysere selskapets fremtidige lønnsomhet på grunnlag av dagens forretningsmiljø og økonomiske resultater.
  • Teknisk Analyse, derimot, inkluderer lesing av diagrammer og bruk av statistiske tall for å identifisere trender i aksjemarkedet.

som du kanskje har gjettet, vil vårt fokus være på teknisk analyse delen. Vi bruker et datasett Fra Quandl (du finner historiske data for ulike aksjer her) og for dette prosjektet har jeg brukt dataene til ‘Tata Global Beverages’. Tid til å dykke i!

Merk: her er datasettet jeg brukte for koden: Last Ned

Vi laster først datasettet og definerer målvariabelen 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()

det er flere variabler i datasettet-dato, åpen, høy, lav, siste, lukk, total_trade_quantity og omsetning.

  • kolonnene Åpne og Lukke representerer start – og sluttprisen som aksjen handles på en bestemt dag.
  • Høy, Lav og Sist representerer maksimum, minimum og siste pris for aksjen for dagen.
  • Totalt Antall aksjer kjøpt eller solgt i dag Og Omsetning (Lacs) er omsetningen til det aktuelle selskapet på en gitt dato.

En annen viktig ting å merke seg er at markedet er stengt i helger og helligdager.Legg merke til tabellen ovenfor igjen, noen datoverdier mangler-2/10/2018, 6/10/2018, 7/10/2018. Av disse datoene er 2. en nasjonalferie mens 6. og 7. faller på en helg.

resultatberegningen bestemmes vanligvis av sluttkursen på en aksje for dagen, derfor vil vi vurdere sluttkursen som målvariabel. La oss plotte målvariabelen for å forstå hvordan den utvikler seg i våre 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 seksjonene vil vi utforske disse variablene og bruke forskjellige teknikker for å forutsi den daglige sluttkursen på aksjen.

Glidende Gjennomsnitt

Introduksjon

‘Gjennomsnitt’ er lett en av de vanligste tingene vi bruker i våre daglige liv. For eksempel, beregne gjennomsnittskarakterene for å bestemme total ytelse, eller finne gjennomsnittstemperaturen de siste dagene for å få en ide om dagens temperatur-alt dette er rutinemessige oppgaver vi gjør regelmessig. Så dette er et godt utgangspunkt for å bruke på vårt datasett for å gjøre spådommer.

den forventede sluttkursen for hver dag vil være gjennomsnittet av et sett med tidligere observerte verdier. I stedet for å bruke det enkle gjennomsnittet, bruker vi glidende gjennomsnittsteknikken som bruker det siste settet med verdier for hver prediksjon. Med andre ord, for hvert etterfølgende trinn, blir de forventede verdiene tatt i betraktning mens du fjerner den eldste observerte verdien fra settet. Her er en enkel figur som vil hjelpe deg å forstå dette med mer klarhet.

vi vil implementere denne teknikken på vårt datasett. Det første trinnet er å opprette en dataframe som bare inneholder Dato-og Lukkekolonnene, og deretter dele den i tog-og valideringssett for å bekrefte våre spådommer.

Implementering

bare å sjekke RMSE hjelper oss ikke med å forstå hvordan modellen utførte. La oss visualisere dette for å få en mer intuitiv forståelse. Så her er et plott av de forutsagte verdiene sammen med de faktiske verdiene.

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

Inferens

RMSE-verdien er nær 105, men resultatene er ikke veldig lovende (som du kan samle fra plottet). De forventede verdiene er av samme rekkevidde som de observerte verdiene i togsettet(det er en økende trend først og deretter en langsom nedgang).

i neste avsnitt vil vi se på to vanlige maskinlæringsteknikker-Lineær Regresjon og kNN, og se hvordan de utfører på våre aksjemarkedsdata.

Lineær Regresjon

Introduksjon

den mest grunnleggende maskinlæringsalgoritmen som kan implementeres på disse dataene, er lineær regresjon. Den lineære regresjonsmodellen returnerer en ligning som bestemmer forholdet mellom de uavhengige variablene og den avhengige variabelen.

ligningen for lineær regresjon kan skrives som:

her, x1, x2,….xn representerer de uavhengige variablene mens koeffisientene θ1, θ2,…. θ representerer vektene. Du kan referere til følgende artikkel for å studere lineær regresjon mer detaljert:

  • en omfattende nybegynnere guide For Lineær, Ridge Og Lasso Regresjon.

for vår problemstilling har vi ikke et sett med uavhengige variabler. Vi har bare datoene i stedet. La oss bruke datokolonnen til å trekke ut funksjoner som-dag, måned, år, man/fre etc. deretter følger en lineær regresjonsmodell.

Implementering

vi vil først sortere datasettet i stigende rekkefølge Og deretter opprette et eget datasett slik at eventuelle nye funksjoner som opprettes, ikke påvirker de opprinnelige dataene.

#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 skaper funksjoner som:

‘År’, ‘Måned’, ‘Uke’, ‘Dag’, ‘Dayofweek’, ‘Dayofyear’,’ Is_month_end’, ‘Is_month_start’, ‘Is_quarter_end’,’ Is_quarter_start’,’Is_year_end’ og ‘Is_year_start’.

Merk: jeg har brukt add_datepart fra fastai library. Hvis du ikke har det installert, kan du bare bruke kommandoen pip install fastai. Ellers kan du lage disse funksjonene ved hjelp av simple for loops i python. Jeg har vist et eksempel nedenfor.

Bortsett Fra dette kan vi legge til vårt eget sett med funksjoner som vi tror vil være relevante for spådommene. For eksempel er min hypotese at de første og siste dagene i uken potensielt kan påvirke sluttkursen på aksjen langt mer enn de andre dagene. Så jeg har laget en funksjon som identifiserer om en gitt dag er mandag / fredag eller tirsdag / onsdag / torsdag. Dette kan gjøres ved hjelp av 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 ukedagen er lik 0 eller 4, vil kolonneverdien være 1, ellers 0. På samme måte kan du opprette flere funksjoner. Hvis du har noen ideer til funksjoner som kan være nyttige for å forutsi aksjekurs, vennligst del i kommentarfeltet.

vi vil nå dele dataene i tog-og valideringssett for å sjekke ytelsen til modellen.

#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-verdien er høyere enn forrige teknikk, noe som tydelig viser at lineær regresjon har utført dårlig. La oss se på plottet og forstå hvorfor lineær regresjon ikke har gjort det bra:

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

Inferens

Lineær regresjon Er en enkel teknikk og ganske lett å tolke, men det er noen åpenbare ulemper. Et problem med å bruke regresjonsalgoritmer er at modellen overfits til dato og måned kolonne. I stedet for å ta hensyn til tidligere verdier fra prediksjonspunktet, vil modellen vurdere verdien fra samme dato for en måned siden, eller samme dato/måned for et år siden.

sett fra tomten ovenfor, for januar 2016 og januar 2017, var det en nedgang i aksjekursen. Modellen har spådd det samme for januar 2018. En lineær regresjonsteknikk kan fungere godt for problemer som Big Mart-salg der de uavhengige funksjonene er nyttige for å bestemme målverdien.

k-Nærmeste Naboer

Innledning

en annen interessant ML algoritme som man kan bruke her er kNN (k nærmeste naboer). Basert på de uavhengige variablene finner kNN likheten mellom nye datapunkter og gamle datapunkter. La meg forklare dette med et enkelt eksempel.

Vurder høyde og alder for 11 personer. På grunnlag av gitte funksjoner (‘Alder’ og ‘Høyde’), kan tabellen representeres i et grafisk format som vist nedenfor:

for å bestemme vekten FOR ID #11, vurderer kNN vekten til de nærmeste naboene til DENNE ID-EN. Vekten AV ID #11 er spådd å være gjennomsnittet av det er naboer. Hvis vi vurderer tre naboer (k=3) for nå, vil vekten FOR ID#11 være = (77+72+60)/3 = 69.66 kg.

for en detaljert forståelse av kNN, kan du referere til følgende artikler:

  • Introduksjon til k-Nærmeste Naboer: Forenklet

  • En Praktisk Introduksjon Til K-Nærmeste Naboer Algoritme For Regresjon

Implementering

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

Bruk samme tog-og valideringssett fra den siste delen:

#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

DET er ikke en stor forskjell I RMSE-verdien, men et plott for de forutsagte og faktiske verdiene bør gi en klarere forståelse.

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

Slutning

RMSE-verdien er nesten lik den lineære regresjonsmodellen, og plottet viser det samme mønsteret. Som lineær regresjon identifiserte kNN også en nedgang i januar 2018 siden det har vært mønsteret de siste årene. Vi kan trygt si at regresjonsalgoritmer ikke har gjort det bra på dette datasettet.

La oss gå videre og se på noen tidsserier prognoser teknikker for å finne ut hvordan de utfører når møtt med denne aksjekurser prediksjon utfordring.

Auto ARIMA

Introduksjon

ARIMA ER en svært populær statistisk metode for tidsserieprognoser. ARIMA-modeller tar hensyn til tidligere verdier for å forutsi fremtidige verdier. DET er tre viktige parametere I ARIMA:

  • p (tidligere verdier brukt til å prognostisere neste verdi)
  • q(tidligere prognosefeil brukt til å forutsi fremtidige verdier)
  • d (rekkefølge av differensiering)

Parameter tuning FOR ARIMA bruker mye tid. Sa vi vil bruke auto ARIMA som automatisk velger den beste kombinasjonen av (p, q, d)som gir den minste feilen. For å lese mer om hvordan auto ARIMA fungerer, se denne artikkelen:

  • Bygg Høy Ytelse Tidsseriemodeller ved Hjelp Av 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)

Slutning

som vi så tidligere, bruker en auto ARIMA-modell tidligere data for å forstå mønsteret i tidsserien. Ved hjelp av disse verdiene fanget modellen en økende trend i serien. Selv om spådommene ved hjelp av denne teknikken er langt bedre enn de tidligere implementerte maskinlæringsmodellene, er disse spådommene fortsatt ikke nær de virkelige verdiene.

som det fremgår av plottet, har modellen tatt en trend i serien, men fokuserer ikke på sesongdelen. I neste avsnitt vil vi implementere en tidsseriemodell som tar hensyn til både trend og sesongmessighet i en serie.

Prophet

Innledning

det finnes en rekke tidsserieteknikker som kan implementeres på stock prediction datasett, men de fleste av disse teknikkene krever mye data forbehandling før montering av modellen. Profeten, designet Og utviklet Av Facebook, er en tidsserie prognoser bibliotek som krever ingen data forbehandling og er svært enkel å implementere. Input For Profeten er en dataframe med to kolonner: dato og mål (ds og y).

Prophet prøver å fange sesongmessigheten i de siste dataene og fungerer bra når datasettet er stort. Her er en interessant artikkel som forklarer Profeten på en enkel og intuitiv måte:

  • Generere Raske Og Nøyaktige Tidsserier Prognoser ved Hjelp Av Facebook ‘ S Prophet.

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

Inference

Prophet (som de fleste tidsserieprognoser) prøver å fange trenden og sesongmessigheten fra tidligere data. Denne modellen fungerer vanligvis godt på tidsserier datasett, men klarer ikke å leve opp til sitt rykte i dette tilfellet.

som det viser seg, har aksjekursene ikke en bestemt trend eller sesongmessighet. Det er svært avhengig av hva som for tiden skjer i markedet og dermed prisene stiger og faller. Derfor prognoser teknikker SOM ARIMA, SARIMA og Profeten ville ikke vise gode resultater for dette problemet.

La oss gå videre og prøve en annen avansert teknikk-Long Short Term Memory (LSTM).

Long Short Term Memory (Lstm)

Introduksjon

Lstm er mye brukt for sekvensprognoseproblemer og har vist seg å være ekstremt effektive. Grunnen til at DE fungerer så bra er FORDI LSTM er i stand til å lagre tidligere informasjon som er viktig, og glemme informasjonen som ikke er. LSTM har tre porter:

  • inngangsporten: Inngangsporten legger til informasjon i cellestatusen
  • glem-porten: den fjerner informasjonen som ikke lenger kreves av modellen
  • utgangsporten: Utgangsporten ved LSTM velger informasjonen som skal vises som utgang

For en mer detaljert forståelse AV LSTM og dens arkitektur, kan du gå gjennom artikkelen nedenfor:

  • Introduksjon Til Lang Korttidshukommelse

For nå, la OSS implementere LSTM som en svart boks og sjekke ytelsen på våre spesielle 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])

Slutning

Wow! LSTM-modellen kan stilles inn for ulike parametere som å endre antall lstm-lag, legge til frafallsverdi eller øke antall epoker. Men er spådommene fra LSTM nok til å identifisere om aksjekursen vil øke eller redusere? Absolutt ikke!

som jeg nevnte i starten av artikkelen, er aksjekursen påvirket av nyheter om selskapet og andre faktorer som demonetisering eller fusjon/fisjon av selskapene. Det er også visse immaterielle faktorer som ofte kan være umulig å forutsi på forhånd.

Sluttnotater

tidsserieprognoser er et veldig spennende felt å jobbe med, som jeg har innsett i løpet av min tid å skrive disse artiklene. Det er en oppfatning i samfunnet at det er et komplekst felt, og mens det er et sannhetskorn der inne, er det ikke så vanskelig når du får tak i de grunnleggende teknikkene.

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert.