From b3d70960d1bb54e2c3c28ec59dad7ab24c5b57b0 Mon Sep 17 00:00:00 2001 From: Tvishi Agarwal Date: Sun, 12 Apr 2026 20:48:09 +0000 Subject: [PATCH] pleasepleasework --- __pycache__/generate.cpython-312.pyc | Bin 34523 -> 36707 bytes generate.py | 41 +++++++++++++++++++++++++-- index.html | 1 + 3 files changed, 40 insertions(+), 2 deletions(-) diff --git a/__pycache__/generate.cpython-312.pyc b/__pycache__/generate.cpython-312.pyc index 844d468edd3e7e09bff7252d979625def3d44671..a827b256777bd6ff7e0bc9bfaa6ea799c4b3d533 100644 GIT binary patch delta 7023 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 M8wDwo4#CU%Z!_P<*8l(j delta 4777 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 Q>;0u&M#+@K&cJs38yLGfH2?qr diff --git a/generate.py b/generate.py index fe11e31..c1b483e 100644 --- a/generate.py +++ b/generate.py @@ -112,6 +112,36 @@ EODHD_BONDS = { "NO10Y.GBOND": {"key": "no10y", "label": "Norway 10Y", "country": "Norway"}, } +# ─── CENTRAL BANK POLICY RATES ─────────────────────────────────────────────── +# Updated periodically — these change at most ~8 times/year per central bank +POLICY_RATES = { + "US": 4.50, # Fed Funds upper bound + "Eurozone": 2.65, # ECB deposit facility rate + "UK": 4.50, # BoE Bank Rate + "Japan": 0.50, # BoJ overnight rate + "Switzerland": 0.25, # SNB policy rate + "Canada": 2.75, # BoC overnight rate + "Australia": 3.85, # RBA cash rate + "New Zealand": 3.50, # RBNZ OCR + "Sweden": 2.25, # Riksbank repo rate + "Norway": 4.50, # Norges Bank sight deposit rate +} + +# ─── MACRO SNAPSHOT DATA ───────────────────────────────────────────────────── +# Updated periodically — CPI/GDP/unemployment are published monthly/quarterly +MACRO_DATA = { + "US": {"cpi": "2.8%", "cpiP": "3.0%", "gdp": "2.4%", "gdpT": "Q1 2025", "unemp": "4.2%", "unempT": "Jun 2025", "stance": "Hawkish Hold", "last": "Hold 4.50%", "next": "Jul 30", "pricing": "1 cut by Sep"}, + "Eurozone": {"cpi": "2.1%", "cpiP": "2.2%", "gdp": "1.0%", "gdpT": "Q1 2025", "unemp": "6.3%", "unempT": "May 2025", "stance": "Dovish Easing", "last": "Cut to 2.65%", "next": "Jul 17", "pricing": "1 more cut 2025"}, + "UK": {"cpi": "3.5%", "cpiP": "3.3%", "gdp": "1.3%", "gdpT": "Q1 2025", "unemp": "4.4%", "unempT": "May 2025", "stance": "Cautious Hold", "last": "Hold 4.50%", "next": "Aug 7", "pricing": "1 cut by Nov"}, + "Japan": {"cpi": "3.6%", "cpiP": "3.2%", "gdp": "-0.7%", "gdpT": "Q1 2025", "unemp": "2.5%", "unempT": "May 2025", "stance": "Gradual Tightening", "last": "Hold 0.50%", "next": "Jul 31", "pricing": "Hike to 0.75% H2"}, + "Switzerland": {"cpi": "0.6%", "cpiP": "0.3%", "gdp": "1.4%", "gdpT": "Q1 2025", "unemp": "2.8%", "unempT": "Jun 2025", "stance": "Neutral", "last": "Cut to 0.25%", "next": "Sep 18", "pricing": "Hold through 2025"}, + "Canada": {"cpi": "2.9%", "cpiP": "2.7%", "gdp": "1.7%", "gdpT": "Q1 2025", "unemp": "6.7%", "unempT": "Jun 2025", "stance": "Easing", "last": "Cut to 2.75%", "next": "Jul 30", "pricing": "1 more cut 2025"}, + "Australia": {"cpi": "2.4%", "cpiP": "2.8%", "gdp": "1.3%", "gdpT": "Q1 2025", "unemp": "4.0%", "unempT": "May 2025", "stance": "Easing", "last": "Cut to 3.85%", "next": "Aug 5", "pricing": "1-2 cuts by Dec"}, + "New Zealand": {"cpi": "2.5%", "cpiP": "2.2%", "gdp": "0.7%", "gdpT": "Q1 2025", "unemp": "5.1%", "unempT": "Q1 2025", "stance": "Easing Cycle","last": "Cut to 3.50%", "next": "Jul 9", "pricing": "2 more cuts 2025"}, + "Sweden": {"cpi": "2.3%", "cpiP": "2.5%", "gdp": "1.1%", "gdpT": "Q1 2025", "unemp": "8.9%", "unempT": "May 2025", "stance": "Dovish Hold", "last": "Hold 2.25%", "next": "Aug 20", "pricing": "Hold through 2025"}, + "Norway": {"cpi": "2.7%", "cpiP": "2.8%", "gdp": "1.5%", "gdpT": "Q1 2025", "unemp": "4.1%", "unempT": "May 2025", "stance": "Hawkish Hold","last": "Hold 4.50%", "next": "Aug 14", "pricing": "Cut Q4 2025"}, +} + # ─── COMMODITY TICKERS ─────────────────────────────────────────────────────── COMMODITIES = { "GC=F": {"key": "gold", "name": "Gold", "unit": "$/oz"}, @@ -704,8 +734,15 @@ def main(): }] print(f" Final calendar rows: {len(output['calendar'])}") - # 11. Government bonds (EODHD) - print("\n[11] Fetching government bonds from EODHD...") + # 11. Policy rates & macro data + print("\n[11] Loading policy rates & macro data...") + output["policy_rates"] = POLICY_RATES + output["macro"] = MACRO_DATA + print(f" Policy rates: {len(output['policy_rates'])} countries") + print(f" Macro data: {len(output['macro'])} countries") + + # 12. Government bonds (EODHD) + print("\n[12] Fetching government bonds from EODHD...") if GOV_KEY: for symbol, info in EODHD_BONDS.items(): result = fetch_eodhd_eod(symbol) diff --git a/index.html b/index.html index 9b3c06b..cb899e2 100644 --- a/index.html +++ b/index.html @@ -538,6 +538,7 @@ function App(){ try{ const data=await fData(); setEtfs(data.etfs||{});setVol(data.volatility||{});setBondEtfs(data.bond_etfs||{}); + console.log("FULL DATA",data);console.log("POLICY_RATES",data.policy_rates);console.log("MACRO",data.macro);console.log("YIELDS",data.yields); setMacro(data.macro||{});setPolicyRates(data.policy_rates||{});setGovBonds(data.gov_bonds||{}); const mapFx=defs=>defs.map(d=>{const x=data.fx?.[d.p];return{pair:d.p,spot:x?.price??null,d1:x?.d1_pct??null,w1:x?.w1_pct??null,m1:x?.m1_pct??null,ytd:null}}); sG10(mapFx(G10));sEM(mapFx(EMP));sFxL(true);