# Méthodologie — QC Élection Forecast Version du modèle : **2.0.0 « Au-delà des sondages »** · Élection cible : générale québécoise du 5 octobre 2026 (127 circonscriptions, majorité à 64). Ce document est la référence auditable du système. La version grand public est servie sur `/methodologie`; les snapshots de chaque exécution sont conservés en base (`forecast_runs`) et consultables par l'API. ## 1. Sources de données et provenance | Source | Contenu | Rôle | |---|---|---| | DGEQ (données ouvertes officielles) | GeoJSON carte 2026 (127 circ.), liste officielle, candidatures (drapeau « député sortant »), résultats en direct le soir du vote | référence géographique, candidats, incumbency | | Wikipédia (agrégation, liens vers chaque maison) | sondages 2022→2026 (85+), sondages campagne 2022 (106), résultats 2022 par circonscription, variations 2018→2022 | série de sondages, baselines locales, backtest | | **Élections partielles (DGEQ)** | 4 partielles 2023-2025 : votes réels comptés | **couche 2 — observations nationales du filtre (v2)** | | **Baromètres de satisfaction (Léger, via veille web)** | % satisfaits envers le gouvernement | **couche 3 — entrée du prior de fondamentaux (v2)** | | Presse québécoise (RSS + veille Firecrawl) | Radio-Canada, Le Devoir, La Presse + presse élargie | **couche 4 — ajustement borné ±0,35 pp (v2)** | | Polymarket (API Gamma publique) | probabilités implicites « plus de sièges » | **couche 5 — ensemble 88/12 sur P(plus de sièges) (v2)** | | Veille web continue (Firecrawl v2 : search + scrape) | radar de nouveaux sondages, satisfaction, articles hors RSS | détection + provenance (pages brutes archivées) | Chaque enregistrement conserve : source, URL, date d'accès, valeur brute, valeur normalisée. Les HTML bruts sont archivés dans `backend/data/raw/`. Dédoublonnage des sondages : clé (maison, fin de terrain, taille d'échantillon[, parti]); un même sondage publié à plusieurs endroits n'est compté qu'une fois. ## 2. Pondération des sondages - **Récence** : poids `0,5^(âge/12 j)`, l'âge étant mesuré à la **fin du terrain**, pas à la publication. - **Précision** : taille effective `n_eff = min(n/deff, 2500)` avec design effects par mode (web 1,30; téléphone 1,20; IVR 1,40; SMS 1,45; mixte 1,25; inconnu 1,35). Le plafond de 2 500 empêche un mégasondage de dominer. - **Qualité de la maison** : multiplicateur 0,6–1,4 selon l'EAM historique de ses sondages finaux; maison sans historique : ×0,9 + erreur excédentaire accrue (+25 %). - **Erreur totale d'enquête** : ±1,5 pp ajoutés en variance à chaque sondage (cadre, non-réponse, pondérations internes du sondeur). ## 3. House effects Sur chaque élection passée à résultat connu, biais moyen par parti des sondages des 21 derniers jours de chaque maison, **rétréci de 50 % vers zéro** et borné à ±3 pp, soustrait avant l'ajustement du modèle. Recalculé à chaque cycle (`pollster_ratings`). ## 4. Modèle latent (Bayesian state space) - Composition : 6 composantes (CAQ, PCQ, PLQ, PQ, QS, Autres), transformées en log-ratios additifs `y_k = log(p_k/p_CAQ)` (5 dimensions) — la somme fait toujours 100 % et la corrélation négative entre partis est structurelle. - Dynamique : marche aléatoire gaussienne `x_t = x_{t-1} + w_t`, `w_t ~ N(0, q·I)`. - Observation : `y_sondage ~ N(x_t, R)`, `R` = covariance multinomiale (méthode delta) sur `n_eff` × cote maison + erreur excédentaire diagonale. - Inférence : filtre de Kalman exact + lisseur RTS; `q` estimé par maximum de vraisemblance (grille log-uniforme, borné à [0,004², 0,030²]). ## 5. Nowcast vs Forecast - **Nowcast** : distribution de `softmax(x_aujourd'hui)` — « si l'élection avait lieu aujourd'hui ». - **Forecast** : même moyenne (martingale), variance augmentée de `q × jours_restants × 1,6` (volatilité de campagne) **plus l'erreur systémique de sondage** `σ_industrie = 0,12` (voir §7). ## 5 bis. Au-delà des sondages (v2) — les couches complémentaires Le forecast v2 combine **cinq couches d'inférence**, chacune à poids explicite, borné, débrayable par configuration et décomposé publiquement (`/api/beyond`, page `/signaux`) : 1. **Sondages** (couche de base) : le modèle d'état des §4-5, inchangé. 2. **Votes réels — partielles** : chaque élection partielle depuis 2022 (Saint-Henri–Sainte-Anne 2023, Jean-Talon 2023, Terrebonne 2025, Arthabaska 2025) devient une observation nationale du filtre de Kalman à sa date : `alr_implicite = alr(national 2022) + 0,6 × [alr(partielle) − alr(local 2022)]`. Le rétrécissement ×0,6 reflète l'exagération connue du swing des partielles; la variance est celle d'un sondage de n≈350 plus ±3 pp d'erreur excédentaire (participation faible, dynamique locale). Ce sont les seuls bulletins comptés avant le scrutin — et le modèle les voit. 3. **Prior de fondamentaux** : régression ridge « vote du sortant ~ vote précédent + satisfaction envers le gouvernement », pénalité d'usure de 1,5 pp/mandat au-delà du premier, ajustée sur les 8 générales de 1998 à 2022 (RMSE leave-one-out publié). Les partis d'opposition reçoivent un prior de persistance (0,65 × vote précédent + 0,35 × moyenne 2008-2022, renormalisé). Le prior (diffus, sd alr ≥ 0,40) est combiné au posterior des sondages par pondération de précision avec `w(t) = min(0,8; (jours restants/540)^1,3)` → il compte à 18 mois, presque plus la veille du vote. La satisfaction est mise à jour en continu par la veille web (repli configuré sinon), avec provenance. 4. **Ajustement médias** : sentiment de presse des 14 derniers jours (RSS + veille) → `delta = ±0,35 pp × tanh(2·sentiment) × min(1, volume/60)`, nul sous 12 mentions. Un nudge, jamais un moteur. 5. **Ensemble marchés** : la probabilité « plus de sièges » publiée est `0,88 × modèle + 0,12 × Polymarket` (renormalisée). Les intentions de vote ne sont jamais modifiées par le marché. **Veille web continue (Firecrawl)** à chaque cycle de 6 h : (a) radar de nouveaux sondages dans la presse — alerte avec provenance, aucune ingestion automatique de chiffres; (b) extraction du % de satisfaits (baromètres Léger); (c) presse élargie au-delà des RSS. Toutes les pages brutes sont archivées (`data/raw/firecrawl/`). **Signaux web avancés (v2.1)** : - **Attention Wikipédia** (API Wikimedia, pageviews des pages des partis et chef·fe·s, fr.wikipédia) — ajoute du pouvoir prédictif au-delà des sondages+fondamentaux (Smith & Gustafson, *POQ* 2017; Salem & Stephany 2020). Signal **jamais directionnel** : un pic global d'attention (z ≥ 2 sur 3 j vs base 180 j) gonfle la variance de dérive du forecast (multiplicateur borné ≤ 1,45), sans toucher aucune moyenne. Parts d'attention 7 j/28 j publiées (`/api/attention`). - **Sondage synthétique LLM** (« silicon sampling », arXiv:2411.01582) — 96 strates démographiques (région×âge×genre×langue, poids de population), LLM incarnant chaque strate, ancré dans les manchettes réelles de la veille (jamais de chiffres de sondage dans le prompt), poststratification. **EXPÉRIMENTAL, poids strictement nul** (critique McKown-Dawson 2025 : un LLM ne collecte aucune donnée nouvelle); écart au forecast publié comme objet d'étude, évaluation après le 5 octobre. Provenance complète archivée (`data/synthetic_polls/`). **Page quotidienne** : `/aujourdhui` (« Le point du jour ») — snapshot daté : probabilités publiées, Δ vs dernier run de la veille, journal 24 h (sondages intégrés, détections du radar), attention web, sondage synthétique, état des couches (`/api/today`). **Décomposition** : à chaque run, le forecast est reconstruit couche par couche (sondages seuls → + partielles → + fondamentaux → + médias) avec 8 000 simulations par variante; les Δ de vote et de probabilité de chaque couche sont publiés. ## 6. Modèle de circonscription `part(circ, parti) = softmax( alr(référence 2022 locale) + swing_national_alr + ε_région + ε_circonscription − pénalité_retraite )` - **Swing proportionnel** en espace log-ratio (jamais de swing uniforme). - Référence locale : résultat 2022 transposé sur la carte 2026 (renommages appliqués; Bellefeuille et Marie-Lacoste-Gérin-Lajoie = moyenne des circonscriptions parentes). - Pénalité de 0,06 (log-ratio, ≈1,3 pp) au parti sortant si le député ne se représente pas (48 retraits; drapeau raffiné par le registre officiel des candidatures DGEQ). - Partial pooling : les régions sans sondage propre héritent du national + couche régionale. ## 7. Monte Carlo et corrélation des erreurs (25 000 simulations) | Couche | Distribution | Justification | |---|---|---| | Opinion | posterior Kalman + dérive | incertitude d'estimation et d'évolution | | **Systémique de sondage** | `N(0, 0,12²)` nationale corrélée | 2022 : toute l'industrie a sous-estimé la CAQ (~3 pp); 2018 idem | | Régionale | `N(0, 0,14²)` × 13 régions | corrélation intrarégionale | | Locale | `N(0, 0,20²)` × 127 circ. | candidats, enjeux locaux | σ régional/local **calibrés sur les résidus du backtest 2022** (swing proportionnel 2018→2022), atténués car 2022 (émergence PCQ) fut un réalignement atypique. Sorties : distribution complète des sièges par parti (P5–P95, histogramme), P(plus de sièges), P(majorité ≥64), P(gouvernement minoritaire), catégorie par circonscription (Solide ≥95 %, Probable ≥80 %, Favorisé ≥60 %, sinon Chaudement disputé). ## 8. Backtesting (élection 2022, information à date seulement) | Horizon | EAM vote (pp) | Couverture IC 95 % | EAM sièges | Brier | Vainqueurs corrects | |---|---|---|---|---|---| | J−120 | 2,65 | 100 % | 3,1 | 0,147 | 92 % | | J−60 | 2,23 | 100 % | 2,2 | 0,133 | 91 % | | J−30 | 4,15 | 80 % | 4,0 | 0,179 | 88 % | | J−7 | 2,76 | 60 % | 4,2 | 0,178 | 86 % | | J−1 | 2,19 | **100 %** | 4,3 | 0,179 | 86 % | Calibration des probabilités locales (tous horizons confondus) : suit la diagonale (ex. bac 70–80 % → observé 84 %; bac 90–100 % → observé 98 %). L'ajout de la couche systémique a fait passer la couverture J−1 de 20 % à 100 % sans dégrader le Brier. Aucune correction maison n'est appliquée en backtest (pas de données antérieures à 2018). **Backtest v2** : le blend de fondamentaux est rejoué avec l'information de 2022 (sortant CAQ, 1er mandat, satisfaction ~54 %, vote 2018); le rapport publie côte à côte `mae_pp` (v2) et `mae_pp_sondages_seuls`. Les partielles et l'ajustement médias ne sont pas rejouables pour 2022 (données indisponibles) — ils sont exclus du backtest et bornés par construction. ## 9. Signaux et leur poids (v2) - **Sentiment médiatique** : RSS + veille Firecrawl → extraction d'entités → stance (pro/anti/neutre/ambigu) avec négation et attaques dirigées; scoreur LLM optionnel (MacLustr) sinon lexique; regroupement par grappes; anomalies de volume (z ≥ 2,5) → événements. Poids : ajustement borné ±0,35 pp (§5 bis-4). - **Marchés prédictifs** : probabilités implicites Polymarket affichées face au modèle ET intégrées à 12 % dans la P(plus de sièges) publiée (§5 bis-5). - **Momentum** : Δ vote modèle 14 j + sentiment 7 j, borné [−100, 100] — purement auxiliaire. - **Radar de sondages (Firecrawl)** : détections listées sur `/signaux` avec provenance; l'ajout d'un sondage au modèle reste une opération de collecte/validation normale. ## 10. Limites connues 1. Pas de sondages régionaux publics structurés — la variation régionale vient de la structure 2022 + couche d'erreur régionale. 2. Transposition 2022→2026 approximative pour les circonscriptions dont les limites ont bougé. 3. Historique des maisons limité à 2022 (les cotes s'affineront après 2026). 4. Participation : outil de scénario (multiplicateurs par électorat), pas un modèle individuel de probabilité de vote. 5. `AUT` agrège les tiers partis (PVQ, etc.) — aucun siège projeté pour eux. ## 11. Reproductibilité - Chaque run : `forecast_runs` (posterior complet, sièges, diagnostics, version du modèle). - Graines aléatoires fixes; simulations vectorisées NumPy; tests unitaires du cœur statistique (`backend/tests/`).