Files
forex-dashboard/lib/constants.ts
T
Capucine Gest 3a39904ce5 fix: CPI/taux/expectations — corrections sources données mai 2026
Indicateurs :
- JPY CPI : null → IMF/IFS DBnomics MoM% (override 0.1% mai 2026)
- AUD CPI : mauvais ID FRED (AUSCPIALLMINMEI→AUSCPIALLQINMEI) + override 1.4% T1 2026
- NZD CPI : mauvais ID FRED (NZLCPIALLMINMEI→NZLCPIALLQINMEI) + override 0.9% T1 2026
- Nouveau data/cpi_overrides.json — surcharge manuelle quand FRED/DBnomics en retard
- Override date-comparé : source auto reprend quand elle dépasse l'override

Taux directeurs :
- GBP : BoE API IUDBEDR primary + IR3TIB01GBM156N fallback FRED (IRSTCB01 inexistant)
- USD/EUR/CAD/NZD : sources déduplicées (DFEDTARU, ECBDFR, BoC Valet, IRSTCB01)

Zone Euro :
- EUR CPI fallback : prc_hicp_mmr (404) → prc_hicp_midx + toIndicatorPct
- EUR chômage : geo=EA21 (2026) + fallback EA20

Expectations :
- data/rate_expectations.json : données correctes 29/05/2026
  (Fed 68bps, ECB 49bps, BoE 53bps, BoJ +32bps, etc.)

UI :
- Tooltip bps : explication "1 bp = 0,01% de taux"
- NarrativeButton : affiche le vrai message d'erreur (était "Erreur Bytez")
- Groq API key manquante : message descriptif avec chemin Vercel

Types :
- IndicatorResult type explicite → corrige erreurs tsc pre-existantes (prev/lastUpdated)
- toPmiIndicator retourne IndicatorResult

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-29 12:13:05 +02:00

129 lines
6.0 KiB
TypeScript

import type { Currency } from "./types";
export const CURRENCIES: Currency[] = ["USD", "EUR", "GBP", "JPY", "CHF", "CAD", "AUD", "NZD"];
export const CURRENCY_META: Record<Currency, { name: string; flag: string; cb: string; cbShort: string }> = {
USD: { name: "États-Unis", flag: "🇺🇸", cb: "Federal Reserve", cbShort: "Fed" },
EUR: { name: "Zone Euro", flag: "🇪🇺", cb: "Banque Centrale Européenne", cbShort: "BCE" },
GBP: { name: "Royaume-Uni", flag: "🇬🇧", cb: "Bank of England", cbShort: "BoE" },
JPY: { name: "Japon", flag: "🇯🇵", cb: "Bank of Japan", cbShort: "BoJ" },
CHF: { name: "Suisse", flag: "🇨🇭", cb: "Banque Nationale Suisse", cbShort: "BNS" },
CAD: { name: "Canada", flag: "🇨🇦", cb: "Bank of Canada", cbShort: "BoC" },
AUD: { name: "Australie", flag: "🇦🇺", cb: "Reserve Bank of Australia", cbShort: "RBA" },
NZD: { name: "Nouvelle-Zélande", flag: "🇳🇿", cb: "Reserve Bank of New Zealand", cbShort: "RBNZ" },
};
// FRED series IDs — corrections audit 2026-05-28
// null = série inexistante sur FRED → source alternative dans /api/macro
//
// Retail Sales : séries GPSAM (déjà en MoM%, ne pas convertir)
// Format : {PAYS3}SLRTTO01GPSAM (OECD monthly retail trade, % growth prev. period, SA)
// EUR utilise l'Allemagne comme proxy (plus grande économie, données mensuelles récentes)
// Employment : séries LFEMTTTT*647S (niveaux en milliers → MoM% calculé localement)
export const FRED_SERIES: Record<Currency, {
policyRate: string | null;
cpiCore: string | null;
gdp: string | null;
retailSales: string | null;
unemployment: string | null;
employment: string | null;
}> = {
USD: {
policyRate: "FEDFUNDS",
cpiCore: "CPILFESL", // indice niveau → MoM%
gdp: "GDPC1", // indice niveau → QoQ%
retailSales: "USASLRTTO01GPSAM", // déjà MoM% — ex-MARTSSM44W72USS (niveau)
unemployment: "UNRATE",
employment: "PAYEMS", // niveau → MoM%
},
EUR: {
policyRate: "ECBDFR", // taux dépôt BCE
cpiCore: "CP0000EZCCM086NEST", // HICP total EA composition variable → Index 2025=100 → MoM%
gdp: null, // → Eurostat dans /api/macro
retailSales: "DEUSLRTTO01GPSAM", // proxy Allemagne, déjà MoM%
unemployment: null, // → Eurostat EA21 dans /api/macro
employment: null,
},
GBP: {
policyRate: null, // → BoE API dans /api/macro
cpiCore: "GBRCPIALLMINMEI", // indice niveau → MoM%
gdp: "NGDPRSAXDCGBQ", // Real GDP UK (BEA/ONS) indice niveau → QoQ%
retailSales: "GBRSLRTTO01GPSAM", // déjà MoM%
unemployment: "LRHUTTTTGBM156S",
employment: null, // pas de série mensuelle FRED pour GBP
},
JPY: {
policyRate: "IR3TIB01JPM156N", // 3M interbank (IRSTCB01JPM156N stale 2023)
cpiCore: null, // JPNCPIALLMINMEI stale depuis 2021 sur FRED
gdp: "JPNRGDPEXP", // indice niveau → QoQ%
retailSales: "JPNSLRTTO01GPSAM", // déjà MoM%
unemployment: "LRHUTTTTJPM156S",
employment: "LFEMTTTTJPM647S", // niveau mensuel → MoM%
},
CHF: {
policyRate: "IR3TIB01CHM156N", // 3M interbank — IRSTCB01CHM156N n'existe pas
cpiCore: "CHECPICORMINMEI", // indice niveau → MoM%
gdp: "CHNGDPNQDSMEI", // indice niveau → QoQ% (peut être stale)
retailSales: "CHESLRTTO01GPSAM", // déjà MoM%
unemployment: "LRHUTTTTCHQ156S", // trimestriel (LRHUTTTTCHM156S n'existe pas)
employment: null, // pas de série FRED pour CHF
},
CAD: {
policyRate: "IR3TIB01CAM156N", // 3M interbank (IRSTCB01CAM156N stale 2023)
cpiCore: "CANCPICORMINMEI", // indice niveau → MoM%
gdp: "NGDPRSAXDCCAQ", // Real GDP Canada (BEA/StatCan) indice niveau → QoQ%
retailSales: "CANSLRTTO01GPSAM", // déjà MoM%
unemployment: "LRHUTTTTCAM156S",
employment: "LFEMTTTTCAM647S", // niveau mensuel → MoM%
},
AUD: {
policyRate: "IR3TIB01AUM156N", // 3M interbank — IRSTCB01AUM156N n'existe pas
cpiCore: "AUSCPIALLQINMEI", // trimestriel (Q = quarterly, ex-AUSCPIALLMINMEI inexistant)
gdp: "NGDPRSAXDCAUQ", // Real GDP Australia (ABS) indice niveau → QoQ%
retailSales: null, // pas de série mensuelle FRED pour AUD
unemployment: "LRHUTTTTAUM156S",
employment: "LFEMTTTTAUM647S", // niveau mensuel → MoM%
},
NZD: {
policyRate: "IR3TIB01NZM156N", // 3M interbank — IRSTCB01NZM156N n'existe pas
cpiCore: "NZLCPIALLQINMEI", // trimestriel (Q = quarterly, ex-NZLCPIALLMINMEI inexistant)
gdp: "NAEXKP01NZQ661S", // indice niveau → QoQ% (stale ~2023, best available)
retailSales: null, // pas de série mensuelle FRED pour NZD
unemployment: "LRUNTTTTNZQ156S",
employment: "LFEMTTTTNZQ647S", // niveau trimestriel → QoQ% (proxy)
},
};
// COT CFTC contract codes per currency
export const COT_CODES: Record<Currency, string> = {
USD: "098662", // USD Index DX
EUR: "099741", // Euro FX EC
GBP: "096742", // British Pound BP
JPY: "097741", // Japanese Yen JY
CHF: "092741", // Swiss Franc SF
CAD: "090741", // Canadian Dollar CD
AUD: "232741", // Australian Dollar AD
NZD: "112741", // New Zealand Dollar NE
};
// Scoring weights per indicator (§4 CDC)
export const INDICATOR_WEIGHTS = {
policyRate: 3,
cpiCore: 2.5,
pmiMfg: 1.5,
pmiServices: 1.5,
gdp: 2,
retailSales: 1.5,
unemployment: 1.5,
employment: 2,
} as const;
// Cycle phase multipliers (§4c CDC)
export const PHASE_MULTIPLIERS: Record<string, { bull: number; bear: number }> = {
tightening: { bull: 1.5, bear: 1.0 },
hawkish_pause: { bull: 1.3, bear: 1.5 },
easing: { bull: 1.0, bear: 1.5 },
dovish_pause: { bull: 1.5, bear: 1.0 },
transition: { bull: 1.0, bear: 1.0 },
};