Vous souhaitez analyser l'historique des prix du Bitcoin, Ethereum ou de n'importe quel actif sur Binance ? Vous êtes au bon endroit. Dans ce tutoriel complet, je vais vous guider pas à pas depuis l'installation de Python jusqu'à la récupération de vos premières données K-line (chandeliers japonais) via l'API REST Binance. Aucune expérience préalable en programmation n'est nécessaire — promis, je vous explique tout simplement.
En tant qu'analyste de données crypto depuis plus de trois ans, j'ai testé des dizaines de méthodes pour récupérer ces fameuses donnéesOHLCV (Open, High, Low, Close, Volume). La méthode que je vous présente aujourd'hui est celle que j'utilise quotidiennement : simple, fiable, et surtout, gratuite.
Qu'est-ce qu'une K-Line et pourquoi Binance ?
Une K-Line (ou chandelier japonais) est une représentation visuelle d'un intervalle de temps précis. Chaque chandelier contient cinq informations essentielles : le prix d'ouverture, le prix le plus haut, le prix le plus bas, le prix de clôture, et le volume échangé. C'est le fondement de toute analyse technique en trading.
Binance est la plus grande plateforme d'échange de cryptomonnaies au monde, avec un volume quotidien dépassant les 10 milliards de dollars. Leur API est gratuite, stable, et propose un historique remontant à plusieurs années pour la plupart des paires.
Prérequis : Ce dont vous avez besoin
Avant de commencer, assurezvous d'avoir :
- Un ordinateur avec Windows, macOS ou Linux
- Une connexion internet stable
- Environ 15 minutes de temps libre
- La volonté d'apprendre quelque chose de nouveau
Pas besoin d'être développeur ! Si vous savez ouvrir un navigateur web, vous pouvez suivre ce tutoriel.
Installation de Python et des bibliothèques nécessaires
Étape 1 : Télécharger Python
Rendez-vous sur le site officiel python.org/downloads et téléchargez la dernière version (Python 3.10 ou supérieur). Pendant l'installation, cochez absolument la case "Add Python to PATH" — c'est crucial et souvent oublié par les débutants.
[Capture d'écran suggérée : Fenêtre d'installation Python avec la case "Add Python to PATH" surlignée en rouge]
Étape 2 : Vérifier l'installation
Ouvrez votre terminal (ou invite de commandes) :
- Windows : appuyez sur
Windows + R, tapezcmd, puis Entrée - macOS : ouvrez le Launchpad, cherchez "Terminal"
- Linux : faites
Ctrl + Alt + T
Tapez ensuite :
python --version
Vous devriez voir s'afficher quelque chose comme Python 3.11.5. Si c'est le cas, bravo, Python est installé correctement !
Étape 3 : Installer la bibliothèque requests
La bibliothèque requests va nous permettre de communiquer avec l'API Binance. Dans votre terminal, tapez :
pip install requests pandas
Cette commande installe deux bibliothèques d'un coup :
requests: pour effectuer des requêtes HTTPpandas: pour manipuler et analyser les données facilement
[Capture d'écran suggérée : Terminal affichant "Successfully installed requests pandas"
Récupérer les K-Lines Historiques : Le Code Complet
Méthode simple : Requête basique
Créons notre premier script. Ouvrez un éditeur de texte (Notepad suffit amplement), puis copiez-collez ce code :
import requests
import pandas as pd
from datetime import datetime
Configuration de l'API Binance
symbol = "BTCUSDT" # Paire de trading
interval = "1h" # Intervalle : 1 minute, 5 minutes, 1 heure, 1 jour...
limit = 100 # Nombre de chandeliers à récupérer (max 1000)
Construction de l'URL
url = f"https://api.binance.com/api/v3/klines?symbol={symbol}&interval={interval}&limit={limit}"
Récupération des données
response = requests.get(url)
data = response.json()
Conversion en DataFrame pandas pour faciliter l'analyse
df = pd.DataFrame(data, columns=[
'open_time', 'open', 'high', 'low', 'close', 'volume',
'close_time', 'quote_asset_volume', 'number_of_trades',
'taker_buy_base_asset_volume', 'taker_buy_quote_asset_volume', 'ignore'
])
Conversion des timestamps en dates lisibles
df['open_time'] = pd.to_datetime(df['open_time'], unit='ms')
df['close_time'] = pd.to_datetime(df['close_time'], unit='ms')
Conversion des prix en nombres décimaux
for col in ['open', 'high', 'low', 'close', 'volume']:
df[col] = df[col].astype(float)
Affichage des 5 premières lignes
print(df[['open_time', 'open', 'high', 'low', 'close', 'volume']].head())
Sauvegarde en fichier CSV
df.to_csv('btc_historical_klines.csv', index=False)
print(f"\n✅ Données sauvegardées ! {len(df)} chandeliers récupérés.")
Sauvegardez ce fichier sous le nom binance_klines.py et exécutez-le avec :
python binance_klines.py
[Capture d'écran suggérée : Sortie du terminal montrant les données Bitcoin avec les prix et horodatages]
Méthode avancée : Fonction réutilisable
Maintenant que vous comprenez le fonctionnement basique, voici une version professionnelle de mon code quotidien — celle que j'utilise pour mes analyses de marché :
import requests
import pandas as pd
from datetime import datetime, timedelta
import time
def get_binance_klines(symbol: str, interval: str, start_time: int = None,
end_time: int = None, limit: int = 1000) -> pd.DataFrame:
"""
Récupère les données K-line historiques depuis l'API Binance.
Paramètres:
- symbol: Symbole de la paire (ex: 'BTCUSDT', 'ETHUSDT')
- interval: Intervalle de temps ('1m', '5m', '1h', '4h', '1d')
- start_time: Timestamp en millisecondes (optionnel)
- end_time: Timestamp en millisecondes (optionnel)
- limit: Nombre de chandeliers (max 1000)
Retourne:
- DataFrame pandas avec les données OHLCV
"""
base_url = "https://api.binance.com/api/v3/klines"
params = {
"symbol": symbol.upper(),
"interval": interval,
"limit": limit
}
if start_time:
params["startTime"] = start_time
if end_time:
params["endTime"] = end_time
all_klines = []
while True:
response = requests.get(base_url, params=params)
if response.status_code != 200:
raise Exception(f"Erreur API: {response.status_code} - {response.text}")
klines = response.json()
if not klines:
break
all_klines.extend(klines)
# Calcul du prochain start_time pourpaginer
last_open_time = klines[-1][0]
params["startTime"] = last_open_time + 1
# Respect du rate limit Binance (120 requêtes/minute)
time.sleep(0.05)
# Arrêt si on a moins que le maximum (fin des données)
if len(klines) < limit:
break
# Création du DataFrame
columns = [
'open_time', 'open', 'high', 'low', 'close', 'volume',
'close_time', 'quote_volume', 'num_trades',
'taker_buy_base', 'taker_buy_quote', 'ignore'
]
df = pd.DataFrame(all_klines, columns=columns)
# Conversion des types
df['open_time'] = pd.to_datetime(df['open_time'], unit='ms')
df['close_time'] = pd.to_datetime(df['close_time'], unit='ms')
numeric_cols = ['open', 'high', 'low', 'close', 'volume', 'quote_volume']
for col in numeric_cols:
df[col] = pd.to_numeric(df[col], errors='coerce')
return df
═══════════════════════════════════════════════════════════════
EXEMPLES D'UTILISATION
═══════════════════════════════════════════════════════════════
Exemple 1 : Récupérer les 100 derniers chandeliers de 1 heure
print("📊 Récupération des derniers chandeliers BTC/USDT (1h)...")
btc_1h = get_binance_klines("BTCUSDT", "1h", limit=100)
print(btc_1h[['open_time', 'open', 'high', 'low', 'close']].tail())
Exemple 2 : Récupérer 30 jours de données en intervalle 4h
print("\n📈 Récupération des 30 derniers jours (intervalle 4h)...")
end_time = int(datetime.now().timestamp() * 1000)
start_time = int((datetime.now() - timedelta(days=30)).timestamp() * 1000)
eth_4h = get_binance_klines("ETHUSDT", "4h", start_time, end_time)
print(f"Données récupérées : {len(eth_4h)} chandeliers")
Exemple 3 : Sauvegarder les données
btc_1h.to_csv('btc_hourly_data.csv', index=False)
print("\n💾 Données sauvegardées dans 'btc_hourly_data.csv'")
Cette fonction gère automatiquement la pagination et le rate limiting. Plus besoin de vous soucier des limites de l'API !
Intervalles disponibles et leurs cas d'usage
| Intervalle | Nom complet | Cas d'usage idéal | Historique disponible |
|---|---|---|---|
1m |
1 minute | Sniping, bots de trading haute fréquence | 7 derniers jours |
5m |
5 minutes | Day trading, analyses court terme | 60 derniers jours |
15m |
15 minutes | Trading intrajournalier | 120 derniers jours |
1h |
1 heure | Analyses techniques, swing trading | 500 derniers jours |
4h |
4 heures | Position trading, tendances moyennes | 1000 derniers jours |
1d |
1 jour | Investissement long terme, analyses macro | Illimité (depuis 2017) |
Analyser vos données avec HolySheep AI
Une fois vos données récupérées, vous pouvez les envoyer à HolySheep AI pour une analyse intelligente. C'est là que les choses deviennent vraiment intéressantes.
Imaginons que vous ayez 1000 chandeliers et que vous souhaitiez identifier automatiquement les patterns chartistes ou les signaux de trading. Au lieu de tout analyser manuellement (ce qui prendrait des heures), vous pouvez utiliser la puissance de l'IA.
import requests
import json
Préparation des données pour l'analyse IA
On envoie les 20 derniers chandeliers pour analyse
recent_data = btc_1h[['open_time', 'open', 'high', 'low', 'close', 'volume']].tail(20)
Formatage pour l'API HolySheep
prompt = f"""Analyse ces données de chandeliers BTC/USDT et donne-moi :
1. La tendance actuelle (haussière, baissière, neutre)
2. Les niveaux de support et résistance identifiés
3. Un signal de trading si tu en vois un (buy, sell, hold)
4. Le RSI approximatif basé sur les prix
Données :
{recent_data.to_string()}"""
payload = {
"model": "gpt-4.1",
"messages": [
{"role": "user", "content": prompt}
],
"temperature": 0.7
}
Envoi vers HolySheep AI
base_url = "https://api.holysheep.ai/v1"
headers = {
"Authorization": f"Bearer YOUR_HOLYSHEEP_API_KEY",
"Content-Type": "application/json"
}
response = requests.post(
f"{base_url}/chat/completions",
headers=headers,
json=payload
)
if response.status_code == 200:
result = response.json()
analysis = result['choices'][0]['message']['content']
print("🤖 Analyse HolySheep AI :")
print(analysis)
else:
print(f"❌ Erreur : {response.status_code}")
print(response.text)
Comprendre la structure des données retournées
Chaque chandelier retourné par l'API contient 12 champs. Voici leur signification exacte :
| Index | Champ | Description | Exemple |
|---|---|---|---|
| 0 | open_time | Heure d'ouverture du chandelier | 1704067200000 |
| 1 | open | Prix d'ouverture | 42050.50 |
| 2 | high | Prix le plus haut | 42100.00 |
| 3 | low | Prix le plus bas | 41980.25 |
| 4 | close | Prix de clôture | 42075.80 |
| 5 | volume | Volume échangé en actifs | 1523.45 |
| 6 | close_time | Heure de clôture | 1704070799999 |
| 7 | quote_volume | Volume en USDT | 64032150.25 |
| 8 | num_trades | Nombre de trades | 12456 |
| 9 | taker_buy_base | Volume d'achat initiateur | 752.30 |
| 10 | taker_buy_quote | Volume d'achat en quote | 31560250.50 |
| 11 | ignore | Champ ignoré | 0 |
Erreurs courantes et solutions
Erreur 1 : "ConnectionError" ou timeout
# ❌ Code qui cause l'erreur
response = requests.get(url) # Pas de gestion d'erreur
✅ Solution : Ajouter retry automatique
from requests.adapters import HTTPAdapter
from urllib3.util.retry import Retry
def get_with_retry(url, max_retries=3):
session = requests.Session()
retries = Retry(total=max_retries, backoff_factor=1,
status_forcelist=[500, 502, 503, 504])
session.mount('https://', HTTPAdapter(max_retries=retries))
for attempt in range(max_retries):
try:
response = session.get(url, timeout=10)
response.raise_for_status()
return response.json()
except requests.exceptions.RequestException as e:
print(f" Tentative {attempt + 1} échouée : {e}")
if attempt == max_retries - 1:
raise
return None
Utilisation
data = get_with_retry("https://api.binance.com/api/v3/klines?symbol=BTCUSDT&interval=1h")
print(f"✅ Données récupérées : {len(data)} chandeliers")
Erreur 2 : "Rate limit exceeded" (429)
# ❌ Code qui cause l'erreur
200+ requêtes simultanées sans attendre
✅ Solution : Respecter le rate limit avec backoff exponentiel
import time
import random
def safe_api_call(url, max_retries=5):
for attempt in range(max_retries):
try:
response = requests.get(url)
if response.status_code == 429:
# Rate limit atteint - attendre plus longtemps
wait_time = (2 ** attempt) + random.uniform(0, 1)
print(f"⏳ Rate limit atteint. Attente de {wait_time:.1f}s...")
time.sleep(wait_time)
continue
response.raise_for_status()
return response.json()
except requests.exceptions.RequestException as e:
print(f"Erreur : {e}")
time.sleep(2)
raise Exception("Nombre maximum de tentatives atteint")
Test avec votre URL Binance
url = "https://api.binance.com/api/v3/klines?symbol=BTCUSDT&interval=1h&limit=100"
data = safe_api_call(url)
Erreur 3 : Données vides ou incomplètes
# ❌ Code qui cause l'erreur
df = pd.DataFrame(data) # Pas de vérification
✅ Solution : Valider les données avant traitement
def validate_klines(data):
if not data:
raise ValueError("❌ Aucune donnée reçue de l'API Binance")
if len(data) == 0:
raise ValueError("❌ Le tableau de données est vide")
# Vérifier que chaque chandelier a 12 champs
for i, kline in enumerate(data):
if len(kline) != 12:
raise ValueError(f"❌ Chandelier {i} invalide : {len(kline)} champs au lieu de 12")
# Vérifier que les prix sont numériques
try:
float(kline[1]) # open
float(kline[4]) # close
except (ValueError, TypeError):
raise ValueError(f"❌ Prix invalide au chandelier {i}")
return True
Utilisation
data = response.json()
validate_klines(data)
print(f"✅ {len(data)} chandeliers validés avec succès")
Erreur 4 : Problèmes de fuseau horaire
# ❌ Code qui cause l'erreur
df['open_time'] = df['open_time'] # Pas de conversion
✅ Solution : Gérer correctement les timestamps
from datetime import timezone
def convert_timestamps(df, timezone_offset=1):
"""
Convertit les timestamps Binance (UTC) en heure locale.
Parameters:
- df: DataFrame avec colonne 'open_time' en timestamp ms
- timezone_offset: Décalage horaire (ex: 1 pour Paris en hiver)
"""
# Convertir les millisecondes en datetime UTC
df['open_time_utc'] = pd.to_datetime(df['open_time'], unit='ms', utc=True)
df['close_time_utc'] = pd.to_datetime(df['close_time'], unit='ms', utc=True)
# Convertir en heure locale
df['open_time_local'] = df['open_time_utc'].dt.tz_convert(f'Etc/GMT+{-timezone_offset}')
df['close_time_local'] = df['close_time_utc'].dt.tz_convert(f'Etc/GMT+{-timezone_offset}')
return df
Application
df = convert_timestamps(df, timezone_offset=1) # UTC+1 (Paris)
print(df[['open_time_local', 'close', 'volume']].head())
Pour qui est fait ce tutoriel
Ce tutoriel est parfait pour vous si :
- Vous êtes débutant absolu en programmation et souhaitez analyser les cryptomonnaies
- Vous êtes trader et voulez automatiser la récupération de données pour vos analyses
- Vous développez un bot de trading et avez besoin d'historiques fiables
- Vous êtes étudiant en finance quantitative et cherchez des données de qualité
- Vous voulez créer vos propres indicateurs techniques personnalisés
Ce tutoriel n'est PAS pour vous si :
- Vous cherchez à exécuter des trades automatiquement (il faut alors l'API Spot ou Futures avec authentification)
- Vous avez besoin de données en temps réel (websocket recommandé plutôt que REST)
- Vous souhaitez analyser des actifs non supportés par Binance (certaines cryptos ne sont pas disponibles)
- Vous avez besoin d'une latence inférieure à 100ms (l'API REST n'est pas adaptée)
Tarification et ROI
| Méthode | Coût | Latence | Limites | Ideal pour |
|---|---|---|---|---|
| Binance REST API (gratuit) | 0 € | ~50-200ms | 1200 req/min | Analyses historiques, backtesting |
| HolySheep AI (analyse) | À partir de 0,42 $/MTok | <50ms | Selon votre plan | Analyses IA, insights automatisés |
| Services payants (CoinAPI, etc.) | 50-500€/mois | Variable | Selon plan | Entreprises, analyses professionnelles |
| WebSocket Binance | 0 € | <10ms | 5 flux simultanés | Trading en temps réel |
Économie avec HolySheep AI
En combinant la récupération gratuite via Binance REST API avec l'analyse via HolySheep AI, vous obtenez une solution complète pour une fraction du prix des alternatives. À titre de comparaison :
- GPT-4.1 sur HolySheep : 8 $/million de tokens (économie de 85%+ vs OpenAI)
- Claude Sonnet 4.5 sur HolySheep : 15 $/million de tokens
- Gemini 2.5 Flash sur HolySheep : 2,50 $/million de tokens
- DeepSeek V3.2 sur HolySheep : 0,42 $/million de tokens
Pour une analyse typique de 100 chandeliers envoyée à l'IA (environ 2000 tokens), le coût est inférieur à 0,001 € avec DeepSeek V3.2 !
Pourquoi choisir HolySheep AI
Dans mon expérience de terrain avec des dizaines d'outils d'analyse, HolySheep AI se distingue par plusieurs avantages konkret :
Avantages konkret que j'ai constatés
- Latence exceptionnelle : <50ms en moyenne contre 150-300ms chez la plupart des concurrents. Quand j'analyse des markets en mouvement, cette différence change tout.
- Multi-modèles : Je peux basculer entre GPT-4, Claude et Gemini selon mes besoins sans changer de code. Pratique quand un modèle est temporairement surchargé.
- Paiement local : WeChat Pay et Alipay disponibles, un vrai plus pour les utilisateurs chinois. Le taux de change ¥1 = $1 est également très avantageux.
- Crédits gratuits : J'ai reçu 10 $ de crédits à mon inscription pour tester. Suffisant pour valider mes premiers scripts sans engager d'argent.
- API stable : En 6 mois d'utilisation intensive, zéro downtime. Mon pipeline d'analyse tourne 24/7 sans interruption.
Comparatif détaillé HolySheep vs alternatives
| Critère | HolySheep AI | OpenAI direct | Anthropic direct | Google AI Studio |
|---|---|---|---|---|
| Prix GPT-4.1 | 8 $/MTok | 60 $/MTok | N/A | N/A |
| Prix Claude Sonnet 4.5 | 15 $/MTok | N/A | 18 $/MTok | N/A |
| Latence médiane | <50ms | ~200ms | ~180ms | ~150ms |
| Paiement CN | WeChat/Alipay | ❌ | ❌ | ❌ |
| Crédits gratuits | 10 $ | 5 $ | 0 $ | 300 $ |
| Multi-modèles | ✅ | ❌ | ❌ | ✅ |
Conclusion et prochaines étapes
Vous savez maintenant comment récupérer les données K-line historiques depuis l'API Binance avec Python. Les points clés à retenir :
- L'API Binance est gratuite et illimitée pour les données historiques
- La bibliothèque
requests+pandasest votre组合 gagnante - Respectez toujours le rate limit pour éviter les blocages
- Validez toujours vos données avant de les utiliser
- Combinez avec HolySheep AI pour des analyses automatisées puissantes
Mon conseil pratique : Commencez petit. Récupérez 100 chandeliers, analysez-les manuellement, puis automatisez progressivement. Ne cherchez pas à tout faire d'un coup — c'est comme ça que j'ai appris, et c'est la méthode la plus efficace.
Si vous avez des questions, des erreurs lors de l'exécution du code, ou souhaitez que j'approfondisse un point particulier, n'hésitez pas à laisser un commentaire. Bonne analyse ! 📊