暗号資産のFRをBitgetのAPIを使ってPythonで取得する方法

FR(資金調達率)を使った取引手法を考えたいので、BitgetのAPIを使ってみました。

現在のFRを取得する

API:Get Current Funding Rate を使う

現在のFRを取得するBitgetのAPIは、Get Current Funding Rate です。
https://www.bitget.com/api-doc/contract/market/Get-Current-Funding-Rate

出典: Bitget

現在のFRを取得する関数を作成しました。Pythonのサンプルコードです。通貨ペアは固定でBTCUSDTにしています。

def get_current_funding_rate():
    endPoint = 'https://api.bitget.com'
    path     = '/api/v2/mix/market/current-fund-rate'
    url = endPoint + path

    params = {
        'symbol': 'BTCUSDT',
        'productType': 'USDT-FUTURES',
    }

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

この関数を実行すると…

res = get_current_funding_rate()
print(json.dumps(res, indent=4))

このようなレスポンスが返ってきます。BTCUSDTの現在のFRは0.0119%となります。

{
    "code": "00000",
    "msg": "success",
    "requestTime": 1735263372100,
    "data": [
        {
            "symbol": "BTCUSDT",
            "fundingRate": "0.000119"
        }
    ]
}

FRのヒストリカルデータを取得する

API:Get Historical Funding Rates を使う

どのような取引アルゴリズムがいいか検討するために、FRの過去データを見たくなりますよね?取得してみましょう。

FRのヒストリカルデータを取得するBitgetのAPIは、Get Historical Funding Rates です。
https://www.bitget.com/api-doc/contract/market/Get-History-Funding-Rate

出典: Bitget

Pythonのサンプルコードです。こちらも通貨ペアは固定でBTCUSDTにしていますので、見たいペアに変更してください。

def get_current_funding_rate():
    endPoint = 'https://api.bitget.com'
    path     = '/api/v2/mix/market/current-fund-rate'
    url = endPoint + path

    params = {
        'symbol': 'BTCUSDT',
        'productType': 'USDT-FUTURES',
    }

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

関数を実行し、見やすいようにデータを加工しDataFrameにしてみました。

# FRのヒストリカルデータを取得する。
res = get_historical_funding_rate()

# DataFrameに変換する。
df = pd.DataFrame(
    data=res['data'],
    columns=res['data'][0].keys(),
    )
# 資金調達料発生時刻をPOSIXから日本時間に変換する。
df['fundingTime'] = df['fundingTime'].astype('int64').apply(lambda x:datetime.fromtimestamp(x/1000, JST))
# 資金調達率の型をfloatにする。
df['fundingRate'] = df['fundingRate'].astype(float)
# 資金調達料発生時刻をIndexにする。
df = df.set_index('fundingTime')
print(df)

結果はこうなります。資金調達料は日本時間の9時・15時・夜中の1時に発生するので、Indexのタイムスタンプはその時刻になっています。

                            symbol  fundingRate
fundingTime
2024-12-27 09:00:00+09:00  BTCUSDT     0.000123
2024-12-27 01:00:00+09:00  BTCUSDT     0.000096
2024-12-26 17:00:00+09:00  BTCUSDT     0.000081
2024-12-26 09:00:00+09:00  BTCUSDT     0.000114
2024-12-26 01:00:00+09:00  BTCUSDT     0.000114
2024-12-25 17:00:00+09:00  BTCUSDT     0.000118
2024-12-25 09:00:00+09:00  BTCUSDT     0.000127
2024-12-25 01:00:00+09:00  BTCUSDT     0.000126
2024-12-24 17:00:00+09:00  BTCUSDT     0.000116
2024-12-24 09:00:00+09:00  BTCUSDT     0.000112
2024-12-24 01:00:00+09:00  BTCUSDT     0.000117
2024-12-23 17:00:00+09:00  BTCUSDT     0.000120
2024-12-23 09:00:00+09:00  BTCUSDT     0.000128
2024-12-23 01:00:00+09:00  BTCUSDT     0.000122
2024-12-22 17:00:00+09:00  BTCUSDT     0.000112
2024-12-22 09:00:00+09:00  BTCUSDT     0.000129
2024-12-22 01:00:00+09:00  BTCUSDT     0.000128
2024-12-21 17:00:00+09:00  BTCUSDT     0.000021
2024-12-21 09:00:00+09:00  BTCUSDT     0.000122
2024-12-21 01:00:00+09:00  BTCUSDT     0.000127

長期のヒストリカルデータを取得する

Get Historical Funding Rates はデフォルトでは最大で20個のデータまでしか取得できません。ページ番号と1ページにおける取得数を指定することで長期のデータを取得することができます。

取得関数をちょっと変更してみました。通貨ペアとページ番号を引数にしています。1ページの取得数はデフォルトは20なので100に増やしています。

def get_historical_funding_rate_page(symbol, page):
    endPoint = 'https://api.bitget.com'
    path     = '/api/v2/mix/market/history-fund-rate'
    url = endPoint + path

    params = {
        'symbol': symbol,
        'productType': 'USDT-FUTURES',
        'pageSize': 100,
        'pageNo': page,
    }

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

この関数を使って長期のFRヒストリカルデータを取得してみます。BTCUSDTを5page分ほど取得してみました。1pageに含まれるデータ数は100個なので500個のデータを取得できます。

df_all = pd.DataFrame()
for i in range(5):
    symbol = 'BTCUSDT'
    page = i
    res = get_historical_funding_rate_page(symbol, page)

    if len(res['data']) == 0:
        print(f'skip: {i} {symbol}')
        continue

    # DataFrameに変換する。
    df = pd.DataFrame(
        data=res['data'],
        columns=res['data'][0].keys(),
        )

    # 資金調達料発生時刻をPOSIXから日本時間に変換する。
    df['fundingTime'] = df['fundingTime'].astype('int64').apply(lambda x:datetime.fromtimestamp(x/1000, JST))
    # 資金調達率の型をfloatにする。
    df['fundingRate'] = df['fundingRate'].astype(float)
    # 資金調達料発生時刻をIndexにする。
    df = df.set_index('fundingTime')

    # 取得したFRをつなげて保存する。
    df_all = pd.concat([df_all, df], axis='index')

print(df_all)

このような結果になりました。

                            symbol  fundingRate
fundingTime
2024-12-27 09:00:00+09:00  BTCUSDT     0.000123
2024-12-27 01:00:00+09:00  BTCUSDT     0.000096
2024-12-26 17:00:00+09:00  BTCUSDT     0.000081
2024-12-26 09:00:00+09:00  BTCUSDT     0.000114
2024-12-26 01:00:00+09:00  BTCUSDT     0.000114
...                            ...          ...
2024-08-17 17:00:00+09:00  BTCUSDT     0.000058
2024-08-17 09:00:00+09:00  BTCUSDT     0.000023
2024-08-17 01:00:00+09:00  BTCUSDT    -0.000003
2024-08-16 17:00:00+09:00  BTCUSDT    -0.000084
2024-08-16 09:00:00+09:00  BTCUSDT    -0.000142

[500 rows x 2 columns]

FRをグラフ化する

FRのヒストリカルデータは取得できたので、見やすいようにグラフ化します。

BTCUSDT

まずは、BTCUSDTのFRです。最近は安定して0.01%付近ですが、過去にはマイナスになっていることもあります。価格との関連性を見てみたいですね。

HYPEUSDT

話題のHYPEのFRです。HYPEはBitgetに上場されて間もないので、データ数は少ないです。

BGBUSDT

BGBも価格が急上昇しているので、FRを見てみました。

おまけ

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

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