Files
forex-dashboard/lib/calendar-taxonomy.ts
caty21 0657b50c07 feat: banques centrales (vote+dot plot+previsions), calendrier elargi, fix InvestingLive, M3 auto
Central bank governance (nouvel onglet Banques centrales) :
- lib/centralBankGovernance.ts + app/api/central-bank-sources : scraping live du
  vote de la derniere reunion, dot plot Fed (SEP), et desormais les previsions
  macro (PIB + inflation) publiees par chaque BC elle-meme (Fed SEP, Eurosystem
  staff projections, BoJ Outlook Report PDF, SNB conditional forecast, BoC MPR,
  RBA SMP). GBP/NZD laisses honnetement vides quand aucune source chiffree
  fiable n'est accessible (RBNZ bloque par Cloudflare).
- components/CentralBankSourcesTab.tsx : nouvel onglet avec cards par banque.

Taux directeurs + Money Supply M3 :
- data/rate_decisions.json corrige (JPY, EUR, NZD etc. etaient perimes d'1-2
  decisions) et desormais auto-maintenu : .github/workflows/update-rate-decisions.yml
  (horaire) detecte les changements de taux via Trading Economics et fait
  glisser current -> prev sans perte de donnee.
- data/money-supply-m3.json (nouveau) + .github/workflows/fetch-money-supply.yml
  (hebdo) : M3 par devise (proxy M2 pour l'USD, la Fed ne publiant plus M3
  depuis 2006), affiche dans CurrencyCard.

Calendrier economique elargi :
- lib/calendar-countries.ts, lib/calendar-taxonomy.ts, lib/fxstreetCalendar.ts :
  couverture pays elargie + classification des evenements + source FXStreet.

Fix InvestingLive :
- lib/investinglive.ts : l'ancienne API WordPress (wp-json) renvoyait 404 depuis
  leur migration Nuxt.js -> reecrit vers api.investinglive.com/api/homepage/articles,
  + fix crash silencieux (Tldr pas toujours un tableau).

Divers :
- .vercel/ ajoute au .gitignore (ne doit jamais etre commite, cf. son propre README).
- scripts/ (lancement PWA, push env Vercel), captures d'ecran, cache InvestingLive.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-08 16:47:59 +02:00

80 lines
4.5 KiB
TypeScript

// lib/calendar-taxonomy.ts
// Règles de tri du fourre-tout "other" du calendrier économique, décidées avec
// l'utilisateur devise par devise (session du 2026-07-08) :
// - Confiance/sentiment, immobilier (prix uniquement), M3 (EUR uniquement),
// commerce extérieur détaillé, Fed régionale (Philly uniquement), flux de
// portefeuille étrangers, finances publiques, jours fériés → catégories
// dédiées (visibles, triables séparément).
// - Adjudications obligataires, production industrielle, énergie hebdo US,
// hypothécaires hebdo US, CPI infranational, réunions institutionnelles
// sans chiffre → exclus du calendrier (bruit, cf. décisions utilisateur).
// Tout le reste (non couvert par une règle ci-dessous) continue d'apparaître
// sous "other" / "Autre".
import type { EventCategory } from "@/app/api/calendar/route";
const SENTIMENT_RE = /\bifo\b|\bzew\b|\bgfk\b|consumer confidence|business confidence|business climate|economic sentiment|\bsentix\b|westpac consumer confidence|anz.*consumer confidence|anz business confidence|anz activity outlook|nab business confidence|cbi business optimism|cbi distributive trades|cbi industrial trends|eco watchers survey|reuters tankan/i;
const HOUSING_PRICE_RE = /house price|housing price|nationwide housing|case-shiller|rightmove|rics house price|cotality dwelling|residential property price/i;
const MONEY_SUPPLY_RE = /m3 money supply/i;
const TRADE_DETAIL_RE = /^exports?\b|^imports?\b|export price|import price/i;
const REGIONAL_FED_RE = /philly fed|philadelphia fed/i;
const PORTFOLIO_FLOWS_RE = /tic flows|net capital flows|foreign bond investment|stock investment by foreigners|cftc \w+ nc net positions/i;
const PUBLIC_FINANCE_RE = /budget balance|monthly budget statement|public sector net borrowing/i;
const HOLIDAY_RE = /\bholiday\b|\b(independence|canada|marine|labor|labour|thanksgiving|christmas|boxing|memorial|veterans|presidents?|columbus|mlk|good friday|easter monday)\s+day\b/i;
// ── Exclusions (bruit écarté du calendrier, décision utilisateur) ────────────
const AUCTION_RE = /\bauction\b|\btender\b|conventional gilt|index-linked gilt/i;
const INDUSTRIAL_PROD_RE = /industrial production|industrial output|manufacturing production|capacity utilization|tertiary industry index/i;
const US_ENERGY_WEEKLY_RE = /\beia\b|\bapi\b crude|baker hughes|crude oil stock|natural gas stock|gasoline stock|distillate|heating oil stock|refinery crude/i;
const US_MORTGAGE_WEEKLY_RE = /\bmba\b|mortgage application|mortgage market index|mortgage refinance index|mba purchase index/i;
const SUBNATIONAL_CPI_RE = /baden wuerttemberg cpi|bavaria cpi|brandenburg cpi|hesse cpi|north rhine westphalia cpi|saxony cpi|tokyo cpi|tokyo core cpi/i;
const INSTITUTIONAL_MEETING_RE = /ecofin meeting|eurogroup meeting|iea oil market report|wasde report|nopa crush report/i;
export function classifyOtherTitle(title: string): EventCategory {
if (SENTIMENT_RE.test(title)) return "sentiment";
if (HOUSING_PRICE_RE.test(title)) return "housing";
if (MONEY_SUPPLY_RE.test(title)) return "money_supply";
if (TRADE_DETAIL_RE.test(title)) return "trade_detail";
if (REGIONAL_FED_RE.test(title)) return "regional_fed";
if (PORTFOLIO_FLOWS_RE.test(title)) return "portfolio_flows";
if (PUBLIC_FINANCE_RE.test(title)) return "public_finance";
if (HOLIDAY_RE.test(title)) return "holiday";
return "other";
}
export function isExcludedEventTitle(title: string): boolean {
return (
AUCTION_RE.test(title) ||
INDUSTRIAL_PROD_RE.test(title) ||
US_ENERGY_WEEKLY_RE.test(title) ||
US_MORTGAGE_WEEKLY_RE.test(title) ||
SUBNATIONAL_CPI_RE.test(title) ||
INSTITUTIONAL_MEETING_RE.test(title)
);
}
// ── Plancher d'impact (demande explicite : PPI, Trade Balance, Construction PMI
// ne doivent jamais rester masqués par le filtre "Impact faible" par défaut) ──
// TE/investingLive taggent souvent ces indicateurs "low" par pays (surtout hors
// USD), ce qui les cache dans le calendrier tant que la case "Impact faible"
// n'est pas cochée. On relève le plancher à "medium" sans jamais rétrograder
// un impact déjà "high" décidé par la source (ex. PPI MoM US, Balance of Trade JP).
const IMPACT_FLOOR_RE = /construction pmi|\bppi\b|producer price|balance of trade|trade balance|goods trade balance|foreign trade balance/i;
export function applyImpactFloor(
title: string,
impact: "high" | "medium" | "low"
): "high" | "medium" | "low" {
if (impact === "low" && IMPACT_FLOOR_RE.test(title)) return "medium";
return impact;
}