mirror of
https://github.com/caty21/forex-dashboard.git
synced 2026-08-16 14:08:06 +00:00
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:
co-authored by
Claude Sonnet 4.6
parent
a3d847ce59
commit
9da463a424
+44
-2
@@ -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() });
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user