Nous avons tous vécu ce moment frustrant : votre système de trading algo vient de déclencher un signal d'achat sur le Bitcoin, mais au moment d'exécuter, votre connexion API expire avec un ConnectionError: timeout after 30000ms. Ou pire encore, vous recevez un 401 Unauthorized en plein milieu d'une session de marché volatile. Aujourd'hui, je vais vous montrer comment éviter ces pièges et construire une stratégie robuste de suivi de tendance crypto avec l'API Kaiko.
Scénario d'erreur réel : Le crash qui m'a coûté 2 400 $
Il y a six mois, j'exécutais une stratégie de trend following sur 8 paires crypto simultanément. À 3h47 du matin, le BTC a brisé une résistance clé à 67 200 $. Mon système a généré les signaux, mais l'API Kaiko a répondu avec un 429 Too Many Requests. Résultat : 0 exécuté sur 8 ordres. Le prix a continué sa hausse de 3,2% sans moi. Cette expérience m'a poussé à comprendre intimement les limites, les quotas et les patterns d'erreur de cette API.
Qu'est-ce que l'API Kaiko et pourquoi l'utiliser ?
Kaiko est un fournisseur de données blockchain institutionnel offrant des flux de prix en temps réel, du carnet d'ordres, et des données historiques de plus de 10 000 actifs numériques. Contrairement aux exchanges directs, Kaiko'agrège les données de 85+ sources, offrant une vision consolidée du marché avec une latence médiane de 180ms pour les flux REST.
Prérequis et configuration initiale
# Installation des dépendances Python
pip install kaiko-python requests aiohttp pandas numpy
Vérification de la connexion
python3 -c "import kaiko; print(kaiko.__version__)"
Créez votre fichier de configuration config.py :
# config.py
import os
=== CONFIGURATION KAIKO ===
KAIKO_API_KEY = "votre_cle_api_kaiko"
KAIKO_BASE_URL = "https://ws-api.kaiko.com"
=== CONFIGURATION HOLYSHEEP (analyse IA) ===
HOLYSHEEP_BASE_URL = "https://api.holysheep.ai/v1"
HOLYSHEEP_API_KEY = "YOUR_HOLYSHEEP_API_KEY" # Obtenez vos crédits gratuits
Paramètres de stratégie
TRADING_PAIRS = ["BTC-USD", "ETH-USD", "SOL-USD", "AVAX-USD"]
TIMEFRAME = "1m"
TREND_PERIOD = 20 # Périodes pour moyenne mobile
TREND_THRESHOLD = 0.015 # 1.5% de changement pour confirmer le trend
Implémentation du client Kaiko avec gestion des erreurs
# kaiko_client.py
import requests
import time
from typing import Dict, List, Optional
from datetime import datetime, timedelta
class KaikoClient:
"""
Client robuste pour l'API Kaiko avec retry automatique
et gestion complète des erreurs HTTP.
"""
def __init__(self, api_key: str, base_url: str = "https://ws-api.kaiko.com"):
self.api_key = api_key
self.base_url = base_url
self.session = requests.Session()
self.session.headers.update({
"X-API-Key": self.api_key,
"Accept": "application/json"
})
# Rate limiting : 100 req/minute par défaut
self.request_count = 0
self.last_reset = time.time()
def _rate_limit_check(self):
"""Respecte les limites de l'API Kaiko"""
current_time = time.time()
if current_time - self.last_reset >= 60:
self.request_count = 0
self.last_reset = current_time
if self.request_count >= 95: # Marge de sécurité
wait_time = 60 - (current_time - self.last_reset)
print(f"⏳ Rate limit proche, attente {wait_time:.1f}s...")
time.sleep(wait_time)
def get_spot_price(self, base_asset: str, quote_asset: str = "USD") -> Dict:
"""
Récupère le prix spot actuel avec retry automatique.
Raises:
KaikoAPIError: Si l'API retourne une erreur après 3 tentatives
"""
endpoint = f"/v2/data/trade.v1/spot/{base_asset}-{quote_asset}/last"
max_retries = 3
for attempt in range(max_retries):
try:
self._rate_limit_check()
response = self.session.get(
f"{self.base_url}{endpoint}",
timeout=10
)
self.request_count += 1
if response.status_code == 200:
return response.json()
elif response.status_code == 401:
raise KaikoAPIError("❌ Clé API invalide ou expirée", 401)
elif response.status_code == 429:
retry_after = int(response.headers.get("Retry-After", 60))
print(f"⚠️ Rate limit atteint, retry dans {retry_after}s...")
time.sleep(retry_after)
elif response.status_code == 404:
raise KaikoAPIError(f"❌ Pair {base_asset}-{quote_asset} non trouvé", 404)
else:
raise KaikoAPIError(f"❌ Erreur HTTP {response.status_code}", response.status_code)
except requests.exceptions.Timeout:
print(f"⚠️ Timeout tentative {attempt + 1}/{max_retries}")
if attempt == max_retries - 1:
raise KaikoAPIError("⏱️ Délai d'attente dépassé après 3 tentatives")
except requests.exceptions.ConnectionError as e:
print(f"🔌 Erreur de connexion: {e}")
time.sleep(2 ** attempt) # Backoff exponentiel
raise KaikoAPIError("Échec après toutes les tentatives")
def get_historical_prices(self, base_asset: str, quote_asset: str = "USD",
start_time: datetime = None, end_time: datetime = None,
limit: int = 1000) -> List[Dict]:
"""Récupère l'historique des prix pour analyse technique."""
endpoint = f"/v2/data/trade.v1/spot/{base_asset}-{quote_asset}/trades"
params = {
"limit": min(limit, 10000),
"sort": "desc"
}
if start_time:
params["start_time"] = start_time.isoformat()
if end_time:
params["end_time"] = end_time.isoformat()
self._rate_limit_check()
response = self.session.get(
f"{self.base_url}{endpoint}",
params=params,
timeout=30
)
self.request_count += 1
if response.status_code == 200:
return response.json().get("data", [])
else:
raise KaikoAPIError(f"Erreur historique: {response.status_code}")
def get_orderbook_snapshot(self, base_asset: str, quote_asset: str = "USD") -> Dict:
"""Récupère un snapshot du carnet d'ordres pour la profondeur de marché."""
endpoint = f"/v2/data/orderbook.snapshots.v1/spot/{base_asset}-{quote_asset}/last"