> ⚠️ **URL live hors fonction pour le moment.** L'application a été retirée du cluster MacLustr le 2026-09-04 (processus arrêtés, copie du nœud supprimée). Ce dépôt spbgit est désormais la seule source de vérité du projet. Ancienne URL : https://www.qc-election.com # QC Élection Forecast Plateforme de **prévision probabiliste** de l'élection générale québécoise du 5 octobre 2026 (127 circonscriptions, majorité à 64). Ce n'est pas un agrégateur de sondages : c'est un moteur statistique complet — modèle d'état latent bayésien, effets maison, simulations Monte Carlo à erreurs corrélées, backtesting et calibration. **v2.0.0 « Au-delà des sondages »** : le forecast combine cinq couches d'inférence à poids explicites et bornés — sondages (Kalman), **votes réels des élections partielles** injectés dans le filtre, **prior de fondamentaux** (satisfaction gouvernementale, vote précédent, usure du pouvoir — régression 1998-2022, poids décroissant vers le scrutin), **ajustement médias** borné (±0,35 pp) et **ensemble 88/12 avec les marchés prédictifs** (Polymarket) sur P(plus de sièges). Une **veille web continue (Firecrawl)** alimente le tout : radar des nouveaux sondages, satisfaction Léger, presse élargie. Décomposition publique de chaque couche sur `/signaux` et `/api/beyond`. **Production : https://www.qc-election.com** (nœud M2U64, PM2 + ngrok) ## Architecture ``` backend/ app/ config.py paramètres (élection, partis, hyperparamètres du modèle) models.py schéma SQLAlchemy (provenance complète de chaque donnée) seed.py chargement CSV → base (idempotent, dédoublonnage) pipeline.py collect → validate → normalize → dedupe → model → simulate → publish ingest/ wikipedia.py sondages 2026 + 2022, résultats 2022 par circonscription, carte 2025 news_rss.py sentiment médiatique (RSS) : entités → stance → anomalies de volume byelections.py partielles 2022-2026 : votes réels → observations nationales (v2) firecrawl_watch.py veille web continue : radar sondages, satisfaction, presse (v2) modeling/ fundamentals.py prior de fondamentaux + blend à poids décroissant (v2) ensemble.py ajustement médias borné + ensemble modèle/marchés (v2) compositions.py transformations log-ratio (alr) + covariance multinomiale weights.py pondération : récence, taille effective, design effect, cote maison house_effects.py biais maison rétrécis + cote de qualité dynamique trend.py filtre de Kalman (marche aléatoire en espace alr), q estimé par MV forecast.py nowcast vs forecast (incertitude d'opinion future) simulate.py Monte Carlo 25 000 élections, erreurs nationale/régionales/locales backtest.py rejoue 2022 à J-120…J-1 : MAE, Brier, log loss, couverture, calibration explain.py « Interroger le modèle » — réponses traçables aux données api/ API publique + administration (Bearer token) data/ CSV de seed + copies brutes HTML (provenance) + rapport de backtest tests/ pytest (14 tests du cœur statistique) frontend/ pages statiques premium (ECharts) servies par FastAPI ``` ## Démarrage local ```bash cd backend python3 -m venv .venv && .venv/bin/pip install -r requirements.txt .venv/bin/python -m app.ingest.wikipedia # collecte + CSV de seed .venv/bin/python -m app.seed # base SQLite .venv/bin/python -m app.pipeline # premier forecast .venv/bin/uvicorn app.main:app --port 8140 ``` Variables d'environnement (`.env`) : voir `.env.example`. `ADMIN_TOKEN` est requis pour `/admin`. ## Tests ```bash cd backend && .venv/bin/python -m pytest tests/ -q ``` ## Méthodologie Documentée en détail dans [METHODOLOGY.md](METHODOLOGY.md) et sur `/methodologie`. Principes : incertitude d'abord, neutralité politique, traçabilité de chaque valeur, calibration avant tout.