BitgetのヒストリカルデータをAPIを使ってPythonで取得する方法

暗号資産の価格分析をするためにOHLCVデータが必要です。Bitgetの暗号資産のヒストリカルデータをAPIで取得する方法をご紹介します。今回はデリバティブの価格を例にしていますが、使用するAPIを変えれば現物の価格のヒストリカルデータも取得可能です。

ローソク足を取得するAPI

Bitgetのデリバティブ取引のOHLCVデータを取得するAPIには、以下の2つがあります。

前者のAPIだと取得できる期間に限りがあるので、この記事では後者のAPIを使います。

出典: Bitget

1分足のOHLCVデータ

BitgetのAPIを使ってOHLCVデータを取得する関数を作成します。通貨ペアはBTCUSDTのデータを取得するコードになっているので、必要に応じて変更してください。

def get_historical_candlestick_data(
        candle, # ローソク足の長さ
        end_time,
        ):
    endPoint = 'https://api.bitget.com'
    path     = '/api/v2/mix/market/history-candles'
    url = endPoint + path

    params = {
        'symbol': 'BTCUSDT',
        'productType': 'USDT-FUTURES',
        'granularity': candle,
        'limit': 200,
        'endTime': end_time,
    }

    time.sleep(1)
    response = requests.get(url, params)
    return response.json()

作成したget_historical_candlestick_data関数を使って、1分足のOHLCVデータを終了時刻を変えて5回取得し、それをつなげてDataFrameにします。(これをあとで使うのでget_ohlcv_1min関数にしておきます。)

def get_ohlcv_1min():

    df_1min = pd.DataFrame()
    end_time = None
    for i in range(5):
        res = get_historical_candlestick_data('1m', end_time)

        df = pd.DataFrame(
            data=res['data'],
            columns=[
                'timestamp',
                'open',
                'high',
                'low',
                'close',
                'volume',
                'volume_quote',
                ]
            )

        # 次回に取得するOHLCVデータの終了時刻を設定する。
        # 取得済のOHLCVデータの先頭データが最も過去のデータとなるので、そのタイムスタンプを使用する。
        end_time = df.iat[0, df.columns.get_loc('timestamp')]

        # タイムスタンプをUNIX時刻からUTC時刻へ変換する。
        df['timestamp'] = df['timestamp'].astype('int64').apply(lambda x:datetime.fromtimestamp(x/1000, UTC))
        # タイムスタンプをIndexにする。
        df = df.set_index('timestamp')
        # 不要なカラムは削除する。
        df = df.drop(columns=['volume_quote'])
        # すべてのカラムを文字列からfloat型に変換する。
        df = df.astype(float)

        df_1min = pd.concat([df_1min, df], axis='index')
        # 重複するデータを削除する。
        df_1min = df_1min.drop_duplicates(keep='first')
        # Indexのタイムスタンプを昇順でソートする。
        df_1min = df_1min.sort_index(ascending=True)

    print(df_1min)

    return df_1min

get_historical_candlestick_data関数を5回呼び出しているので、200 x 5 = 1,000個のデータが取得できています。重複する行は削除する実装になっていますが、endTimeパラメータは取得するデータに含まれていないようです。

                              open     high      low    close   volume
timestamp
2024-12-29 06:51:00+00:00  95127.3  95150.2  95127.0  95149.9   11.206
2024-12-29 06:52:00+00:00  95149.9  95160.3  95149.9  95160.1   32.179
2024-12-29 06:53:00+00:00  95160.1  95188.6  95160.1  95176.3   22.159
2024-12-29 06:54:00+00:00  95176.3  95180.2  95161.8  95161.8   24.674
2024-12-29 06:55:00+00:00  95161.8  95183.9  95161.8  95169.5   37.344
...                            ...      ...      ...      ...      ...
2024-12-29 23:26:00+00:00  93321.0  93321.1  93268.7  93290.0   52.547
2024-12-29 23:27:00+00:00  93290.0  93368.6  93290.0  93368.6  103.977
2024-12-29 23:28:00+00:00  93368.6  93415.8  93354.7  93398.5  276.099
2024-12-29 23:29:00+00:00  93398.5  93470.0  93398.5  93456.7  226.910
2024-12-29 23:30:00+00:00  93456.7  93576.1  93432.8  93556.4  332.944

[1000 rows x 5 columns]

For文の回数を増やすともっと多くのヒストリカルデータを取得できます。

以上が、1分足のヒストリカルデータを取得するサンプルコードです。

1分足より長いローソク足のOHLCVデータ

1分足から1時間足を作る

1分足のOHLCVデータがあれば、1分足より長いローソク足のOHLCVデータを作ることができます。簡単に言うと、1分足のタイムスタンプをローソク足の長さ単位でFloorして、欲しいローソク足の情報に集約します。

4行目で1分足のOHLCVデータをAPIで取得し、それ以降の処理で1時間足に変換しています。

def make_ohlcv_1hour():

    # 1分足のOHLCVデータをAPIで取得する。
    df_1min = get_ohlcv_1min()

    # 現在のタイムスタンプを1時間単位に丸める。1時間足のタイムスタンプを作成する。
    s = pd.Series(df_1min.index.floor('1H'), index=df_1min.index, name='timestamp_1hour')

    # 1時間足のタイムスタンプを1分足のOHLCVデータのカラムに追加する。
    df_1min = pd.concat([df_1min, s], axis='columns')

    # 念の為、1分足のタイムスタンプのIndexを昇順でソートする。
    df_1min = df_1min.sort_index(ascending=True)

    # 1時間足のタイムスタンプを使い、1時間足のOHLCVデータを作成する。
    # 昇順にソートしているので、先頭が始値で、末尾が終値となる。
    df_1hour = pd.concat([
        df_1min.groupby('timestamp_1hour')['open'].nth(0),
        df_1min.groupby('timestamp_1hour')['high'].max(),
        df_1min.groupby('timestamp_1hour')['low'].min(),
        df_1min.groupby('timestamp_1hour')['close'].nth(-1),
        df_1min.groupby('timestamp_1hour')['volume'].sum(),
        ], axis='columns')

    # Indexの名前を"timestamp_1hour"から"timestamp"に変える。
    df_1hour = df_1hour.rename_axis('timestamp', axis='index')

    # 1時間足のタイムスタンプのIndexを昇順でソートする。
    df_1hour = df_1hour.sort_index(ascending=True)

    # 先頭と末尾の行は、1時間足分のすべてのデータが含まれていない可能性があるので、削除する。
    df_1hour = df_1hour.drop(index=[df_1hour.index[0], df_1hour.index[-1]])
    print(df_1hour)

    return df_1hour

上のコードの実行結果です。Indexが1時間足になっています。1,000個の1分足データを使って1時間足を作っているので、1,000 / 60分 = 16.666個の1時間足のデータとなります。中途半端になる先頭と末尾の行は削除しています。

                              open     high      low    close     volume
timestamp
2024-12-29 07:00:00+00:00  95151.1  95240.0  95043.3  95224.8   1416.586
2024-12-29 08:00:00+00:00  95224.8  95276.0  95038.2  95089.0   1023.285
2024-12-29 09:00:00+00:00  95089.0  95186.9  95012.0  95152.6   1086.027
2024-12-29 10:00:00+00:00  95152.6  95244.2  95078.1  95130.6   2163.602
2024-12-29 11:00:00+00:00  95130.6  95149.2  94968.4  94986.1   1334.595
2024-12-29 12:00:00+00:00  94986.1  95105.5  94859.8  94860.6   2162.208
2024-12-29 13:00:00+00:00  94860.6  94979.0  94709.5  94889.9   2588.518
2024-12-29 14:00:00+00:00  94889.9  95193.7  93959.9  94578.7  12576.411
2024-12-29 15:00:00+00:00  94578.7  94752.8  94354.2  94468.6   3230.382
2024-12-29 16:00:00+00:00  94468.6  94537.9  93553.0  93850.3  12526.503
2024-12-29 17:00:00+00:00  93850.3  94072.0  93740.4  93902.4   4800.310
2024-12-29 18:00:00+00:00  93902.4  93902.4  93555.0  93605.0   5511.860
2024-12-29 19:00:00+00:00  93605.0  93826.2  93333.0  93559.7   3453.177
2024-12-29 20:00:00+00:00  93559.7  93826.9  93305.3  93800.4   2999.085
2024-12-29 21:00:00+00:00  93800.4  93891.1  93100.0  93303.4   3999.038
2024-12-29 22:00:00+00:00  93303.4  93729.5  93000.1  93100.5   6830.548

1時間足をAPIで取得する

1分足のデータから作成した1時間足のOHLCVデータが正しく作成できているか確認するために、APIを使って1時間足のOHLCVデータを取得してみます。

1分足を取得したコードを変更し、1時間足を取得するコードにします。

def get_ohlcv_1hour():

    df_1hour = pd.DataFrame()
    end_time = None
    for i in range(5):
        res = get_historical_candlestick_data('1H', end_time)

        df = pd.DataFrame(
            data=res['data'],
            columns=[
                'timestamp',
                'open',
                'high',
                'low',
                'close',
                'volume',
                'volume_quote',
                ]
            )

        # 次回に取得するOHLCVデータの終了時刻を設定する。
        # 取得済のOHLCVデータの先頭データが最も過去のデータとなるので、そのタイムスタンプを使用する。
        end_time = df.iat[0, df.columns.get_loc('timestamp')]

        # タイムスタンプをUNIX時刻からUTC時刻へ変換する。
        df['timestamp'] = df['timestamp'].astype('int64').apply(lambda x:datetime.fromtimestamp(x/1000, UTC))
        # タイムスタンプをIndexにする。
        df = df.set_index('timestamp')
        # 不要なカラムは削除する。
        df = df.drop(columns=['volume_quote'])
        # すべてのカラムを文字列からfloat型に変換する。
        df = df.astype(float)

        df_1hour = pd.concat([df_1hour, df], axis='index')
        # 重複するデータを削除する。
        df_1hour = df_1hour.drop_duplicates(keep='first')
        # Indexのタイムスタンプを昇順でソートする。
        df_1hour = df_1hour.sort_index(ascending=True)

    print(df_1hour)

    return df_1hour

1時間足のOHLCVデータをAPIで取得した結果は、以下です。1分足から1時間足を作った結果と合っていることが確認できました。

                              open     high      low    close     volume
timestamp
2024-11-18 07:00:00+00:00  92225.1  92415.2  91506.4  91789.0  13459.817
2024-11-18 08:00:00+00:00  91789.0  92235.0  91647.1  91883.5   5574.930
2024-11-18 09:00:00+00:00  91883.5  92333.7  91725.0  91810.1   7287.136
2024-11-18 10:00:00+00:00  91810.1  92120.0  91762.0  91862.3   3473.331
2024-11-18 11:00:00+00:00  91862.3  91915.8  90100.1  90338.8  18962.439
...                            ...      ...      ...      ...        ...
2024-12-29 18:00:00+00:00  93902.4  93902.4  93555.0  93605.0   5511.860
2024-12-29 19:00:00+00:00  93605.0  93826.2  93333.0  93559.7   3453.177
2024-12-29 20:00:00+00:00  93559.7  93826.9  93305.3  93800.4   2999.085
2024-12-29 21:00:00+00:00  93800.4  93891.1  93100.0  93303.4   3999.038
2024-12-29 22:00:00+00:00  93303.4  93729.5  93000.1  93100.5   6830.548

[1000 rows x 5 columns]

おまけ

ヒストリカルデータ取得にBitgetのアカウントは不要ですが、アカウントをお持ちでなければ、招待コードは以下をお使いください。

スマホからであれば、以下のQRコードをご利用ください。