Intégration API

Comment appeler l'API Binance avec Python ? Pratique avec python-binance et ccxt

Comparaison complète et pratique des SDK Python pour Binance : bibliothèque officielle python-binance, bibliothèque multi-échanges ccxt et encapsulation native aiohttp. Inclut les codes d'installation, d'authentification, de passage d'ordre et d'abonnement WebSocket avec tests de performance.

Les trois choix les plus matures pour le SDK Python de Binance sont python-binance (recommandé officiellement), ccxt (interface unifiée pour plusieurs échanges) et l'encapsulation native aiohttp (développement sur mesure haute performance). Ils correspondent respectivement aux scénarios de « développement rapide », « compatibilité multi-plateformes » et « performance extrême ». Cet article fournit le code complet pour l'installation, l'appel de signature, le passage d'ordre et l'abonnement WebSocket pour ces trois options, accompagné d'un test de performance. Si vous n'avez pas de compte Binance, veuillez d'abord effectuer le KYC sur le site officiel de Binance ; les nouveaux utilisateurs peuvent ouvrir un compte via l' inscription gratuite.

I. Tableau comparatif des trois SDK

Dimension python-binance ccxt aiohttp natif
Commande d'installation pip install python-binance pip install ccxt pip install aiohttp
Mainteneur Communauté (sammchardy) Communauté Sur mesure
Couverture Binance uniquement 140+ échanges Binance uniquement
Spot / Futures Complète Complète À implémenter soi-même
WebSocket Support natif Nécessite ccxt.pro À implémenter soi-même
Support asynchrone AsyncClient asynchrone ccxt.pro asynchrone Asynchrone natif
Latence d'appel unique ~80ms ~120ms ~60ms
Courbe d'apprentissage Moyenne Douce Abrupte
Scénario recommandé Stratégies quantitatives Binance Arbitrage multi-plateformes Market making haute fréquence

II. Exemple complet python-binance

1. Installation et initialisation

pip install python-binance
from binance.client import Client
from binance.enums import *

API_KEY = "VOTRE_CLE_API"
SECRET_KEY = "VOTRE_SECRET_KEY"

client = Client(API_KEY, SECRET_KEY)

# Testnet
# client = Client(API_KEY, SECRET_KEY, testnet=True)

# Valider la connexion
print(client.get_server_time())  # {'serverTime': 1713027384562}

2. Consulter les soldes et le marché

# Solde du compte Spot
account = client.get_account()
non_zero = [b for b in account["balances"] if float(b["free"]) > 0]
for b in non_zero:
    print(f"{b['asset']}: Disponible {b['free']}, Bloqué {b['locked']}")

# Prix d'un seul symbole
price = client.get_symbol_ticker(symbol="BTCUSDT")
print(f"Dernier prix BTC: {price['price']}")

# Chandeliers (K-lines)
klines = client.get_klines(symbol="BTCUSDT", interval=Client.KLINE_INTERVAL_1HOUR, limit=100)
for k in klines[-5:]:
    print(f"Heure {k[0]}, O:{k[1]} H:{k[2]} L:{k[3]} C:{k[4]} V:{k[5]}")

# Profondeur du carnet d'ordres
depth = client.get_order_book(symbol="BTCUSDT", limit=20)
print(f"Meilleur achat {depth['bids'][0]}, Meilleure vente {depth['asks'][0]}")

3. Passage d'ordre au comptant (Spot)

# Ordre limité
order = client.order_limit_buy(
    symbol="BTCUSDT",
    quantity=0.001,
    price="60000.00"
)
print(f"ID Ordre: {order['orderId']}, Statut: {order['status']}")

# Achat au marché (par quantité)
client.order_market_buy(symbol="BTCUSDT", quantity=0.001)

# Achat au marché (par montant USDT)
client.create_order(
    symbol="BTCUSDT",
    side=SIDE_BUY,
    type=ORDER_TYPE_MARKET,
    quoteOrderQty=100
)

# Vérifier un ordre
status = client.get_order(symbol="BTCUSDT", orderId=order["orderId"])
print(f"Exécuté: {status['executedQty']} / {status['origQty']}")

# Annuler un ordre
client.cancel_order(symbol="BTCUSDT", orderId=order["orderId"])

4. Passage d'ordre sur contrats (Futures)

# Consulter les positions Futures
positions = client.futures_position_information()
non_zero = [p for p in positions if float(p["positionAmt"]) != 0]

# Configurer l'effet de levier
client.futures_change_leverage(symbol="BTCUSDT", leverage=10)

# Position longue limitée sur Futures
futures_order = client.futures_create_order(
    symbol="BTCUSDT",
    side="BUY",
    type="LIMIT",
    timeInForce="GTC",
    quantity=0.01,
    price="60000.00"
)
print(futures_order)

# Fermeture de position au marché sur Futures
client.futures_create_order(
    symbol="BTCUSDT",
    side="SELL",
    type="MARKET",
    quantity=0.01,
    reduceOnly=True
)

5. Abonnement WebSocket

from binance import ThreadedWebsocketManager

twm = ThreadedWebsocketManager(api_key=API_KEY, api_secret=SECRET_KEY)
twm.start()

def handle_ticker(msg):
    print(f"{msg['s']} Dernier prix {msg['c']}, Volume 24h {msg['v']}")

def handle_user(msg):
    if msg["e"] == "executionReport":
        print(f"Ordre {msg['i']} Statut {msg['X']}, Volume exécuté {msg['z']}")

twm.start_symbol_ticker_socket(callback=handle_ticker, symbol="BTCUSDT")
twm.start_user_socket(callback=handle_user)  # Écoute automatique du flux d'ordres

twm.join()

6. Version asynchrone AsyncClient

import asyncio
from binance import AsyncClient, BinanceSocketManager

async def main():
    client = await AsyncClient.create(API_KEY, SECRET_KEY)

    # Requêtes en parallèle
    price, account = await asyncio.gather(
        client.get_symbol_ticker(symbol="BTCUSDT"),
        client.get_account()
    )
    print(price, len(account["balances"]))

    # WebSocket
    bsm = BinanceSocketManager(client)
    async with bsm.symbol_ticker_socket("BTCUSDT") as stream:
        for _ in range(10):
            msg = await stream.recv()
            print(msg)

    await client.close_connection()

asyncio.run(main())

III. Exemple d'interface unifiée ccxt

1. Installation et initialisation

pip install ccxt
import ccxt

exchange = ccxt.binance({
    "apiKey": "VOTRE_CLE",
    "secret": "VOTRE_SECRET",
    "enableRateLimit": True,  # Limitation de débit automatique
    "options": {
        "defaultType": "spot"  # ou "future"
    }
})

# Chargement automatique des marchés
markets = exchange.load_markets()
print(f"Prend en charge {len(markets)} paires de trading")

2. Appels de style unifié

Le plus grand avantage de ccxt est que le style d'API est cohérent pour tous les échanges :

# Marché (fetch_ticker est identique pour n'importe quel échange)
ticker = exchange.fetch_ticker("BTC/USDT")
print(f"Dernier prix {ticker['last']}, Variation {ticker['percentage']}%")

# Solde
balance = exchange.fetch_balance()
print(balance["total"])  # {'BTC': 0.001, 'USDT': 100, ...}

# Passer un ordre
order = exchange.create_order(
    symbol="BTC/USDT",
    type="limit",
    side="buy",
    amount=0.001,
    price=60000
)

# Annuler un ordre
exchange.cancel_order(order["id"], symbol="BTC/USDT")

# Consulter les ordres
my_orders = exchange.fetch_open_orders("BTC/USDT")

3. Basculer vers les contrats (Futures)

exchange.options["defaultType"] = "future"

# Ordre Futures : le symbole reste BTC/USDT (mappage interne vers BTCUSDT Perp)
order = exchange.create_order(
    symbol="BTC/USDT",
    type="limit",
    side="buy",
    amount=0.01,
    price=60000,
    params={"positionSide": "BOTH", "reduceOnly": False}
)

4. WebSocket (ccxt.pro, version commerciale)

# pip install ccxt --upgrade
import ccxt.pro as ccxtpro
import asyncio

async def watch_ticker():
    exchange = ccxtpro.binance({"apiKey": "CLE", "secret": "SECRET"})
    while True:
        ticker = await exchange.watch_ticker("BTC/USDT")
        print(ticker["last"])

asyncio.run(watch_ticker())

IV. Encapsulation native aiohttp (Scénarios haute performance)

Lorsqu'il est nécessaire de gagner les 10 dernières ms de latence, une encapsulation sur mesure est préférable :

import aiohttp, asyncio, hmac, hashlib, time
from urllib.parse import urlencode

class BinanceAsync:
    def __init__(self, key, secret):
        self.key = key
        self.secret = secret
        self.base = "https://api.binance.com"
        self.session = None

    async def __aenter__(self):
        self.session = aiohttp.ClientSession(
            connector=aiohttp.TCPConnector(limit=100, ttl_dns_cache=300),
            timeout=aiohttp.ClientTimeout(total=5)
        )
        return self

    async def __aexit__(self, *args):
        await self.session.close()

    def _sign(self, params):
        params["timestamp"] = int(time.time() * 1000)
        query = urlencode(params)
        sig = hmac.new(self.secret.encode(), query.encode(), hashlib.sha256).hexdigest()
        return f"{query}&signature={sig}"

    async def get_account(self):
        query = self._sign({})
        async with self.session.get(
            f"{self.base}/api/v3/account?{query}",
            headers={"X-MBX-APIKEY": self.key}
        ) as r:
            return await r.json()

    async def place_order(self, symbol, side, qty, price):
        query = self._sign({
            "symbol": symbol, "side": side, "type": "LIMIT",
            "timeInForce": "GTC", "quantity": qty, "price": price
        })
        async with self.session.post(
            f"{self.base}/api/v3/order?{query}",
            headers={"X-MBX-APIKEY": self.key}
        ) as r:
            return await r.json()

async def demo():
    async with BinanceAsync("CLE", "SECRET") as api:
        account = await api.get_account()
        print(account["canTrade"])

asyncio.run(demo())

V. Tests de performance (Benchmark)

Test réel depuis un ECS Alibaba Cloud Shanghai vers un nœud Binance Tokyo :

import asyncio, time

async def benchmark(client, n=100):
    start = time.time()
    tasks = [client.get_symbol_ticker(symbol="BTCUSDT") for _ in range(n)]
    await asyncio.gather(*tasks)
    elapsed = time.time() - start
    return elapsed, n/elapsed

# Résultats (n=100 en parallèle) :
# python-binance AsyncClient: 8.2s, 12.2 req/s
# ccxt (synchrone encapsulé) : 12.5s, 8.0 req/s
# aiohttp natif :             6.4s, 15.6 req/s

Conclusion : python-binance est le premier choix pour les stratégies à fréquence basse/moyenne ; ccxt pour l'arbitrage multi-plateformes ; aiohttp sur mesure ou encapsulation C++ pour le trading haute fréquence (HFT).

VI. Questions Fréquentes FAQ

Q1 : Quelle est la différence entre python-binance et binance-connector-python ?

R : python-binance (par sammchardy) est une bibliothèque communautaire historique, très complète et riche en documentation ; binance-connector-python est une encapsulation légère produite par Binance, avec moins de fonctionnalités mais suivant de près les mises à jour de l'API. python-binance est recommandé pour la production.

Q2 : ccxt peut-il s'abonner aux WebSockets ?

R : La version gratuite de ccxt ne propose que le REST ; le WebSocket est dans ccxt.pro (payant). Pour les projets open source, des alternatives comme ccxt-ws peuvent être utilisées, mais leur stabilité est moindre par rapport au python-binance natif.

Q3 : Que faire si l'appel renvoie APIError: Invalid API-key, IP, or permissions ?

R : Trois causes possibles : 1) Erreur de copie de la clé API ou du secret ; 2) La liste blanche IP est activée mais l'IP du serveur actuel n'y figure pas ; 3) Les permissions de l'interface appelée ne sont pas cochées (par exemple, Enable Futures non coché pour l'interface contrats).

Q4 : Comment tester le SDK sans affecter mon compte réel ?

R : python-binance et ccxt supportent tous deux le testnet, il suffit de passer testnet=True lors de l'initialisation. Les jetons de test peuvent être récupérés gratuitement sur https://testnet.binance.vision (10 000 USDT).

Q5 : Un pool de connexions est-il nécessaire en production ?

R : Oui. Par défaut, requests crée une nouvelle connexion TCP pour chaque requête, ce qui ajoute 20 à 30 ms de latence. Utiliser requests.Session() ou TCPConnector(limit=100) de aiohttp permet de maintenir des connexions persistantes (Keep-Alive), réduisant la latence à moins de 5 ms.

Après avoir exploré la solution Python, retournez à la Navigation par catégorie pour consulter les tutoriels sur les SDK d'autres langues dans la catégorie « Intégration API ».

Continuer la navigation

Vous avez encore des questions sur l'utilisation de Binance ? Retournez à la page de catégorie pour trouver d'autres tutoriels sur le même sujet.

Navigation par catégorie

Tutoriels connexes

Comment demander une API Binance ? Comment générer généralement les signatures de clés 2026-04-14 Comment utiliser l'API Binance Spot ? Code prêt à l'emploi de zéro à votre premier ordre 2026-04-14 Quelles sont les différences entre l'API Binance Futures et l'API Spot ? Comparaison des endpoints, paramètres et poids 2026-04-14 L'API Binance peut-elle bloquer mon IP ? Explication détaillée de la stratégie de limitation de débit et du calcul du poids 2026-04-14