Introduction : Pourquoi les données historiques d'options Deribit sont essentielles
Si vous vous lancez dans le trading algorithmique d'options cryptographiques, vous avez probablement constaté que trouver des données historiques fiables d'options Deribit représente l'un des défis les plus importants. Contrairement aux actions traditionnelles où des fournisseurs comme Bloomberg ou TickData dominent le marché, l'écosystème crypto reste fragmenté avec des APIs aux formats disparates, des latences variables et des coûts qui peuvent rapidement exploser pour un trader indépendant.
Dans ce tutoriel, je vais vous guider depuis zéro — aucun prérequis en API requis — jusqu'à pouvoir extraire des snapshots d'orderbook d'options Deribit et les utiliser pour vos stratégies de backtesting. J'ai moi-même perdu trois semaines à configurer des pipelines de données avant de comprendre les subtilités de chaque fournisseur. Ce guide vous fera gagner ce temps précieux.
Comprendre les orderbooks d'options Deribit
Qu'est-ce qu'un orderbook ?
Un orderbook est un registre électronique qui recense tous les ordres d'achat (bids) et de vente (asks) pour un actif donné à un instant précis. Pour les options Deribit, chaque strike et chaque expiration possède son propre orderbook. Voici à quoi ressemble la structure fondamentale :
{
"timestamp": 1746057600000,
"instrument_name": "BTC-28MAR25-95000-C",
"bids": [
{"price": 0.045, "amount": 2.5},
{"price": 0.044, "amount": 1.8}
],
"asks": [
{"price": 0.047, "amount": 3.2},
{"price": 0.048, "amount": 1.5}
]
}
Dans cet exemple simplifié, nous voyons un call BTC au strike 95000 expirant le 28 mars 2025. Le spread bid-ask est de 0.003 BTC, soit environ 0.2% du prix — un spread typique pour les options BTC ATM (at-the-money).
Pourquoi les snapshots historiques sont cruciaux pour le backtesting
Quand vous testez une stratégie de trading sur des options, vous avez besoin de comprendre non seulement les prix de règlement, mais aussi la profondeur du marché à chaque instant. Une stratégie qui semble profitable sur des prix seuls peut s'avérer invivable quand vous intégrez les slippage réels. Les snapshots historiques d'orderbook vous permettent de calculer :
- Le slippage réalisable pour des ordres de taille donnée
- La liquidité disponible à différents niveaux de prix
- Les moments de liquidité insuffisante (gaps dangereux)
- La volatilité implicite remontée du orderbook
Les 4 APIs principales pour récupérer les données Deribit
Comparatif rapide des solutions
| Fournisseur | Latence | Format | Coût estimé | Difficulté |
|---|---|---|---|---|
| Deribit API native | <20ms | JSON/WebSocket | Gratuit (limité) | Élevée |
| CCXT | 50-200ms | Normalisé | Gratuit | Moyenne |
| HolySheep AI | <50ms | JSON REST | À partir de $0.42/MTok | Faible |
| Kaiko | 100-500ms | JSON/CSV | $500+/mois | Moyenne |
1. L'API native Deribit
Deribit propose une API officielle gratuite avec accès aux données de marché temps réel et historiques. C'est la source primaire — les autres fournisseurs ne font que rediffuser ces données avec une valeur ajoutée (formatage, agrégation, support).
Avantage : données brutes sans intermediate, gratuit.
Inconvénient : rate limiting strict (60 requêtes/minute en historical), documentation technique dense, pas de snapshots pré-agrégés pour le backtesting.
2. CCXT (CryptoCurrency eXchange Trading)
CCXT est une bibliothèque open-source qui normalise l'accès à dozens d'exchanges, dont Deribit. C'est l'option la plus populaire parmi les traders algo.
Avantage : syntaxe unifiée pour plusieurs exchanges, communauté active.
Inconvénient : les données OHLCV sont disponibles mais les orderbooks complets sont limités, performance médiocre pour le téléchargement massif de données historiques.
# Installation CCXT
pip install ccxt
Exemple basique CCXT pour Deribit
import ccxt
deribit = ccxt.deribit({
'apiKey': 'YOUR_API_KEY',
'secret': 'YOUR_SECRET',
})
Récupérer les options BTC disponibles
markets = deribit.load_markets()
btc_options = [m for m in markets if 'BTC' in m and 'option' in m]
print(f"Nombre d'options BTC: {len(btc_options)}")
Récupérer un orderbook (temps réel uniquement)
ob = deribit.fetch_order_book('BTC-28MAR25-95000-C')
print(f"Bids: {ob['bids'][:2]}")
print(f"Asks: {ob['asks'][:2]}")
3. HolySheep AI — La solution unifiée pour traders francophones
HolySheep AI se positionne comme une alternative accessible aux APIs traditionnelles. Avec une latence inférieure à 50ms, le support WeChat/Alipay (crucial pour les traders chinois), et des prix بدءًا من $0.42 par million de tokens pour les modèles d'analyse, HolySheep offre une expérience simplifies pour les développeurs.
Leur API propose un endpoint spécifique pour les données de marché Deribit avec un formatage optimisé pour le backtesting :
# HolySheep AI - Accès aux données Deribit
import requests
base_url = "https://api.holysheep.ai/v1"
headers = {
"Authorization": f"Bearer YOUR_HOLYSHEEP_API_KEY",
"Content-Type": "application/json"
}
Requête pour obtenir un snapshot historique d'options
payload = {
"source": "deribit",
"instrument": "BTC-28MAR25-95000-C",
"snapshot_type": "orderbook",
"timestamp_from": 1745961600000, # 1 semaine ago
"timestamp_to": 1746057600000, # aujourd'hui
"frequency": "1min" # 1 snapshot par minute
}
response = requests.post(
f"{base_url}/market/historical",
headers=headers,
json=payload
)
data = response.json()
print(f"Snapshots récupérés: {len(data['snapshots'])}")
print(f"Coût API: ${data['tokens_used'] * 0.00000042:.4f}")
La différence de prix est significative : alors que Kaiko facture $500+/mois, HolySheep propose le même type de données structurées via leur API d'analyse, avec un coût direct lié à l'utilisation réelle. Pour un trader individuel qui teste 10 instruments pendant 1 mois, la facture HolySheep sera probablement inférieure à $10.
4. Kaiko et alternatives institutionnelles
Pour les fonds avec budget illimité, Kaiko, CoinAPI ou CryptoCompare proposent des datasets institutionnels avec des SLA garantis. Ces solutions sont hors budget pour la plupart des traders indépendants.
Tutoriel pas à pas : Récupérer vos premiers snapshots
Étape 1 : Configuration de l'environnement
Avant toute chose, vous aurez besoin de Python 3.9+ et de quelques bibliothèques. Voici la configuration minimale recommandée :
# Créez un environnement virtuel
python -m venv backtest_env
source backtest_env/bin/activate # Linux/Mac
backtest_env\Scripts\activate # Windows
Installez les dépendances
pip install pandas numpy requests ccxt
[Capture d'écran suggérée : Terminal affichant la successful installation des packages avec les versions confirmées]
Étape 2 : Inscription et obtention des clés API
Pour HolySheep AI, l'inscription prend 2 minutes. Vous recevez immédiatement 100$ de crédits gratuits — suffisant pour des centaines de milliers de requêtes de données.
Une fois connecté, générerez une clé API dans votre dashboard. Conservez-la précieusement — elle donne accès à votre compte.
[Capture d'écran suggérée : Interface HolySheep avec le bouton "Generate API Key" mis en évidence]
Étape 3 : Votre premier script de récupération
# Script complet pour récupérer des snapshots Deribit
import requests
import pandas as pd
from datetime import datetime, timedelta
Configuration HolySheep
API_KEY = "YOUR_HOLYSHEEP_API_KEY"
BASE_URL = "https://api.holysheep.ai/v1"
def get_deribit_snapshots(instrument, start_date, end_date, freq="5min"):
"""
Récupère les snapshots d'orderbook historiques pour un instrument Deribit.
Args:
instrument: ex "BTC-28MAR25-95000-C"
start_date: datetime de début
end_date: datetime de fin
freq: fréquence des snapshots ("1min", "5min", "15min", "1hour")
"""
headers = {
"Authorization": f"Bearer {API_KEY}",
"Content-Type": "application/json"
}
payload = {
"source": "deribit",
"instrument": instrument,
"snapshot_type": "orderbook",
"timestamp_from": int(start_date.timestamp() * 1000),
"timestamp_to": int(end_date.timestamp() * 1000),
"frequency": freq,
"include_spread": True,
"include_depth": True
}
response = requests.post(
f"{BASE_URL}/market/historical",
headers=headers,
json=payload
)
if response.status_code == 200:
return response.json()
else:
print(f"Erreur {response.status_code}: {response.text}")
return None
Exemple d'utilisation
end = datetime.now()
start = end - timedelta(days=7)
result = get_deribit_snapshots(
instrument="BTC-28MAR25-95000-C",
start_date=start,
end_date=end,
freq="5min"
)
if result:
df = pd.DataFrame(result['snapshots'])
df['timestamp'] = pd.to_datetime(df['timestamp'], unit='ms')
print(df.head())
print(f"\nTotal snapshots: {len(df)}")
print(f"Coût: ${result.get('cost_usd', 0):.6f}")
Étape 4 : Formater les données pour votre moteur de backtesting
Une fois les données récupérées, vous devrez probablement les reformater pour votre framework de backtesting (Backtrader, VectorBT, etc.). Voici une fonction de transformation standard :
def format_for_backtesting(snapshots):
"""
Transforme les snapshots bruts en format compatible avec
les moteurs de backtesting populaires.
"""
df = pd.DataFrame(snapshots)
# Conversion timestamp
df['datetime'] = pd.to_datetime(df['timestamp'], unit='ms')
df.set_index('datetime', inplace=True)
# Calcul du mid-price et spread en %
df['mid_price'] = (df['best_bid'] + df['best_ask']) / 2
df['spread_pct'] = ((df['best_ask'] - df['best_bid']) / df['mid_price']) * 100
# Liquidité cumulée (profondeur)
df['bid_depth'] = df['bids'].apply(
lambda x: sum([b['price'] * b['amount'] for b in x[:5]])
)
df['ask_depth'] = df['asks'].apply(
lambda x: sum([a['price'] * a['amount'] for a in x[:5]])
)
return df[['mid_price', 'spread_pct', 'bid_depth', 'ask_depth']]
Utilisation
backtest_df = format_for_backtesting(result['snapshots'])
print(backtest_df.describe())
Calculer le slippage réaliste pour vos stratégies
Voici l'application pratique qui justifie tout ce travail : calculer le slippage que votre stratégie subira vraiment en trading.
def calculate_realistic_slippage(orderbook, order_size_btc, side="buy"):
"""
Calcule le slippage réalisable pour un ordre de taille donnée.
Args:
orderbook: snapshot d'orderbook
order_size_btc: taille de l'ordre en BTC
side: "buy" (ask) ou "sell" (bid)
"""
levels = orderbook['asks'] if side == "buy" else orderbook['bids']
remaining = order_size_btc
total_cost = 0
filled_levels = 0
for level in levels:
price = level['price']
available = level['amount']
fill = min(remaining, available)
total_cost += fill * price
remaining -= fill
filled_levels += 1
if remaining <= 0:
break
# Prix moyen pondéré vs prix au meilleur niveau
avg_price = total_cost / (order_size_btc - remaining)
best_price = levels[0]['price']
slippage_bps = ((avg_price - best_price) / best_price) * 10000
return {
"filled_pct": (order_size_btc - remaining) / order_size_btc * 100,
"avg_price": avg_price,
"best_price": best_price,
"slippage_bps": slippage_bps,
"slippage_pct": slippage_bps / 100
}
Test avec un ordre de 5 BTC sur le dernier snapshot
test_orderbook = result['snapshots'][-1]
slippage = calculate_realistic_slippage(
test_orderbook,
order_size_btc=5,
side="buy"
)
print(f"Ordre: BUY 5 BTC")
print(f"Prix moyen: {slippage['avg_price']:.6f} BTC")
print(f"Prix optimal: {slippage['best_price']:.6f} BTC")
print(f"Slippage: {slippage['slippage_bps']:.2f} bps ({slippage['slippage_pct']:.3f}%)")
print(f"Ordre rempli à {slippage['filled_pct']:.1f}%")
Analyser la volatilité implicite depuis l'orderbook
Une application avancée : extraire la volatilité implicite (IV) des prix de l'ordrebook. L'IV est le paramètre le plus important pour les stratégies sur options.
import math
def implied_volatility_from_orderbook(orderbook, option_type="call",
spot_price=1.0, time_to_expiry=30/365):
"""
Approximation de l'IV via la formule de Black-Scholes inversée.
Pour une estimation rapide, on utilise le prix mid.
"""
K = extract_strike_from_instrument(orderbook['instrument'])
mid_price = (orderbook['best_bid'] + orderbook['best_ask']) / 2
# Newton-Raphson simplifié pour trouver IV
sigma = 0.5 # Estimation initiale
for _ in range(50):
d1 = (math.log(spot_price / K) + 0.5 * sigma**2 * time_to_expiry) / (sigma * math.sqrt(time_to_expiry))
if option_type == "call":
bs_price = spot_price * norm_cdf(d1) - K * norm_cdf(d1 - sigma * math.sqrt(time_to_expiry))
else:
bs_price = K * norm_cdf(-d1 + sigma * math.sqrt(time_to_expiry)) - spot_price * norm_cdf(-d1)
if abs(bs_price - mid_price) < 1e-6:
break
# Ajustement grossier (pas de Greeks calculés pour simplifier)
sigma += (mid_price - bs_price) * 0.1
return sigma * 100 # En pourcentage
Note: Cette fonction nécessite norm_cdf du module scipy
from scipy.stats import norm
Extraction du strike depuis le nom d'instrument
def extract_strike_from_instrument(instrument):
parts = instrument.split('-')
strike = parts[2]
return float(strike)
Erreurs courantes et solutions
Erreur 1 : "Rate limit exceeded" sur Deribit
Symptôme : Votre script fonctionne 5 minutes puis tous les appels retournent 429.
Cause : Deribit limite à 60 req/min pour les endpoints historiques sans authentication.
Solution : Implémentez un rate limiter et utilisez l'authentification (clé API) qui porte la limite à 300 req/min.
import time
from ratelimit import limits, sleep_and_retry
@sleep_and_retry
@limits(calls=55, period=60) # Marge de sécurité
def fetch_with_rate_limit(url, headers=None):
response = requests.get(url, headers=headers)
if response.status_code == 429:
time.sleep(60) # Attendre 1 minute complète
raise Exception("Rate limit, retrying...")
return response
Erreur 2 : Données orderbook vides ou incomplètes
Symptôme : Les snapshots sont retournés mais les champs 'bids' et 'asks' sont vides.
Cause : L'instrument spécifié n'existe pas ou a expiré. Deribit purge les orderbooks des options expirées.
Solution : Vérifiez d'abord la liste des instruments actifs.
# Vérifier l'existence de l'instrument
def list_active_options(exchange, coin="BTC"):
markets = exchange.load_markets()
active = [
m for m in markets
if coin in m and 'option' in m and '-C-' in m
]
print(f"Options {coin} actives: {len(active)}")
return active
Lister les strikes disponibles
active_options = list_active_options(deribit, "BTC")
strikes = list(set([o.split('-')[2] for o in active_options[:20]]))
print(f"Exemples de strikes: {strikes}")
Erreur 3 : Timestamp mal formaté导致 données erronées
Symptôme : Vos données semblent correctes mais couvrent la mauvaise période.
Cause : Confusion entre timestamps en secondes (Unix) et millisecondes (JavaScript).
Solution : Deribit utilise les millisecondes. Vérifiez systématiquement.
from datetime import datetime
Vérification de conversion
now_ms = int(datetime.now().timestamp() * 1000)
now_s = int(datetime.now().timestamp())
print(f"Timestamp actuel (ms): {now_ms}")
print(f"Timestamp actuel (s): {now_s}")
print(f"Différence: {now_ms - now_s} millisecondes")
Votre code devrait utiliser *1000 si vous partez de datetime
timestamp_correct = int(datetime(2025, 3, 28).timestamp() * 1000)
print(f"28 Mars 2025 en ms: {timestamp_correct}")
Erreur 4 : Clé API HolySheep invalide
Symptôme : Erreur 401 "Invalid API key" même après avoir copié la clé.
Cause : Espaces ou caractères invisibles collés lors du copier-coller.
Solution : Regenerer la clé et utilisez les variables d'environnement.
import os
Stockez la clé en variable d'environnement (plus sûr)
Mac/Linux: export HOLYSHEEP_API_KEY="votre_cle"
Windows: set HOLYSHEEP_API_KEY="votre_cle"
API_KEY = os.environ.get('HOLYSHEEP_API_KEY', 'YOUR_HOLYSHEEP_API_KEY')
Test de connexion
def test_connection():
response = requests.get(
f"{BASE_URL}/account/balance",
headers={"Authorization": f"Bearer {API_KEY}"}
)
if response.status_code == 401:
print("❌ Clé API invalide. Vérifiez votre clé sur le dashboard HolySheep.")
return False
elif response.status_code == 200:
print("✅ Connexion réussie!")
return True
else:
print(f"⚠️ Erreur inattendue: {response.status_code}")
return False
test_connection()
Bonnes pratiques pour vos backtests
- Fréquence des snapshots : Pour du scalping (< 1min), utilisez des snapshots 1 seconde. Pour du swing trading, 5-15 min suffisent.
- Gestion des gaps : Les cryptomarchés sont ouverts 24/7 mais les options ont des heures de trading. Identifiez les périodes de faible liquidité.
- Transaction costs : Intégrez toujours les fees Deribit (0.04% maker, 0.05% taker) + votre slippage calculé.
- Suréchantillonnage : Ne backtestez jamais sur les données exactes utilisées pour calculer les paramètres. Splittez train/test.
Conclusion et ressources
La récupération de snapshots historiques d'options Deribit est accessible à tous avec les bons outils. L'API native Deribit convient aux développeurs expérimentés, CCXT pour ceux quiwant une bibliothèque unifiée, et HolySheep AI pour une solution clé-en-main avec support multilingue et facilité de paiement.
Les erreurs les plus fréquentes sont liées aux rate limits, aux formats de timestamp et aux instruments inexistants. En suivant les exemples de ce guide, vous devriez pouvoir constituer votre premier dataset de backtesting en moins d'une heure.
Pour approfondir, consultez la documentation officielle Deribit API et les exemples HolySheep dans leur documentation technique.
👉 Inscrivez-vous sur HolySheep AI — crédits offerts