Binance APIを使ってAPIデータをGridDBに解析する

暗号通貨は、ブロックチェーン技術に基づく分散型のデジタル通貨を提供し、金融分野で圧倒的な存在感を示しています。これらの暗号通貨を取引する際には、暗号通貨取引所が必要となります。Binanceは世界最大級の暗号通貨取引所であり、ユーザーに安全で効率的な暗号通貨の取引方法を提供しています。

このブログでは、Binance APIを使って様々な暗号通貨の情報を照会し、そのデータをGridDBデータベースに解析する方法を紹介します。

Binanceからデータを収集する

最初のステップは、Binanceからデータを収集することです。まずは、Binance APIを使って接続し、暗号通貨の市場情報を取得します。ここでは、APIキーを作成し、Binance APIを介してデータを取得する方法を説明します。

Binance API Keyを作成する

Binanceアカウントを持っていれば誰でも、Binance APIを利用するためのAPIキーを作成することができます。アカウント設定からAPI Managementに移動して、Binanceアカウントで新しいAPI Keyを作成してください。ユーザーはAPIキー用の名前を提供し、APIキーを正常に生成するために認証を行う必要があります。

Binance APIに接続する

Pythonは、Binance APIへの接続を簡単に確立するために使用できるpython-binanceというライブラリを提供しているため、このブログでは基本的なプログラミング言語としてPythonを使用します。次のコードブロックは、Binanceで利用可能なすべての暗号通貨の接続と現在の価格を取得する方法を示しています。


from binance.client import Client  
import pandas as pd  
import os  
  
# Create the client  
client = Client(os.environ['binance_api_key'], os.environ['binance_api_secret'])  
  
# Retrieve all data  
prices = client.get_all_tickers()  
  
# Create a Pandas DataFrame  
data = pd.DataFrame(prices)  
print(data)
結果

定期的にデータを取得する

選択した暗号通貨の24時間の市場情報を定期的に収集することが求められるシナリオを考えてみましょう。以下のコードブロックは、この機能を実現する方法を示しています。

  
def retrive_market_data(currency_list):
    try:
        # Create the Connection
        client = Client(os.environ['binance_api_key'],
                        os.environ['binance_api_secret'])
        currency_data = []
        # Iterate the Currency List
        for currency in currency_list:
            # Get Crypto Information
            tickers = client.get_ticker(symbol=str(currency))
            currency_data.append(tickers)
        # Create a DataFrame
        currency_data_df = pd.DataFrame(currency_data)
        # Return the DataFrame
        return currency_data_df
    except BaseException as error:
        print(f"Error Occuered: {error}")
  
  
if __name__ == "__main__":  
    list = ['DOGEUSDT','BNBBTC','BTCUSDT','ETHUSDT']  
    print(retrive_market_data(list))
結果

GridDBデータベースへデータを解析する

さて、Binance APIからデータを取得したので、次にこれらのデータをGridDBデータベースに解析します。ここでは、取得したデータセットから以下の情報だけが必要となると仮定します。

  • symbol
  • piceChange
  • priceChangePercent
  • weightedAvgPrice
  • prevClosePrice
  • lastPrice
  • openPrice
  • highPrice
  • lowPrice
  • volume
  • openTime
  • closeTime

取得したデータセットをデータベースに送る前にクリーニングする必要があります。これは、以下のコードを使ってPandas DataFrameから不要なカラムを削除することで簡単に行うことができます。


market_data.drop(columns=['lastQty','bidPrice','bidQty','askPrice','askQty', 'quoteVolume', 'firstId', 'lastId', 'count'],inplace=True)

次に、必要なフィールドを必要なデータタイプに変換します。このデータセットのほとんどの値はfloat値なので、文字列からfloatに変換し、「openTime」と「closeTime」の値をEpochからTimeStampデータタイプに変換します。


# Convert String to Float  
market_data['priceChange'] = market_data['priceChange'].astype(float)  
market_data['priceChangePercent'] = market_data['priceChangePercent'].astype(float)  
market_data['weightedAvgPrice'] = market_data['weightedAvgPrice'].astype(float)  
market_data['prevClosePrice'] = market_data['prevClosePrice'].astype(float)  
market_data['lastPrice'] = market_data['lastPrice'].astype(float)  
market_data['openPrice'] = market_data['openPrice'].astype(float)  
market_data['highPrice'] = market_data['highPrice'].astype(float)  
market_data['lowPrice'] = market_data['lowPrice'].astype(float)  
market_data['volume'] = market_data['volume'].astype(float)  
  
# Convert from Time since Epoch  
market_data['openTime'] = pd.to_datetime(market_data['openTime'], unit='ms')  
market_data['closeTime'] = pd.to_datetime(market_data['closeTime'], unit='ms')

GridDBコレクションを作成する

これでデータの変換が完了しました。次のステップは、データをGridDBデータベースに挿入することです。しかし、その前に、データを挿入するための適切なコンテナをデータベース内に作成する必要があります。そのためには、griddb_pythonライブラリを使ってコレクションを作成します。データタイプがPandas DataFrameとGridDBデータベースの両方にマッチしていなければ、エラーが発生する可能性があるので注意してください。


import griddb_python as griddb

factory = griddb.StoreFactory.get_instance()
try:
    # Get GridStore object
    gridstore = factory.get_store(
        host='10.10.10.100',
        port=250,
        cluster_name='default',
        username='admin',
        password='admin'
    )

    # Create Collection
    containerName = "Crypto_Data_Container"
    crypto_container = griddb.ContainerInfo(containerName,
                    [["symbol", griddb.Type.STRING],
                     ["priceChange", griddb.Type.FLOAT],
                     ["priceChangePercent", griddb.Type.FLOAT],
                     ["weightedAvgPrice", griddb.Type.FLOAT],
                     ["prevClosePrice", griddb.Type.FLOAT],
                     ["lastPrice", griddb.Type.FLOAT],
                     ["openPrice", griddb.Type.FLOAT],
                     ["highPrice", griddb.Type.FLOAT],
                     ["lowPrice", griddb.Type.FLOAT],
                     ["volume", griddb.Type.FLOAT],
                     ["openTime", griddb.Type.TIMESTAMP],
                     ["closeTime", griddb.Type.TIMESTAMP]],
                    griddb.ContainerType.COLLECTION, True)

    data_container = gridstore.put_container(crypto_container)

except griddb.GSException as e:
    for i in range(e.get_error_stack_size()):
        print("[", i, "]")
        print(e.get_error_code(i))
        print(e.get_location(i))
        print(e.get_message(i))

上記のコードブロックは、griddb_pythonライブラリを使用して、GridDBにコレクションを作成する方法を示しています。

GridDBデータベースにデータを挿入する

最後に、Binance APIから取得したデータをGridDBコレクションに渡します。これで、互換性のあるデータとデータベースフィールドのセットができました。Pandasの “marketdata “データフレームには、解析されたデータが含まれており、そのデータを受け取るためにGridDBコレクションが利用できます。GridDBでは、データを挿入するためにデータフレーム自体を使用することができます。


def insert_data(binance_data):
    factory = griddb.StoreFactory.get_instance()
    try:
        # Get GridStore object
        gridstore = factory.get_store(
            host='10.10.10.100',
            port=250,
            cluster_name='default',
            username='admin',
            password='admin'
        )

        # Get the Collection
        containerName = "Crypto_Data_Container"
        data_container = gridstore.get_container(containerName)

        # Insert the DataFrame data
        data_container.put_rows(binance_data)

    except griddb.GSException as e:
        for i in range(e.get_error_stack_size()):
            print("[", i, "]")
            print(e.get_error_code(i))
            print(e.get_location(i))
            print(e.get_message(i))

以上で、Binance APIからデータを取得し、GridDBデータベースに格納することに成功しました。サーバーに配備されている場合はcronジョブを使用してこのプログラムを自動的に実行し、クラウド機能として配備されている場合はスケジューリングサービスを使用してスクリプトを定期的に実行することができます。

データを可視化する

データを解析する方法がわかったところで、データセットから意味のある情報を抽出してみましょう。上記の関数を1週間毎日実行したと仮定して、weightedAvgPriceを使用してグラフを作成し、選択した暗号通貨の値動きを確認する必要があります。次のコードブロックは、TQLステートメントを使用してGridDBデータベースに問い合わせてETHUSDTのデータを取得し、得られたデータセットを使用してラインチャートを描画します。

from binance.client import Client
import griddb_python as griddb
import pandas as pd

def get_data(symbol):
    factory = griddb.StoreFactory.get_instance()
    try:
        # Get GridStore object
        gridstore = factory.get_store(
            host='10.10.10.100',
            port=250,
            cluster_name='default',
            username='admin',
            password='admin'
        )

        # Get the Collection
        containerName = "Crypto_Data_Container"
        data_container = gridstore.get_container(containerName)

        # Fetch all rows - Crypto_Data_Container
        query_string = f"select symbol, weightedAvgPrice, closeTime where symbol = '{symbol}'"
        query = data_container.query(query_string)
        rs = query.fetch(False)
        
        # Create a List form the Crypto_Data_Container
        retrieved_data= []
        while rs.has_next():
            data = rs.next()
            retrieved_data.append(data)

        return retrieved_data

    except griddb.GSException as e:
        for i in range(e.get_error_stack_size()):
            print("[", i, "]")
            print(e.get_error_code(i))
            print(e.get_location(i))
            print(e.get_message(i))

if __name__ == "__main__":
    # Get the Necessary Data
    crypto_data = get_data('ETHUSDT')
    crypto_dataframe = pd.DataFrame(crypto_data, columns=['symbol', 'weightedAvgPrice', 'closeTime'])

    # Create the Plot using Pandas
    crypto_dataframe.sort_values('closeTime', ascending=True, inplace=True)
    lines = crypto_dataframe.plot.line(x='closeTime', y="weightedAvgPrice", figsize=(20, 10))
結果

まとめ

今回のブログでは、APIと対話してデータを取得する方法と、取得したデータをデータベースに解析する方法について大まかに説明しました。データを解析する際に最も重要な要素は、必要なデータをクリーンアップし、データベースが受け入れる正しいデータタイプに変換することです。このような機能を使うことで、あらゆる組織のための自動化されたデータストレージと分析機能を作ることができます。

ブログの内容について疑問や質問がある場合は Q&A サイトである Stack Overflow に質問を投稿しましょう。 GridDB 開発者やエンジニアから速やかな回答が得られるようにするためにも "griddb" タグをつけることをお忘れなく。 https://stackoverflow.com/questions/ask?tags=griddb

Leave a Reply

Your email address will not be published. Required fields are marked *