feat: OISEnhancedBlock — rate curve, implied pts, scénarios charts per CB

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
caty21
2026-06-27 14:12:05 +02:00
co-authored by Claude Sonnet 4.6
parent a3d847ce59
commit 9da463a424
12 changed files with 1777 additions and 754 deletions
+44 -2
View File
@@ -1,13 +1,43 @@
import { NextResponse } from "next/server";
import { fetchTEBondYields } from "@/lib/tebonds";
// Variation % d'un pair FX vs clôture J-1 (Yahoo Finance, cache 5 min)
// Valeur positive = devise X plus forte vs USD (ou USD plus fort si pair inversé)
async function fxChangePct(symbol: string, invert = false): Promise<number | null> {
try {
const res = await fetch(
`https://query1.finance.yahoo.com/v8/finance/chart/${encodeURIComponent(symbol)}?interval=1d&range=2d`,
{ next: { revalidate: 300 }, headers: { "User-Agent": "Mozilla/5.0" } }
);
if (!res.ok) return null;
const meta = (await res.json())?.chart?.result?.[0]?.meta as { regularMarketPrice?: number; chartPreviousClose?: number } | undefined;
const cur = meta?.regularMarketPrice ?? null;
const prev = meta?.chartPreviousClose ?? null;
if (cur === null || prev === null || prev === 0) return null;
const pct = (cur - prev) / prev * 100;
return parseFloat((invert ? -pct : pct).toFixed(3));
} catch { return null; }
}
// 10Y sovereign yields — source unique : tradingeconomics.com/bonds (HTML statique)
// Remplace les sources précédentes (FRED DGS10 + IRLTLT01XXM156N mensuel + ECB/BoE APIs)
// qui avaient des décalages allant de 1 jour (FRED daily) à 1 mois (FRED monthly JPY/CHF/AUD/NZD).
// TE bonds = données du jour pour les 8 devises, cache 1h.
export async function GET() {
const bondData = await fetchTEBondYields();
const [bondData, fxResults] = await Promise.all([
fetchTEBondYields(),
Promise.all([
fxChangePct("EURUSD=X"), // EUR: positif = EUR fort
fxChangePct("GBPUSD=X"), // GBP: positif = GBP fort
fxChangePct("USDJPY=X", true), // JPY: inversé (USD/JPY haut = JPY faible)
fxChangePct("USDCHF=X", true), // CHF: inversé
fxChangePct("USDCAD=X", true), // CAD: inversé
fxChangePct("AUDUSD=X"), // AUD: positif = AUD fort
fxChangePct("NZDUSD=X"), // NZD: positif = NZD fort
]),
]);
const [eurFx, gbpFx, jpyFx, chfFx, cadFx, audFx, nzdFx] = fxResults;
const yields: Record<string, number | null> = {
USD: bondData.USD?.yield10y ?? null,
@@ -42,5 +72,17 @@ export async function GET() {
}
}
return NextResponse.json({ yields, spreads, dayDeltas, timestamp: Date.now() });
// Variation FX journalière par devise (positif = devise forte vs USD)
const fxDayPct: Record<string, number | null> = {
USD: 0,
EUR: eurFx,
GBP: gbpFx,
JPY: jpyFx,
CHF: chfFx,
CAD: cadFx,
AUD: audFx,
NZD: nzdFx,
};
return NextResponse.json({ yields, spreads, dayDeltas, fxDayPct, timestamp: Date.now() });
}