Ce projet implémente un système complet de collecte de données et de prédiction pour les cryptomonnaies utilisant plusieurs modèles de machine learning et de séries temporelles.
Le projet est structuré en deux modules principaux :
cryptobot/
│
├── api_collection/ # MODULE 1: Collecte des données Binance
│ ├── recuperation_historique.py # Récupération initiale des données historiques
│ ├── import_db_historique.py # Import des données dans PostgreSQL
│ ├── mise_a_jour_quotidienne.py # Mise à jour quotidienne des données
│ └── *.csv # Fichiers de données générés
│
├── prod/ # MODULE 2: ML & API de Prédiction
│ ├── app/ # Application FastAPI
│ │ ├── main.py # Point d'entrée de l'API
│ │ ├── models/ # Modèles ML déployés
│ │ └── data/ # Données pour l'API
│ │
│ ├── scripts/ # Scripts de traitement ML
│ │ ├── utils.py # Fonctions utilitaires
│ │ ├── 01_data_cleaning.py # Nettoyage des données
│ │ ├── 02_train_models.py # Entraînement des modèles
│ │ └── 03_make_predictions.py # Génération des prédictions
│ │
│ ├── data/ # Données ML
│ │ ├── processed/ # Données nettoyées
│ │ └── predictions/ # Prédictions générées
│ │
│ ├── models/ # Modèles entraînés
│ │ ├── random_forest_model.pkl
│ │ ├── lstm_model.keras
│ │ ├── arima_model.pkl
│ │ └── sarimax_model.pkl
│ │
│ ├── docker-compose.yml # Orchestration conteneurs
│ ├── Dockerfile # Configuration conteneur API
│ └── requirements.txt # Dépendances Python
│
└── README.md # Ce fichier
- Python 3.12+
- PostgreSQL (ou Docker pour utiliser PostgreSQL en conteneur)
- Docker & Docker Compose (recommandé pour le déploiement)
- Connexion Internet (pour les appels API Binance)
pandas==2.0.3
numpy==1.24.3
scikit-learn==1.3.0
tensorflow==2.12.0
statsmodels==0.14.0
fastapi==0.109.1
uvicorn==0.27.0
sqlalchemy==2.0.19
psycopg2-binary==2.9.6
aiohttp==3.8.4
requests==2.31.0
# Cloner le projet (si applicable)
cd /home/nassbuntu/projet/AVR25-CDE-OPA-1/cryptobot
# Créer un environnement virtuel
python3 -m venv venv
source venv/bin/activate # Linux/Mac
# ou : venv\Scripts\activate # Windows
# Installer les dépendances
pip install -r prod/requirements.txt
pip install aiohttp requests # Pour api_collectionOption A : Avec Docker (recommandé)
cd prod/
docker-compose up -d dbOption B : PostgreSQL local
# Créer la base de données
psql -U postgres -c "CREATE DATABASE crypto;"
psql -U postgres -c "CREATE USER nassim WITH PASSWORD 'datascientest';"
psql -U postgres -c "GRANT ALL PRIVILEGES ON DATABASE crypto TO nassim;"cd api_collection/
# 1. Récupérer les données historiques depuis Binance (2020-2025)
python recuperation_historique.py
# ⏱️ Durée: ~10-15 minutes
# 📁 Génère: binance_historical_data_secure.csv
# 2. Importer les données dans PostgreSQL
python import_db_historique.py
# ✅ Crée la table: binance_historical_data_with_metricsConfiguration des symboles et dates : Vous pouvez modifier dans recuperation_historique.py :
symbols = ['BTCUSDT', 'ETHUSDT'] # Ajouter d'autres paires
start_date = '2020-01-01'
end_date = '2025-11-01'cd ../prod/scripts/
# 1. Nettoyer les données
python 01_data_cleaning.py
# 📁 Génère: ../data/processed/cleaned_crypto_data.csv
# 2. Entraîner les modèles
python 02_train_models.py
# ⏱️ Durée: ~5-10 minutes
# 📁 Génère: ../models/*.pkl et ../models/*.keras
# 3. (Optionnel) Générer des prédictions initiales
python 03_make_predictions.py
# 📁 Génère: ../data/predictions/latest_predictions.csvcd ../
docker-compose up --buildL'API sera disponible sur : http://localhost:8000
Le script recuperation_historique.py utilise l'API publique de Binance de manière asynchrone pour :
- Récupérer les bougies (klines) : Prix OHLCV (Open, High, Low, Close, Volume)
- Récupérer les métriques 24h : Volume 24h, nombre de trades
- Récupérer le carnet d'ordres : Bid-Ask Spread
Caractéristiques :
- ✅ Gestion des erreurs 429 (rate limit) et 418 (ban IP)
- ✅ Retry automatique avec backoff exponentiel
- ✅ Délais entre requêtes (2 secondes) pour éviter les bans
- ✅ Asynchrone (aiohttp) pour des performances optimales
Colonnes générées :
timestamp, open, high, low, close, volume, symbol,
bid_ask_spread, volume_24h, num_trades_24h
Le script import_db_historique.py :
- Charge le CSV généré
- Crée/remplace la table
binance_historical_data_with_metrics - Utilise SQLAlchemy pour la connexion
Le script mise_a_jour_quotidienne.py permet de :
- Détecter automatiquement la dernière date dans la base
- Récupérer uniquement les nouvelles données
- Ajouter les nouvelles bougies à la table existante
À exécuter quotidiennement (optionnel, via cron) :
0 1 * * * cd /path/to/api_collection && python mise_a_jour_quotidienne.pyLe système utilise 4 modèles complémentaires :
| Modèle | Type | Usage | Symboles |
|---|---|---|---|
| Random Forest | Classification | Prédiction hausse/baisse | BTCUSDT, ETHUSDT |
| LSTM | Régression (Deep Learning) | Prédiction de prix | BTCUSDT, ETHUSDT |
| ARIMA | Séries temporelles | Prédiction de tendance | BTCUSDT uniquement |
| SARIMAX | Séries temporelles + saisonnalité | Prédiction avancée | BTCUSDT uniquement |
Script 1 : 01_data_cleaning.py
- Charge les données depuis PostgreSQL
- Nettoie les valeurs manquantes
- Génère des features (moyennes mobiles, RSI, etc.)
- Sauvegarde :
data/processed/cleaned_crypto_data.csv
Script 2 : 02_train_models.py
- Entraîne les 4 modèles sur les données nettoyées
- Évalue les performances (accuracy, MAE, RMSE)
- Sauvegarde les modèles dans
models/
Script 3 : 03_make_predictions.py
- Charge les modèles entraînés
- Génère des prédictions pour les symboles
- Sauvegarde :
data/predictions/latest_predictions.csv
L'API expose les prédictions via plusieurs endpoints :
Endpoints disponibles :
# Santé de l'API
GET /health
# Liste des symboles supportés
GET /symbols
# Réponse: ["BTCUSDT", "ETHUSDT"]
# Métriques de performance globales
GET /metrics
# Métriques par symbole
GET /metrics/{symbol}
# Prédictions
POST /predict
Content-Type: application/json
{"symbol": "BTCUSDT"}Exemple de réponse de prédiction :
{
"symbol": "BTCUSDT",
"timestamp": "2026-01-28T12:00:00",
"predictions": {
"random_forest": 1, // 1 = hausse, 0 = baisse
"lstm": 1,
"arima": 45000.5, // Prix prédit
"sarimax": 45100.2
}
}Connexion par défaut :
Host: localhost
Port: 5432
Database: crypto
User: nassim
Password: datascientest
Table principale :
binance_historical_data_with_metricsSchéma :
CREATE TABLE binance_historical_data_with_metrics (
timestamp DATE,
symbol VARCHAR(20),
open FLOAT,
high FLOAT,
low FLOAT,
close FLOAT,
volume FLOAT,
bid_ask_spread FLOAT,
volume_24h FLOAT,
num_trades_24h INTEGER,
-- autres colonnes...
);Le fichier docker-compose.yml orchestre 3 services :
| Service | Port | Description |
|---|---|---|
| db | 5432 | PostgreSQL 13 |
| app | 8000 | API FastAPI |
| pgadmin | 5050 | Interface d'administration PostgreSQL |
Accès PgAdmin :
- URL : http://localhost:5050
- Email :
nassim@crypto.com - Password :
bitcoin
Pour plus de détails, consultez les fichiers suivants dans prod/ :
- API_USAGE.md : Guide complet d'utilisation de l'API
- ARCHITECTURE.md : Architecture technique détaillée
- ARIMA_SARIMAX_GUIDE.md : Guide des modèles de séries temporelles
- DEV_REFERENCE.md : Référence pour développeurs
- QUICK_START.md : Démarrage rapide
- DEBUG_CHECKLIST.md : Guide de débogage
Pour automatiser la collecte de nouvelles données :
# Créer un cron job
crontab -e
# Ajouter (exécution à 1h du matin)
0 1 * * * cd /home/nassbuntu/projet/AVR25-CDE-OPA-1/cryptobot/api_collection && /home/nassbuntu/nass_env/bin/python mise_a_jour_quotidienne.py >> /tmp/cryptobot_update.log 2>&1Il est recommandé de réentraîner les modèles régulièrement (hebdomadairement ou mensuellement) :
cd prod/scripts/
python 01_data_cleaning.py
python 02_train_models.py
# Redémarrer l'API pour charger les nouveaux modèles
cd ..
docker-compose restart app- Rate Limit : 1200 requêtes par minute (Weight)
- Ban IP (418) : Peut survenir en cas d'abus
- Délais recommandés : 2 secondes entre requêtes
- Ne pas récupérer les données historiques trop souvent : Utiliser le script de mise à jour quotidienne
- Limiter le nombre de symboles : Commencer avec BTCUSDT et ETHUSDT
- Surveiller les logs : Vérifier les erreurs 429/418 dans les logs
- Sauvegardes régulières : Exporter la base PostgreSQL régulièrement
# Backup PostgreSQL
docker exec -t cryptobot-db pg_dump -U nassim crypto > backup_$(date +%Y%m%d).sql
# Restore
docker exec -i cryptobot-db psql -U nassim crypto < backup_20260128.sqlSolution :
- Augmenter les délais dans les scripts (actuellement 2 secondes)
- Réduire le nombre de symboles récupérés
- Attendre quelques heures avant de réessayer
Vérification :
docker exec -it cryptobot-db psql -U nassim -d crypto -c "SELECT COUNT(*) FROM binance_historical_data_with_metrics;"Solution :
- Vérifier que le CSV a été généré correctement
- Re-exécuter
import_db_historique.py
Solution :
# Vérifier la présence des modèles
ls -la prod/models/
ls -la prod/app/models/
# Copier les modèles si nécessaire
cp prod/models/* prod/app/models/
# Redémarrer l'API
docker-compose restart appSolution :
# Vérifier que le service est démarré
docker-compose ps
# Vérifier les logs
docker-compose logs db
# Redémarrer le service
docker-compose restart dbProjet développé dans le cadre du projet AVR25-CDE-OPA-1.
# Branche principale
main
# Créer une branche de feature
git checkout -b feature/nouvelle-fonctionnalite
# Tester avant commit
pytest tests/
# Commit
git commit -m "feat: description"
# Push
git push origin feature/nouvelle-fonctionnaliteCe projet est développé dans un cadre éducatif.
Pour toute question ou problème :
- Consulter la documentation dans prod/
- Vérifier le DEBUG_CHECKLIST.md
- Consulter les logs :
docker-compose logs -f
Dernière mise à jour : 28 janvier 2026