FLINTERS Engineer's Blog

FLINTERSのエンジニアによる技術ブログ

暗号通貨取引所間の資金調達率アービトラージで利益がでそうか検証してみた

こんにちは、株式会社FLINTERSのエンジニアの中澤です。

10周年記念として133日間ブログを書き続けるチャレンジの57日目の投稿になります。

本記事では欲しい情報を手にいれるために気軽にAPIを使って利益が出そうか検証してみます。

資金調達率(FR)アービトラージとは?

暗号通貨取引所の先物取引における「資金調達率(Funding Rate)」は、特定の時間間隔で取引所において支払われる金利を指します。 主に以下の2つの場合に利用されます。

1. プライス指数と市場価格の乖離: 先物契約のプライス指数(通常は指標価格)と実際の市場価格に差異がある場合

2. ロングポジションとショートポジションの不均等: 市場で不均等なロングポジションとショートポジションが存在する場合

資金調達率は取引所によって設定されるのでその差を利用して稼ぐというわけです。

例えば取引所Aでは資金調達率が2%で取引所Bで1%であれば、 取引所Aではショートポジションを持ち、取引所Bでは同量のロングポジションを権利確定まで持つことで差分の1%の利益を得ることができます。

多くの取引所で1日に3回金利が発生するので結構チャンスがあります。

こんな感じで大きく乖離することがあるので、現時点でそういった通貨があるかというのが今回の検証です。

coinglassに資金調達率が乖離している情報が出ている

coinglassというサイトを見ると資金調達率が乖離しているランキングを見ることができます。 www.coinglass.com

ただ自分は全ての取引所のアカウントを持っているわけではないのでこの情報は少し活用しづらいです。

引用 https://www.coinglass.com/ja/FrArbitrage

自分用にカスタマイズした情報が欲しい!

例えば自分がBybitとBitgetのアカウントを持っていたとしたらこの2アカウント間だけの乖離ランキングが欲しいですよね?

このようにサイトの情報だけだと利用しづらいことがあります。

ただ取引所ごとのAPIから資金調達率を抽出して比較するのも少し面倒です。

coinglassのAPIで取引所、通貨別の資金調達率を抽出する

先ほど紹介したcoinglassのAPIを使えば取引所ごとの資金調達率を簡単に抽出することができます。

アカウントを作成してAPIキーを発行してみましょう!

いくつかプランがありますが、無料で使える範囲で十分です。 www.coinglass.com

現時点で一番乖離している通貨ランキングを作る

以下のコードでBybit, Bitget間の資金調達率乖離ランキングを作成します。 ChatGPTの結果を少しいじっただけ作れたので簡単でした。

import requests
import json
import pandas as pd


url = "https://open-api.coinglass.com/public/v2/funding"
headers = {
    "accept": "application/json",
    "coinglassSecret": {API_KEY}
}
response = requests.get(url, headers=headers)
data = json.loads(response.text)["data"]
df = pd.json_normalize(data)

# 必要なカラムを選択
df = df[['symbol', 'uMarginList', 'uIndexPrice', 'uPrice']]

# 新しいDataFrameの初期化
new_df = pd.DataFrame(columns=['symbol', 'exchangeName', 'rate'])

# 各行のuMarginListから="Bybit", "Bitget"のみに絞ってexchangeNameとrateを抽出して新しいDataFrameに追加
for index, row in df.iterrows():
    symbol = row['symbol']
    rows_to_concat = []
    for item in row['uMarginList']:
        exchangeName = item.get('exchangeName', None)
        rate = item.get('rate', None)
        if exchangeName in ["Bybit", "Bitget"] and rate is not None:
            row = pd.DataFrame({'symbol': [symbol], 'exchangeName': [exchangeName], 'rate': [rate]})
            new_df = pd.concat([new_df, row])

# dataframeを共通カラムでマージ
df = pd.merge(df, new_df)

# "symbol"カラムでグループ化して"rate"カラムの最大値と最小値を求める
result = df.groupby('symbol')['rate'].agg(['max', 'min']).reset_index()

# "max"と"min"の差分を新しいカラムに追加
result['difference'] = result['max'] - result['min']

# "difference"カラムで降順にデータフレームを並べ替え
result = result.sort_values(by='difference', ascending=False, ignore_index=True)

# 結果の表示
print(result)

結果はこんな感じです↓

[457 rows x 3 columns]
         symbol     max     min  difference
0           AXS -0.0307 -0.1575      0.1268
1       1000XEC  0.1180  0.0098      0.1082
2    10000LADYS -0.0100 -0.0996      0.0896
3           GAL  0.0540  0.0106      0.0434
4           TRU  0.0495  0.0100      0.0395
..          ...     ...     ...         ...
260         RPL  0.0100  0.0100      0.0000
261         ANT  0.0100  0.0100      0.0000
262       MATIC  0.0100  0.0100      0.0000
263        IOST  0.0100  0.0100      0.0000
264      BADGER  0.0100  0.0100      0.0000

1位でも0.12%とあまり乖離がないですね、、、

先週はTRBという通貨が1.5%ぐらい乖離してたのでチャンスはあると思います。

引用 TRBの歴史的資金調達レート | CoinGlass

取引価格の乖離を確認する

今度は以下のコードで1位だった$AXSのBybit, Bitgetの価格乖離を確認します。

import requests
import json


url = "https://open-api.coinglass.com/public/v2/perpetual_market?symbol=AXS"
headers = {
    "accept": "application/json",
    "coinglassSecret": {API_KEY}
}

response = requests.get(url, headers=headers)
data = json.loads(response.text)["data"]["AXS"]
result = [{'exchangeName': x["exchangeName"], 'price': x["price"]} for x in data if x["exchangeName"] in ["Bybit", "Bitget"]]

price_diff_rate= result[0]["price"]/result[1]["price"]-1
print(price_diff_rate)

結果はこちら↓

0.0015993946377284

0.15%の乖離なので資金調達率を超えてしまっています。

この時点で赤字ですね、、、

先週の$TRBは0.2%ぐらいの乖離だったのでこの時点で黒字でした。

取引手数料を考える

価格乖離の他に取引手数料を考える必要があります。

Bybitの場合、デリバティブ取引の指値注文で0.02%(記事執筆時点)

[引用]Bybit取引手数料

Bitgetの場合、デリバティブ取引の指値注文で0.014%(記事執筆時点)

[引用]https://www.bitget.com/ja/fee/spot-trading

売買するにはそれぞれ2回取引するので、0.02×2+0.014×2= 0.068%となります。 今回の場合は赤字ですね。

結論

チャンスは毎日あるわけではなさそうですが、毎日データを取ってみて取引botを作るかどうか決めるのもありだと思いました。