Bitcoin - predikcija podataka vremenskih nizova pomoću indikatora tehničke analize i prediktivne analitike

Natrag
Svibanj 5, 2021
Vrijeme čitanja: 8 minuta

U poslovnom svijetu je jako bitno predvidjeti budući trend rasta/pada prodaje, cijena i očekivanog prinosa kako bi se sukladno tome mogle donositi ispravne poslovne odluke. U seriji članaka ću pomoću osnovne tehničke analize i prediktivne analitike pokušati predvidjeti kretanje Bitcoin cijene u budućnosti. Članci su primarno za akademske svrhe, za uvod u data science i machine learning algoritme.

Predikcija kretanja cijene u svijetu dionica, pa tako i na kripto tržištu je puno složenija nego primjerice predviđanje prodaje na razini mjeseca, kvartala ili godine. Ovdje trebe uzeti puno više faktora u obzir pa sam stoga predviđanje cijene bitcoina uzeo kao možda trenutno najpopularniji primjer korištenja statističkih metoda za predikciju budućeg trenda u podacima. Za ovu svrhu ćemo koristiti pokazatelje MACD i RSI, fundamentalnu analizu i analizu društvenih mreža u kombinaciji sa facebook paketom za python pod nazivom „Prophet“. Baš na potonjem je i fokus u ovom članku.

Ideja nije imati gotovog bota koji će na razini sata ili minute donositi odluku o padu ili rastu cijene bitcoina, već je ideja složiti alat za predviđanje trenda cijene bitcoina koji može poslužiti kao smjernica za kupovinu ili prodaju. Nad dostupnim povijesnim podacima od 2017. ćemo kreirati/trenirati model i razvijati predikcije te ćemo pomoću statističkih pokazatelja validirati točnost predviđanja. U obzir treba također uzeti i ekstremnu volatilnost tržišta, što predviđanje čini još zahtjevnijim. Nastavite čitati i otkrijte kako se Prophet nosio s ovakvim teškim zadatkom.

Prophet

Prophet koristi aditivni regresijski model, prepoznavajući promjene u trendovima na temelju analize povijesnih podataka. Za razliku od drugih algoritama kao što su ARIMA (Auto-Regressive Integrated Moving Average model), Auto-Regressive model, Exponential Smoothing, LSTM (Long Short Term Memory), FBProphet ne traži dodatan angažman oko odabira varijabli I finog podešavanja inputa u algoritam već taj posao radi on sam.

Primjer predikcije na BTC podacima na dnevnoj razini

Alati koji su nam potrebni:

  • Python 3.7 ili noviji sa pystan verzijom 2.19.1.1, fbprophet verzijom 0.7.1 ili 0.6.
  • Za potrebe ovog članka sam koristio Spyder i python 3.8. te FBProphet verziju 0.6.

Instalacija se odvija unutar Anaconda okruženja pomoću naredbe:
conda install -c conda-forge fbprophet -y

Nakon toga je potrebno skinuti povijesne BTC podatke u csv datoteku. Definiramo koje kolone želimo iz csv datoteke i datoteku učitamo u varijablu df.

col_list = ["timestamp", "close"]
df = read_csv(r"*tvoja_lokacija* \BTCUSDT-1d-data.csv", header=0, decimal=".",usecols=col_list)

Prophet zahtjeva da se kolone zovu „ds“ i „y“ kako bi sve radilo kako treba. df.columns = ['ds', 'y']

Jedna od kolona mora biti datumskog tipa jer podatke pratimo kroz povijest, potrebno je napraviti konverziju iz tipa string: df['ds']= to_datetime(df['ds'])

Napravimo li model.plot(df), dobit ćemo graf na slici ispod

Blog - model plot - Bitcoin

Sljedeći korak je fitanje modela. model = Prophet() model.fit(df)

Nakon navedenih predradnji, spremni smo raditi predikcije. Predikcije možemo raditi na godišnjoj razini, dnevnoj, tjednoj ili mjesečnoj. Potrebno je samo definirati vremenski period. Ono što je ovdje bitno je promijeniti dio koda kojim u varijablu „future“ dohvaćamo period, u ovom slučaju je to 365, čime određujemo vremenski prozor za koji želimo raditi predviđanja.

future=model.make_future_dataframe(periods=365)
future.colums['ds']
future['ds']=to_datetime(future['ds'])
#ovdje radimo predikciju
forecast=model.predict(future)
print(forecast[['ds','yhat','yhat_lower','yhat_upper']].head())
model.plot(forecast)
pyplot.show()

Blog - model predviđanja - Bitcoin

Pogledajmo rezultate predviđanja za idućih godinu dana. Točke na slici predstavljaju prave podatke, plava krivulja predstavlja kalkulaciju na temelju pravih podataka, svijetlije plavi dio je „Confidence interval“ sa defaultnom vrijednošću od 80% (možemo promijeniti confidence interval na način da proslijedimo parametar u funkciju model = Prophet(interval_width=0.80)). Dijagram govori da su 80% šanse da će vrijednost bitcoina sljedeće godine u ovo vrijeme biti između 80.000 i 175.000.

Ako malo „zumiramo“ dijagram, odnosno postavimo parametre za prognozu na 90 dana i promijenimo parametar model = Prophet(interval_width=0.95), dobijemo sljedeći dijagram:

Blog - model prophet - Bitcoin

Prophet „predviđa“ da je 95% šansa da će se cijena BTC-a za 3 mjeseca nalaziti između 65k i 85k. Kako bismo vidjeli koliko dobro algoritam radi i može li mu se vjerovati, potrebno je napraviti simulaciju pomoću cross validation metode.

Cross validation

Kako bismo odradili „Cross validation“, vremenski niz moramo podijeliti na 3 dijela. Jedna opcija je da odredimo samo varijablu horizon pa će defaultno biti određen cutoff period i inicijalni period. Inicijalni period je period na kojem algoritam „uči“, ovo bi trebao biti period od barem godinu dana, ovisno o tome s kolikom povijesti podataka radimo. Cutoff period je period u kojem algoritam „testira“ ono što je „naučio“. Horizon (validation) je vremenski period za koji želimo predviđati budućnost.

Sljedeće parametre sam odabrao na način da sam vrtio algoritam s više različitih parametara te su se ovi pokazali najpreciznijima na dulji rok.

Train - postavljen je period od godine dana za sample za treniranje

Test - 2 mjeseca

Validation – 2 mjeseca

Izvrtimo sljedeći kod:
df_cv = cross_validation(model,horizon='60 days',period='60 days',initial='365 days')
print(df_cv.head())

Blog - algoritam - Bitcoin

U testnom periodu, za timestamp ds, promatramo yhat i y, y je realna vrijednost (iz dataseta kojeg smo dohvatili), a yhat je predikcija algoritma (ono što je algoritam naučio iz skupa podataka za treniranje). Na ovome slučaju vidimo da određena odstupanja postoje. Primjerice za 15.09.2018. tržišna cijena je bila 6514.96 dok je algoritam predvidio 6348.58. Kako bismo provjerili koliko je algoritam precizan, moramo napraviti još jednu usporedbu.

Mape

Napravit ćemo analizu koristeći mean absolute percent error (MAPE) da vidimo koliko je algoritam za predviđanje točan u ovom specifičnom slučaju.

Blog - graf predviđanja - Bitcoin

ig = plot_cross_validation_metric(df_cv, metric = 'mape')

Napravimo još jedno predviđanje, ovaj put sa defaultnim postavkama, na kraći vremenski rok od 30 dana. Postavit ćemo jedino parametar horizon = '30 days'. df_cv = cross_validation(model,horizon='30 days')

Blog - rezultati predviđanja - Bitcoin

Kao što je vidljivo, u kraćem vremenskom periodu su rezultati predviđanja bili precizniji, iako odstupanje od 20-30% ne spada u kategoriju preciznijih (više u kategoriju „not great, not terrible“). Jasno je da se zbog ekstremne volatilnosti tržita ovakvi modeli trebaju uzimati sa dozom rezerve i ne mogu se koristiti kao samostalno sredstvo za predviđanje tržišta već samo kao pokazatelj momentuma ili trenda u kojem se tržište kreće.

Iako je Facebook ovaj library inicijalno zamislio za potrebe predviđanja prodaje sa izraženom sezonalnošću, on se pokazao dobrim i za svrhe predviđanja vremenskih nizova bez izražene sezonalnosti. Velika prednost mu je što nije potrebno fino podešavanje parametara te je zbog toga izrazito jednostavan za korištenje.
Treba naglasiti da je ovom metodom nemoguće točno predvidjeti kretanje cijene Bitcoina iz razloga što je burza mjesto gdje se znaju dogoditi iznenadne i neočekivanje vijesti koje oblikuju psihologiju sudionika burze i cijeli momentum se može naglo promijeniti (COVID, Trump, Elon Musk, BTC halving). Za to je u algoritam potrebno ukomponirati i dodatne komponente kao što je praćenje društvenih mreža. Također, kako bi algoritam bio precizniji, potrebno je dodati fundamentalnu i tehničku analizu (očekujte u sljedećem blog postu). Ovaj se model ne može sam kao takav koristiti za predviđanje cijene u budućnosti, ali ako se pažljivo koristi, može biti iskoristiv kao kotačić u sustavu koji je potrebno detaljno razraditi.

Autor Kristijan Rebrović

"Jasno je da se zbog ekstremne volatilnosti tržita ovakvi modeli trebaju uzimati sa dozom rezerve i ne mogu se koristiti kao samostalno sredstvo za predviđanje tržišta već samo kao pokazatelj momentuma ili trenda u kojem se tržište kreće."

Kristijan Rebrović

Senior developer

Želiš podijeliti? Slobodno!

Zanima te kako će izgledati predikcija nakon fundamentalne
i tehničke analize? Saznaj prva/i 👇