Kuinka ennustaa Bitcoin- ja Ethereum-hintaa RNN-LSTM: llä Kerasissa

2017 oli upea tekoälyn ja salaustekniikan vuosi. AI-teollisuudessa on tehty monia tutkimuksia ja läpimurtoja, ja ehdottomasti AI on yksi trendikkäimmistä tekniikoista nykyään ja vielä enemmän tulevaisuudessa. Yksi asia, jota en henkilökohtaisesti nähnyt sen tulevan valtavirtaan vuonna 2017, oli kryptovaluutat. Se oli massiivinen härkäjuoksu, jolla oli järjetöntä sijoitetun pääoman tuottoa kryptovaluutoille, kuten Bitcoin, Ethereum, Litecoin, Ripple ja niin edelleen.

Olen alkanut sukeltamalla koneoppimistekniikoiden yksityiskohtiin vuoden 2017 alussa, ja kuten monet muutkin ML-asiantuntijat ja -harrastajat, näiden tekniikoiden soveltaminen kryptovaluuttamarkkinoille on erittäin houkuttelevaa. Mielenkiintoinen osa on erilaisia ​​tapoja ja menetelmiä, joita ML- ja Deep Learning -malleja voidaan käyttää osakemarkkinoilla tai tapauksessamme salausmarkkinoilla.

Huomasin, että yhden pisteen ennustamismallin rakentaminen voisi olla hyvä lähtökohta tutkia syvää oppimista aikasarjojen, kuten hintatietojen, avulla. Tietenkin, se ei lopu tähän, on aina parantamisen varaa ja lisäämällä lisätietoja syöttötietoihin. Oma suosikki on käyttää syvävahvistusoppimista automatisoituihin kauppaedustajiin. Mihin työskentelen tällä hetkellä, LSTM-verkkojen käytön oppiminen ja hyvän ennustemallin luominen on kuitenkin ensimmäinen askel.

Edellytykset ja kehitysympäristö

Oletan, että sinulla on jonkin verran Python-koodaustaitoja ja perustiedot koneoppimisesta, erityisesti syväoppimisesta. Jos ei, tarkista tämä viesti saadaksesi nopean yleiskuvan.

Valintani kehitysympäristöön on google's Colab. Valitsin Colabin ympäristöasennuksen yksinkertaisuuden ja ilmaisen GPU: n käytön takia, mikä tekee huomattavan eron harjoittelusajassa. Tässä on opas, jolla voit määrittää ja käyttää colabia Google Drivessa. Löydät koko Colab-muistikirjani täältä ja täältä GitHubista.

Jos haluat asettaa AWS-ympäristön, kirjoitin myös jonkin aikaa sitten opetusohjelman AWS-ilmentymän asentamisesta GPU: n Docker-ohjelmalla. Tässä on linkki.

Aion käyttää Keras-kirjastoa TensorFlow-taustajärjestelmän kanssa mallin rakentamiseen ja historiallisen tiedon kouluttamiseen.

Mikä on toistuva hermoverkko?

Palaa toistuviin hermostoverkkoihin palaamalla ensin takaisin yksinkertaiseen perceptron-verkkoon, jossa on yksi piilotettu kerros. Tällainen verkko tekee OK-tehtävän yksinkertaisiin luokitteluongelmiin. Lisäämällä piilotettuja kerroksia verkko pystyy päättelemään monimutkaisempia malleja syöttötiedoissamme ja parantamaan ennusteiden tarkkuutta. Tämäntyyppiset verkot ovat kuitenkin hyviä historiasta riippumattomille tehtäville, joissa ajallisella järjestyksellä ei ole merkitystä. Esimerkiksi kuvan luokittelu, joka aikaisempi näyte harjoitusjoukossa ei vaikuta seuraavaan näytteeseen. Toisella sanalla, havaitsijoilla ei ole muistia menneisyydestä. Tämä on sama konvoluutiohermostoverkoissa, jotka ovat kuvan tunnistamiseen suunniteltujen näköhavaintojen monimutkaisempi arkkitehtuuri.

Yksinkertainen perceptron-hermoverkko, jossa yksi piilotettu kerros ja kaksi lähtöä

RNN: t ovat neuraaliverkon tyyppejä, jotka ratkaisevat havainnointien aikaisemman muistin ongelman silmukoimalla edellisen aikavaiheen piilotetussa tilassa verkkoon yhdessä nykyisen tulonäytteen kanssa.

Sallikaa minun tarkentaa tätä tarkemmin, jokaisessa vaiheessa, kun uusi näyte tulee, verkko unohtaa mikä oli edellisen vaiheen näyte. Yksi tapa ratkaista tämä aikasarjojen ongelma on syöttää edellinen tulo ota nykyisen näytteen kanssa, jotta verkostomme voi saada kuvan siitä, mitä tapahtui aiemmin, mutta tällä tavoin emme pysty vangitsemaan aikasarjojen koko historiaa ennen edellistä vaihetta. Parempi lähestymistapa on ottaa tuloksena oleva piilotettu kerros (piilotetun kerroksen painomatriisi) edellisestä tulonäytteestä ja syöttää se verkkoomme nykyisen tulonäytteen rinnalla.

Tarkastelen piilotetun kerroksen painomatriisia verkon mielentilana, jos tarkastelemme sitä tällä tavalla, piilotettu kerros on jo vallannut menneisyyden painon jakautumisen muodossa kaikissa sen neuroneissa, mikä on paljon rikkaampi esitys menneisyydestä verkostomme kannalta. Colalan blogin alla olevan kuvan alla on hyvä kuvaus RNN: n tapahtumista.

kun Xt tulee sisään, Xt-1: n piilotettu tila yhdistetään Xt: n kanssa ja siitä tulee verkon tulo ajankohtana t. Tämä prosessi toistetaan jokaiselle näytteelle aikasarjassa.

Yritin pitää sen mahdollisimman yksinkertaisena. Resursseja on paljon, jos haluat sukeltaa syvemmälle RNN-verkkoihin, mitä suosittelen teille niin. Tässä on hyviä resursseja RNN: istä:

  • Johdanto RNN: iin
  • Toistuvat hermoverkot aloittelijoille
  • Toistuvien hermoverkkojen kohtuuton tehokkuus

Mikä on pitkäaikainen muisti?

Ennen kuin kerron sinulle, mikä on LSTM, anna minun kertoa sinulle suurimmasta ongelmasta RNN: ien kanssa. Toistaiseksi kaikki näyttää hyvältä RNN: istä, kunnes me koulutamme sitä vastalevityksen avulla. Kun koulutusnäytteidemme gradientti etenee verkon kautta taaksepäin, se heikkenee ja heikkenee, kun ne pääsevät neuroneihin, jotka edustavat aikajaksomme vanhempia datapisteitä, sillä ei ole mehua säätää niitä kunnolla. Tätä ongelmaa kutsutaan häviäväksi gradientiksi. LSTM-solu on eräänlainen RNN, joka tallentaa tärkeää tietoa menneisyydestä ja unohtaa tärkeät kappaleet. Tällä tavoin, kun kaltevuus taaksepäin leviää, tarpeeton tieto ei kuluta sitä.

Ajattele itseäsi, kun luet kirjaa, usein luvun päätyttyä, vaikka et muista mitä edellinen luku oli, et ehkä pysty muistamaan kaikkia tärkeitä seikkoja siitä. Yksi tapa ratkaista tämä ongelma korostetaan ja tehdään muistiinpanoja niistä kohdista, jotka on tärkeää muistaa ja jättää huomioimatta selitykset ja täyteaineet, jotka eivät ole kriittisiä aiheelle. Christopher Olahin ymmärtäminen LSTM-verkoista on loistava resurssi LSTM: ien syvälliseen ymmärtämiseen.

Otetaan koodi

Ensinnäkin ensin tuodaan kirjastoja, joita tarvitsemme projektiimme.

Tuo gc
Tuo päivämäärä
tuoda pandat pd-muodossa
Tuo numerot kuin np
Tuo matplotlib.pyplot plt

tuo kerat
alkaen keras.models tuo Sequential
alkaen keras.layers tuo Activation, Dense
alkaen keras.layers tuo LSTM
alkaen keras.layers tuo Dropout

Historiatiedot

Olen käyttänyt historiallista tietoa osoitteesta www.coinmarketcap.com, saatat käyttää mitä tahansa muuta lähdettä, mutta pidän sitä erittäin yksinkertaisena ja suoraviivaisena tähän viestiin. Me saamme päivittäiset hintatiedot Bitcoinista. Kuitenkin colab-muistikirjassa näet myös koodin Ethereumille. Kirjoitin koodin tavalla, jota voidaan käyttää uudelleen muihin kryptovaluutoihin.

Kirjoita nyt toiminto markkinatietojen saamiseksi.

Otetaan nyt Bitcoinin tiedot ja ladataan se muuttujaan '' btc_data '' ja näytetään tietomme viisi ensimmäistä riviä.

btc_data = get_market_data ("bitcoin", tag = 'BTC')
btc_data.head ()
BTC: n markkinatiedot

Katsotaanpa Bitcoinin 'Sulje' -hintaa ja sen päivittäistä määrää ajan myötä

show_plot (btc_data, tag = 'BTC')

Tietojen valmistelu

Suuri osa minkä tahansa syvän oppimisen mallin rakentamista on valmistaa tietomme neuraalisen verkon kuluttamiseen koulutusta tai ennustamista varten. Tätä vaihetta kutsutaan esikäsittelyksi, joka voi sisältää useita vaiheita käytetyn tietotyypin mukaan. Tapauksessamme teemme alla tehtäviä osana esikäsittelyä:

  • Tietojen puhdistus, puuttuvien tietopisteiden täyttäminen
  • Useiden datakanavien yhdistäminen. Bitcoin ja Ethereum yhdessä tietokehyksessä
  • Poista tarpeettomat sarakkeet
  • Lajittele tietomme nousevaan järjestykseen päivämäärän perusteella
  • Jaa tiedot koulutusta ja testiä varten
  • Luo tulonäytteitä ja normalisoi ne välillä 0 - 1
  • Luo harjoitus- ja testijoukkojen tavoitelähdöt ja normalisoi ne välillä 0 - 1
  • Muunna tietomme numeromalliksi, jota mallimme kuluttaa

Tietojen puhdistusosa on jo tehty ensimmäisessä toiminnassamme, jossa latasimme tiedot. Alta löydät yllä olevien tehtävien suorittamiseen tarvittavat toiminnot:

Tässä on koodi toimintojen piirtämiseen ja päivämäärätarrojen luomiseen

Täällä kutsutaan yllä toimintoja, jotta voimme luoda lopulliset tietojoukot mallillemme.

train_set = train_set.drop ('päivämäärä', 1)
test_set = test_set.drop ('Päivämäärä', 1)
X_train = luo_syöttö (juna_set)
Y_train_btc = luo_lähtöt (juna_setti, kolikko = 'BTC')
X_test = luo_sisääntulot (test_set)
Y_test_btc = luo_lähtöt (test_set, kolikko = 'BTC')
Y_train_eth = luo_lähtöt (juna_set, kolikko = 'ETH')
Y_test_eth = luo_lähtöt (test_set, kolikko = 'ETH')
X_train, X_test = to_array (X_train), to_array (X_test)

Nyt rakennetaan LSTM-RNN-malli. Tässä mallissa olen käyttänyt 3 LSTM-kerrosta, joissa on 512 neuronia per kerros, jota seuraa 0,25 pudotusta kunkin LSTM-kerroksen jälkeen ylimääräisen sovittamisen estämiseksi ja lopulta tiheä kerros tuottaa lähtöjämme.

TensorFlow-laskentakaavio viedään TensorBoardista

Olen käyttänyt "tanh" aktivointitoimintooni ja keskimääräistä neliövirhettä menettämiseenni ja "adam" optimoijana. Ehdotan leikkiä näiden toimintojen erilaisilla valinnoilla ja nähdä, miten ne vaikuttavat mallisi suorituskykyyn.

Tässä on malliyhteenveto:

Olen hylännyt koko parametrin hyperparametrit koodin alussa, jotta eri variaatioiden muuttaminen olisi helpompaa yhdestä paikasta. Tässä ovat hyperparametrit:

neuronit = 512
activation_function = 'tanh'
tappio = 'mse'
Optimizer = "Adam"
poistuminen = 0,25
eräkoko = 12
aikakaudet = 53
ikkuna_len = 7
koulutuskoko = 0,8
merge_date = '2016-01-01'

Nyt on aika kouluttaa mallisi mallineemme

# siivota muisti
gc.collect ()
# satunnainen siemen toistettavuutta varten
np.random.seed (202)
# alusta malli arkkitehtuuri
btc_model = build_model (X_train, output_size = 1, neuronit = neuronit)
# junamalli tiedoilla
btc_history = btc_model.fit (X_train, Y_train_btc, epochs = epookit, batch_size = batch_size, verbose = 1, validation_data = (X_test, Y_test_btc), shuffle = False)

Yllä olevan koodin loppuun saattaminen voi viedä hetken riippuen laskentatehosta ja kun se on valmis, myös koulutettu mallisi tehdään liian :)

Katsotaanpa BTC: n ja ETH: n tulokset

Ei paha aloittelijalle :)

Siellä on hieno blogi, jonka on kirjoittanut David Sheehan. Sieltä sain ensin tietää kuinka käyttää LSTM: ää salauksen valuuttahinnan ennustamiseen. Tässä on linkki hänen blogiinsa.

Päivitys 1:

  • Add_volatility poistettiin, koska se ei vaikuttanut suorituskykyyn
  • Luotut plot_results () ja lisätty päivämäärätarrat kuvaan
  • korvattu MAE häviofunktiolla MSE
  • Lisääntynyt erän koko 64: sta 128: een
  • Lisätty TF: n laskennallinen kuvaajakaavio

Päivitys 2:

  • Voisin parantaa jonkin verran suorituskykyä (vähentää häviötä) vähentämällä ikkunan pituutta 7 päivästä 3 päivään ja neuronien määrää 1024: ään.

Toivottavasti nautit tästä viestistä!