Créer un Agent IA de Trading avec LangChain, Python et GPT-4
Construisez un agent IA qui analyse les marchés, lit les actualités financières, génère des signaux et envoie des alertes Telegram — étape par étape avec du code Python réel.
Pourquoi les agents IA changent le trading
Un trader humain peut analyser 5-10 actifs par jour. Un agent IA peut en analyser 500 en quelques secondes, 24h/24, sans fatigue, sans biais émotionnel.
Ce guide construit un agent IA complet qui :
- Lit les actualités financières en temps réel
- Analyse les données de prix via l'API Binance
- Génère des signaux de trading avec GPT-4
- Envoie des alertes Telegram avec reasoning détaillé
- Tient un journal automatique de ses décisions
Prérequis
****bash pip install langchain langchain-openai python-telegram-bot ccxt pandas requests ****
Variables d'environnement nécessaires :
****bash OPENAI_API_KEY=sk-... TELEGRAM_TOKEN=... TELEGRAM_CHAT_ID=... ****
Architecture de l'agent
**** Agent Principal (LangChain ReAct) ├── Tool: get_price_data() → Binance API ├── Tool: get_financial_news() → NewsAPI ├── Tool: calculate_indicators()→ Pandas/TA-Lib ├── Tool: send_telegram_alert() → Telegram Bot └── Tool: log_decision() → SQLite/Supabase ****
Étape 1 : Définir les outils (tools)
****`python
tools.py
import ccxt
import pandas as pd
from langchain.tools import tool
from datetime import datetime
import requests
import json
─── Outil 1: Données de prix ─────────────────────────────────────────────────
@tool
def get_price_data(symbol: str, timeframe: str = "1h", limit: int = 100) -> str:
"""
Récupère les données OHLCV d'un actif depuis Binance.
symbol: ex 'BTC/USDT', 'ETH/USDT', 'SOL/USDT'
timeframe: '1m', '5m', '15m', '1h', '4h', '1d'
"""
try:
exchange = ccxt.binance()
ohlcv = exchange.fetch_ohlcv(symbol, timeframe, limit=limit)
df = pd.DataFrame(ohlcv, columns=['timestamp', 'open', 'high', 'low', 'close', 'volume'])
df['timestamp'] = pd.to_datetime(df['timestamp'], unit='ms')
# Calculer indicateurs de base
df['ema_20'] = df['close'].ewm(span=20).mean()
df['ema_50'] = df['close'].ewm(span=50).mean()
# RSI
delta = df['close'].diff()
gain = delta.clip(lower=0).rolling(14).mean()
loss = (-delta.clip(upper=0)).rolling(14).mean()
df['rsi'] = 100 - (100 / (1 + gain/loss))
last = df.iloc[-1]
prev = df.iloc[-2]
return json.dumps({
"symbol": symbol,
"current_price": round(last['close'], 4),
"24h_change_pct": round((last['close'] - df.iloc[-24]['close']) / df.iloc[-24]['close'] * 100, 2),
"ema_20": round(last['ema_20'], 4),
"ema_50": round(last['ema_50'], 4),
"rsi": round(last['rsi'], 1),
"trend": "BULLISH" if last['ema_20'] > last['ema_50'] else "BEARISH",
"ema_cross": "GOLDEN CROSS" if (prev['ema_20'] < prev['ema_50'] and last['ema_20'] > last['ema_50']) else
"DEATH CROSS" if (prev['ema_20'] > prev['ema_50'] and last['ema_20'] < last['ema_50']) else "NONE",
"volume_vs_avg": round(last['volume'] / df['volume'].rolling(20).mean().iloc[-1], 2),
})
except Exception as e:
return f"Erreur: {str(e)}"
─── Outil 2: Actualités financières ─────────────────────────────────────────
@tool
def get_financial_news(query: str, max_results: int = 5) -> str:
"""
Récupère les dernières actualités financières pour un actif ou sujet donné.
query: ex 'Bitcoin', 'Federal Reserve', 'Gold XAUUSD'
"""
api_key = os.getenv("NEWS_API_KEY", "")
if not api_key:
return "NewsAPI non configuré — analyse basée uniquement sur les prix."
url = f"https://newsapi.org/v2/everything?q={query}&sortBy=publishedAt&pageSize={max_results}&apiKey={api_key}"
try:
res = requests.get(url, timeout=5)
articles = res.json().get('articles', [])
news_list = []
for a in articles:
news_list.append({
"titre": a.get('title', ''),
"source": a.get('source', {}).get('name', ''),
"date": a.get('publishedAt', '')[:10],
"resume": a.get('description', '')[:200] if a.get('description') else '',
})
return json.dumps(news_list, ensure_ascii=False)
except:
return "Impossible de récupérer les actualités."
─── Outil 3: Envoi Telegram ──────────────────────────────────────────────────
@tool
def send_telegram_alert(message: str) -> str:
"""
Envoie une alerte de trading sur Telegram.
message: le message formaté à envoyer
"""
import asyncio
from telegram import Bot
token = os.getenv("TELEGRAM_TOKEN")
chat_id = os.getenv("TELEGRAM_CHAT_ID")
if not token or not chat_id:
return "Telegram non configuré."
async def send():
bot = Bot(token=token)
await bot.send_message(chat_id=chat_id, text=message, parse_mode='HTML')
asyncio.run(send())
return "Alerte envoyée avec succès."
****`
Étape 2 : Créer l'agent LangChain
****`python
agent.py
from langchain_openai import ChatOpenAI
from langchain.agents import create_react_agent, AgentExecutor
from langchain import hub
from tools import get_price_data, get_financial_news, send_telegram_alert
import os
def create_trading_agent():
# Modèle GPT-4
llm = ChatOpenAI(
model="gpt-4o",
temperature=0.1, # Basse température pour des analyses cohérentes
api_key=os.getenv("OPENAI_API_KEY")
)
tools = [get_price_data, get_financial_news, send_telegram_alert]
# Prompt système personnalisé
system_prompt = """Tu es un analyste de trading algorithmique expert.
Ton rôle :
- Analyser les données de prix et indicateurs techniques
- Prendre en compte les actualités récentes
- Donner une opinion sur la direction probable du marché
- Suggérer une action (BUY, SELL ou HOLD) avec reasoning détaillé
- Spécifier des niveaux de SL et TP si applicable
Règles importantes :
- Toujours analyser minimum 2 timeframes
- Mentionner explicitement les risques
- Ne jamais recommander de prendre plus de 1% de risque par trade
- Format de sortie : emoji + action + prix + SL + TP + reasoning
Tu as accès aux outils : get_price_data, get_financial_news, send_telegram_alert
"""
prompt = hub.pull("hwchase17/react")
prompt = prompt.partial(system_message=system_prompt)
agent = create_react_agent(llm, tools, prompt)
executor = AgentExecutor(
agent=agent,
tools=tools,
verbose=True,
max_iterations=10,
handle_parsing_errors=True
)
return executor
─── Analyse principale ────────────────────────────────────────────────────────
def analyze_market(symbols: list[str]):
agent = create_trading_agent()
for symbol in symbols:
print(f"\n📊 Analyse de {symbol}...")
result = agent.invoke({
"input": f"""
Analyse le marché pour {symbol} :
- Récupère les données de prix en timeframe 4H (limit=50)
- Récupère également les données en 1H (limit=24)
- Vérifie les actualités récentes sur {symbol.replace('/USDT', '')}
- Sur la base de cette analyse, génère une recommendation de trading
- Si l'opportunité est intéressante (signal fort), envoie une alerte Telegram avec ce format :
📊 Analyse {symbol}
⏰ {datetime.now().strftime("%d/%m/%Y %H:%M")}
📈 Tendance 4H : [BULLISH/BEARISH]
📉 RSI : [valeur]
🔄 Signal : [GOLDEN CROSS / DEATH CROSS / AUCUN]
🎯 RECOMMENDATION : [BUY/SELL/HOLD]
💰 Prix entrée : [prix]
🛑 Stop Loss : [prix] ([X]%)
✅ Take Profit : [prix] ([X]%)
📊 Risk/Reward : [ratio]
🧠 Reasoning :
[2-3 phrases expliquant pourquoi]
⚠️ Capital max recommandé : 0.5% du compte
"""
})
print(f"✅ Analyse terminée: {result['output'][:200]}...")
if name == "main":
symbols = ["BTC/USDT", "ETH/USDT", "SOL/USDT"]
analyze_market(symbols)
****`
Étape 3 : Automatiser avec un scheduler
****`python
scheduler.py
import schedule
import time
from agent import analyze_market
Analyse toutes les 4 heures
schedule.every(4).hours.do(lambda: analyze_market(["BTC/USDT", "ETH/USDT", "SOL/USDT"]))
Analyse quotidienne approfondie à 8h00
schedule.every().day.at("08:00").do(
lambda: analyze_market(["BTC/USDT", "ETH/USDT", "SOL/USDT", "XRP/USDT", "LINK/USDT"])
)
print("🤖 Agent de trading actif...")
while True:
schedule.run_pending()
time.sleep(60)
****`
Déployer sur VPS (Linux)
****`bash
1. Installer Python et les dépendances
sudo apt update && sudo apt install python3 python3-pip -y
pip3 install langchain langchain-openai ccxt pandas requests schedule python-telegram-bot
2. Créer le fichier .env
cat > .env << EOF
OPENAI_API_KEY=sk-...
TELEGRAM_TOKEN=...
TELEGRAM_CHAT_ID=...
EOF
3. Lancer en background avec screen
screen -S trading-agent
python3 scheduler.py
Ctrl+A+D pour detacher
4. Vérifier les logs
screen -r trading-agent
****`
Exemple de message Telegram généré
****`
📊 Analyse BTC/USDT
⏰ 15/11/2025 08:00
📈 Tendance 4H : BULLISH
📉 RSI : 58.3 (neutre, pas en surachat)
🔄 Signal : GOLDEN CROSS (détecté il y a 2 bougies)
🎯 RECOMMENDATION : BUY
💰 Prix entrée : $94,250
🛑 Stop Loss : $92,500 (-1.86%)
✅ Take Profit : $97,750 (+3.71%)
📊 Risk/Reward : 1:2.0
🧠 Reasoning :
Golden Cross confirmé sur 4H avec volume +1.8x la moyenne.
Les news récentes mentionnent un afflux institutionnel.
RSI en zone neutre — espace pour monter sans surextension.
⚠️ Capital max recommandé : 0.5% du compte
****`
Amélioration : ajouter la mémoire
****`python
from langchain.memory import ConversationBufferWindowMemory
memory = ConversationBufferWindowMemory(
memory_key="chat_history",
k=10, # Garde les 10 dernières interactions
return_messages=True
)
executor = AgentExecutor(
agent=agent,
tools=tools,
memory=memory, # L'agent se souvient des analyses précédentes
verbose=True
)
****`
Avec la mémoire, l'agent peut dire "BTC était bullish il y a 4 heures, maintenant les indicateurs divergent — signal d'inversion possible."
Tu veux ce système déployé pour toi ?
Je construis des agents IA de trading personnalisés : actifs analysés, intervalles, critères d'alerte, niveau de risque — tout selon ton workflow.