Импорт полной информации по любой криптовалюте с Binance и BitMex используя API Python | Форум о Заработке в интернете

Импорт полной информации по любой криптовалюте с Binance и BitMex используя API Python

blacktrader

Administrator
Член команды
Администратор
Супер-модератор
Чтобы получить цены и данные по биткоину:

Зарегистрируйтесь в Binance и / или BitMex, чтобы получить доступ к API.

Импортируйте созданные мной функции для простоты использования и добавьте свои данные API.

а. Вызовите функцию: get_all_binance («BTCUSDT», «1m», save = True)

б. Вызовите функцию: get_all_bitmex («XBTUSD», «1m», save = True)

Пример использования:







Почему Binance и BitMex?

Если у вас есть опыт работы с рынком криптовалют, вы знаете, что ответ на этот вопрос очевиден:

Binance - самая популярная биржа на рынке. BitMex - самая крупная биржа на рынке.

И, как мы знаем, большой объем равен большим данным, а большие данные (обычно) равны лучшему моделированию и прогнозированию, особенно для моделей машинного обучения.

Обратите внимание, что вам не нужно покупать криптовалюту для выполнения действий, описанных в этой статье. Причина, по которой нам нужно зарегистрироваться, состоит в том, что после регистрации у вас будет доступ к их API, который мы будем использовать для получения реальных данных.

Вы можете выбрать один или оба, представленные ниже функции являются гибкими для обеих бирж.


Извлечение и хранение данных

Наш код будет делать следующее:

Проверять существующие сохраненные данные

Найти разницу между последними сохраненными данными (если есть) и новыми

Отправка вызовов API и добавление существующего или нового DataFrame

Сохранить и / или вернуть полный DataFrame

Единственное, что вам нужно сделать, это добавить свой API-ключ и API-секрет в ваш код, также не забывайте, что не нужно делиться ими с кем-либо. Если вы торгуете или держите криптовалюту на Binance или BitMex, это может привести к потере средств.

Код:
# IMPORTS
import pandas as pd
import math
import os.path
import time
from bitmex import bitmex
from binance.client import Client
from datetime import timedelta, datetime
from dateutil import parser
from tqdm import tqdm_notebook #(Optional, used for progress-bars)

### API
bitmex_api_key = '[REDACTED]'    #Enter your own API-key here
bitmex_api_secret = '[REDACTED]' #Enter your own API-secret here
binance_api_key = '[REDACTED]'    #Enter your own API-key here
binance_api_secret = '[REDACTED]' #Enter your own API-secret here

### CONSTANTS
binsizes = {"1m": 1, "5m": 5, "1h": 60, "1d": 1440}
batch_size = 750
bitmex_client = bitmex(test=False, api_key=bitmex_api_key, api_secret=bitmex_api_secret)
binance_client = Client(api_key=binance_api_key, api_secret=binance_api_secret)


### FUNCTIONS
def minutes_of_new_data(symbol, kline_size, data, source):
    if len(data) > 0:  old = parser.parse(data["timestamp"].iloc[-1])
    elif source == "binance": old = datetime.strptime('1 Jan 2017', '%d %b %Y')
    elif source == "bitmex": old = bitmex_client.Trade.Trade_getBucketed(symbol=symbol, binSize=kline_size, count=1, reverse=False).result()[0][0]['timestamp']
    if source == "binance": new = pd.to_datetime(binance_client.get_klines(symbol=symbol, interval=kline_size)[-1][0], unit='ms')
    if source == "bitmex": new = bitmex_client.Trade.Trade_getBucketed(symbol=symbol, binSize=kline_size, count=1, reverse=True).result()[0][0]['timestamp']
    return old, new

def get_all_binance(symbol, kline_size, save = False):
    filename = '%s-%s-data.csv' % (symbol, kline_size)
    if os.path.isfile(filename): data_df = pd.read_csv(filename)
    else: data_df = pd.DataFrame()
    oldest_point, newest_point = minutes_of_new_data(symbol, kline_size, data_df, source = "binance")
    delta_min = (newest_point - oldest_point).total_seconds()/60
    available_data = math.ceil(delta_min/binsizes[kline_size])
    if oldest_point == datetime.strptime('1 Jan 2017', '%d %b %Y'): print('Downloading all available %s data for %s. Be patient..!' % (kline_size, symbol))
    else: print('Downloading %d minutes of new data available for %s, i.e. %d instances of %s data.' % (delta_min, symbol, available_data, kline_size))
    klines = binance_client.get_historical_klines(symbol, kline_size, oldest_point.strftime("%d %b %Y %H:%M:%S"), newest_point.strftime("%d %b %Y %H:%M:%S"))
    data = pd.DataFrame(klines, columns = ['timestamp', 'open', 'high', 'low', 'close', 'volume', 'close_time', 'quote_av', 'trades', 'tb_base_av', 'tb_quote_av', 'ignore' ])
    data['timestamp'] = pd.to_datetime(data['timestamp'], unit='ms')
    if len(data_df) > 0:
        temp_df = pd.DataFrame(data)
        data_df = data_df.append(temp_df)
    else: data_df = data
    data_df.set_index('timestamp', inplace=True)
    if save: data_df.to_csv(filename)
    print('All caught up..!')
    return data_df

def get_all_bitmex(symbol, kline_size, save = False):
    filename = '%s-%s-data.csv' % (symbol, kline_size)
    if os.path.isfile(filename): data_df = pd.read_csv(filename)
    else: data_df = pd.DataFrame()
    oldest_point, newest_point = minutes_of_new_data(symbol, kline_size, data_df, source = "bitmex")
    delta_min = (newest_point - oldest_point).total_seconds()/60
    available_data = math.ceil(delta_min/binsizes[kline_size])
    rounds = math.ceil(available_data / batch_size)
    if rounds > 0:
        print('Downloading %d minutes of new data available for %s, i.e. %d instances of %s data in %d rounds.' % (delta_min, symbol, available_data, kline_size, rounds))
        for round_num in tqdm_notebook(range(rounds)):
            time.sleep(1)
            new_time = (oldest_point + timedelta(minutes = round_num * batch_size * binsizes[kline_size]))
            data = bitmex_client.Trade.Trade_getBucketed(symbol=symbol, binSize=kline_size, count=batch_size, startTime = new_time).result()[0]
            temp_df = pd.DataFrame(data)
            data_df = data_df.append(temp_df)
    data_df.set_index('timestamp', inplace=True)
    if save and rounds > 0: data_df.to_csv(filename)
    print('All caught up..!')
    return data_df
Это выглядит непрезентабельно, но очень функционально и быстро, единственным ограничивающим фактором является количество вызовов API, разрешенных BitMex и Binance ежеминутно.

Просто в использовании, просто вызовите функцию в Python с помощью:



data = get_all_bitmex («XBTUSD», «5m», save = True)

После загрузки функция вернет весь DataFrame для использования по вашему усмотрению. Если аргумент save передан как True, он сохранит DataFrame на вашем компьютере с именем файла «[symbol] - [kline_size] -data.csv», то есть «XBTUSD-5m-data.csv» в вышеприведенном случае.

Самое хорошее в этой функции заключается в том, что она будет постоянно обновлять ваши данные.

Каждый раз, когда вызывается функция, она проверяет последние загруженные данные и обновляет их новыми данными!

Просто вызывайте get_all_bitmex («XBTUSD», «5m», save = True) каждый раз, когда вы работаете с данными XBTUSD из BitMex, чтобы убедиться в их актуальности!

Сделать это для всех бирж также просто! Вы можете получить данные для всех рынков с помощью:

Код:
# For Binance
binance_symbols = ["BTCUSDT", "ETHBTC", "XRPBTC"]
for symbol in binance_symbols:
    get_all_binance(symbol, '1m', save = True)


# For BitMex
bitmex_symbols = ["XBTUSD", "ETHM19", "XRPM19"]
for symbol in bitmex_symbols:
    get_all_bitex(symbol, '1m', save = True)
Здесь мы загружаем все доступные данные для BTC и его связь с Ethereum и Ripple как с BitMex, так и с Binance.