Kuidas ennustada Bitcoini ja Ethereumi hinda RNN-LSTM-iga Keras

2017 oli suurepärane tehisintellekti ja krüptovaluuta aasta. AI-tööstuses on tehtud palju uuringuid ja läbimurdeid ning kindlasti on AI tänapäeval üks trendikamaid tehnoloogiaid ja veelgi enam tulevikus. Üks asi, mida ma isiklikult ei näinud, et see 2017. aastal peavoolu jõudis, olid krüptovaluutad. See oli massiivne puljong, mis tõi kaasa mõne hullumeelse investeeringutasuvuse sellistele krüptovaluutadele nagu Bitcoin, Ethereum, Litecoin, Ripple ja nii edasi.

Olen hakanud masinõppe tehnikate üksikasjadesse sukelduma 2017. aasta alguses ja nagu paljud teisedki ML-i eksperdid ja entusiastid, on nende tehnikate kasutamine krüptovaluutaturul väga ahvatlev. Huvitav osa on mitmesugused viisid ja meetodid, mida ML ja Deep Learning mudeleid saab kasutada aktsiaturul või meie puhul krüptoturul.

Leidsin, et ühepunktilise ennustusmudeli ehitamine võiks olla suurepärane lähtepunkt sügavuti õppimiseks aegridade, näiteks hinnaandmete abil. Muidugi ei lõpe see siin, alati on arenguruumi ja täiendavate sisendandmete lisamist. Minu lemmik on kasutada automatiseeritud kauplemisagentide jaoks sügava tugevdamise õppimist. See, mille kallal ma praegu töötan, on aga esimene samm LSTM-võrkude kasutamise õppimine ja hea ennustusmudeli loomine.

Eeltingimused ja arenduskeskkond

Ma eeldan, et teil on Pythoni osas teatav kodeerimisoskus ja põhiteadmised masinõppest, eriti süvaõppe kohta. Kui ei, siis kiire ülevaate saamiseks lugege seda postitust.

Minu valik arenduskeskkonna jaoks on google Colab. Valisin Colabi keskkonna seadistamise lihtsuse ja tasuta GPU-le juurdepääsu tõttu, mis muudab koolituse aega märkimisväärselt. Siit leiate õpetuse, kuidas oma Google Drive'is kobaleid seadistada ja kasutada. Minu täieliku Colabi sülearvuti leiate siit ja siit GitHubist.

Kui soovite AWS-i keskkonda seadistada, kirjutasin mõni aeg tagasi ka õpetuse AWS-i esinemisjuhu seadistamiseks GPU-ga Dockeriga. Siin on link.

Kasutan mudeli ehitamiseks ja ajalooliste andmete koolitamiseks Kerase teeki koos TensorFlow taustaprogrammiga.

Mis on korduv närvivõrk?

Korduvate närvivõrkude selgitamiseks pöördugem kõigepealt tagasi ühe peidetud kihiga lihtsasse perceptroni võrku. Selline võrk teeb lihtsate klassifitseerimisprobleemide korral OK tööd. Varjatud kihtide lisamisega suudab võrk järeldada meie sisendandmetes keerukamaid mustreid ja suurendab ennustuste täpsust. Seda tüüpi võrgud on aga head ajaloost sõltumatute ülesannete jaoks, kus ajaline järjekord pole oluline. Näiteks kujutise klassifikatsioon, mis eelnev proov treeningkomplektis ei mõjuta järgmist valimit. Teise sõnaga - perceptronitel pole minevikku mälu. Sama on ka konvolutsiooniliste närvivõrkude puhul, mis on pildi äratundmiseks kavandatud tajude keerukam arhitektuur.

Lihtne perceptroni närvivõrk ühe varjatud kihi ja kahe väljundiga

RNN-id on närvivõrgu tüüp, mis lahendab tajude varasema mälu probleemi, lükates võrku eelmise aktiivsusetapi varjatud oleku koos praeguse sisendnäidisega.

Lubage mul seda lähemalt käsitleda, uue valimi saabumisel unustab iga kord, kui võrk eelmises etapis valimi moodustas, üks viis aegridade probleemi lahendamiseks on eelneva sisendi lisamine proovi praeguse valimi abil, nii et meie võrgul oleks aimu, mis varem juhtus, kuid sel viisil ei saa me enne eelmist toimingut kogu aegridade ajalugu jäädvustada. Parem lähenemine on saadud varjatud kihi (varjatud kihi kaalu maatriks) võtmine eelmisest sisendproovist ja söötmine see meie võrku koos praeguse sisendprooviga.

Vaatan varjatud kihi kaalu maatriksit kui võrgu meeleseisundit. Kui me vaatame seda niimoodi, siis on varjatud kiht juba varasemalt hõivatud kaalujaotuse vormis kõigi selle neuronite vahel, mis on palju rikkam esitus. minevikust meie võrgu jaoks. Kolaha ajaveebi pildi all olev pilt annab hea ülevaate RNN-is toimuvast.

kui Xt tuleb sisse, ühendatakse Xt-1 varjatud olek Xt-ga ja sellest saab võrgu sisend ajahetkel t. Seda protseduuri korratakse kõigi aegridade proovide puhul.

Püüdsin hoida seda võimalikult lihtsana. Kui soovite süveneda RNN-idesse, on palju ressursse, mida ma soovitan teil seda tungivalt teha. Siin on mõned head ressursid RNNide kohta:

  • Sissejuhatus RNNidesse
  • Korduvad närvivõrgud algajatele
  • Korduvate närvivõrkude mõistmatu tõhusus

Mis on pikaajaline mälu?

Enne kui ma ütlen teile, mis on LSTM, lubage mul rääkida teile RNN-ide suurimast probleemist. Siiani näeb RNNide kohta kõik hea välja, kuni me treenime seda tagasi levitamise kaudu. Kui meie treeningproovide gradient levib meie võrgu kaudu tagasi, muutub see nõrgemaks ja nõrgemaks, selleks ajaks, kui see jõuab neuronitesse, mis esindavad meie aegridade vanemaid andmepunkte, pole tal mahla, et neid õigesti reguleerida. Seda probleemi nimetatakse kaduvaks gradientiks. LSTM-lahter on teatud tüüpi RNN, mis salvestab olulist teavet mineviku kohta ja unustab tähtsusetud tükid. Sel moel, kui gradient tagasi levib, ei kuluta seda mittevajalik teave.

Mõelge endale, kui loete raamatut, sageli pärast peatüki lõpetamist, ehkki mäletate, mis oli eelmises peatükis, ei pruugi te kõiki selle olulisi punkte meelde jätta. Üks võimalus selle probleemi lahendamiseks toome esile ja teeme märkused nendest punktidest, mida on oluline meeles pidada ja tähelepanuta jätta nende seletuste ja täiteainete osas, mis ei ole teema jaoks kriitilised. Christopher Olahi arusaamine LSTM-võrkudest on suurepärane ressurss LSTM-ide põhjalikuks mõistmiseks.

Let’s Code

Kõigepealt impordime raamatukogud, mida me oma projekti jaoks vajame.

impordi gc
impordi kuupäev
importida pandasid pd-na
impordi numpy kui np
import matplotlib.pyplot plt

impordi keras
alates keras.models import Sequential
saidilt keras.layers impordib Activation, Dense
alates keras.layers impordib LSTM
alates keras.layers impordib väljalangevuse

Ajaloolised andmed

Olen kasutanud veebiaadressi www.coinmarketcap.com ajaloolisi andmeid, võite kasutada mis tahes muud allikat, kuid pidasin seda selle postituse jaoks väga lihtsaks ja otsekoheseks. Saame Bitcoini igapäevaseid hinnaandmeid. Colabi märkmikus näete aga ka Ethereumi koodi. Kirjutasin koodi viisil, mis oleks muude krüptovaluutade jaoks korduvkasutatav.

Kirjutagem nüüd funktsioon turuandmete saamiseks.

Hankigem nüüd Bitcoini andmed ja laadige see muutujasse '' btc_data '' ja näidake meie andmete esimest viit rida.

btc_data = get_market_data ("bitcoin", tag = 'BTC')
btc_data.head ()
BTC turuandmed

Vaatame Bitcoini „Sule” hinda ja selle päevamahtu aja jooksul

show_plot (btc_data, tag = 'BTC')

Andmete ettevalmistamine

Suurt osa süvaõppe mudeli loomisest moodustab meie andmete ettevalmistamine närvivõrkude poolt treenimiseks või ennustamiseks. Seda etappi nimetatakse eeltöötluseks, mis võib sisaldada mitut sammu, sõltuvalt kasutatavate andmete tüübist. Meie puhul teeme eeltöötluse osana allpool ülesandeid:

  • Andmete puhastamine, puuduvate andmepunktide täitmine
  • Mitme andmekanali liitmine. Bitcoin ja Ethereum ühes andmeraamis
  • Eemaldage tarbetud veerud
  • Sorteeri meie andmed kuupäeva järgi kasvavas järjekorras
  • Jagage andmed koolituse ja testi jaoks
  • Looge sisestusproovid ja normaliseerige need vahemikus 0 kuni 1
  • Looge treeningute ja testikomplektide sihtväljundid ja normaliseerige need vahemikus 0 kuni 1
  • Teisendage meie andmed tuimaks massiiviks, mida meie mudel tarbib

Andmete puhastamise osa on juba tehtud meie esimeses funktsioonis, kuhu andmed laadisime. Altpoolt leiate ülaltoodud ülesannete jaoks vajalikud funktsioonid:

Siin on funktsioonide joonistamise ja kuupäeva siltide loomise kood

Siin kutsume ülaltoodud funktsioone, et luua meie mudeli jaoks lõplikud andmekogumid.

train_set = train_set.drop ('kuupäev', 1)
test_set = test_set.drop ('Kuupäev', 1)
X_train = looma_sisendid (rongi_komplekt)
Y_train_btc = loo_väljundid (rongi_komplekt, münt = 'BTC')
X_test = loo_sisendid (test_set)
Y_test_btc = loo_väljundid (test_set, münt = 'BTC')
Y_train_eth = looma_väljundid (rongi_komplekt, münt = 'ETH')
Y_test_eth = loo_väljundid (test_set, münt = 'ETH')
X_õpe, X_test = to_array (X_train), to_array (X_test)

Ehitagem nüüd meie mudel LSTM-RNN. Selles mudelis olen kasutanud 3 kihti LSTM-i koos 512 neuroniga kihi kohta, millele järgneb 0,25 väljalangemist pärast iga LSTM-kihti, et vältida üleliigset paigaldamist, ja lõpuks on tihe kiht meie väljundite saamiseks.

TensorBoardist eksporditud TensorFlow arvutusgraafik

Olen kasutanud oma aktiveerimisfunktsiooni jaoks tanh ja kaotuse korral keskmist ruutude viga ning optimeerijana adam. Ma soovitaksin mängida nende funktsioonide erinevate valikutega ja vaadata, kuidas need mõjutavad teie mudeli toimivust.

Siin on meie mudeli kokkuvõte:

Olen hübriidparameetrid täielikuks muutnud koodi alguses, et muuta erinevate variatsioonide muutmist ühest kohast lihtsamaks. Siin on minu hüperparameetrid:

neuronid = 512
activation_function = 'tanh'
kaotus = 'mse'
optimeerija = "adam"
väljalangevus = 0,25
partii suurus = 12
ajajärgud = 53
window_len = 7
koolitus_suurus = 0,8
merge_date = '2016-01-01'

Nüüd on aeg koolitada meie mudel kogutud andmete põhjal

# puhastage mälu
gc.collect ()
# juhuslik reprodutseeritavus
np.random.seed (202)
# mudeli arhitektuuri lähtestamine
btc_model = build_model (X_train, output_size = 1, neuronid = neuronid)
# rongimudel andmetel
btc_history = btc_model.fit (X_train, Y_train_btc, epochs = epochs, batch_size = batch_size, verbose = 1, validation_data = (X_test, Y_test_btc), shuffle = False)

Ülaltoodud koodi valmimine võib võtta veidi aega, sõltuvalt teie arvuti võimsusest ja kui see on tehtud, tehakse ka teie koolitatud mudel :)

Vaatame BTC ja ETH tulemusi

Pole paha startija jaoks :)

Seal on David Sheehani kirjutatud suurepärane blogipostitus, kus ma sain kõigepealt teada, kuidas kasutada LSTM-e krüptovaluuta hinna ennustamiseks. Siin on link tema ajaveebi.

1. värskendus:

  • Eemaldatud lisa_volatiilsus, kuna see ei mõjutanud toimivust
  • Loodud plot_results () ja lisatud joonisele kuupäeva sildid
  • asendas MAE kaotuse funktsioonina MSE-ga
  • Suurendatud partii suurus 64-lt 128-le
  • Lisatud TF arvutusliku graafiku diagramm

2. värskendus:

  • Suutsin jõudlust pisut parandada (kaotust vähendades), vähendades akna pikkust 7 päevalt 3 päevale ja neuronite arvu 1024-le.

Loodan, et teile meeldis see postitus!