Files
FXandRatesDashboard/__pycache__/generate.cpython-312.pyc
T

299 lines
36 KiB
Plaintext
Raw Normal View History

2026-04-12 20:13:22 +00:00
Ë
2026-04-12 20:48:09 +00:00
vÜiÕ†ãóZdZddlZddlZddlZddlZddlmZmZddlmZddl Z ddl
2026-04-12 20:13:22 +00:00
Z ejjdd«Zejjdd«Zejjdd«Zd Zd
2026-04-12 20:48:09 +00:00
dd d d
dœddddœddddœdddœdœZddddddddddddœ Zddiddid did!did"did#œZd$d%d&d'œd(d%d)d'œd*d%d+d'œd,d-d.d'œd/d0d.d'œd1d2d.d'œd3d%d.d'œd4œZid5d6d7d%d8œd9d:d;d%d8œd<d=d>d%d8œd?d@dAd-d8œdBdCdDd-d8œdEdFdGd-d8œdHdIdJd0d8œdKdLdMd0d8œdNdOdPd0d8œdQdRdSd2d8œdTdUdVd2d8œdWdXdYd2d8œdZd[d\d0d8œd]d^d_d0d8œd`dadbd0d8œdcddded0d8œdfdgdhdid8œdjdkdid8œdldmdnd8œdodpdnd8œdqdrdsd8œdtdudsd8œdvdwdxd8œdydzd{d8œd|d}d~d8œdœ¥Zd€dd€ddƒd„d…d†d‡d€dˆœ
Zd‰dŠddŒddŽddddd“œ
d”d•d–dŒd—d˜d™dšd›dœd“œ
ddždŸdŒd d˜d¡dd¢d£d“œ
d¤d¥d¦dŒd§d˜d¨d©dªd«d“œ
d¬d­d®dŒd‰dŽd¯d°d±d²d“œ
d³d´dµdŒd¶dŽd·d¸d‘dœd“œ
dd‰dŸdŒd¹d˜d·dºd»d¼d“œ
d§d•d½dŒd¾dŒd¿dÀdÁdÂd“œ
dÃd§dÄdŒdÅd˜dÆdÇdÈd²d“œ
d´d‰dÉdŒdÊd˜dddËdÌd“œ
dˆœ
ZdÍdÎdÏdМdÑdÒdÏdМdÓdÔdÕdМdÖd×dÕdМdØdÙdÚdМdÛdÜdÝdМdÞdßdàdМdádâdàdМdãœZidädå“dædç“dèdé“dêdë“dìdí“dîdï“dðdñ“dòdó“dôdõ“död÷“dødù“dúdû“düdý“dþdÿ“dddddddddd œ¥Zd
2026-04-12 20:13:22 +00:00
d d d
dœZidddddddddddddddddd “d!d"“d#d$“d%d&“d'd(“d)d*“d+d,“d-d.“d/d0“d1d2d3d4d5d6d7œ¥Zd8„ZdCd9„ZdDd:„ZdEd;„Z dFd<„Z!d=„Z"d>„Z#d?„Z$dEd@„Z%dA„Z&e'dBk(re&«yy(G
FX RADAR — Data Generation Pipeline
Fetches global yields, commodities, ETFs, vol data, FX, and news.
Outputs data.json which the HTML dashboard reads.
Run locally: python generate.py
Run via GitHub Actions: automatic on schedule
éN)ÚdatetimeÚ timedelta)ÚPathÚ FRED_API_KEYÚÚFINNHUB_API_KEYÚ GOV_API_KEYz data.jsonú^IRXú^FVXú^TNXú^TYX)Ú1MÚ2YÚ5YÚ10YÚ30Y)rrr)rr)ÚUSÚUKÚGermanyÚJapanrÚ3MÚ6MÚ1YrÚ3YrÚ7YrÚ20Yr) ÚDGS1MOÚDGS3MOÚDGS6MOÚDGS1ÚDGS2ÚDGS3ÚDGS5ÚDGS7ÚDGS10ÚDGS20ÚDGS30ÚIRLTLT01DEM156NÚIRLTLT01GBM156NÚIRLTLT01JPM156NÚIRLTLT01CAM156NÚIRLTLT01AUM156N)ÚEurozonerrÚCanadaÚ AustraliazUS 20Y+ TreasuryrÚlong)ÚnameÚcountryÚdurationzUS 7-10Y TreasuryÚmediumzUS 1-3Y TreasuryÚshortzUK GiltsrÚmixedzEurozone Govt Bondsr-zJapan Govt BondsrzUS Total Treasury)ÚTLTÚIEFÚSHYzIGLT.LzIBGL.LÚJGBSÚGOVTz
US2Y.GBONDÚus2yzUS 2Y)ÚkeyÚlabelr2z US10Y.GBONDÚus10yzUS 10Yz US30Y.GBONDÚus30yzUS 30Yz
UK2Y.GBONDÚuk2yzUK 2Yz UK10Y.GBONDÚuk10yzUK 10Yz UK30Y.GBONDÚuk30yzUK 30Yz
DE2Y.GBONDÚde2yz
Germany 2Yz DE10Y.GBONDÚde10yz Germany 10Yz DE30Y.GBONDÚde30yz Germany 30Yz
JP2Y.GBONDÚjp2yzJapan 2Yz JP10Y.GBONDÚjp10yz Japan 10Yz JP30Y.GBONDÚjp30yz Japan 30Yz
IT2Y.GBONDÚit2yzItaly 2Yz IT10Y.GBONDÚit10yz Italy 10Yz FR10Y.GBONDÚfr10yz
2026-04-12 20:35:22 +00:00
France 10Yz ES10Y.GBONDÚes10yz Spain 10Yz
2026-04-12 20:13:22 +00:00
CA2Y.GBONDÚca2yz Canada 2Yr.Úca10yz
Canada 10YÚau2yz Australia 2Yr/Úau10yz
Australia 10YÚnz2yzNew Zealand 2Yú New ZealandÚnz10yzNew Zealand 10YÚch10yzSwitzerland 10YÚ SwitzerlandÚse10yz
2026-04-12 20:48:09 +00:00
Sweden 10YÚSwedenÚno10yz
Norway 10YÚNorway)z CA10Y.GBONDz
AU2Y.GBONDz AU10Y.GBONDz
NZ2Y.GBONDz NZ10Y.GBONDz SW10Y.GBONDz SE10Y.GBONDz NO10Y.GBONDg@g333333@gà?gÐ?g@gÍÌÌÌÌÌ@g @g@)
rr-rrrVr.r/rSrXrZz2.8%z3.0%z2.4%zQ1 2025z4.2%zJun 2025z Hawkish Holdz
Hold 4.50%zJul 30z 1 cut by Sep)
2026-04-12 20:13:22 +00:00
ÚcpiÚcpiPÚgdpÚgdpTÚunempÚunempTÚstanceÚlastÚnextÚpricingz2.1%z2.2%z1.0%z6.3%zMay 2025z
Dovish Easingz Cut to 2.65%zJul 17z1 more cut 2025z3.5%z3.3%z1.3%z4.4%z
Cautious HoldzAug 7z 1 cut by Novz3.6%z3.2%z-0.7%z2.5%zGradual Tighteningz
Hold 0.50%zJul 31zHike to 0.75% H2z0.6%z0.3%z1.4%ÚNeutralz Cut to 0.25%zSep 18zHold through 2025z2.9%z2.7%z1.7%z6.7%ÚEasingz Cut to 2.75%z4.0%z Cut to 3.85%zAug 5z1-2 cuts by Decz0.7%z5.1%z Easing Cyclez Cut to 3.50%zJul 9z2 more cuts 2025z2.3%z1.1%z8.9%z Dovish Holdz
Hold 2.25%zAug 20z1.5%z4.1%zAug 14z Cut Q4 2025ÚgoldÚGoldz$/oz)r=r1ÚunitÚsilverÚSilverÚwtiz WTI Crudez$/bblÚbrentz Brent CrudeÚnatgasz Natural Gasz$/MMBtuÚcopperÚCopperz$/lbÚwheatÚWheatu¢/buÚcornÚCorn)zGC=FzSI=FzCL=FzBZ=FzNG=FzHG=FzZW=FzZC=FÚSPYzS&P 500ÚQQQz
Nasdaq 100ÚIWMz Russell 2000ÚEEMz EM EquitiesÚFXIzChina Large CapÚEWJzJapan EquitiesÚEWZzBrazil EquitiesÚEWGzGermany EquitiesÚEWUz UK EquitiesÚUUPzUS Dollar IndexÚFXEzEuro ETFÚFXYzYen ETFÚFXBzGBP ETFÚFXAzAUD ETFÚFXCzCAD ETFÚGLDzGold ETFÚUSOzOil ETFzAgriculture ETFz
Energy SectorzFinancials Sector)ÚDBAÚXLEÚXLFzVIX (S&P 500 Vol)zVXN (Nasdaq Vol)zMOVE (Bond Vol)zVIX Short-Term ETF)z^VIXz^VXNz^MOVEÚVIXYzEURUSD=XÚEURUSDzGBPUSD=XÚGBPUSDzUSDJPY=XÚUSDJPYzUSDCHF=XÚUSDCHFzAUDUSD=XÚAUDUSDzNZDUSD=XÚNZDUSDzUSDCAD=XÚUSDCADzUSDSEK=XÚUSDSEKzUSDNOK=XÚUSDNOKzUSDCNY=XÚUSDCNYzUSDMXN=XÚUSDMXNzUSDBRL=XÚUSDBRLzUSDZAR=XÚUSDZARzUSDINR=XÚUSDINRzUSDKRW=XÚUSDKRWzUSDTRY=XÚUSDTRYzUSDPLN=XÚUSDPLNÚUSDHUFÚUSDCZKÚUSDSGDÚUSDIDRÚUSDTHBÚDXY)zUSDHUF=XzUSDCZK=XzUSDSGD=XzUSDIDR=XzUSDTHB=XzDX-Y.NYBcóDtsy d|}tddddœ}tj||d¬«}|j«|j «}t |t «rt|«d kry|d
2026-04-12 20:48:09 +00:00
}t|«dk\r|d nd}|jd «}|r|jd «nd}||t||z
d «nd} |||d
k7rt||z
2026-04-12 20:13:22 +00:00
|z d
zd «nd}
|| |
|jd«dœS#t$r} td|d| «Yd} ~ yd} ~ wwxYw)z8Fetch latest EOD data from EODHD for a bond/rate symbol.Nzhttps://eodhd.com/api/eod/ÚjsonÚ)Ú api_tokenÚfmtÚorderÚlimité©ÚparamsÚtimeoutérÚcloseéédÚdate)ÚvalueÚchangeÚ
pct_changer±z EODHD error (ú): ) ÚGOV_KEYÚrequestsÚgetÚraise_for_statusr¢Ú
isinstanceÚlistÚlenÚroundÚ ExceptionÚprint) ÚsymbolÚurlr«ÚdataÚlatestÚprevr²Ú
prev_valuer³r´Úes ú+/workspaces/FXandRatesDashboard/generate.pyÚfetch_eodhd_eodrÉÊsDå ØðØ*¨6¨(ÐÜ&¨vÀÈaÑPˆÜ L‰L˜ V°RÔ Ø ×ÑÔØv‰v‹xˆÜ˜$¤Ô¨T«°QªØØa‘ˆÜ˜d›) qš.ˆtAŠw¨dˆØ
2026-04-12 20:48:09 +00:00
˜7Ó#ˆÙ*.T—XX˜&°Dˆ
Ø16Ð1BÀzÐG]”u˜)¨1Ô-ÐcgˆðÐ  ZÐ%;À
ÈaÂô
5˜:ÑÑ3°cÑ9¸1Ô ð ð ØØ—JJ˜
2026-04-12 20:13:22 +00:00
ð
øô òÜ
 ˜x s¨1¨#Ðûðús‰A&C;Á0B
C;Ã; DÄDÄDcó¦tstd|«y d}|tdd|dœ}tj||d¬«}|j «|j «}|jd g«Dcgc]
}|d
d k7sŒ |Œ}}|rt
|d d
«Std
|«ycc}w#t$r}td|d|«Yd}~yd}~wwxYw)z!Fetch latest value from FRED API.z FRED key missing for Nz3https://api.stlouisfed.org/fred/series/observationsr¢Údesc)Ú series_idÚapi_keyÚ file_typeÚ
sort_orderr¨é
Ú observationsr²ú.rz No valid FRED obs for z FRED error (rµ)ÚFRED_KEYr¿r¸Úfloatr¾) rÌÚobsrÇs Ú
fetch_fredr×ëå Ü
2026-04-12 20:48:09 +00:00
РðàØØ Øñ 
2026-04-12 20:13:22 +00:00
ˆô
2026-04-12 20:48:09 +00:00
L‰L˜ V°RÔ Ø ×ÑÔØv‰v‹xˆØŸ(™( >°2ÓLQ¸!¸G¹*ÈÓ:KŠqÐРܘ˜Q™ Ó 
2026-04-12 20:13:22 +00:00
Ш Ð ùò
Møô ò
˜y˜k¨¨Q¨CÐ ûð2ús6—AB,Á1
B'Á?B'ÂB,ÂB,Â'B,Â, CÂ5C à Ccó¼i}t|j««} tj||dd¬«}|D}||} t |«dk(r|d}n|d|}|j «}t |«dk\rt
t|jd«d«} t |«dk\r"t
t|jd «d«nd
2026-04-12 20:48:09 +00:00
}
2026-04-12 20:13:22 +00:00
|
2026-04-12 20:48:09 +00:00
r|
2026-04-12 20:13:22 +00:00
d kDrt
| |
z dz
d zd«nd
} | |
| t|jd«d
œ||<ŒÖ |S#t$r} td|d| «Yd
} ~ Νd
2026-04-12 20:48:09 +00:00
} ~ wwxYw#t$r} td| «Yd
} ~ |Sd
2026-04-12 20:13:22 +00:00
} ~ wwxYw)z;Fetch quotes from Yahoo Finance for a dict of ticker: name.FT©ÚperiodÚprogressÚthreadsr­ÚCloseéÿÿÿÿr¯éþÿÿÿNr)ÚpriceÚ
prev_closeÚ
change_pctÚ timestampz yfinance parse error (rµz yfinance batch error: )
ÚkeysÚyfÚdownloadr¼Údropnar½ÚilocÚstrÚindexr¾r¿)
Ú tickers_dictrÚÚresultsÚ ticker_listrÃÚtickerr1Ú close_seriesÚclosesrbÚchgrÇs
Úfetch_yf_quotesròs{à€GÜ+€Kð{‰{˜;¨vÀÈtÔà Aˆ Ñ'ˆ
AÜ# (Ø#'¨¡=Là#'¨¡=°Ñ#8%×.Üv“; !Ò ¤ v§{¡{°2¡Ó!7¸Ó;DÜ?BÀ6»{ÈaÒ?Oœ5¤ v§{¡{°2¡Ó!7¸Ô;ÐUYDÙ?CÈÈqÊœ% ¨¡¨q¡°CÑ 7¸Ô;ÐVZ"&Ø&*Ø&)Ü%(¨¯©°bÑ)9Ó%:ñ %G˜DMøñ Að6 €Nøô
ò
AÜа¸¸A¸3Ð@ûð
Aûô ò
ШР€Nûð.úsB#D9ÁC DÄ
D9Ä D6ÄD1Ä,D9Ä1D6Ä6D9Ä9 EÅEÅEcóŠi}t|j««} tj||dd¬«}|D]9}||} t |«dk(r|dj «}n|d|j «}t |«dkrŒQt
|jd«}t |«dk\rt
|jd«nd } t |«d
k\rt
|jd «nd }
t |«d k\rt
|jd
«nd } t|d«| rt|| z dz
dzd«nd |
rt||
z dz
dzd«nd | rt|| z dz
2026-04-12 20:48:09 +00:00
dzd«nd dœ||<Œ< |S#t$r} td|d| «Yd } ~ Œ`d } ~ wwxYw#t$r} td| «Yd } ~ |Sd } ~ wwxYw)z9Fetch longer history for calculating 1W, 1M, YTD changes.FTrÙr­éúÿÿÿééêÿÿÿr¯©Úd1_pctÚw1_pctÚm1_pctz History parse error (rµz History batch error: ) r¿)
r1rbÚd1Úw1Úm1rÇs
Úfetch_yf_historyrÿ,à€GÜ+€Kð{‰{˜;¨vÀÈtÔà @ˆ Ñ'ˆ
@Ü# ! '™]×3! '™]¨6Ñ2×;v“; ’?Øä˜VŸ[™[¨™_Ó-Ü/2°6«{¸aÒ/?”U˜6Ÿ;™; r™?Ô+ÀTÜ/2°6«{¸aÒ/?”U˜6Ÿ;™; r™?Ô+ÀTÜ03°F³ ¸rÒ0A”U˜6Ÿ;™; ,Àtô# ^ÙACœe T¨B¡Y°¡]°cÑ$9¸ÙACœe T¨B¡Y°¡]°cÑ$9¸ÙACœe T¨B¡Y°¡]°cÑ$9¸ñ !˜
ñ! @ð8 €Nøô
2026-04-12 20:13:22 +00:00
ò
@ÜШx°s¸1¸>×?ûð
@ûô ò
Р+× €Nûð-úsO$F ÁAE8ÂF  C)E8Å2F Å8 FÆFÆF ÆFÆF Æ GÆ)F=Æ=Gc
ó‚tsgS d|dt}tj|d¬«}|j«}|ddDcgc]J}|jdd«|jd d«|jd
2026-04-12 20:48:09 +00:00
d«|jd d «|d
œŒLc}Scc}w#t$r}t d|«gcYd}~Sd}~wwxYw)zFetch news from Finnhub.z(https://finnhub.io/api/v1/news?category=ú&token=rЩÚheadlinerÚsourcerÁrr©rrrÚcategoryz Finnhub news error: )Ú FINNHUB_KEYr·r¸r¿)rÚarticlesÚarÇsÚfetch_finnhub_newsr Så Øˆ ðظ
2026-04-12 20:13:22 +00:00
À'Ì+ÈÐÜ L‰L˜ bÔ Ø—6‘6“8ˆð˜c˜r 
ðð
ŸE™E *¨bÓŸ%™% ¨"Ó—uu˜U ŸE™E *¨aÓ 
ò 
ð
ùò 
øô òÜ
2026-04-12 20:48:09 +00:00
Ð& q  ûðús0Š:BÁABÂBÂBÂ B>Â$B9Â3B>Â9B>c
ó\tsgS tj«jd«}tj«t d¬«zjd«}d|d|dt}t j |d¬«}|j«}|j
d g«}|d
2026-04-12 20:13:22 +00:00
d Dcgc}|j
d d
«d
2026-04-12 20:48:09 +00:00
d|j
2026-04-12 20:13:22 +00:00
d d
2026-04-12 20:35:22 +00:00
«dd|j
2026-04-12 20:13:22 +00:00
dd
«|j
dd
«|j
d«|j
d«nd|j
d«|j
d«nd|j
d«|j
d«nd|j
d«dk(rdnddœŒÑc}Scc}w#t$r}td|«gcYd
}~Sd
}~wwxYw)z%Fetch economic calendar from Finnhub.ú%Y-%m-%dé)Údaysz1https://finnhub.io/api/v1/calendar/economic?from=z&to=rrÚeconomicCalendarNé(Útimeré ér2ÚeventrÅõ—ÚestimateÚactualÚimpactÚhighÚredÚorange)rÚctryÚevrÅÚfcastÚactÚimpz Finnhub calendar error: )
rrÚnowÚstrftimerr¸r¿)ÚtodayÚfuturerÁÚeventsrÇsÚfetch_finnhub_calendarr'jå Øˆ ðÜ ×
ÓÜ—,,“.¤9°!Ô#4Ñ4×>¸JˆØAÀ%ÀÈÈVÈHÐT[Ô\gÐ[hÐÜ L‰L˜ bÔ Øv‰v‹xˆØÐ,¨bÓð˜C˜R 
ððŸ˜f bÓ)¨#¨2П˜f )¨"¨RП˜i¨Ó—e‘e˜G RÓ(Ø)*¯©¨v«Ð)B˜Ÿ˜fœ
ÈØ./¯e©e°JÓ.?Ð.K˜Ÿ˜*ÐQYØ*+¯%©%°«/Ð*Eq—u‘u˜X”È8Ø !§¡ h£°6Ò 9‘u¸xó
ò 
ð
ùò 
2026-04-12 20:48:09 +00:00
øô òÜ
2026-04-12 20:13:22 +00:00
Ð*¨1¨#Ð ûðús1ŠB"FÂ,CFÆFÆFÆ F+ÆF&Æ F+Æ&F+có ddlm}d}dddœ} t j
2026-04-12 20:48:09 +00:00
||d¬ «}|j
«td
2026-04-12 20:13:22 +00:00
|jd t|j««||jd «}g}|jd
2026-04-12 20:48:09 +00:00
«D]T}|jxsd}d|vsŒd|vsŒtj|«}|j di«j dg«}n|s
2026-04-12 20:13:22 +00:00
td«gSg} |D}
2026-04-12 20:48:09 +00:00
|
j dd«} |
j dd«} |
j dd«}
|
j d«}|
j d«}|
j d«}|
j dd«}|
r|
ddnd}t|
«dkDr|
2026-04-12 20:13:22 +00:00
ddnd}d}| |ž tt|«j!d d«j!d!d««}tt|«j!d d«j!d!d««}|
2026-04-12 20:48:09 +00:00
j d"d«}|r||kDrd#n||krd$nd%}n||krd#n||kDrd$nd%}|d&k\rd'n|d(k\rd)nd)}| j'||d*| | rd+| d,ndz| t|«nd-| t|«nd-| t|«nd-||d.d/œ
«Œ¢td0t| ««| dd1S#t$rtd«gcYSwxYw#t"t$f$rYŒ«wxYw#t($r}
td2|
«gcYd}
2026-04-12 20:13:22 +00:00
~
Sd}
~
wwxYw)3uQFetch economic calendar from Finviz — data is embedded as JSON in a script tag.r)Ú
BeautifulSoupu0 bs4 not installed — skipping Finviz calendarz https://finviz.com/calendar.ashxz<Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36zen-GB,en;q=0.9)ú
User-AgentzAccept-Languageé)Úheadersr¬z Finviz status: z, html length: z html.parserÚscriptrÚentriesÚ
calendarIdrÃz' Finviz: no JSON entries found in pagerÚ referencer±rÚforecastÚpreviousÚ
importancer­NrÐrrúisHigherPositiveÚbeatÚmissÚinlineérrõ🇺🇸ú)rÚfinviz)
rrrrr r!r7rz Finviz parsed rows: é<z Finviz calendar error: )Úbs4r)Ú ImportErrorr¿r¸Ú status_coder¼ÚtextÚfind_allÚstringr¢ÚloadsrÔÚreplaceÚ
ValueErrorÚ TypeErrorÚappendr¾)r)r,Úsoupr.r-ÚtxtrÃÚrowsrÇÚev_nameÚrefÚdtrr1r2r3Údate_strÚtime_strr7Úa_valÚf_valÚ higher_goodr!sÚfetch_finviz_calendarrVs7ðÝ
-€Cà€Gð
CÜ L‰L˜ g°rÔ Ø ×ÑÔÜ
Ð! !§-¡- °ÄÀAÇFÁFà ¸}ИQŸV™V ]ÓðˆØ—m‘m HÓ ˆFØ—-‘-Ò% 2ˆCؘCÒ L°CÒ$7Ü—z‘z #“ØŸ(™( 6¨2Ó2°9¸bÓAÙð  ñÜ Ð ˆˆØó' ˆ—ee˜G (ˆ—%‘%˜  RÓ(ˆv˜"ˆBØ—UU˜8“_ˆFØ—u‘u˜ZÓ(ˆHØ—u‘u˜ZÓ(ˆHØŸ˜|¨QÓ/ˆJá"$r˜#˜2w¨"ˆHÜ$'¨£G¨b¢Lr˜"˜Ry°bˆˆÐ! hÐ&:ð Ü!¤# f£+×"5Ñ"5°c¸2Ó">×"FÑ"FÀsÈBÓ"OÓP!¤# h£-×"7Ñ"7¸¸RÓ"@×"HÑ"HÈÈbÓ"QÓREØ"#§%¡%Ð(:¸AÓ">"Ø).°ª™vÀuÈuÂ}¹VÐZb™à).°ª™vÀuÈuÂ}¹VÐZb˜ðš?%¸ZÈ1º_±ÐRZˆ K‰KØ Ø Ø ˜ ±S¨¨3¨%¨q¡k¸AØ)1Ð)=œ˜
À5Ø*2Ð*>œ˜ÀEØ&,Ð&8”s˜6”{¸ØØ ö
ð9' ôR Ð&¤s¨4£y CRˆyÐøôS òÜ
Њ ðûôl#¤IÐÙðûô* òÜ
Ð)¨!¨Ð ûðúsiJ5BK&Â$K&Â)AK&Ã2B'K&ÆBKÈ7A=K&Ê5KË
KËK#Ë K&Ë"K#Ë#K&Ë& L Ë/LË>L ÌL c
óDddlmcm}ddg}g}|D\}} tj|dddi¬«}|j |j «}|jd «ddD]€}|jd
d «}|jd d «} |jd
d «}
ttj|
d«j««} |sŒj|j||| | ddœ«Œ‚ŒÔ|S#t$rd} YŒ-wxYw#t$r} td|d| «Yd} ~ Œd} ~ wwxYw)z3Fetch news from free RSS feeds (no API key needed).rN)z:https://feeds.content.dowjones.io/public/rss/mw_topstoriesÚ MarketWatch)z.https://feeds.bbci.co.uk/news/business/rss.xmlz BBC BusinessrÐr*z FXRadar/1.0)r,z.//itemÚtitlerÚlinkÚpubDatez%a, %d %b %Y %H:%M:%S %ZÚgeneralrz
RSS error (rµ)Úxml.etree.ElementTreeÚetreeÚ ElementTreer·r¸Ú
fromstringÚcontentÚfindallÚfindtextÚintrÚstrptimerãrJr¿)
ÚETÚfeedsr rÚrootÚitemrYrZÚpubÚpub_tsrÇs
Úfetch_rss_newsrlÛs@ç VØ
€Eð€HØò2‰ ˆˆVð ˜S¨"°|À]Ð6SÔTˆ—=‘= §¡Ó+ˆDØŸ  YÓ°Ð
ØŸ
 g¨rÓ2Ø—}} V¨RÓ0Ø—m‘m I¨rÓ2ðÜ ¤×!2Ñ!2°3Ð8RÓ!S×!]Ñ!]Ó!_Ó`Ø—OOØ$)Ø"(Ø#Ø$*Ø$-ñ %õñ
ð 2ð, €OøôØ’Fðûôò M & ¨¨Q¨CÐ0× 1ûð 2úsB™BC:Â-C)à C:à C:Ã) C7Ã4C:Ã6C7Ã7C:Ã: DÄDÄDcó˜ tj||dd¬«}|dj«}t|«dkryt |j
d«}t|«dk\rt |j
d«nd}t|«dk\rt |j
d «nd}t|«d
k\rt |j
d «nd}t
|d «|rt
||z d
z
dzd«nd|rt
2026-04-12 20:48:09 +00:00
||z d
z
dzd«nd|rt
||z d
z
2026-04-12 20:35:22 +00:00
dzd«dœSddœS#t$r} td|d| «Yd} ~ yd} ~ wwxYw)zEFallback: fetch a single ticker individually if batch download fails.FrÙNrÞr­z Single ticker history error (rµ) rår¿)
2026-04-12 20:13:22 +00:00
r1rbs
Úfetch_single_ticker_historyrnýsIðÜ{‰{˜6¨&¸5È%ÔPˆØg×Ü ˆv‹;˜Š?ØÜV—[[ %ˆÜ'*¨6£{°aÒ'7ŒU6—;;˜r
2026-04-12 20:35:22 +00:00
#¸TˆÜ'*¨6£{°aÒ'7ŒU6—;;˜r
#¸TˆÜ(+¨F« °rÒ(9ŒU6—;;˜
$¸tˆä˜4 “^Ù9;”e˜T B™Y¨™]¨cÑ1°1ÔÙ9;”e˜T B™Y¨™]¨cÑ1°1ÔÙ9;”e˜T B™Y¨™]¨cÑ1°1Ó
ð
ðBFñ 
ð
øô òÜ
Шx°s¸1¸#Ðûðús#:D%½C#D%Ä!D%Ä% E Ä.EÅE cóć2—td«tdtj«jd««td«tj«j «dziiiiiiggiiiiidœ}td«i}t j«D]>\}}t|«}||||<td|d|d «tjd
«Œ@|jd «|jd «|jd
«|jd«|jd«|jd«|jd«|jd«|jd«|jd«|jd«dœ |dd<td«tj«D]—\}}i}|j«D]A\}}t|«}||||<td|d|d|d «tjd
«ŒC|sŒ_|jd«|jd«|jd«dœ|d|<Œ™td«tddd d!d"œ«}|j«D]\Š2} td‰2d| d#«Œ|djdi«}
|
jd$«|jd«r |dd#|
d$<|
jd%«|jd«r |dd#|
d%<|
jd&«|jd «r |d d#|
d&<|
jd'«|jd!«r |d!d#|
d'<|
jd(«€ûtd)« d*D]b} tj| d+d,¬-«} | j rŒ(| d.j#«}
t%|
2026-04-12 20:13:22 +00:00
«d/kDsŒJt'|
j(d0«}n|
jd(«€w|
jd$«}|
jd%«}|-|+t-|||z
d2zzd3«|
d(<td4|
2026-04-12 20:48:09 +00:00
d(d «n&|$t-|d5z
d3«|
d(<td6|
d(d «|
2026-04-12 20:13:22 +00:00
jd(« td7«|
|dd<||dd8<td9«t/t0j«Dcic] \}}||d:Œ
c}}«}i}td;t3|j5«««t0j«D\}}|d:Š2|d<}|j‰2«}|rC|jd=d>«|d=<|||<td‰2d?|d#d@|jdAdB«dC«Œft7|‰2«}|sŒu|jd=d>«|d=<|||<td‰2dD|d#d@|jdAdB«dC«Œ¸||dE<tdF«t/t8«}|j«D]-\Š2} td‰2d?| d#d@| jdAdB«dC«Œ/||dG<tdH«t/t:j«Dcic] \}}||d:Œ
c}}«}|j«D]V\Š2} t=ˆ2fdI„t:j«D«i«}|jdJd>«| dJ<|jdKd>«| dK<ŒX||dL<tdM«tt>«}|j«D]\Š2} td‰2d| d#«Œ||dN<tdO«t/t@«}|j«D]-\Š2} td‰2d| d#d@| jdAdB«dC«Œ/||dP<tdQ«tCdR«tCdS«z}tE«} || z}!tG«}"g}#|!D]1}$|$dTddU}||"vsŒ|"jI|«|#jK|$«Œ3|#ddV|dW<tdt%|#«dX«tdY«tM«}%tO«}&tdZt%|&««td[t%|%««|&r.|%Dcgc]}|jd\d«dk7sŒ|Œ}'}|&|'z|d]<nD|%r|%|d]<n<td^«tj«jd_«d`dadbdcdcdcddddeœ g|d]<tdft%|d]««tdg«tP|dh<tR|di<tdjt%|dh«dk«tdlt%|di«dk«tdm«tTrqtVj«D]z\}(}tY|(«})|)rS|dn|)dn<|dJ|)dJ<|)|do|d<<|)dp}|)jdq«}*|*d@|*drdsnd>}+td|dnd|d |+«tjdt«Œ|tdut%|do«dv«idwdx“dydz“d{d|“d}d~“dd€“dd‚“dƒd„“d…d†“d‡dˆ“d‰dŠ“d‹dŒ“ddŽ“ddd‘d’“d“d”“d•d–“d—d˜“d™dšd›dœddždŸd d¡œ¥},|,j«D]f\}-\}}|doj|-«}.|.sŒ |.jdp«Œ2||dvri|d|<|d|j|«ŒY|.dp|d||<Œhtd¢«n td£«t[t\«}/t_|/d¤«5}0tajb||0d¥td¬¦«ddd«|/jg«jhd§z }1td¨d«td©t\d@|1dª›«td¬t%|d«dk«td­t%|dE««td¯t%|dG««td±t%|dP««td³t%|dW«d´«tdµt%|d]««td·t%|do««td«y#t*$r}td1|«Yd}~ŒYd}~wwxYwcc}}wcc}}wcc}w#1swYŒLxYw)¸Nz<============================================================uFX RA
2026-04-12 20:48:09 +00:00
volatilityÚ bond_etfsÚnewsÚcalendarÚ policy_ratesÚmacroÚ sentimentÚ scenariosÚ gov_bondsz+
[1/8] Fetching US yield curve from FRED...z US z: r4gš™™™™™É?rrrrrrrrrrr) Úy1mÚy3mÚy6mÚy1Úy2Úy3Úy5Úy7Úy10Úy20Úy30rrrz*
2026-04-12 20:13:22 +00:00
[2/8] Fetching global yields from FRED...z ú )r‡r…z0
[3/8] Fetching yield data from Yahoo Finance...ÚUS_3MÚUS_5YÚUS_10YÚUS_30Y)r
r r r
r€r…r‡r‰z6 US 2Y missing from FRED, trying yfinance fallback...)zZT=FÚ5dF)rz US 2Y futures fallback error: g
×£p=
×?r:z! US 2Y interpolated from 3M/5Y: g333333Ã?z US 2Y estimated from 5Y: u= âš  US 2Y still null — carry/spread logic will be limitedÚUS_yfz
[4/8] Fetching commodities...r1z Commodity raw keys:r=rirz: $r<ú?z%)z (fallback): $rsz
[5/8] Fetching ETFs...rtz
[6/8] Fetching bond ETFs...c3ó:K|]\}}|dk(sŒ|Œy­w)r1)Ú.0Úvr1s €rÈú <genexpr>zmain.<locals>.<genexpr>£s øèø€ÒJ™4˜1˜a¸¸&¹ ÀTÓ8I”QÑJùsƒr2r3rwz"
[7/8] Fetching volatility data...rvz
[8/8] Fetching FX rates...ruz
[9] Fetching news...Úforexr\ré2rrxz unique articlesz
2026-04-12 20:48:09 +00:00
[10] Fetching calendar...z Finviz rows: z Finnhub rows: rryuA ⚠ Both calendar sources empty — inserting debug placeholderr
z08:30r;z[Calendar sources unavailable]rr) r±rrrrr r!r7z Final calendar rows: z*
[11] Loading policy rates & macro data...rzr{z Policy rates: z
countriesz Macro data: z-
[12] Fetching government bonds from EODHD...r>r~z+.3fr=g333333Ó?z
Fetched z bondsr<)rr?)rr‡r@)rr‰rA)rrB)rr‡rC)rr‰rD)r-rE)r-r‡rF)r-r‰rG)rrH)rr‡rI)rr‰rJ)ÚItalyrƒrK)r‡rL)ÚFrancer‡rM)ÚSpainr‡rN)r.)r.r‡)r/)r/r‡)rS)rSr‡)rVr‡)rXr‡)rZr‡)rOrPrQrRrTrUrWrYz$ Backfilled yields from EODHD bondsu5 EODHD API key not set — skipping government bondsÚwr¤)ÚindentÚdefaultiú
u✓ Generated z.1fz KB)z