Outils de trading

Récupérer l'historique des Klines via l'API Binance : Comment éviter les données manquantes

2026-04-23 · 14 min de lecture

Le backtesting nécessite des Klines historiques. Cet article présente la méthode standard pour la pagination et la déduplication lors de la récupération de données via l'API.

Toute stratégie de backtesting repose sur un historique de Klines (bougies) fiable. Commencez par créer une clé API en lecture seule sur le site officiel de Binance. Pour le suivi sur mobile, utilisez l' application officielle de Binance (pour iOS, voir le tutoriel d'installation iOS).

L'interface API

GET /api/v3/klines
Paramètres : symbol, interval, startTime, endTime, limit

Le paramètre limit est plafonné à 1000 bougies par requête.

Récupérer tout l'historique d'un coup ?

C'est impossible. En raison de la limite de 1000 bougies, vous devez procéder par pagination.

Paradigme de pagination

Voici comment structurer votre boucle de récupération en Python :

import time
all_klines = []
end = int(time.time() * 1000)
start = end - 365 * 24 * 3600 * 1000  # Historique sur 1 an

while start < end:
    klines = client.get_klines(
        symbol='BTCUSDT',
        interval='1h',
        startTime=start,
        limit=1000
    )
    if not klines:
        break
    all_klines.extend(klines)
    # La prochaine série commence à la fin de la précédente + 1ms
    start = klines[-1][0] + 1  
    time.sleep(0.5)  # Protection contre la limitation de débit (rate limit)

Déduplication

Les bougies aux limites de chaque lot peuvent être dupliquées. L'ajout de 1ms au start_time du lot suivant permet d'éviter cela.

Vous pouvez aussi utiliser Pandas pour nettoyer vos données :

import pandas as pd
df = pd.DataFrame(all_klines)
# Suppression des doublons basés sur le timestamp (colonne 0)
df = df.drop_duplicates(subset=[0])  

Format des Klines

Chaque Kline est retournée sous forme de tableau (array) :

[
  open_time,    # Timestamp d'ouverture (ms)
  open,         # Prix d'ouverture
  high,         # Prix le plus haut
  low,          # Prix le plus bas
  close,        # Prix de clôture
  volume,       # Volume échangé
  close_time,   # Timestamp de clôture
  quote_volume, # Volume en devise de cotation
  trades,       # Nombre de transactions
  taker_buy_base,
  taker_buy_quote,
  ignore
]

Conversion en DataFrame

df = pd.DataFrame(all_klines, columns=[
    'open_time','open','high','low','close','volume',
    'close_time','quote_volume','trades',
    'taker_buy_base','taker_buy_quote','ignore'
])
df['open_time'] = pd.to_datetime(df['open_time'], unit='ms')
df.set_index('open_time', inplace=True)
df = df.astype({'open': float, 'high': float, 'low': float, 'close': float, 'volume': float})

Une fois converties, vous pouvez exploiter ces données avec Pandas, Numpy ou n'importe quelle bibliothèque de backtesting.

Unités de temps et volume de données

Intervalle Nombre de Klines par an
1m 525 600
5m 105 120
15m 35 040
1h 8 760
4h 2 190
1d 365

Avec une limite de 1000 bougies par requête :

  • 1 an en 1m = 526 requêtes = environ 4-5 minutes.
  • 1 an en 1h = 9 requêtes = quelques secondes.

Parallélisation multi-symboles

import concurrent.futures
symbols = ['BTCUSDT', 'ETHUSDT', 'SOLUSDT']

def fetch(s):
    return get_history(s, '1h', 365)

with concurrent.futures.ThreadPoolExecutor(max_workers=3) as ex:
    results = list(ex.map(fetch, symbols))

La parallélisation est possible, veillez simplement à ne pas dépasser le "poids" (weight) total autorisé par l'API.

API Publique vs Authentifiée

Les Klines historiques sont des données publiques. Vous pouvez les récupérer sans clé API :

import requests
url = 'https://api.binance.com/api/v3/klines'
params = {'symbol': 'BTCUSDT', 'interval': '1h', 'limit': 1000}
r = requests.get(url, params=params)

Cependant, utiliser une clé API (authentifiée) vous octroie généralement des limites de débit plus élevées.

Données historiques massives

Binance propose un portail dédié au téléchargement de jeux de données historiques au format CSV (fichiers .zip) :

  • data.binance.vision/

C'est beaucoup plus rapide que l'API pour récupérer plusieurs années de données.

Mise à jour continue

Après le backtesting, le passage au trading réel nécessite une mise à jour des données en temps réel. Deux méthodes :

1. Requêtes programmées (Polling)

Récupérer les 5 dernières bougies chaque minute pour mettre à jour votre base locale.

2. WebSocket

S'abonner au flux WebSocket des Klines :

wss://stream.binance.com:9443/ws/btcusdt@kline_1h

Les mises à jour sont poussées instantanément à chaque changement de prix. Le WebSocket est idéal pour le temps réel, tandis que le REST est préférable pour combler l'historique.

Qualité des données

Points d'attention :

  • Une instabilité réseau peut entraîner la perte d'un lot (vérifiez la continuité des timestamps).
  • Les timestamps sont en millisecondes (et non en secondes).
  • La bougie en cours (la plus récente) est fluctuante jusqu'à sa clôture.

Excluez toujours la bougie non clôturée lors de vos calculs de backtesting.

Persistance

Enregistrez vos données récupérées sous l'un des formats suivants :

  • CSV : Simple mais volumineux.
  • Parquet : Très efficace pour la compression et la rapidité.
  • SQLite : Pratique pour les requêtes complexes.
  • DuckDB : Excellent pour l'analyse rapide de données.

Le format Parquet est recommandé pour des volumes de données moyens à importants.

Historique des dérivés

Interfaces pour les Futures :

  • USDT-M : /fapi/v1/klines
  • Coin-M : /dapi/v1/klines

Les paramètres et les formats de réponse sont identiques à ceux du Spot v3.

Historique des taux de financement

GET /fapi/v1/fundingRate?symbol=BTCUSDT&limit=1000

Un enregistrement toutes les 8 heures. Max 1000 entrées = environ 333 jours d'historique.

Questions Fréquemment Posées

Risque-t-on d'être banni par l'API en récupérant l'historique ? Oui, si vous n'ajoutez pas de délais (sleep) entre vos requêtes. Respectez les limites de débit.

Peut-on récupérer l'historique de toutes les cryptomonnaies ? Oui, mais l'historique peut être limité pour les cryptos ayant été délistées.

Quel espace disque occupe un an de Klines en 1m ? Environ 50 Mo par paire en format CSV. Cela peut devenir massif avec beaucoup de paires.

Le backtesting simule-t-il le glissement (slippage) ? Non, vous devez ajouter votre propre modèle de slippage. Les données de Klines brutes ne l'incluent pas.

Lectures complémentaires

Les Klines historiques sont le carburant de votre backtesting. Maîtriser leur récupération, leur nettoyage et leur stockage est la première étape vers une stratégie quantitative réussie.