Как да получите исторически данни за криптовалута

Изтегляне на OHLC данни с минутна разделителна способност чрез API за обмен

UPDATE:

Поради общия интерес към този въпрос създадох набор от данни, включващ всички данни на OHLC от API за обмен на Bitfinex и го качих като публичен набор данни в Kaggle.

Въведение

Алгоритмичната търговия е популярен начин за справяне с бързо развиващата се и променлива среда на пазарите на криптовалути. Въпреки това прилагането на автоматизирана стратегия за търговия е предизвикателно и изисква много бектестиране, което от своя страна изисква много исторически данни. Въпреки че има няколко източника, които предоставят исторически данни за криптовалута, повечето от тях имат недостатъци. Или те са скъпи, предоставяйте само ниски данни за времева разделителна способност (ежедневно) или покрийте ограничени периоди от време с ограничено количество валутни двойки. Тук ще видим, че получаването на исторически отворени, високи, ниски, близки данни (OHLC) с 1-минутна резолюция всъщност не е магическа задача и може да се извърши в няколко реда код на Python безплатно.

Свързване към борсата

В този урок ще използваме API за обмен на Bitfinex за извличане на исторически данни. Подходът обаче трябва да работи и за всеки друг обмен, който предоставя подобен API. Освен това не се нуждаете от акаунт в Bitfinex, за да работи този код, тъй като ще използваме само крайни точки на публичния API. В случай, че не сте запознати с това какво представлява API или как да го използвате, предлагам да прочетете документацията за API на Bitfinex, в края на краищата това е и интерфейсът, чрез който по-късно алгоритъмът ви ще взаимодейства с обмена. Но не се притеснявайте, няма да е необходимо сами да пишете интерфейса Python за Bitfinex API. Вече има няколко реализации, като една от тях е този клиент тук. Най-лесната инсталация е чрез pip:

>>> pip инсталирайте bitfinex-tencars

Освен това, ако имате инсталиран Git, можете просто да стартирате командите по-долу, за да инсталирате клиента. Просто не забравяйте да замените <папка> с вашата целева папка.

>>> git клонинг https://github.com/akcarsten/bitfinex_api.git <папка>
>>> инсталирате python  /setup.py

Ако нямате инсталиран Git, можете да клонирате хранилището на страницата на GitHub, след това отидете в папката, в която сте го клонирали и стартирайте:

>>> инсталирате python setup.py

И в двата случая клиентът Bitfinex ще бъде инсталиран към вашата дистрибуция Python.

Използване на API клиента

Ако погледнете документацията за API на Bitfinex, ще видите, че има две версии на API, v1 и v2, и двете са реализирани в клиента, който току-що сте инсталирали, но тук ще използваме само v2 API. Така че след импортиране на клиента на API на Bitfinex, трябва да създадем екземпляр на v2 API, като стартираме кода по-долу. Забележете, че тук не предоставяме никакви ключове, така че ще имаме достъп само до публичните крайни точки, след пускането на кода ще се покаже съответно съобщение.

>>> импортиране на bitfinex
 
>>> # Създайте екземпляр api на v2 API
>>> api_v2 = bitfinex.bitfinex_v2.api_v2 ()

И това е нашата порта към данните. От документацията знаем, че една от обществените крайни точки се нарича свещи, която връща данните зад таблиците на свещниците, които виждате на всички борси. Този вид данни съдържа следната информация за отпечатване на времето за отворена, затворена, висока и ниска цена и обем на търговията. Той се нарича също и данни на OHLC. Най-простият начин за взаимодействие с тази крайна точка чрез клиента е просто да го извикате с настройките му по подразбиране.

>>> резултат = api_v2.candles ()

Горната линия ще ви даде последните 1000 минути OHLC данни за цената на Bitcoin в щатски долари. Е, това е хубаво, но може да се интересуваме от време отдавна или друга валутна двойка. В този случай можем да определим допълнителни параметри, за да получим точно това, което искаме. И тези параметри са:

  • символ: валутна двойка, по подразбиране: BTCUSD
  • интервал: времева резолюция, напр. 1m за 1 минута от OHLC данни
  • ограничение: брой върнати точки от данни, по подразбиране: 1000
  • начало: начален час на интервал в милисекунди след 1970 г.
  • край: време на края на интервал в милисекунди след 1970 г.

Така че с тази информация под ръка можем да стартираме първата заявка. Кодът по-долу ще върне 1-минутната резолюция OHLC данни за цената на биткойн в щатски долари за първите два дни през април 2018 г.

>>> време за импортиране
>>> време за импортиране
>>> # Определете параметрите на заявката
>>> чифт = ‘btcusd’ # Валутна двойка по интереси
>>> bin_size = '1m' # Това ще върне минути данни
>>> ограничение = 1000 # Искаме максимум 1000 точки от данни
>>> # Определете началната дата
>>> t_start = datetime.datetime (2018, 4, 1, 0, 0)
>>> t_start = време.mktime (t_start.timetuple ()) * 1000
>>> # Определете крайната дата
>>> t_stop = datetime.datetime (2018, 4, 2, 0, 0)
>>> t_stop = време.mktime (t_stop.timetuple ()) * 1000
>>> резултат = api_v2.candles (символ = двойка, интервал = bin_size,
>>> ограничение = ограничение, старт = t_start, край = t_stop)

Събиране на исторически данни за по-дълги интервали от време

Това е чудесно, но все още има един проблем: API ще върне само максимум 1000 точки от данни. Така че, ако увеличим интервала от време за интерес до целия месец април 2018 г., нямаше да можем да го получим с 1-минутна резолюция. За да преминем през това ограничение, трябва да напишем функция, която разделя нашата голяма заявка на няколко по-малки. Едно допълнително нещо, което трябва да имаме предвид тук, е, че има ограничение за това колко искания можем да отправим към API на Bitfinex. В момента този лимит е 60 разговора в минута, което означава, че след всяка заявка трябва да изчакаме минимум 1 секунда, преди да започнем следващата. За да сте в безопасност, функцията по-долу изчаква 2 секунди, но можете да я промените, ако искате.

>>> def fetch_data (старт, стоп, символ, интервал, маркиране_лимит, стъпка):
>>> # Създаване на екземпляр api
>>> api_v2 = bitfinex.bitfinex_v2.api_v2 ()
>>> данни = []
>>> старт = старт - стъпка
>>> докато започнете >> старт = старт + стъпка
>>> край = старт + стъпка
>>> res = api_v2.candles (символ = символ, интервал = интервал,
>>> ограничение = тик_лимит, старт = старт,
>>> край = край)
>>> data.extend (res)
>>> time.sleep (2)
>>> връщане на данни

С функцията по-горе вече можем да изпълняваме заявки за по-дълги интервали от време, единственото допълнително нещо, което трябва да осигурим, е размерът на стъпката в милисекунди. Ето колко точки от данни трябва да поискаме във всяка от по-малките заявки. По същество това е същото като ограничението, което дефинирахме по-рано, но сега в милисекунди. За да намалим броя на обажданията към API, трябва да постигнем максималното, което за 1-минутен случай означава размер на стъпката от: 60000 * 1000 = 60000000.

>>> # Задайте размер на стъпката
>>> time_step = 60000000
>>> # Определете началната дата
>>> t_start = datetime.datetime (2018, 4, 1, 0, 0)
>>> t_start = време.mktime (t_start.timetuple ()) * 1000
>>> # Определете крайната дата
>>> t_stop = datetime.datetime (2018, 5, 1, 0, 0)
>>> t_stop = време.mktime (t_stop.timetuple ()) * 1000
>>> pair_data = fetch_data (start = t_start, stop = t_stop, символ = двойка,
>>> интервал = bin_size, tick_limit = ограничение,
>>> стъпка = време_ стъпка)

Накрая нека конвертираме резултатите в рамка с данни на Pandas, за да можем да премахнем потенциалните дубликати, да се уверим, че всичко е в правилния ред и да конвертираме времевата марка в четим формат.

>>> импортиране на панди като pd
>>>
>>> # Създайте рамка с данни за панди и изчистете / форматирайте данни
>>> имена = ['време', 'отвори', 'затвори', 'високо', 'ниско', 'обем']
>>> df = pd.DataFrame (pair_data, колони = имена)
>>> df.drop_duplicates (inplace = Вярно)
>>> df ['time'] = pd.to_datetime (df ['time'], unit = 'ms')
>>> df.set_index ('време', inplace = Вярно)
>>> df.sort_index (inplace = True)

заключение

Така че извличането на OHLC данни с висока разделителна способност всъщност не е толкова сложно. И ако се чудите за колко валутни двойки можем да направим това чрез API на Bitfinex, просто изпълнете двата реда код по-долу.

>>> api_v1 = bitfinex.bitfinex_v1.api_v1 ()
>>> двойки = api_v1.symbols ()

Сега, ако искаме да го натискаме, бихме могли да напишем скрипт като този, който събира всички данни за всяка валутна двойка и ги записва в CSV файл. Това ви дава всички исторически данни за търговия с OHLC от борсата на Bitfinex с 1-минутна резолюция, което би трябвало да ви помогне да разработите автоматизирана стратегия за търговия. Въпреки това ще отнеме известно време, докато всички данни са на вашия компютър, така че трябва да ограничите заявката си или до по-кратка времева рамка, или да бъдете по-избирателни с валутните си двойки.

Надявам се, че това помага и можете да проверите кода тук, следвайте ме в Twitter или се свържете чрез LinkedIn.