Commit Graph

456 Commits

Author SHA1 Message Date
github-actions[bot] ccfccf2536 chore: update rate-probabilities data [skip ci] 2026-07-11 20:56:22 +00:00
github-actions[bot] 3304aa075a chore: update rate-probabilities data [skip ci] 2026-07-11 20:00:45 +00:00
github-actions[bot] ecec6c713b chore: update rate-probabilities data [skip ci] 2026-07-11 18:47:40 +00:00
github-actions[bot] ab16b988c7 chore: update rate-probabilities data [skip ci] 2026-07-11 17:47:32 +00:00
github-actions[bot] 0ae5c89cc3 chore: update rate-probabilities data [skip ci] 2026-07-11 16:44:45 +00:00
github-actions[bot] 94bbfafd05 chore: update rate-probabilities data [skip ci] 2026-07-11 15:46:04 +00:00
github-actions[bot] 2c75c1435d chore: update rate-probabilities data [skip ci] 2026-07-11 14:22:03 +00:00
github-actions[bot] dbdcf90b1d chore: update rate-probabilities data [skip ci] 2026-07-11 12:58:37 +00:00
github-actions[bot] 64e2bd7bc2 chore: update rate-probabilities data [skip ci] 2026-07-11 11:46:22 +00:00
github-actions[bot] c72c4b943c chore: update rate-probabilities data [skip ci] 2026-07-11 10:56:14 +00:00
github-actions[bot] bbadfcd8b0 chore: update rate-probabilities data [skip ci] 2026-07-11 09:19:05 +00:00
github-actions[bot] 327e912fed chore: update rate-probabilities data [skip ci] 2026-07-11 07:08:48 +00:00
github-actions[bot] 5dda2e575e chore: update rate-probabilities data [skip ci] 2026-07-11 04:56:57 +00:00
github-actions[bot] 8e11d1d527 chore: update rate-probabilities data [skip ci] 2026-07-11 01:50:54 +00:00
github-actions[bot] 39651f2636 chore: update rate-probabilities data [skip ci] 2026-07-10 23:51:41 +00:00
github-actions[bot] 7ff72c5baa chore: update rate-probabilities data [skip ci] 2026-07-10 22:52:45 +00:00
github-actions[bot] 578ff4b69a chore: update rate-probabilities data [skip ci] 2026-07-10 21:53:18 +00:00
github-actions[bot] fa32619e35 chore: update rate-probabilities data [skip ci] 2026-07-10 20:15:45 +00:00
github-actions[bot] b4c7a7f2f9 chore: update rate-probabilities data [skip ci] 2026-07-10 18:18:25 +00:00
github-actions[bot] 1db7eb7688 chore: update rate-probabilities data [skip ci] 2026-07-10 16:16:13 +00:00
caty21 3c01c1922e fix: badge NEW basé sur l'indicateur précis, pas la catégorie du calendrier
Le badge NEW s'allumait pour tous les indicateurs partageant une même
catégorie calendaire (ex. PPI MoM publié -> CPI YoY/Core marqués NEW à
tort). Le matching se fait désormais par indicateur exact (mêmes regex
que fetchTEInflationForecasts) et la fenêtre passe de 7 à 3 jours
calendaires après la date réelle de publication.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-10 15:44:54 +02:00
github-actions[bot] 03189c4a20 chore: update rate-probabilities data [skip ci] 2026-07-10 13:05:28 +00:00
github-actions[bot] 1276c42c8a chore: update rate-probabilities data [skip ci] 2026-07-10 10:16:14 +00:00
github-actions[bot] eb6cfdf21f chore: update rate-probabilities data [skip ci] 2026-07-10 06:35:18 +00:00
github-actions[bot] e06fc85330 chore: update rate-probabilities data [skip ci] 2026-07-10 02:03:38 +00:00
github-actions[bot] c7070fb584 chore: update rate-probabilities data [skip ci] 2026-07-09 23:04:12 +00:00
github-actions[bot] ccc45a83f5 chore: update rate-probabilities data [skip ci] 2026-07-09 21:14:34 +00:00
github-actions[bot] a4e7dedf34 chore: update rate-probabilities data [skip ci] 2026-07-09 19:24:40 +00:00
github-actions[bot] 139f30f2ed chore: update rate-probabilities data [skip ci] 2026-07-09 17:14:08 +00:00
github-actions[bot] 1a6de4bf40 chore: update rate-probabilities data [skip ci] 2026-07-09 14:34:55 +00:00
github-actions[bot] bc81bd410d chore: update rate-probabilities data [skip ci] 2026-07-09 11:48:19 +00:00
caty21 9e67aebe78 chore: update rate-probabilities data [skip ci] 2026-07-09 11:56:44 +02:00
caty21 50ae11c3c4 feat: remplace Atlanta Fed par des futures Euribor/SONIA réels pour EUR/GBP
- Retire l'onglet Atlanta Fed MPT (USD) : jugé sans valeur ajoutée réelle.
- EUR/GBP n'avaient qu'un unique point synthétique (agrégat year-end
  InvestingLive) gonflé en fausses réunions plates à 0% sur Courbe/
  Probabilités/Réunions — d'où l'aspect cassé. Investing.com n'a de Rate
  Monitor pré-calculé (comme pour la Fed) ni pour la BCE ni pour la BoE
  (404 confirmé), donc pas d'équivalent direct au pipeline USD.
- Remplace ce point unique par un vrai scrape des futures Euribor 3M
  (Eurex) et Three-Month SONIA (ICE), cotés sur investing.com (delayed,
  gratuit, pas de login) : conversion prix→taux (100−prix), mapping sur
  le calendrier réel BCE/BoE (échéance la plus proche ≥ date de réunion,
  fenêtre de grâce de 60j au-delà du dernier contrat coté, sinon on
  s'arrête plutôt que d'inventer), probabilité approximée avec la
  convention bps/25 déjà utilisée pour le fallback InvestingLive.
- Résolution plus grossière que l'USD (mensuelle EUR, trimestrielle GBP)
  et clairement étiquetée comme telle dans un footnote dédié.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-09 11:55:35 +02:00
github-actions[bot] 003ead0189 chore: update rate-probabilities data [skip ci] 2026-07-09 08:20:32 +00:00
caty21 03d601379f fix: RBNZ MPS — le retry curl ne se déclenchait jamais sur un 403
curl sans --fail sort avec le code 0 même sur une erreur HTTP (il écrit juste
la page d'erreur sur stdout), donc le try/catch du wrapper de retry ne
capturait rien : le blocage Cloudflare éventuel des IPs GitHub Actions
n'aurait jamais bénéficié des tentatives supplémentaires. Ajoute --fail (+ un
court backoff entre tentatives) pour que le retry serve réellement à quelque
chose.
2026-07-09 09:06:47 +02:00
github-actions[bot] 317f848a78 chore: update rate-probabilities data [skip ci] 2026-07-09 04:43:33 +00:00
github-actions[bot] 032e324393 chore: update rate-probabilities data [skip ci] 2026-07-09 00:02:06 +00:00
github-actions[bot] 4f8937648e chore: update rate-probabilities data [skip ci] 2026-07-08 22:04:46 +00:00
caty21 465a81a27c feat: RBNZ — automatise la découverte + lecture du Monetary Policy Statement
rbnz.govt.nz bloque bien ses pages génériques (index, listing) derrière un
challenge Cloudflare, comme déjà documenté — mais vérifié en direct que
sitemap.xml, les pages de contenu individuelles qu'il référence, et les PDF
sous /-/media/ répondent normalement (200, sans challenge). C'est exactement
ce qu'indexerait un moteur de recherche : aucun contournement, juste des
ressources publiques non protégées.

.github/scripts/fetch-rbnz-mps.mjs :
  1. Lit sitemap.xml pour trouver la dernière page MPS ("...-filtered-listing-
     page/{year}/{month}-{id}/monetary-policy-statement-{month}-{year}")
  2. En extrait le lien du PDF officiel
  3. Parse le PDF (pdf-parse, déjà utilisé pour BoJ) et extrait la Table 6.5
     "Summary of economic projections" (CPI, OCR moyenne annuelle, GDP par
     année "March year")
Note technique : le fetch() natif de Node (undici) se prend un 403 sur ces
mêmes URLs alors que curl passe (200, vérifié à la seconde près, même
User-Agent) — Cloudflare fingerprinte la pile TLS/HTTP2 du client, pas
seulement l'en-tête. Le script shell out donc vers curl (préinstallé sur les
runners GitHub Actions).

.github/workflows/fetch-rbnz-mps.yml : quotidien (le MPS n'est publié
qu'~4x/an mais découverte + parsing sont légers), + déclenchement manuel.

lib/centralBankGovernance.ts : fetchRbnzGovernance() expose désormais un vrai
reportPdfUrl/statementUrl (au lieu de null) et un CBForecast — la 8e et
dernière banque centrale de l'onglet Banques centrales à avoir ses
prévisions, malgré le blocage du reste du site RBNZ.

Vérifié en direct : PIB/inflation 2026-2029 extraits correctement (+0.7 à
+3.4% PIB, +3.1 à +2.0% inflation), card RBNZ affiche le bloc "Prévisions"
et un vrai bouton "Rapport PDF" fonctionnel.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-08 23:46:31 +02:00
caty21 187ca12658 feat: onglet Scénario — étend le simulateur à l'EUR et au GBP
Recherché un équivalent Atlanta Fed MPT (options-implied probability) pour
l'EUR et le GBP : n'existe pas. La BoE a explicitement arrêté de publier ses
propres fonctions de densité de probabilité par options (short sterling) ;
pour l'EUR, seule la recherche académique calcule ça depuis les options
Euribor, aucune institution ne publie un jeu de données téléchargeable comme
le fait l'Atlanta Fed. Le seul outil CME équivalent (€STRWatch) est un
simulateur scénario→prix, pas un extracteur prix→probabilité — donc la même
famille que l'onglet Scénario (CME SOFRWatch), pas que l'onglet Atlanta Fed.

Étendu /api/scenario-spreads et ScenarioTab.tsx en conséquence (sélecteur de
devise USD/EUR/GBP) :
  EUR : €STR ≈ DFR + (€STR − DFR)          [rate_decisions.json: MRO − 15bps]
  GBP : SONIA ≈ Bank Rate + (SONIA − Bank Rate)
Séries FRED : ECBESTRVOLWGTTRMDMNRT (€STR), IUDSOIA (SONIA).

Fix méthodologique découvert en testant l'EUR : la fenêtre de calcul du spread
était de 60 jours, ce qui chevauchait la hausse ECB du 17 juin 2026 et
mélangeait ancien/nouveau régime (spread €STR−DFR calculé à -26bps au lieu de
~-7bps réel). Réduit à ~2 semaines (10 observations) pour les 3 devises,
assez court pour rester dans le régime de taux courant tout en étant une
vraie moyenne réalisée plutôt qu'un point unique bruité.

Vérifié en direct : USD 3.64% (SOFR), EUR 2.18% (€STR), GBP 3.73% (SONIA) —
tous cohérents avec les valeurs réelles du jour. Sélecteur de devise et clics
sur le constructeur de scénario fonctionnels pour les 3 devises.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-08 23:29:32 +02:00
github-actions[bot] fc899fb912 chore: update rate-probabilities data [skip ci] 2026-07-08 20:58:35 +00:00
caty21 85292c6eda design: onglet Courbe (OIS) — courbe lissée + aire dégradée au lieu du step line
Remplace les Line type="stepAfter" par type="monotone" (courbe lissée,
demandé) et bascule LineChart -> ComposedChart pour ajouter une Area
(dégradé sky-400) sous la courbe "Actuel", avec un filtre glow sur la ligne
(défini mais jamais utilisé auparavant). Légende simplifiée en puces
colorées au lieu de segments de trait, cohérent avec le reste de l'app.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-08 22:23:48 +02:00
caty21 f5417dec17 feat: onglet Scénario — simulateur type CME SOFRWatch (taux → SOFR implicite)
Nouvel onglet principal "Scénario", logique inversée par rapport aux autres
onglets Taux : au lieu de déduire une probabilité depuis les prix de marché,
l'utilisateur choisit lui-même un scénario de hikes/cuts à chaque réunion FOMC
et l'outil déduit où devrait se situer le SOFR implicite si ce scénario se
réalisait — exactement la logique de CME SOFRWatch.

Méthodologie (2 spreads, comme SOFRWatch) :
  SOFR implicite ≈ borne basse Fed + (EFFR − borne basse) + (SOFR − EFFR)
CME calcule ces spreads depuis les prix forward des futures SOFR 1 mois vs Fed
Funds (SR1−ZQ, données de marché propriétaires). On les approxime avec la
moyenne réalisée historique EFFR/SOFR (FRED, gratuit) — limite clairement
documentée dans l'UI et le code, ce n'est pas un prix forward-looking.

- app/api/scenario-spreads/route.ts : calcule les 2 spreads depuis FRED
  (EFFR, SOFR, fenêtre ~60j) + la fourchette Fed actuelle (rate_decisions.json).
- components/ScenarioTab.tsx : constructeur de scénario par réunion FOMC
  (réutilise les dates déjà maintenues dans rate-probabilities.json), chart
  comparatif "Votre scénario" vs "Marché (OIS)" sur l'échelle SOFR.

Vérifié en direct : les spreads calculés (EFFR +13bps, SOFR-EFFR -1bps)
donnent un SOFR implicite actuel de 3.62%, qui correspond exactement au SOFR
réel du jour — et les clics sur le constructeur de scénario cumulent
correctement (step-line vérifié visuellement sur 2 hikes successifs).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-08 22:12:30 +02:00
caty21 274c7f534e feat: Atlanta Fed MPT (options SOFR) + libellé méthodologie Réunions USD
Nouveau sous-onglet "Atlanta Fed" dans le bloc OIS de la card USD, méthodologie
alternative aux 30-day Fed Fund Futures demandée : distribution du niveau de
taux Fed déduite des options sur futures SOFR 3 mois (CME), publiée
quotidiennement par la Fed d'Atlanta (Market Probability Tracker). Affiche
Cut/Hold/Hike, la fourchette de taux SOFR implicite (25e-75e percentile), et
la distribution complète par fourchette de 25bps pour la fenêtre trimestrielle
la plus proche.

- .github/scripts/fetch-atlanta-mpt.mjs : télécharge et parse mpt_histdata.xlsx
  (Atlanta Fed) avec un lecteur ZIP/OOXML maison — le paquet npm "xlsx" a des
  CVE critiques non patchées sur le registre public (SheetJS a arrêté d'y
  publier), donc pas de dépendance ajoutée pour ça.
- .github/workflows/fetch-atlanta-mpt.yml : quotidien (donnée mise à jour 1x/jour
  par l'Atlanta Fed), + déclenchement manuel.
- lib/atlantaFedMpt.ts + app/api/macro/route.ts : expose la donnée (USD only)
  via l'API macro existante.

Sous-onglet "Réunions" (USD) : ajout du libellé de méthodologie demandé —
"Probabilités = somme des % associés à chaque fourchette au-dessus/en-dessous
de la fourchette actuelle · Investing.com Fed Rate Monitor, calculées à partir
des 30-day Fed Fund Futures (CME)".

Vérifié en direct : les deux sous-onglets s'affichent et les chiffres
correspondent aux données brutes (72.4% hike / 1.1% cut / distribution
27.2-45.7-21.4-5.7% pour la fenêtre Sep 2026).

Note en marge (hors scope, découverte pendant les tests) : /api/expectations
prend ~24s à répondre, ce qui bloque l'affichage complet du dashboard
(Promise.allSettled attend les 8 fetches). À investiguer séparément.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-08 22:05:35 +02:00
caty21 8c6f96efd7 fix: restaure la vraie courbe USD (12 réunions) — erreur de résolution de conflit rebase
Le commit précédent a gardé par erreur la version distante (1 point dégradé,
même run bloqué 403) au lieu de la mienne : pendant un `git rebase`,
--ours/--theirs sont inversés par rapport à un merge classique (--ours =
branche cible/origin, pas le commit en cours de replay). Re-fetch confirme
à nouveau 12 réunions FOMC depuis mon IP.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-08 21:13:26 +02:00
github-actions[bot] dc91350bfa chore: update rate-probabilities data [skip ci] 2026-07-08 19:10:14 +00:00
caty21 356940a76a fix: courbe OIS USD écrasée par un fallback dégradé quand investing.com bloque GitHub Actions
Root cause confirmée en direct dans les logs du run GH Actions du 2026-07-08
15:10 : investing.com renvoie 403 spécifiquement aux IPs des runners GitHub
Actions (bloc anti-bot par réputation IP — mon IP locale passe sans problème,
la même page se parse parfaitement, 12 réunions). C'est intermittent par
nature selon la rotation d'IP de GitHub.

Le vrai bug n'était pas le scraping mais l'absence total de filet de
sécurité : dès qu'un run se prenait ce 403, le code écrasait la vraie courbe
FOMC multi-réunions (12 points, table Investing.com) par le fallback
InvestingLive — un unique point "year-end" — et cette dégradation restait
visible dans data/rate-probabilities.json jusqu'au prochain run qui réussissait
à passer. D'où le symptôme : "parfois ça marche et c'est correct, parfois ça
bug et affiche peu de données fausses" pour les sous-onglets Courbe/Probas/
Réunions de la card USD.

Deux corrections dans fetch-rate-data.mjs :
1. Retry (3 tentatives, backoff 2s/4s/6s) sur le fetch Investing.com — couvre
   les échecs vraiment transitoires (n'aide pas contre un blocage IP qui
   persiste sur tout le run, d'où le point 2).
2. Filet de sécurité : si le résultat du jour n'a qu'1 réunion (signature du
   fallback IL dégradé) alors qu'une vraie courbe multi-réunions existait déjà
   dans le fichier, on la conserve au lieu de l'écraser.

Vérifié : (a) le scrape Investing.com refonctionne depuis ma machine (12
réunions FOMC parsées correctement) ; (b) la logique de préservation testée
isolément avec un cas simulé de dégradation restaure bien les 12 réunions.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-08 20:44:20 +02:00
github-actions[bot] 66ca9b188b chore: update rate-probabilities data [skip ci] 2026-07-08 17:21:12 +00:00
caty21 7c9b6ac89d fix: actualités — tri chronologique cassé + 3 flux RSS morts remplacés
Tri (lib/newsfeed.ts + components/NewsTab.tsx) :
Un bonus "+3h pour les catégories prioritaires" (Guerre/Chef d'État/Crise…)
était appliqué avant le tri par date. En temps normal ça remonte discrètement
une poignée d'articles importants ; mais en période de crise soutenue (conflit
Moyen-Orient actuel), la quasi-totalité des articles matche une de ces
catégories — le bonus s'applique presque partout et casse l'ordre
chronologique au lieu de l'affiner, produisant des blocs par source de plus en
plus vieux au lieu d'un flux unique correctement entrelacé. Vérifié en direct :
54 articles avant fix avec des dizaines d'inversions chronologiques, 0 après.
Le badge visuel " Prioritaire" reste pour signaler l'importance sans trahir
la fraîcheur réelle.

Flux RSS (lib/newsfeed.ts RSS_FEEDS) — 3 des 6 sources ne contribuaient plus
rien, vérifié en direct :
  - ForexLive : /feed/news est une coquille vide (0 <item>) depuis leur
    migration Nuxt.js vers investinglive.com — déjà couvert par le scraper
    dédié fetchInvestingLiveNews(), aucune perte réelle en le retirant.
  - MarketWatch : l'ancien miroir dowjones.io ne sert que des articles vieux
    de 1+ an (filtrés par le cutoff 8 jours) → remplacé par l'URL RSS actuelle
    (marketwatch.com/rss/topstories, testée fraîche).
  - Reuters : feeds.reuters.com n'existe plus (échec DNS, fermé par Reuters il
    y a plusieurs années) → remplacé par CNBC Markets (testé frais).

Bloomberg (403 anti-bot) et FinancialJuice (site restructuré) restent à zéro,
déjà connu et accepté (échecs silencieux gérés par try/catch).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-08 18:49:16 +02:00
caty21 062892c340 fix: favicon FX — inverse les couleurs (fond quasi-noir #090e1a, texte orange #f59e0b)
Le commit précédent avait les couleurs inversées (fond orange, texte foncé) ;
c'est le design d'origine (fond sombre, texte orange) qui était voulu.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-08 18:06:19 +02:00