Kuidas saada krüptovaluuta ajaloolisi andmeid

Minimaalse eraldusvõimega OHLC andmete allalaadimine vahetusliideste kaudu

UPDATE:

Selle teema üldise huvi tõttu lõin ma andmekogumi, mis sisaldab kõiki OHLC andmeid Bitfinexi vahetusprogrammi API-st, ja laadisin selle Kaggle'i avaliku andmestikuna.

Sissejuhatus

Algoritmiline kauplemine on populaarne viis krüptovaluutaturgude kiire tempo ja muutliku keskkonnaga tegelemiseks. Automatiseeritud kauplemisstrateegia rakendamine on aga keeruline ja nõuab palju järeltestimist, mis omakorda nõuab palju ajaloolisi andmeid. Ehkki krüptovaluuta ajaloolisi andmeid pakkuvaid allikaid on mitu, on enamikul neist puudusi. Kas need on kallid, pakuvad vaid vähese ajalise eraldusvõimega andmeid (iga päev) või hõlmavad piiratud hulga valuutapaaride piiratud ajavahemikke. Siin näeme, et ajalooliste avatud, kõrgete, madalate, lähedaste andmete (OHLC) hankimine 1-minutise eraldusvõimega ei ole tegelikult maagiline ülesanne ja seda saab tasuta teha mõne Pythoni koodi reaga.

Ühendamine vahetusega

Selles õpetuses kasutame ajalooliste andmete hankimiseks Bitfinexi vahetusliidest API-t. Kuid see lähenemisviis peaks toimima ka kõigi muude samalaadseid API-sid pakkuvate vahetuste korral. Samuti ei vaja selle koodi toimimiseks Bitfinexi kontot, kuna me kasutame ainult avalikke API lõpp-punkte. Juhul, kui te pole kursis sellega, mis on API või kuidas seda kasutada, soovitan teil lugeda läbi Bitfinexi API dokumentatsioon, pärast seda on see ka liides, mille kaudu teie algoritm hiljem andmevahetusega suhtleb. Kuid ärge muretsege, te ei pea ise kirjutama Pyfoni liidest Bitfinex API-le. Juba praegu on saadaval mitu rakendust, millest üks on siin klient. Lihtsaim paigaldamine toimub pipi kaudu:

>>> pip install bitfinex-tencars

Kui teil on installitud Git, võite kliendi installimiseks lihtsalt käivitada järgmised käsud. Ärge unustage asendada sihtkaustaga.

>>> git kloon https://github.com/akcarsten/bitfinex_api.git 
>>> python  /setup.py installimine

Kui teil pole Giti installitud, saate hoidla kloonida GitHubi lehel, minge seejärel kausta, kuhu ta klooninud, ja käivitage:

>>> python setup.py install

Mõlemal juhul installitakse Bitfinexi klient teie Pythoni jaotusse.

API kliendi kasutamine

Kui vaatate Bitfinexi API dokumentatsiooni, näete, et on olemas kaks API versiooni, v1 ja v2, mõlemad rakendatakse äsja installitud kliendis, kuid siin kasutame ainult v2 API-d. Nii et pärast Bitfinex API kliendi importimist peame looma v2 API eksemplari, käivitades allpool oleva koodi. Pange tähele, et me ei anna siin ühtegi võtit, nii et meil on juurdepääs ainult avalikele lõpppunktidele, pärast koodi käivitamist kuvatakse vastav teade.

>>> import bitfinex
 
>>> # Looge v2 API api eksemplar
>>> api_v2 = bitfinex.bitfinex_v2.api_v2 ()

Ja see on meie värav andmete juurde. Dokumentatsioonist teame, et ühte avalikku lõpp-punkti nimetatakse küünlaks, mis tagastab kõikides vahetustes nähtavad andmed küünlajala kaartide taga. Seda tüüpi andmed sisaldavad järgmist teavet, ajatempel avatud, suletud, kõrge ja madala hinnaga ning kaubavahetuse maht. Seda nimetatakse ka OHLC andmeteks. Lihtsaim viis selle lõpp-punktiga kliendi kaudu suhelda on lihtsalt selle vaikesätetega helistamine.

>>> tulemus = api_v2.küünlad ()

Ülaltoodud rida annab teile viimase 1000 minuti OHLC-andmed Bitcoini hinna kohta USA dollarites. Noh, see on tore, kuid meid võib huvitada juba ammu kulgev periood või mõni teine ​​valuutapaar. Sel juhul saame täpsustada soovitud parameetrite saamiseks täiendavaid parameetreid. Ja need parameetrid on:

  • sümbol: valuutapaar, vaikimisi: BTCUSD
  • intervall: ajaline eraldusvõime, nt 1m 1 minuti jooksul OHLC andmetega
  • limiit: tagastatud andmepunktide arv, vaikimisi: 1000
  • algus: intervalli algusaeg millisekundites alates 1970. aastast
  • lõpp: intervalli lõpuaeg millisekundites alates 1970. aastast

Selle käepärase teabe abil saame käivitada esimese päringu. Allolev kood tagastab ühe minuti eraldusvõimega OHLC andmed Bitcoini hinna kohta USA dollarites kahel esimesel päeval aprillis 2018.

>>> impordi datetime
>>> impordi aeg
>>> # Määrake päringu parameetrid
>>> pair = 'btcusd' # Huvipakkuv valuutapaar
>>> bin_size = '1m' # See tagastab minutilised andmed
>>> limit = 1000 # Soovime maksimaalselt 1000 andmepunkti
>>> # Määrake alguskuupäev
>>> t_start = datetime.datetime (2018, 4, 1, 0, 0)
>>> t_start = aeg.mktime (t_start.timetuple ()) * 1000
>>> # Määrake lõppkuupäev
>>> t_stop = datetime.datetime (2018, 4, 2, 0, 0)
>>> t_stop = aeg.mktime (t_stop.timetuple ()) * 1000
>>> tulemus = api_v2.küünlad (sümbol = paar, intervall = bin_suurus,
>>> piir = piir, algus = t_start, lõpp = t_stop)

Ajalooliste andmete kogumine pikemate ajavahemike järel

Nüüd on tore, kuid endiselt on üks probleem: API tagastab maksimaalselt 1000 andmepunkti. Nii et kui me suurendaksime huvipakkuva ajavahemiku kogu aprillini 2018, ei saaks me seda üheminutilise resolutsiooniga. Nii et sellest piirangust üle saamiseks peame kirjutama funktsiooni, mis jagab meie suure päringu mitmeks väiksemaks. Üks täiendav asi, mida peame siinkohal meeles pidama, on see, et Bitfinexi API-le saab teha mitu taotlust. Praegu on see limiit 60 kõnet minutis, mis tähendab, et pärast iga päringut peaksime enne järgmise alustamist ootama vähemalt üks sekund. Allpool toodud funktsiooni turvalisuse tagamiseks oodatakse 2 sekundit, kuid soovi korral saate seda muuta.

>>> def fetch_data (algus, seiskamine, sümbol, intervall, tick_limit, samm):
>>> # Loo API eksemplar
>>> api_v2 = bitfinex.bitfinex_v2.api_v2 ()
>>> andmed = []
>>> algus = algus - samm
>>> käivitamise ajal >> algus = algus + samm
>>> lõpp = algus + samm
>>> res = api_v2.küünlad (sümbol = sümbol, intervall = intervall,
>>> piir = linnuke_limiit, algus = algus,
>>> lõpp = lõpp)
>>> andmed.extend (res)
>>> aeg.magamine (2)
>>> andmete tagastamine

Ülaltoodud funktsiooni abil saame nüüd päringuid esitada pikemate ajavahemike järel, ainus lisa asi, mida peame pakkuma, on sammu suurus millisekundites. See on, kui palju andmepunkte peaksime igas väiksemas päringus küsima. See on põhimõtteliselt sama kui piir, mille me varem määratlesime, kuid nüüd millisekundites. Nii et API-le helistamise vähendamiseks peaksime minema maksimaalselt, mis tähendab üheminutilise juhtumi korral sammu suurust: 60000 * 1000 = 60000000.

>>> # Määrake sammu suurus
>>> aja_etapp = 60000000
>>> # Määrake alguskuupäev
>>> t_start = datetime.datetime (2018, 4, 1, 0, 0)
>>> t_start = aeg.mktime (t_start.timetuple ()) * 1000
>>> # Määrake lõppkuupäev
>>> t_stop = datetime.datetime (2018, 5, 1, 0, 0)
>>> t_stop = aeg.mktime (t_stop.timetuple ()) * 1000
>>> pair_data = fetch_data (algus = t_start, stop = t_stop, sümbol = paar,
>>> intervall = bin_size, tick_limit = limit,
>>> samm = kellaaeg)

Lõpuks teisendame tulemused Pandase andmeraamiks, et saaksime võimalikud duplikaadid eemaldada, veenduda, et kõik on õiges järjekorras ja teisendada ajatempel loetavasse vormingusse.

>>> importida pandasid pd-na
>>>
>>> # Looge pandade andmeraam ja puhastage / vormindage andmed
>>> nimed = ['aeg', 'avatud', 'sulge', 'kõrge', 'madal', 'maht']
>>> df = pd.DataFrame (paari_andmed, veerud = nimed)
>>> df.drop_duplicates (inplace = tõene)
>>> df ['aeg'] = pd.to_datetime (df ['aeg'], ühik = 'ms')
>>> df.set_index ('aeg', kohapeal = tõene)
>>> df.sort_index (sisestatud = tõene)

Järeldus

Nii et kõrge eraldusvõimega OHLC andmete hankimine pole tegelikult nii keeruline. Ja kui te ei tea, kui palju valuutapaare saame seda teha Bitfinexi API kaudu, käivitage lihtsalt kaks koodirida allpool.

>>> api_v1 = bitfinex.bitfinex_v1.api_v1 ()
>>> paar = api_v1.sümbolid ()

Kui me peaksime seda edasi lükkama, võiksime kirjutada sellise skripti, mis kogub kõik andmed iga valuutapaari kohta ja salvestab selle CSV-faili. See annab teile kõik bitfinexi börsil saadud ajaloolised OHLC kauplemisandmed 1-minutise eraldusvõimega, mis peaks aitama teil töötada välja automatiseeritud kauplemisstrateegia. Kulub siiski natuke aega, kuni kõik andmed on teie arvutis, nii et peaksite piirduma oma päringuga kas lühema ajaraamistikuga või olema valuutapaaride suhtes valivam.

Loodan, et see aitab ja saate koodi siit vaadata, jälgida mind Twitteris või luua ühenduse LinkedIni kaudu.