Dr. Manhattan - Trading sur Marchés de Prédiction
Dr. Manhattan est une API unifiée pour les marchés de prédiction, similaire à CCXT pour les échanges de cryptomonnaies. Elle prend en charge Polymarket, Kalshi, Opinion, Limitless et Predict.fun via une interface unique.
Installation
Installez les dépendances avec uv :
uv venv && uv pip install -e .
Pour le serveur MCP (intégration Claude) :
uv sync --extra mcp
Plateformes prises en charge
| Plateforme | Chaîne/Type | Authentification |
|---|---|---|
| Polymarket | Polygon | Clé privée + adresse du financeur |
| Kalshi | CEX régulé | Clé API + clé privée RSA |
| Opinion | BNB Chain | Clé API + clé privée + adresse multi-sig |
| Limitless | Base | Clé privée |
| Predict.fun | BNB Chain | Clé API + clé privée (EOA ou wallet intelligent) |
Utilisation comme bibliothèque Python
Lecture seule (sans identifiants)
import dr_manhattan
polymarket = dr_manhattan.Polymarket({'timeout': 30})
markets = polymarket.fetch_markets()
for market in markets:
print(f"{market.question}: {market.prices}")
Avec authentification
import dr_manhattan
polymarket = dr_manhattan.Polymarket({
'private_key': '0x...',
'funder': '0x...',
})
order = polymarket.create_order(
market_id="market_123",
outcome="Yes",
side=dr_manhattan.OrderSide.BUY,
price=0.65,
size=100,
params={'token_id': 'token_id'}
)
Fabrique d'échanges
from dr_manhattan import create_exchange, list_exchanges
print(list_exchanges()) # ['polymarket', 'opinion', 'limitless', 'predictfun', 'kalshi']
exchange = create_exchange('polymarket', {'timeout': 30})
Utilisation via le serveur MCP
Dr. Manhattan expose toutes ses capacités de trading sous forme d'outils MCP. Configurez dans Claude Code (~/.claude/settings.json ou .mcp.json) :
{
"mcpServers": {
"dr-manhattan": {
"command": "/chemin/vers/dr-manhattan/.venv/bin/python",
"args": ["-m", "dr_manhattan.mcp.server"],
"cwd": "/chemin/vers/dr-manhattan"
}
}
}
Référence des outils MCP
Outils d'échange :
list_exchanges- Liste tous les marchés de prédiction disponibles.get_exchange_info(exchange)- Obtient les métadonnées et les capacités d'un échange.validate_credentials(exchange)- Vérifie si les identifiants sont valides sans trader.
Découverte de marchés :
search_markets(exchange, query)- Recherche des marchés par mot-clé. C'est le moyen le plus rapide de trouver des marchés sur un sujet.fetch_markets(exchange, limit?, offset?)- Récupère tous les marchés avec pagination.fetch_market(exchange, market_id)- Récupère un marché spécifique par son ID.fetch_markets_by_slug(exchange, slug)- Récupère les marchés par slug ou URL (Polymarket, Limitless).find_tradeable_market(exchange, binary?, limit?, min_liquidity?)- Trouve un marché adapté au trading.find_crypto_hourly_market(exchange, token_symbol?)- Trouve les marchés de prix horaires crypto (Polymarket).fetch_token_ids(exchange, market_id)- Obtient les IDs de token pour un marché.parse_market_identifier(identifier)- Extrait le slug d'une URL Polymarket.get_tag_by_slug(slug)- Obtient les informations de tag Polymarket.
Carnet d'ordres :
get_orderbook(exchange, token_id)- Obtient le carnet d'ordres complet (offres et demandes).get_best_bid_ask(exchange, token_id)- Obtient les meilleures offres et demandes.
Trading :
create_order(exchange, market_id, outcome, side, price, size)- Passe un ordre d'achat ou de vente. Le prix est entre 0 et 1 (probabilité). Side est "buy" ou "sell".cancel_order(exchange, order_id, market_id?)- Annule un ordre spécifique.cancel_all_orders(exchange, market_id?)- Annule tous les ordres ouverts.fetch_order(exchange, order_id, market_id?)- Obtient les détails d'un ordre et son état de remplissage.fetch_open_orders(exchange, market_id?)- Liste tous les ordres ouverts.
Compte :
fetch_balance(exchange)- Obtient le solde du compte (USDC).fetch_positions(exchange, market_id?)- Obtient les positions actuelles avec PnL.fetch_positions_for_market(exchange, market_id)- Obtient les positions pour un marché spécifique.calculate_nav(exchange, market_id?)- Calcule la valeur nette d'actif (liquide + positions).
Gestion de stratégies :
create_strategy_session(strategy_type, exchange, market_id, ...)- Démarre une stratégie de market-making en arrière-plan.get_strategy_status(session_id)- Obtient le statut en temps réel de la stratégie (NAV, positions, delta).get_strategy_metrics(session_id)- Obtient les métriques de performance (uptime, exécutions).pause_strategy(session_id)- Met en pause une stratégie en cours.resume_strategy(session_id)- Reprend une stratégie mise en pause.stop_strategy(session_id, cleanup?)- Arrête une stratégie et annule éventuellement les ordres.list_strategy_sessions- Liste toutes les sessions de stratégie actives.
Flux de travail courants
Trouver et Analyser un Marché
- Utilisez
search_marketsavec un mot-clé pour trouver des marchés pertinents. - Choisissez un marché parmi les résultats et notez son
idetmetadata.clobTokenIds. - Utilisez
get_orderbookavec un ID de token pour voir les offres et demandes actuelles. - Utilisez
get_best_bid_askpour une vérification rapide de l'écart.
Passer un Ordre
- Trouvez le marché avec
search_marketsoufetch_markets_by_slug. - Vérifiez
fetch_balancepour confirmer les fonds disponibles. - Consultez le carnet d'ordres avec
get_orderbookpour voir les prix actuels. - Utilisez
create_orderavec l'ID du marché, le résultat ("Yes" ou "No"), le côté ("buy" ou "sell"), le prix (0-1) et la taille. - Surveillez avec
fetch_orderoufetch_open_orders.
Exécuter une Stratégie de Market-Making
- Trouvez un marché avec
search_marketsoufind_tradeable_market. - Démarrez avec
create_strategy_session(strategy_type="market_making", exchange, market_id). - Surveillez avec
get_strategy_statusetget_strategy_metrics. - Contrôlez avec
pause_strategy,resume_strategyoustop_strategy.
Consulter son Portefeuille
fetch_balancepour voir le liquide.fetch_positionspour voir toutes les positions ouvertes avec le PnL non réalisé.calculate_navpour la valeur totale du portefeuille (liquide + positions).
Concepts clés
- Les prix sont des probabilités allant de 0 à 1 (exclusif). Un prix de 0,65 signifie que le marché implique une probabilité de 65%.
- Les résultats sont généralement "Yes" et "No" pour les marchés binaires. Leurs prix totalisent environ 1.
- Les IDs de token sont des identifiants spécifiques à chaque plateforme pour chaque résultat d'un marché. Nécessaires pour les requêtes de carnet d'ordres.
- Les slugs sont des identifiants URL lisibles (par exemple, "trump-2024") utilisés par Polymarket et Limitless.
- Types d'ordres pris en charge : GTC (valable jusqu'à annulation), FOK (tout ou rien), IOC (immédiat ou annulation).
Exemples d'exécution
uv run python examples/list_all_markets.py polymarket
uv run python examples/spread_strategy.py --exchange polymarket --slug fed-decision
uv run python examples/spike_strategy.py -e opinion -m 813 --spike-threshold 0.02
Modèles de données
Marché champs : id, question, outcomes, prices, volume, liquidity, close_time, tick_size, description, metadata (contient slug, clobTokenIds).
Ordre champs : id, market_id, outcome, side (BUY/SELL), price, size, filled, status (PENDING/OPEN/FILLED/CANCELLED), time_in_force.
Position champs : market_id, outcome, size, average_price, current_price. Propriétés : cost_basis, current_value, unrealized_pnl.
Carnet d'ordres champs : bids (prix, taille décroissante), asks (prix, taille croissante). Propriétés : best_bid, best_ask, mid_price, spread.