Ceny Akcií Predikce Pomocí Strojového Učení a Hluboké Učení Techniky (s Python kódy)

Úvod

Předpovídat, jak na akciovém trhu, bude provádět je jednou z nejtěžších věcí na práci. V predikci je tolik faktorů-fyzikální faktory vs. fyziologické, racionální a iracionální chování, atd. Všechny tyto aspekty se kombinují, aby ceny akcií byly Volatilní a velmi obtížné předvídat s vysokou mírou přesnosti.

můžeme použít strojové učení jako měnič her v této doméně? Používání funkcí, jako jsou nejnovější oznámení o organizaci, jejich čtvrtletní výsledky příjmů atd., techniky strojového učení mají potenciál odhalit vzorce a poznatky, které jsme předtím neviděli, a ty lze použít k vytváření neomylně přesných předpovědí.

cena akcií předpověď, LSTM, strojového učení

V tomto článku, budeme pracovat s historickými údaji o ceny akcií kotovaných společností. Budeme realizovat mix algoritmů strojového učení předpovídat budoucí cenu akcií této společnosti, počínaje jednoduchými algoritmy, jako je průměrování a lineární regrese, a pak přejít na pokročilejší techniky, jako je Auto ARIMA a LSTM.

hlavní myšlenkou tohoto článku je ukázat, jak jsou tyto algoritmy implementovány. Stručně popíšu techniku a poskytnu relevantní odkazy, abych v případě potřeby oprášil koncepty. V případě, že jste nováčkem ve světě časových řad, doporučuji nejprve projít následující články:

  • komplexní průvodce začátečníka k vytvoření Čas Řady Předpovědi
  • Kompletní Návod na Časové Řady Modelování
  • Volný Kurz: Time Series Forecasting using Python

Projekt na Praxi Čas Série Forecasting

Čas Série forecasting & modelování hraje důležitou roli v analýze dat. Analýza časových řad je specializovaný obor statistiky široce používaný v oblastech, jako je ekonometrie & Operační výzkum.

časové řady jsou široce používány v analytice & datové vědy. To je speciálně navržen tak, časové řady problém pro vás a úkolem je předpovědět provoz.

praxe nyní

jste začátečník hledá místo, kde začít své datové vědy cestu? Prezentace komplexního kurzu plného znalostí a učení o datových vědách, kurátorský právě pro vás! Tento kurz pokrývá vše od základů strojového učení až po pokročilé koncepty ML, hluboké učení a časové řady.

  • Ověřené AI & ML Blackbelt+ Program

Obsah

    1. Pochopení Problému Prohlášení
    2. Klouzavý Průměr
    3. Lineární Regrese
    4. k-Nejbližších Sousedů
    5. Auto ARIMA
    6. Prophet
    7. Dlouhý Krátkodobé Paměti (LSTM)

Pochopení Problému Prohlášení

Budeme ponořit do implementační části tohoto článku brzy, ale nejprve je důležité si stanovit, co chceme vyřešit. Obecně je analýza akciového trhu rozdělena na dvě části-fundamentální analýzu a technickou analýzu.

  • Fundamentální analýza zahrnuje analýzu budoucí ziskovosti společnosti na základě jejího současného podnikatelského prostředí a finanční výkonnosti.
  • Technická analýza na druhé straně zahrnuje čtení grafů a použití statistických údajů k identifikaci trendů na akciovém trhu.

jak jste možná uhodli, zaměříme se na část technické analýzy. Budeme používat dataset od Quandl (Historická data pro různé zásoby najdete zde) a pro tento konkrétní projekt jsem použil data pro „Tata Global Beverages“. Čas se ponořit!

Poznámka: Zde je datový soubor jsem použil pro kód: ke Stažení

Budeme nejprve načíst soubor dat a definovat cílové proměnné za problém:

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

Tam jsou více proměnných v datovém souboru – datum, open, high, low, poslední, uzavřít, total_trade_quantity, a obrat.

  • sloupce otevřít a zavřít představují počáteční a konečnou cenu, za kterou se akcie obchodují v určitý den.
  • vysoká, nízká a poslední představují maximální, minimální a poslední cenu akcie za den.
  • celkové množství obchodu je počet akcií zakoupených nebo prodaných v den a obrat (Lacs) je obrat konkrétní společnosti k danému datu.

další důležitou věcí, kterou je třeba poznamenat, je, že trh je o víkendech a svátcích uzavřen.Všimněte si výše uvedené tabulky znovu, některé hodnoty data chybí-2/10/2018, 6/10/2018, 7/10/2018. Z těchto dat, 2. je státní svátek, zatímco 6. a 7. podzim o víkendu.

výpočet zisku nebo ztráty je obvykle určen závěrečnou cenou akcie za den, proto budeme považovat závěrečnou cenu za cílovou proměnnou. Ať je děj cílové proměnné, aby pochopili, jak to vypadá v naší údaje:

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

V nadcházející části, budeme zkoumat tyto proměnné a používat různé techniky předpovědět denní uzavírací cena akcií.

klouzavý průměr

Úvod

„průměr“ je snadno jednou z nejčastějších věcí, které používáme v našem každodenním životě. Například výpočet průměrné známky určit celkový výkon, nebo zjištění průměrné teploty v posledních několika dnech získat představu o dnešní teplotě – to vše jsou rutinní úkoly, které děláme v pravidelných intervalech. Toto je tedy dobrý výchozí bod pro použití v našem datovém souboru pro vytváření předpovědí.

předpokládaná závěrečná cena za každý den bude průměrem sady dříve pozorovaných hodnot. Namísto použití jednoduchého průměru budeme používat techniku klouzavého průměru, která používá nejnovější sadu hodnot pro každou předpověď. Jinými slovy, pro každý následující krok se předpokládané hodnoty berou v úvahu při odstraňování nejstarší pozorované hodnoty ze sady. Zde je jednoduchá postava, která vám pomůže pochopit to s větší jasností.

tuto techniku implementujeme na našem datovém souboru. Prvním krokem je vytvořit datovém že obsahuje pouze Datum a Zavřete cena sloupců, pak to rozdělit do vlaku a validační sady ověřit naše předpovědi.

implementace

pouhá kontrola RMSE nám nepomůže pochopit, jak model fungoval. Pojďme si to představit, abychom získali intuitivnější porozumění. Zde je graf předpokládaných hodnot spolu se skutečnými hodnotami.

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

Inference

hodnota RMSE se blíží 105, ale výsledky nejsou příliš slibné (jak můžete získat z grafu). Předpokládané hodnoty jsou ve stejném rozsahu jako pozorované hodnoty ve vlakové soupravě (zpočátku dochází k rostoucímu trendu a poté k pomalému poklesu).

v další části se podíváme na dvě běžně používané techniky strojového učení-lineární regresi a kNN a uvidíme, jak si vedou na našich burzovních datech.

lineární regrese

Úvod

nejzákladnějším algoritmem strojového učení, který lze na těchto datech implementovat, je lineární regrese. Lineární regresní model vrací rovnici, která určuje vztah mezi nezávislými proměnnými a závislou proměnnou.

rovnici pro lineární regresi lze zapsat jako:

tady, x1, x2,….xn představují nezávislé proměnné, zatímco koeficienty θ1, θ2,…. to jsou váhy. Podrobnější studium lineární regrese naleznete v následujícím článku:

  • komplexní průvodce pro začátečníky pro lineární, hřebenovou a laso regresi.

pro naše prohlášení o problému nemáme sadu nezávislých proměnných. Místo toho máme pouze data. Použijme sloupec Datum k extrahování funkcí jako-Den, měsíc, rok, po/pá atd. a pak se vejde lineární regresní model.

Realizace

Budeme třídit dataset ve vzestupném pořadí, a pak vytvořit samostatný datový soubor tak, že žádné nové funkce, vytvořené nemá vliv na původní 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

tím se vytvoří funkce jako:

„Rok“, „Měsíc“, „Týden“, „Den“, ‚Denvtýdnu‘, ‚Dayofyear‘, ‚Is_month_end‘, ‚Is_month_start‘, ‚Is_quarter_end‘, ‚Is_quarter_start‘, ‚Is_year_end“ a „Is_year_start‘.

Poznámka: použil jsem add_datepart z knihovny fastai. Pokud jej nemáte nainstalovaný, můžete jednoduše použít příkaz pip install fastai. V opačném případě můžete tyto funkce vytvořit pomocí simple for loops v Pythonu. Níže jsem ukázal příklad.

kromě toho můžeme přidat vlastní sadu funkcí, o kterých se domníváme, že by byly relevantní pro předpovědi. Například, moje hypotéza je, že první a poslední dny v týdnu by mohly potenciálně ovlivnit uzavírací cenu akcií mnohem více než ostatní dny. Vytvořil jsem tedy funkci, která identifikuje, zda je daný den Pondělí/pátek nebo úterý/středa / čtvrtek. To lze provést pomocí následujících řádků kódu:

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

pokud se den v týdnu rovná 0 nebo 4, hodnota sloupce bude 1, jinak 0. Podobně můžete vytvořit více funkcí. Pokud máte nějaké nápady na funkce, které mohou být užitečné při předpovídání ceny akcií, sdílejte prosím v sekci komentářů.

nyní rozdělíme data do vlakových a validačních sad, abychom zkontrolovali výkon modelu.

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

Výsledky

#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

Na RMSE hodnota je vyšší než předchozí techniky, která jasně ukazuje, že lineární regrese se provádí špatně. Pojďme se podívat na děj a pochopit, proč lineární regrese není dobře:

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

Závěr

Lineární regrese je jednoduchá technika, a docela snadné interpretovat, ale tam jsou některé zjevné nevýhody. Jedním z problémů při používání regresních algoritmů je to, že model překonává sloupec datum a měsíc. Namísto zohlednění předchozích hodnot z bodu predikce bude model zvažovat hodnotu ze stejného data před měsícem nebo ze stejného data/měsíce před rokem.

jak je vidět z výše uvedeného grafu, za leden 2016 a leden 2017 došlo k poklesu ceny akcií. Model předpověděl totéž pro leden 2018. Lineární regresní technika může fungovat dobře pro problémy, jako je prodej Big Mart, kde jsou nezávislé funkce užitečné pro stanovení cílové hodnoty.

k-nejbližší sousedé

Úvod

dalším zajímavým ml algoritmem, který zde lze použít, je kNN (k nejbližší sousedé). Na základě nezávislých proměnných kNN zjistí podobnost mezi novými datovými body a starými datovými body. Dovolte mi to vysvětlit jednoduchým příkladem.

zvažte výšku a věk pro 11 osob. Na základě dané vlastnosti (‚Age‘ a ‚Výška‘), stůl lze znázornit v grafickém formátu, jak je uvedeno níže:

určit váhu pro ID #11, kNN domnívá, hmotnost nejbližší sousedé tohoto ID. Předpokládá se, že hmotnost ID #11 bude průměrem sousedů. Pokud vezmeme v úvahu tři sousedy (k=3), váha pro ID#11 by byla = (77+72+60)/3 = 69.66 kg.

Pro detailní pochopení kNN, můžete odkazovat na následující články:

  • Úvod do k-Nejbližších Sousedů: Zjednodušené

  • Praktický Úvod do K-Nejbližších Sousedů Algoritmus Regrese

Provádění

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

Pomocí stejného vlaku a validačního souboru z poslední části:

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

Výsledky

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

Tam je obrovský rozdíl v RMSE hodnotu, ale spiknutí za předpokládané a skutečné hodnoty by měla poskytnout jasnější porozumění.

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

Inference

hodnota RMSE je téměř podobná lineárnímu regresnímu modelu a graf ukazuje stejný vzorec. Stejně jako lineární regrese, kNN také identifikoval pokles v lednu 2018, protože to byl vzor za poslední roky. Můžeme s jistotou říci, že regresní algoritmy na tomto datovém souboru nefungovaly dobře.

pojďme do toho a podívat se na některé časové řady prognostických technik zjistit, jak si vedou, když čelí této ceny akcií predikce výzvu.

Auto ARIMA

Úvod

ARIMA je velmi populární statistické metody pro časové řady prognóz. Modely ARIMA berou v úvahu minulé hodnoty, aby předpovídaly budoucí hodnoty. Tam jsou tři důležité parametry v ARIMA:

  • p (kolem hodnoty používané pro předpovídání další hodnoty)
  • q (chybami prognóz z minulosti použit k předpovědět budoucí hodnoty)
  • d (pořadí odlišení)

Parametr tuning pro ARIMA spotřebuje hodně času. Použijeme tedy auto ARIMA, které automaticky vybere nejlepší kombinaci (p, q, d), která poskytuje nejmenší chybu. Další informace o tom, jak auto ARIMA funguje, naleznete v tomto článku:

  • Vytvořit Vysoce výkonné Modely Časových řad pomocí Automatické ARIMA

Realizace

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

Výsledky

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)

Závěr

Jak jsme viděli dříve, auto ARIMA model využívá dat z minulosti, aby pochopili vzor v časové řadě. Pomocí těchto hodnot model zachytil rostoucí trend v řadě. Ačkoli předpovědi používající tuto techniku jsou mnohem lepší než předpovědi dříve implementovaných modelů strojového učení, tyto předpovědi stále nejsou blízké skutečným hodnotám.

jak je zřejmé ze spiknutí, model zachytil trend v sérii, ale nezaměřuje se na sezónní část. V další části implementujeme model časových řad, který bere v úvahu jak trend, tak sezónnost série.

Prophet

Úvod

Existuje řada časová řada technik, které mohou být realizovány na skladě předpověď dataset, ale většina z těchto technik vyžadují hodně předzpracování dat před montáží modelu. Prorok, navržený a propagoval Facebook, je časová řada prognózování knihovna, která nevyžaduje žádné předzpracování dat a je velmi jednoduché implementovat. Vstup pro proroka je datový rám se dvěma sloupci: datum a cíl (ds a y).

Prophet se snaží zachytit sezónnost v minulých datech a funguje dobře, když je datová sada velká. Zde je zajímavý článek, který vysvětluje Prorok v jednoduchým a intuitivním způsobem:

  • Generování Rychlé a Přesné Časové Řady Předpovědi pomocí Facebook je Prorok.

Realizace

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

Výsledky

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

Závěr

Prorok (jako většina čas série forecasting techniky) se snaží zachytit trend a sezónnost z minulých údajů. Tento model obvykle funguje dobře na datových sad časových řad, ale v tomto případě nesplňuje svou pověst.

jak se ukazuje, ceny akcií nemají zvláštní trend nebo sezónnost. Velmi záleží na tom, co se v současné době děje na trhu, a tím i ceny rostou a klesají. Prognostické techniky jako ARIMA, SARIMA a Prorok by tedy pro tento konkrétní problém nevykazovaly dobré výsledky.

zkusme další pokročilou techniku-Long Short Term Memory (Lstm).

dlouhodobá krátkodobá paměť (LSTM)

Úvod

Lstm jsou široce používány pro problémy s predikcí sekvencí a ukázaly se jako velmi účinné. Důvod, proč fungují tak dobře, je ten, že LSTM je schopen ukládat minulé informace, které jsou důležité, a zapomenout na informace, které nejsou. LSTM má tři brány:

  • vstupní brána: Vstupní brána přidává informace do buňky státu
  • zapomeňte na bránu: odstraňuje informace, že již není nutné do modelu
  • výstupní brány: Výstupní Brány na LSTM vybere informace, které mají být zobrazeny jako výstup

Pro podrobnější pochopení LSTM a jeho architektury, můžete projít níže čl.:

  • Úvod do Dlouhé krátkodobá Paměť

Pro teď, pojďme implementovat LSTM jako black box a zkontrolujte, zda je výkon na naše konkrétní data.

Realizace

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

Výsledky

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

Závěr

Wow! Model LSTM lze vyladit pro různé parametry, jako je změna počtu vrstev LSTM, přidání hodnoty výpadku nebo zvýšení počtu epoch. Jsou však předpovědi LSTM dostatečné k určení, zda se cena akcií zvýší nebo sníží? Určitě ne!

jak jsem zmínil na začátku článku, cena akcií je ovlivněna zprávami o společnosti a dalšími faktory, jako je demonetizace nebo fúze / rozdělení společností. Existují také určité nehmotné faktory, které lze často předem předvídat.

konec poznámky

prognóza časových řad je velmi zajímavé pole pro práci s, jak jsem si uvědomil během svého psaní těchto článků. Tam je vnímání ve společenství, že je to komplexní obor, a zatímco tam je zrnko pravdy tam, to není tak těžké, jakmile se dostanete na kloub základní techniky.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna.