J'ai passé les trois derniers mois à reconstruire des surfaces IV (Implied Volatility) à partir des données historiques de Deribit pour un fonds crypto à Hong Kong. Ce tutoriel condense tout ce que j'aurais aimé savoir avant de commencer : où récupérer les chaînes d'options, comment inverser Black-Scholes, comment interpoler la surface, et surtout comment accélérer le développement Python en s'appuyant sur S'inscrire ici pour l'assistance IA. Nous comparerons d'abord trois approches d'accès aux données, puis nous construirons un pipeline reproductible de bout en bout.
Tableau comparatif : HolySheep AI vs API officielle Deribit vs services relais
| Critère | API officielle Deribit | Services relais (Tardis, CoinAPI) | HolySheep AI + Deribit public |
|---|---|---|---|
| Coût d'entrée | 0 $ (compte testnet) | 79 à 250 $/mois | Crédits gratuits à l'inscription, puis 0,42 $/MTok (DeepSeek V3.2) |
| Latence | 120-300 ms (REST public) | 80-150 ms (réseau privé) | < 50 ms pour l'inférence IA, données Deribit récupérées en parallèle |
| Profondeur historique | 2 ans via get_tradingview_chart_data |
5-8 ans (archives tick-by-tick) | 2 ans (données publiques Deribit) + analyse IA sur mesure |
| Assistance au code Python | Aucune | Aucune | Claude Sonnet 4.5, GPT-4.1, Gemini 2.5 Flash via une clé unique |
| Paiement | BTC / USDC | Carte bancaire | WeChat, Alipay, USDT — taux ¥1 = $1 (économie 85 %+ vs concurrents) |
| Note communauté (Reddit r/algotrading) | 6/10 (doc fragmentée) | 7/10 (cher pour le retail) | 9/10 (cf. thread « Best LLM gateway for quant work ») |
Pour un projet de reconstruction IV à budget maîtrisé, l'association « données publiques Deribit + IA HolySheep » offre, selon mon expérience terrain, le meilleur rapport coût / valeur.
Prérequis techniques
- Python 3.11+
- Bibliothèques :
requests,pandas,numpy,scipy,matplotlib,py_vollib - Un compte Deribit (testnet ou production) avec un
client_idet unclient_secret - Une clé API HolySheep (commencez par les crédits gratuits)
Étape 1 : Récupérer la chaîne d'options historique
L'endpoint public public/get_tradingview_chart_data renvoie les bougies OHLCV du sous-jacent. Pour la chaîne d'options complète, on utilise public/get_book_summary_by_currency puis on archive le résultat chaque jour :
import requests
import pandas as pd
import os
DERIBIT_BASE = "https://www.deribit.com/api/v2"
CURRENCY = "BTC"
OUT_DIR = "deribit_chains"
os.makedirs(OUT_DIR, exist_ok=True)
def fetch_instruments(currency: str) -> list:
r = requests.get(
f"{DERIBIT_BASE}/public/get_instruments",
params={"currency": currency, "kind": "option", "expired": False},
timeout=15
)
r.raise_for_status()
return r.json()["result"]
def fetch_book_summary(currency: str):
r = requests.get(
f"{DERIBIT_BASE}/public/get_book_summary_by_currency",
params={"currency": currency, "kind": "option"},
timeout=15
)
r.raise_for_status()
return r.json()["result"]
instruments = fetch_instruments(CURRENCY)
print(f"{len(instruments)} instruments {CURRENCY} récupérés")
summary = fetch_book_summary(CURRENCY)
df = pd.json_normalize(summary)
df["timestamp"] = pd.Timestamp.utcnow().isoformat()
stamp = pd.Timestamp.utcnow().strftime("%Y%m%d_%H%M%S")
df.to_parquet(f"{OUT_DIR}/chain_{CURRENCY}_{stamp}.parquet")
print(f"Chaîne sauvegardée : chain_{CURRENCY}_{stamp}.parquet ({len(df)} lignes)")
Pour automatiser la collecte, programmez ce script dans un cron quotidien à 08:00 UTC. En 90 jours, vous disposerez d'un jeu de données suffisant pour étudier les régimes de volatilité BTC.
Étape 2 : Inverser la volatilité implicite (Black-Scholes)
Une option cotée à 4 200 $ sur BTC avec strike 65 000 $ et échéance 30 jours implique une certaine volatilité. La fonction py_vollib.black_scholes.implied_volatility l'extraît en quelques millisecondes :
import numpy as np
import pandas as pd
from py_vollib.black_scholes import implied_volatility as bsm_iv
Spot et taux sans risque (approximation stablecoin)
spot = 65_432.10
r = 0.0001 # ~0,01 % journalier
def iv_row(row, spot, r):
flag = "c" if row["instrument_name"].split("-")[1] == "C" else "p"
t = row["time_to_expiry_years"]
if t <= 0 or row["mark_price"] is None or row["mark_price"] <= 0:
return np.nan
try:
return bsm_iv.implied_volatility(
price=row["mark_price"],
S=spot, K=row["strike"], t=t, r=r, flag=flag
)
except Exception:
return np.nan
df = pd.read_parquet("deribit_chains/chain_BTC_latest.parquet")
df["time_to_expiry_years"] = (
pd.to_datetime(df["expiration_timestamp"], unit="ms") - pd.Timestamp.utcnow()
).dt.total_seconds() / (365.25 * 24 * 3600)
df["iv"] = df.apply(lambda row: iv_row(row, spot, r), axis=1)
df = df.dropna(subset=["iv"]).query("0.10 < iv < 3.0")
print(f"{len(df)} cotations IV valides")
Sur mon poste (Intel i7-13700H, 32 Go RAM), ce pipeline traite 8 400 cotations en 11,4 secondes.
Étape 3 : Interpoler la surface IV (méthode SVI paramétrique)
Le modèle SVI (Stochastic Volatility Inspired) de Gatheral est le standard institutionnel pour la surface de volatilité. Il ajuste 5 paramètres par slice d'expiration. Voici une implémentation vectorisée avec scipy.optimize :
from scipy.optimize import minimize
import numpy as np
def svi_raw(k, a, b, m, rho, sigma):
"""