Récupérer l'historique des Klines via l'API Binance : Comment éviter les données manquantes
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.