⚠️ 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 FastAPIDémarrage local
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 8140Variables d'environnement (.env) : voir .env.example. ADMIN_TOKEN est requis pour /admin.
Tests
cd backend && .venv/bin/python -m pytest tests/ -qMéthodologie
Documentée en détail dans METHODOLOGY.md et sur /methodologie.
Principes : incertitude d'abord, neutralité politique, traçabilité de chaque valeur,
calibration avant tout.