Személy szerint mindig akkor kezdek el hinni valamiben, ha megfelelő leírások alapján saját adatokkal, saját motivációval azt a valamit le tudom tesztelni. Ezt első alkalommal a Mesterin-en, most fogjuk megtenni egy gépi tanulás példával:

múltbeli, idősor alapú (tőzsdei) adatok alapján fogunk előrejelzést készíteni, Python programozási nyelvben, Google Colab platformon.

Amennyire bonyolultnak tűnik első olvasatra, annyira lesz egyszerű a megvalósítása.

Kiemelném, hogy nem biztos, 100%-os módszert akarok adni, hogy lehet tőzsdei árfolyamokat előrejelezni, hanem a sokak által ismert, könnyen hozzáférhető adatokkal szeretnék dolgozni.

Idősor alapú adatok

Idősor alapú adatokról abban az esetben beszélünk amikor a statisztikai megfigyelések elemeit egymás követő időpontokban vagy időszakokban tesszük és ez a fajta időbeliség az adatok fontos tulajdonsága.

Szóval, ha 30 napon keresztül, minden reggel 8:00-kor feljegyezzük a lakás egy megadott pontján lévő hőmérő által mutatott értékek, és ezt táblázatos vagy diagramos formátumban tesszük, idősor alapú adatokról beszélünk. Nagyon fontos, hogy csak akkor értelmezhető jól az adatsor amikor a mintavételezések értéke mellé az adott dátumot is feljegyezzük, mert így állíthatóak időrendbe az értékek.

Egyéb példák lehetnek:

  • hipermarket napi bevételének adatsora,
  • munkanélküliségi ráta negyedéves adatsora,
  • vonat járat utasainak száma óránként,
  • ipari termelés és értékesítés negyedéves adatsora,
  • cég tőzsdei árfolyamának napi záróértékei.
Magyarországi ipari termelés és értékesítés idősori diagramja. Forrás: KSH.

Előrejelzés idősor alapú adat alapján

Ha képbe kerültünk az idősor alapú adatok fő tulajdonságaival, érdemes szót ejteni arról, hogy milyen lehetőségeink vannak az adatok alapján előrejelzést tenni.

Elsőként az átlag, medián fogalmak juthatnak eszünkbe: átlag a számértékek összege, osztva az összeadott számok számával, míg a medián a számértékek növekvő sorba rendezése után a középső elem, vagy páros számú elem esetén a két középső elem átlag.

Ezek jól hangzanak, de mi van abban az esetben, amikor például ránézünk az OTP árfolyam 2018-as napi záró értékeinek diagramjára?

Az OTP részvény napi záróértékei a 2018-as évben.
Az OTP részvény napi záróértékei a 2018-as évben.

Kékkel ábrázoltuk a napi árfolyamot és narancssárga vonallal az átlag értéket. Ha feltesszük a kérdést, valószínűleg melyek a 2019.01.01-ét követő tőzsdei záró érték, valószínűleg nem a sárga pontot jelölnénk meg.

Tudhatjuk, hogy az árfolyam nem mindig az áltag érték felé mozog el, lehetnek benne szezonalitások (visszatérő tendenciák), így emiatt szinte lehetetlen egyszerű leíró statisztikával előre jelezni az árfolymot.

Érzékeltetni szerettem volna, hogy a konvencionális statisztikai megoldások alkalmazásával nem lehet bonyolult rendszereket pontosan és jól leírni. Ilyen esetben érdemes a összetettebb matematikai stuktúrát, a gépi tanulás eszközeit igénybe venni.

Tőzsdei adatok letöltése

A példánkban tőzsdei adatokat fogok használni. A letöltéshez a BÉT (Budapesti Értéktőzsde) honapjára kell ellátogatni (link), ahol következő felület fogad minket.

A BÉT adatletöltési felülete.
A BÉT adatletöltési felülete.

Itt lehetőség van beállítani az időszakos bontást, az adott időszakot, az adatformát és az adat típusát. Mi most a 2015.01.01-től 2019.01.18-ig terjedő időszak, napi záró adataival fogunk dolgozni és vesszővel ellátott (*.csv, comma separated value) formátumot használunk.

Továbblépve, az “Azonnali piac” részen a “Részvények Prémium” lehetőséget kell kiválasztani, valamint egy instrumentumra rámutatni. A példában most az OTP árfolyammal fogok dolgozni. Ha minden beállítással végeztünk, a letöltés gombbal van lehetőség az adatok mentésére.

A kiválasztott insturmentum letöltése.
A kiválasztott insturmentum letöltése.

A letöltött fájlt eztán jegyzettömb vagy táblázatkezelő alkalmazással meg tudjuk nyitni. Miután megtettük, az alábbi kép fogad minket.

A táblázatkezelőbe betöltött csv fájl egy része.

A táblázatkezelőbe betöltött csv fájl egy része.

A CSV fájl formátum egy népszerű módja az adatok tárolásának, ugyanis nincsenek elválasztó tabulátorok az adatok között, csak a vessző értékek jelölik az értékek elválasztását.

Esetünkben 4 oszlop és 1010 sor szerepel a letöltött fájlban (mivel hétvégén nincs nyitva a tőzsde, azokra és az ünnepnapokra nincs jegyzett érték). Az első oszlop az instrumentum nevét jelöli, míg a második oszlopban találhatóak a dátum értékek. A dátumok és a hozzá kapcsolódó mennyiség értékek (zárási ár, forgó mennyiség) biztosítják az adathalmaz idősor alapú tulajdonságát.

Így már rendelkezésre áll a gépi tanulás alkalmazásához szükséges kiinduló adatsor.

Google Colab bemutatás

A nagy IT vállalatok közül a Google az egyik olyan aki komoly pénzt és időt invesztál a mesterséges intelligencia és a gépi tanulás népszerűsítésére. Ennek egyik eredményeként létrehozta a Colab felületet, azért hogy elősegítse a gyakorlati alkalmazásukat.

A program nagyon hasonló a Google Docs rendszerhez, aki rendelkezik Google fiókkal ingyenesen használhatja a rendelkezésre bocsájtott számítási kapacitást. A Colab felületen Python programozási nyelvben, szükség esetén GPU (grafikus feldolgozó egység, videókártya) teljesítmény igénybe vételével tudják a kezdők programozási és a gépi tanulással kapcsolatos tudásukat fejleszteni és elmélyíteni.

Előkészületek a gépi tanulás alkalmazásához

Első lépésként szükséges egy Google fiók, melynek Drive felületére kell feltöltenünk a BÉT rendszeréből exportált adatállományt.

A Google Drive rendszere, ahova az exportált adatállomány kell feltölteni.
A Google Drive rendszere, ahova az exportált adatállomány kell feltölteni.

A Colab felületére belépve, egy új Python 3 fájlt kell megnyitni, ez lesz az az online környezet, ahol dolgozni fogunk.

A Google Colab platform, ahol a gépi tanulás programját el fogjuk készíteni.
A Google Colab platform, ahol a gépi tanulás programját el fogjuk készíteni.

Ha ezzel megvagyunk, egy üres programfájl kerül a szemünk elé. Ezek a file-ok *.ipynb kiterjesztéssel rendelkeznek és a Drive / Colab Notebooks elérési úton kerülnek tárolásra. Ezek a fájlok letölthetőek és adott esetben saját gépen is szerkeszthetőek.

Egy üres Python file a Colab felületen.
Egy üres Python file a Colab felületen.

Első lépésként, a későbbi könnyebb azonosítás végett az Untitled0.ipynb-t, egy kattintás segítségével nevezzük át.

Az átnevezett Python file a Colab felületen.

Az átnevezett Python file a Colab felületen.

A Colab rendszerben vannak beépített parancsok és könyvtárak, de az egyik leghasznosabb tulajdonsága az hogy saját magunk is tudunk könyvtárakat telepíteni. Ezt a !pip install paranccsal tudjuk megtenni. Második lépésként az fbprophet könyvárat kell telepíteni.

Colab parancssor: !pip install –upgrade fbprophet

Ezután a bal felső sarokban található cella futtatása (run cell, play ikon, CTRL+ENTER) segítségével tudjuk telepíteni az online környezetben az fbprophet rendszert.

Fbprophet könyvtár telepítése.
Fbprophet könyvtár telepítése.

Fbprophet bemutatása

Na de mi is az a fbprophet? Az alkalmazást idősor jellegű adatok alapján történő előrejelzésre fejlesztették ki, ahol a rendszer egy additív modellt használ, olyan módon hogy figyelembe veszi a napi, heti, éves szezonalitásokat. Azon adatok alapján lehet a legpontosabb előrejelzéseket tenni az fbprophet segítségével, melyek erős szezonalitás hatással rendelkeznek és nagy mennyiségű múltbeli adat áll rendelkezésre.

Nagyon fontos, hogy a rendszer kezeli az idősorból esetlegesen hiányzó adatokat, trendek eltolódását, valamint a kiugró adatokat is. Ebből a szempontból az fbprophet az egyik legjobb egyszerűen használható alkalmazás tőzsdei idősoros adatok alapján történő előrejelzés készítésére.

Ha megtörtént az alkalmazás telepítése, egy új cellát kell nyitni (bal felső sarok: + CODE). Ezután importálni szükséges a telepített fbprophet könyvtárat valamint más szükséges könyvtárakat. Az fbprophet telepítésével kapcsolatos kimeneti információkat az első sor melletti CLEAR OUTPUT ikonnal törölni lehet.

Colab parancssor:
import pandas as pd
from fbprophet import Prophet
from fbprophet.plot import add_changepoints_to_plot

A különböző könyvtárak importálása a programba.
A különböző könyvtárak importálása a programba.

A Python programozási nyelvben az import parancs szükséges, hogy a futtatott program használni tudja a telepített könyvtárakat. Első lépésként a Panda könyvtárat (adatkezelés és adatvizualizáció miatt szükséges) importáljuk és az as paranccsal megadjuk, hogy később az egyszerűség kedvéért csak pd kóddal hivatkozunk rá.

Az fbprophet könyvtárból két részt csatolunk a saját programunkhoz: a Prophet szükséges az idősor alapú előrejelzés kiszámításához, míg az fbprophet.plot a vizuális megjelenítés miatt lesz hasznos eszköz. Ha megvagyunk a lejátszás ikonnal tudjuk a programsort a rendszerben futtatni.

Ha nincs hibaüzenet, ebben az esetben nem kapunk visszajelzést a Colab-tól. Következő lépésként a Drive tárhelyet kell a Colab-hoz csatolni, annak érdekében, hogy onnan adatot lehessen beolvasni.

Adatok beolvasása Python-ban

Colab paranccsor:
from google.colab import drive
drive.mount(‘/content/drive’)

A kódok direkt másolása esetén figyeljünk rá, hogy a Colab felületen, az aposztróf (‘) és idéző (“) jeleket javítani kell, különben SyntaxError hibaüzenet köszön vissza.

A Drive tárhely kapcsolása a Google Colab rendszerhez.
A Drive tárhely kapcsolása a Google Colab rendszerhez.

A futtatás nem történik meg, ugyanis a csatlakozáshoz autentikálni kell a Google Drive felületet. Ennek érdekében a megadott linkre kell kattintani, majd az ott található kódot az szükséges helyre be kell másolni és enter billentyűt nyomni. Ha minden rendben lezajlott a Mounted at /content/drive üzenet jelenik meg.

Egy következő cellában hivatkozzuk meg a korábban feltöltött CSV adatsort.

Colab paranccsor:
df = pd.read_csv(“drive/My Drive/”)
df.head()

A df lesz az a változónk ahova a Panda (I) segítségével a CSV fájlból beolvassuk az adatokat. A Python közvetlenül nem képes fájlokból dolgozni, így mindig szükséges először a külső fájl tartalmát változóba beolvastatni a program segítségével.

A drive/My Drive/ rész után kell megadnunk a Drive-ba feltöltött fájl nevét és kiterjesztését. Amennyiben a feltöltés előtt átnevezzük vagy más CSV fájlt használunk adatelemzésre, értelemszerűen annak a nevét kell megadni. Amennyiben nem a Drive gyökér könyvtárába töltjük fel az fájlt, természetesen az elérési utat is át kell nevezni.

 A Panda segítségével, a Drive-ba feltöltött fájl olvasásása.
A Panda segítségével, a Drive-ba feltöltött fájl olvasásása.

A df.head() paranccsal íratjuk ki az importált adatok fejlécét és első pár sorát. Amikor a cellát futtatjuk (play ikon vagy CTRL+ENTER segítségével) fenti ábrán látható táblázatos visszajelzést kapjuk.

Itt a korábban megnyitott CSV fájl köszön vissza, ugyanolyan struktúrában, ahogy korábban a számítógépen, excel segítségével megnyitottuk. Ezután a

df.plot(x=’Dátum’, y=’Utolsó ár’, kind=”line”)

paranccsal vonalas rajzon is megjeleníthetjük az értékek változását. Az x értéket minden esetben a időváltozó nevével (jelen esetben Dátum) jellemezzük, míg az y a változó mennyiségét jelenti.

Az OTP árfolyam alakulása 2015-től napjainkig.
Az OTP árfolyam alakulása 2015-től napjainkig.

Előrejelzés elkészítése

Ha ezzel is végeztünk, jön a legizgalmasabb rész, a gépi tanulás applikációja a adatokra, olyan módon, hogy abból az árfolyam értékének jövőbeli alakulását előre lehessen jelezni.

Colab parancssor:
df = df.rename(columns={‘Dátum’:’ds’, ‘Utolsó ár’:’y’})
m = Prophet(changepoint_range=0.2)
m.fit(df)
future = m.make_future_dataframe(periods=200)
forecast = m.predict(future)
fig1 = m.plot(forecast)
a = add_changepoints_to_plot(fig1.gca(), m, forecast)

A df.rename paranccsal átneveztük az oszlopok fejlécét annak érdekében, hogy az fbprophet értelmezni tudja az adatokat.

Az m változó fogja megadni, a prophet struktúrában milyen százalékos arányban jelenjenek meg trendfordulók (changepoint_range=0.2, ez lehet variálni.). Ez az értéket utána m.fit(df) paranccsal illesztjük a saját adatsorunkra.

A future változónk lesz, ahol a jövőbeli (napi) értékeket tárolni fogja a program. A változó amit szabadon át lehet írni, a periódusok száma (periods), azaz hogy hány napot jelez előre a rendszer. Az alap érték használatával 200 napos előrejelzés alakulását láthatjuk majd az ábrán.

És a végső ábránk (dobpergés…):

A gépi tanulás könyvtár (Fbprophet) segítségével előrejelzett OTP részvényárfolyam alakulása.
A gépi tanulás könyvtár (Fbprophet) segítségével előrejelzett OTP részvényárfolyam alakulása.

Az ábra értelmezését szándékosan nem végzem el, mindenkinek a saját fantáziájára bízom. Érdemes azonban a fent megnevezett 2 változó (changepoint_range és periods) variálásával figyelni hogyan reagál a gépi tanulás a jövőbeli adatok meghatározása során.

Összefoglalás

A gépi tanulás alkalmazása nem is annyira bonyolult, mint amennyire első ránézésre tűnik. A Google Colab egy remek felület, ahol ingyenesen, mindenféle programok telepítése nélkül ki lehessen próbálni a mesterséges intelligencia alkalmazásait. Mivel ingyenesen biztosít erőforrást, komolyabb, GPU-t igénylő számítási feladatok (gépi látás tanítása) elvégzésére is lehet használni.

A cikkben szerepelő példában, egy nyilvánosan elérhető (BÉT adatok) tőzsdei részvény múltbeli adatait töltöttük fel a Google Drive rendszerébe, melyet összekapcsoltuk a Colab programozási platformmal. Itt egy egyszerű, pár soros program segítségével telepítettük a gépi tanulást biztosító Fbprophet Python könyvtárat, és változóba olvastuk a CSV fájlban tárolt adatokat. Innen pedig pár sor segítségével sikerült az idősor alapú adatok 200 napos előrejelzését megadni.

A módszert jól lehet használni, más idősor alapú adathalmaz elemzéséhez, de jól működik például termelési folyamatparaméterek múltbeli értékein alapú előrejelzése során is. Innentől kezdve a képzelet szab határt milyen adatok előrejelzésére lehet felhasználni a leírt módszert.