Machine-leren heeft in de loop der jaren op vele interessante gebieden zijn toepassingen gevonden. Het temmen van de aandelenmarkt is een van hen. Ik dacht er al een hele tijd aan om het eens te proberen; vooral om mijn kennis van LSTM’s te vergroten. En eindelijk heb ik het project afgerond en ben ik erg enthousiast om mijn ervaring te delen.
Motivatie en doelpubliek
Ik zal over mijn ervaring schrijven in een serie van blogs. Het doel van deze serie is niet om de basis van LSTM of Machine Learning concepten uit te leggen. Daarom ga ik ervan uit dat de lezer zijn/haar reis met Machine Learning is begonnen en de basisbeginselen heeft zoals Python, bekendheid met SkLearn, Keras, LSTM enz. De reden hiervoor is dat er al uitstekende artikelen bestaan over onderwerpen als “Hoe werken LSTM’s?” door mensen die veel beter gekwalificeerd zijn om de wiskunde erachter uit te leggen. Maar ik zal links naar dergelijke artikels delen, overal waar ik het gevoel heb dat er achtergrondkennis ontbreekt. Hoewel er veel artikelen zijn die je vertellen hoe je aandelenkoersen kunt voorspellen gegeven een dataset, onthullen/verklaren de auteurs meestal niet hoe ze tot die bepaalde configuratie voor een neuraal netwerk zijn gekomen of hoe ze die bepaalde set hyperparameters hebben gekozen. Het echte doel van dit artikel is dus om dergelijke stappen, mijn fouten en enkele stappen die ik zeer nuttig vond, te delen. Als zodanig, dit artikel is niet beperkt tot Stock Price Prediction probleem.
Hier zijn de dingen die we zullen kijken naar :
- Lezen en analyseren van gegevens. (Pandas)
- Normaliseren van de gegevens. (SkLearn)
- Omzetten van data naar tijdreeksen en supervised learning probleem.
- Maken van model (Keras)
- Fine tuning van het model (in het volgende artikel)
- Trainen, voorspellen en visualiseren van het resultaat.
- Tips & tools die ik erg nuttig vond (laatste artikel van de serie)
Let op dat dit eerste artikel het heeft over preprocessing stappen en terminologieën van LSTM. Als je deze stappen redelijk goed kent, kun je het volgende artikel overslaan.
Let’s begin!
Lezen en analyseren van de gegevens
Ik zal voor dit artikel de historische koersgegevens van GE gebruiken. U kunt de gegevens vinden in mijn kaggle site hier. Ik weet niet meer de bron van de gegevens omdat ik had gedownload het lang terug. We kunnen lezen van de gegevens in frame zoals hieronder weergegeven :
df_ge = pd.read_csv(os.path.join(INPUT_PATH, "us.ge.txt"), engine='python')
df_ge.tail()
Zoals u kunt zien zijn er ongeveer 14060 items, die elk vertegenwoordigen een dag van de beurs attributen voor het bedrijf.
from matplotlib import pyplot as pltplt.figure()
plt.plot(df_ge)
plt.plot(df_ge)
plt.plot(df_ge)
plt.plot(df_ge)
plt.title('GE stock price history')
plt.ylabel('Price (USD)')
plt.xlabel('Days')
plt.legend(, loc='upper left')
plt.show()
Ik heb ontdekt dat deze configuratie voor LSTM het beste werkt van alle combinaties die ik heb geprobeerd (voor deze dataset), en ik heb er meer dan 100 geprobeerd! De vraag is dus hoe je de perfecte (of in bijna alle gevallen, bijna perfecte) architectuur voor je neuraal netwerk vindt. Dit leidt ons naar ons volgende en belangrijke deel, dat in het volgende artikel wordt vervolgd.
U kunt alle volledige programma’s hier op mijn Github profiel vinden.
NOTE: Een nederig verzoek aan de lezers – U bent allen welkom om contact met mij op te nemen op LinkedIn of Twitter, maar als u een vraag over mijn blogs hebt, plaats die dan alstublieft in het commentaargedeelte van de betreffende blog in plaats van in persoonlijke berichten, zodat als iemand anders dezelfde vraag heeft, hij of zij die hier zelf zou vinden, en ik die niet afzonderlijk zou hoeven uit te leggen. Echter, je bent nog steeds welkom om vragen die niet gerelateerd zijn aan blogs of algemene technische vragen, naar mij persoonlijk te sturen. Bedankt 🙂
UPDATE 13/4/19
- Het is mij ter ore gekomen, sinds ik dit artikel heb geschreven, dat mijn model dat voor deze blog is gebruikt, mogelijk overfitted is. Hoewel ik het niet heb bevestigd, is het waarschijnlijk. Dus wees voorzichtig bij het implementeren van dit in uw projecten. U kunt dingen proberen zoals minder tijdpochs, een kleiner netwerk, meer uitval, enz.
- Ik heb Sigmoid activering gebruikt voor de laatste laag, die kan lijden onder de beperking dat het niet in staat is om een prijs te voorspellen die groter is dan de ‘max’ prijs in de dataset. U zou ‘Lineaire’ activering voor de laatste laag kunnen proberen om dit op te lossen.
- Verholpen met een typfout in “omzetten van gegevens naar tijdreeksen” sectie.
Bedankt aan de lezers voor het onder mijn aandacht brengen van deze zaken.
UPDATE 21/1/2020