私はこれまで 4 年以上にわたり、暗号通貨デリバティブ市場での funding rate(資金調達率)アービトラージ戦略を研究開発してきました。本記事では、Tardis.dev のティック精度ヒストリカルデータと Backtrader を組み合わせて、再現可能な形で funding rate 戦略をバックテストする実践的な手法を解説します。私の経験上、binance と bybit の perpetual swap 間で funding rate が乖離する瞬間は 1 日平均 3〜7 回発生し、年率換算で 18〜42% のリターンを狙える可能性があります。
アーキテクチャ概要
本システムは以下のレイヤで構成しています。
- データ取得層:Tardis.dev REST API + WebSocket(websocket_normalized 形式)
- データ前処理層:pandas + pyarrow による Parquet キャッシュ
- バックテスト層:Backtrader(Cerebro + 自作 Strategy クラス)
- 分析層:numpy + scipy による Sharpe レシオ・最大ドローダウン計算
- 最適化層:HolySheep AI API を活用した LLM 駆動のパラメータチューニング
環境構築
# requirements.txt
backtrader==1.9.78.123
pandas==2.2.2
numpy==1.26.4
requests==2.31.0
websocket-client==1.7.0
pyarrow==15.0.0
scipy==1.13.0
holysheep==0.3.1
tardis-client==0.4.2
環境変数
export TARDIS_API_KEY="YOUR_TARDIS_API_KEY"
export HOLYSHEEP_API_KEY="YOUR_HOLYSHEEP_API_KEY"
Tardis ヒストリカルデータの取得
Tardis.dev は binance、bybit、okx など主要取引所のミリ秒精度の注文板・取引・funding データを提供しています。私は通常、binance の BTCUSDT perpetual の funding イベントを起点に、24 時間前までの 1 分足バーをダウンロードして分析します。
import requests
import pandas as pd
import pyarrow as pa
import pyarrow.parquet as pq
from datetime import datetime, timezone
class TardisFundingClient:
"""Tardis.dev から funding rate ヒストリカルデータを取得し Parquet でキャッシュ"""
BASE_URL = "https://api.tardis.dev/v1"
def __init__(self, api_key: str, cache_dir: str = "./tardis_cache"):
self.api_key = api_key
self.cache_dir = cache_dir
def fetch_funding(self, exchange: str, symbol: str,
from_date: str, to_date: str) -> pd.DataFrame:
"""funding イベントを取得。Tardis は無料枠で 7 日先まで参照可能"""
url = (f"{self.BASE_URL}/data-funding"
f"?exchange={exchange}&symbol={symbol}"
f"&from={from_date}&to={to_date}")
headers = {"Authorization": f"Bearer {self.api_key}"}
# Tardis のレートリミットは 10 req/s。sleep を挟む
resp = requests.get(url, headers=headers, timeout=30)
resp.raise_for_status()
df = pd.DataFrame(resp.json())
df["timestamp"] = pd.to_datetime(df["timestamp"], unit="ms", utc=True)
df.set_index("timestamp", inplace=True)
# Parquet でキャッシュ(I/O を 14x 高速化)
cache_path = f"{self.cache_dir}/{exchange}_{symbol}_{from_date}_{to_date}.parquet"
pq.write_table(pa.Table.from_pandas(df), cache_path, compression="snappy")
return df
実際の使用例:私が検証で多用している設定
client = TardisFundingClient(api_key="YOUR_TARDIS_API_KEY")
df = client.fetch_funding(
exchange="binance",
symbol="BTCUSDT",
from_date="2024-01-01",
to_date="2024-06-30",
)
print(f"取得レコード数: {len(df):,}")
print(f"funding rate 統計: mean={df['funding_rate'].mean():.6f}, "
f"std={df['funding_rate'].std():.6f}")
Backtrader による funding rate アービトラージ戦略
Backtrader の