こんにちは、株式会社FLINTERSのエンジニアの中澤です。
10周年記念として133日間ブログを書き続けるチャレンジの57日目の投稿になります。
本記事では欲しい情報を手にいれるために気軽にAPIを使って利益が出そうか検証してみます。
- 資金調達率(FR)アービトラージとは?
- coinglassに資金調達率が乖離している情報が出ている
- 自分用にカスタマイズした情報が欲しい!
- coinglassのAPIで取引所、通貨別の資金調達率を抽出する
- 現時点で一番乖離している通貨ランキングを作る
- 取引価格の乖離を確認する
- 取引手数料を考える
- 結論
資金調達率(FR)アービトラージとは?
暗号通貨取引所の先物取引における「資金調達率(Funding Rate)」は、特定の時間間隔で取引所において支払われる金利を指します。 主に以下の2つの場合に利用されます。
1. プライス指数と市場価格の乖離: 先物契約のプライス指数(通常は指標価格)と実際の市場価格に差異がある場合
2. ロングポジションとショートポジションの不均等: 市場で不均等なロングポジションとショートポジションが存在する場合
資金調達率は取引所によって設定されるのでその差を利用して稼ぐというわけです。
例えば取引所Aでは資金調達率が2%で取引所Bで1%であれば、 取引所Aではショートポジションを持ち、取引所Bでは同量のロングポジションを権利確定まで持つことで差分の1%の利益を得ることができます。
多くの取引所で1日に3回金利が発生するので結構チャンスがあります。
こんな感じで大きく乖離することがあるので、現時点でそういった通貨があるかというのが今回の検証です。
FRアービ始めました。
— kotaro.Crypto.DeFi (@kotaro03873195) 2023年9月21日
まぁ、どうせ、直ぐに収束しそうだけど、試しにやってみる。1日6%の利益はデカイでしょ。 pic.twitter.com/MnI9CBFhyn
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%ぐらい乖離してたのでチャンスはあると思います。
取引価格の乖離を確認する
今度は以下のコードで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を作るかどうか決めるのもありだと思いました。