Vous souhaitez extraire l'historique complet des transactions Binance pour alimenter vos analyses, vos modèles de trading algorithmique ou vos rapports financiers ? Vous avez remarqué que les API Binance renvoient les données par petits paquets et que votre connexion coupe en cours de route ? Ce tutoriel est fait pour vous. Nous allons démystifier ensemble les concepts de pagination et de reprise sur interruption (断点续传), sans jargon technique superflu.
Pourquoi les données Binance arrivent-elles par fragments ?
Lorsque vous demandez l'historique des transactions à l'API Binance, celle-ci ne vous renvoie jamais l'intégralité des données d'un coup. Pourquoi ? Parce que le volume serait colossal et bloquerait les serveurs. Binance impose donc des limites de pages : typiquement 500 à 1000 enregistrements par requête. Votre rôle consiste à réclamer page après page jusqu'à obtenir la totality des données.
Imaginez une bibliothèque qui vous lendrait uniquement 100 livres à la fois, même si vous en avez demandé 50 000. Vous devriez retourner plusieurs fois pour tout récupérer. C'est exactement le principe de la pagination.
Préparer votre environnement de travail
Avant de commencer, assurezvous d'avoir installé Python 3.8 ou supérieur. Nous utiliserons la bibliothèque requests pour communiquer avec l'API Binance et pandas pour manipuler les données. Installez ces dépendances avec la commande suivante :
pip install requests pandas python-dotenv
Créez ensuite un fichier nommé config.py à la racine de votre projet. Ce fichier contiendra vos clefs API et vos paramètres de configuration. Ne partagez jamais vos clefs secrètes !
# config.py
import os
from dotenv import load_dotenv
load_dotenv()
Vos clefs API Binance (obtenez-les sur https://www.binance.com)
BINANCE_API_KEY = os.getenv("BINANCE_API_KEY", "votre_clef_publique")
BINANCE_SECRET_KEY = os.getenv("BINANCE_SECRET_KEY", "votre_clef_secrete")
Paramètres de pagination
LIMIT_PAR_PAGE = 1000 # Maximum autorisé par Binance
PAUSE_ENTRE_REQUETES = 0.05 # 50ms pour respecter les limites de l'API
Comprendre le mécanisme de pagination de l'API Binance
L'API Binance utilise deux méthodes principales pour paginer les résultats : l'identifiant de start (startTime) et l'identifiant de fin (endId). Chaque réponse inclut un champ id du dernier enregistrement récupéré. Vous utiliserez ce dernier identifiant comme point de départ pour la page suivante.
Pour les endpoints de type /api/v3/myTrades (vos transactions) ou /api/v3/allOrders (tous vos ordres), le processus fonctionne ainsi :
- Effectuez une première requête sans paramètre
fromId - Récupérez le
iddu dernier enregistrement dans la réponse - Utilisez ce
idcommefromIdpour la requête suivante - Répétez jusqu'à obtenir moins de 1000 résultats ou atteindre la date souhaitée
Implémenter la récupération avec pagination automatique
Voici le code complet d'une fonction qui récupère automatiquement toutes vos transactions sur une paire donnée. Cette implémentation gère la pagination, les erreurs réseau et les limites de taux de l'API.
# btc_history.py
import requests
import time
import pandas as pd
from config import BINANCE_API_KEY, BINANCE_SECRET_KEY, LIMIT_PAR_PAGE, PAUSE_ENTRE_REQUETES
BASE_URL = "https://api.binance.com"
def recuperer_transactions(symbol: str, limit: int = None) -> pd.DataFrame:
"""
Récupère l'intégralité de l'historique des transactions pour un symbole.
Args:
symbol: Paire de trading (ex: 'BTCUSDT', 'ETHBUSD')
limit: Nombre maximum de transactions à récupérer (None = tout)
Returns:
DataFrame pandas contenant toutes les transactions
"""
all_trades = []
headers = {
"X-MBX-APIKEY": BINANCE_API_KEY
}
from_id = None
total_recupere = 0
while True:
params = {
"symbol": symbol.upper(),
"limit": LIMIT_PAR_PAGE,
}
if from_id:
params["fromId"] = from_id
try:
response = requests.get(
f"{BASE_URL}/api/v3/myTrades",
headers=headers,
params=params,
timeout=10
)
if response.status_code == 429:
# Limite de taux atteinte, patienter 60 secondes
print("⚠️ Limite de taux atteinte. Pause de 60 secondes...")
time.sleep(60)
continue
response.raise_for_status()
trades = response.json()
except requests.exceptions.RequestException as e:
print(f"❌ Erreur réseau : {e}")
time.sleep(5)
continue
if not trades:
print("✓ Toutes les transactions récupérées.")
break
all_trades.extend(trades)
total_recupere += len(trades)
print(f"→ Page récupérée : {len(trades)} transactions (total : {total_recupere})")
# Utiliser l'ID le plus élevé comme point de départ suivant
from_id = max(int(trade["id"]) for trade in trades)
# Respecter les limites de l'API
time.sleep(PAUSE_ENTRE_REQUETES)
if limit and total_recupere >= limit:
print(f"✓ Limite de {limit} transactions atteinte.")
break
return pd.DataFrame(all_trades)
Exemple d'utilisation
if __name__ == "__main__":
df = recuperer_transactions("BTCUSDT", limit=10000)
df.to_csv("btcusdt_trades.csv", index=False)
print(f"💾 Fichier enregistré : {len(df)} lignes")
Implémenter la reprise sur interruption (断点续传)
La vraie valeur ajoutée réside dans la capacité de reprendre un téléchargement interrompu. Imaginons que votre script tourne depuis 2 heures et que votre connexion coupe. Sans reprise, vous devriez recommencer depuis le début. Avec notre système de checkpoint, vous reprenez exactement où vous vous étiez arrêté.
# resume_download.py
import json
import os
import time
import pandas as pd
import requests
from datetime import datetime
CHECKPOINT_FILE = "checkpoint_binance.json"
class TelechargeurBinance:
def __init__(self, symbol: str, checkpoint_path: str = None):
self.symbol = symbol.upper()
self.checkpoint_path = checkpoint_path or CHECKPOINT_FILE
self.all_trades = []
def charger_checkpoint(self) -> dict:
"""Charge l'état précédent si disponible."""
if os.path.exists(self.checkpoint_path):
with open(self.checkpoint_path, "r") as f:
data = json.load(f)
print(f"📂 Reprise détectée : {data.get('total_recupere', 0)} transactions déjà sauvegardées")
return data
return {"from_id": None, "total_recupere": 0, "last_update": None}
def sauvegarder_checkpoint(self, from_id: int, total_recupere: int):
"""Sauvegarde l'état actuel pour permettre la reprise."""
checkpoint = {
"from_id": from_id,
"total_recupere": total_recupere,
"last_update": datetime.now().isoformat(),
"symbol": self.symbol
}
with open(self.checkpoint_path, "w") as f:
json.dump(checkpoint, f, indent=2)
print(f"💾 Checkpoint sauvegardé : ID={from_id}, Total={total_recupere}")
def charger_donnees_existantes(self) -> list:
"""Charge les données déjà téléchargées depuis le fichier CSV."""
csv_path = f"{self.symbol.lower()}_trades.csv"
if os.path.exists(csv_path):
df = pd.read_csv(csv_path)
self.all_trades = df.to_dict("records")
print(f"📥 {len(self.all_trades)} transactions existantes chargées")
return self.all_trades
return []
def telecharger(self, limite: int = None, auto_save: int = 5000):
"""
Télécharge les transactions avec sauvegarde automatique et reprise.
Args:
limite: Nombre maximum de transactions (None = illimité)
auto_save: Sauvegarder toutes les N transactions
"""
checkpoint = self.charger_checkpoint()
self.charger_donnees_existantes()
from_id = checkpoint.get("from_id")
total = checkpoint.get("total_recupere", 0)
headers = {"X-MBX-APIKEY": BINANCE_API_KEY}
while True:
params = {
"symbol": self.symbol,
"limit": LIMIT_PAR_PAGE,
}
if from_id:
params["fromId"] = from_id
try:
response = requests.get(
f"{BASE_URL}/api/v3/myTrades",
headers=headers,
params=params,
timeout=15
)
if response.status_code == 429:
print("⏳ Rate limit - pause 60s")
time.sleep(60)
continue
response.raise_for_status()
trades = response.json()
except Exception as e:
print(f"❌ Erreur : {e}, nouvelle tentative dans 10s...")
time.sleep(10)
continue
if not trades:
break
self.all_trades.extend(trades)
total += len(trades)
from_id = max(int(t["id"]) for t in trades)
print(f" [{datetime.now().strftime('%H:%M:%S')}] +{len(trades)} | Total: {total}")
# Sauvegarde automatique périodique
if total % auto_save == 0:
self.sauvegarder(final=False)
time.sleep(0.05)
if limite and total >= limite:
break
self.sauvegarder(final=True)
return pd.DataFrame(self.all_trades)
def sauvegarder(self, final: bool = False):
"""Sauvegarde les données et le checkpoint."""
df = pd.DataFrame(self.all_trades)
csv_path = f"{self.symbol.lower()}_trades.csv"
df.to_csv(csv_path, index=False)
if self.all_trades:
last_id = max(int(t["id"]) for t in self.all_trades)
self.sauvegarder_checkpoint(last_id, len(self.all_trades))
status = "✅ Final" if final else "💾 Intermédiaire"
print(f"{status} : {len(self.all_trades)} lignes dans {csv_path}")
Utilisation
if __name__ == "__main__":
telechargeur = TelechargeurBinance("BTCUSDT")
df = telechargeur.telecharger(limite=50000)
print(f"🎉 Terminé : {len(df)} transactions")
Analyser vos données avec HolySheep AI
Une fois vos données historiques récupérées, vous souhaiterez probablement les analyser, les visualiser ou les enrichir avec de l'intelligence artificielle. C'est précisément là qu'HolySheep AI entre en jeu. Notre plateforme offre un accès simplifié aux modèles d'IA les plus puissants du marché avec une latence inférieure à 50 millisecondes et des tarifs considérablement inférieurs aux fournisseurs traditionnels.
# analyze_with_holysheep.py
import requests
import pandas as pd
Configuration HolySheep
HOLYSHEEP_BASE_URL = "https://api.holysheep.ai/v1"
HOLYSHEEP_API_KEY = "YOUR_HOLYSHEEP_API_KEY" # Remplacez par votre clef
def analyser_performance_trades(df_trades: pd.DataFrame) -> dict:
"""
Envoie les données de trading à HolySheep AI pour analyse approfondie.
"""
# Préparer un résumé des transactions
resume = {
"total_transactions": len(df_trades),
"volume_total": float(df_trades["qty"].sum()) if "qty" in df_trades else 0,
"paire": df_trades["symbol"].iloc[0] if len(df_trades) > 0 else "UNKNOWN",
"premiere_date": df_trades["time"].min() if "time" in df_trades else None,
"derniere_date": df_trades["time"].max() if "time" in df_trades else None
}
prompt = f"""Analyse mes performances de trading sur {resume['paire']} :
- Nombre de transactions : {resume['total_transactions']}
- Volume total échangé : {resume['volume_total']}
- Période : {resume['premiere_date']} à {resume['derniere_date']}
Donne-moi :
1. Une estimation de ma fréquence de trading
2. Des conseils pour optimiser mes stratégies
3. Les points d'amélioration prioritaires"""
headers = {
"Authorization": f"Bearer {HOLYSHEEP_API_KEY}",
"Content-Type": "application/json"
}
payload = {
"model": "gpt-4.1", # Notre modèle le plus performant
"messages": [{"role": "user", "content": prompt}],
"temperature": 0.7,
"max_tokens": 1000
}
try:
response = requests.post(
f"{HOLYSHEEP_BASE_URL}/chat/completions",
headers=headers,
json=payload,
timeout=30
)
response.raise_for_status()
result = response.json()
return result["choices"][0]["message"]["content"]
except requests.exceptions.RequestException as e:
return f"Erreur lors de l'analyse : {e}"
Exemple d'utilisation
if __name__ == "__main__":
df = pd.read_csv("btcusdt_trades.csv")
analyse = analyser_performance_trades(df)
print("📊 Résultat de l'analyse HolySheep :")
print(analyse)
Erreurs courantes et solutions
Erreur 1 : "Signature verification failed"
Symptôme : L'API renvoie un code 400 ou 401 avec le message "Signature verification failed".
Cause : Votre signature HMAC ne correspond pas aux paramètres envoyés. Cela arrive souvent quand l'ordre des paramètres n'est pas alphabétique ou quand un paramètre est omis.
Solution :
# CORRECTION pour la signature Binance
import hashlib
import hmac
from urllib.parse import urlencode
def creer_signature(query_string: str, secret_key: str) -> str:
"""Crée une signature HMAC SHA256 conforme aux exigences Binance."""
# Assurez-vous que la chaîne de requête est triée alphabétiquement
sorted_params = sorted(query_string.split("&"))
sorted_query = "&".join(sorted_params)
signature = hmac.new(
secret_key.encode("utf-8"),
sorted_query.encode("utf-8"),
hashlib.sha256
).hexdigest()
return signature
Exemple d'utilisation correcte
params = {
"symbol": "BTCUSDT",
"timestamp": int(time.time() * 1000),
"recvWindow": 5000
}
query_string = urlencode(params)
signature = creer_signature(query_string, BINANCE_SECRET_KEY)
Erreur 2 : "Too many requests"
Symptôme : Code de réponse 429 et message "Too many requests".
Cause : Vous avez dépassé les limites de taux de l'API Binance (1200 requêtes/minute pour les endpointsWeight 1).
Solution : Implémentez un délai adaptatif et un exponential backoff :
# GESTION ROBUSTE des limites de taux
import random
class RateLimiter:
def __init__(self, max_requests: int = 1200, window_seconds: int = 60):
self.max_requests = max_requests
self.window = window_seconds
self.requests = []
def attendre_si_necessaire(self):
now = time.time()
# Supprimer les requêtes plus anciennes que la fenêtre
self.requests = [t for t in self.requests if now - t < self.window]
if len(self.requests) >= self.max_requests:
# Calculer le temps d'attente restant
oldest = min(self.requests)
wait_time = self.window - (now - oldest) + 1
print(f"⏳ Rate limit proche. Pause de {wait_time:.1f}s")
time.sleep(wait_time)
# Ajouter un délai aléatoire pour éviter les pics
time.sleep(random.uniform(0.05, 0.15))
self.requests.append(time.time())
Utilisation dans votre code
limiter = RateLimiter()
def requete_securisee(url, headers, params):
limiter.attendre_si_necessaire()
# ... votre logique de requête
return response
Erreur 3 : "Data between start time and end time is truncated"
Symptôme : Pour les endpoints de klines/candlesticks, vous recevez un avertissement que certaines données manquent.
Cause : L'intervalle demandé est trop large et Binance limite le nombre de chandeliers retournés (1000 par défaut, 1500 maximum).
Solution : Découpez vos intervalles en tranches plus petites :
# RECUPERATION DE KLINES SANS TRONCATURE
from datetime import datetime, timedelta
def recuperer_klines_complet(symbol: str, interval: str, start_time: int, end_time: int):
"""Récupère tous les klines sans troncature en découpant les périodes."""
all_klines = []
current_start = start_time
# Limites Binance : 1000 klines par requête, 1500 max avec limit=1500
MAX_KLINES_PAR_REQUETE = 1500
# Estimation de la plage maximale selon l'intervalle
INTERVALES_MS = {
"1m": 60000, "3m": 180000, "5m": 300000,
"15m": 900000, "1h": 3600000, "4h": 14400000,
"1d": 86400000, "1w": 604800000
}
interval_ms = INTERVALLES_MS.get(interval, 3600000)
# Calculer la fenêtre temporelle maximale
max_window = MAX_KLINES_PAR_REQUETE * interval_ms
while current_start < end_time:
window_end = min(current_start + max_window, end_time)
params = {
"symbol": symbol,
"interval": interval,
"startTime": current_start,
"endTime": window_end,
"limit": MAX_KLINES_PAR_REQUETE
}
response = requests.get(f"{BASE_URL}/api/v3/klines", params=params)
klines = response.json()
if klines:
all_klines.extend(klines)
# Avancer le curseur au dernier timestamp + 1 intervalle
current_start = int(klines[-1][0]) + interval_ms
print(f" → {len(klines)} klines récupérés, total : {len(all_klines)}")
else:
# Aucune donnée, avancer quand même
current_start = window_end
time.sleep(0.1)
return all_klines
Exemple : récupérer 1 an de données horaires BTCUSDT
start = int(datetime(2024, 1, 1).timestamp() * 1000)
end = int(datetime(2025, 1, 1).timestamp() * 1000)
klines = recuperer_klines_complet("BTCUSDT", "1h", start, end)
print(f"✅ Total : {len(klines)} chandeliers horaires")
Pour qui ce tutoriel est fait — et pour qui il ne l'est pas
| ✅ Ce tutoriel est pour vous si… | ❌ Ce tutoriel n'est pas pour vous si… |
|---|---|
|
|
Tarification et ROI
Combien coûte réellement la récupération de données Binance et l'analyse par IA ? Voici une comparaison détaillée pour un cas d'usage typique : 50 000 transactions analysées mensuellement.
| Composante | Solution traditionnelle | Avec HolySheep AI | Économie |
|---|---|---|---|
| API Binance (rate limit) | Gratuit | Gratuit | — |
| Stockage CSV (50K lignes/mois) | ~0,10 $/mois | ~0,10 $/mois | — |
| Analyse IA (50 prompts/mois) | OpenAI GPT-4 : ~2,50 $/mois | DeepSeek V3.2 : ~0,10 $/mois | 96% |
| Infrastructure (serveur 24/7) | ~5-10 $/mois | Optionnel (script local) | Jusqu'à 10 $/mois |
| Total mensuel estimé | ~7-13 $ → ~0,20 $ | ||
Avec HolySheep AI, vous payez en tokens d'entrée environ 0,42 $ par million de tokens avec DeepSeek V3.2, contre 8 $ pour GPT-4.1 sur les plateformes américaines. Pour un utilisateur européen, le change ¥1 = 1 $ rend le service encore plus compétitif grâce à notre support natif WeChat et Alipay.
Pourquoi choisir HolySheep pour vos analyses de trading
- Latence ultra-faible : Sous 50 millisecondes de temps de réponse moyen, idéal pour les analyses en temps réel
- Modèles diversifiés : Accès à GPT-4.1 (8 $/MTok), Claude Sonnet 4.5 (15 $/MTok), Gemini 2.5 Flash (2,50 $/MTok) et DeepSeek V3.2 (0,42 $/MTok)
- Multi-paiements : NousChat, Alipay et cartes internationales acceptées, change ¥1 = 1 $ pour les utilisateurs chinois
- Crédits gratuits : 5 $ de crédits offerts à l'inscription pour tester toutes les fonctionnalités
- Économie 85%+ : Par rapport aux fournisseurs occidentaux pour les mêmes modèles
Conclusion et prochaines étapes
Vous maîtrisez désormais les fondamentaux de la récupération de données historiques Binance avec pagination et reprise sur interruption. Le code fourni est prêt à l'emploi : copiez-le dans votre environnement, ajoutez vos clefs API, et lancez le script. Vos données seront automatiquement sauvegardées avec des checkpoints permettant de reprendre en cas d'interruption.
Pour aller plus loin, envisagez d'enrichir vos analyses avec l'intelligence artificielle. HolySheep AI vous permet d'automatiser la détection de patterns, la génération de rapports de performance et l'optimisation de vos stratégies de trading, le tout à une fraction du coût des alternatives traditionnelles.
Ressources complémentaires
- Documentation officielle Binance API
- Inscrivez-vous sur HolySheep AI — crédits offerts
- Guide avancé : « Prédire les tendances BTC avec machine learning et données Binance »
Note : Ce tutoriel est fourni à des fins éducatives. Assurez-vous de respecter les conditions d'utilisation de Binance et les réglementations locales concernant l'analyse de données financières.
👉 Inscrivez-vous sur HolySheep AI — crédits offerts