Ë
    ²kj&  ã                  óz  — d Z ddlmZ ddlZddlZddlZddlm	Z
 ddlmZ ddlmZ ddlmZmZ ddlmZ  ej&                  d	d
d¬«        ej(                  «         ej*                  dd¬«      drd„«       Z ej*                  dd¬«      dsd„«       Z ej*                  dd¬«      dtd„«       Z ej*                  dd¬«      dud„«       Zej4                  5   ej6                  d«        ej8                  d e ej<                  «       «      «      Z ee«      Z  ejB                  dd e" e#e «      d«       e"d e#e «      «      d¬«      Z$ ejJ                  «         ejL                  d«        ejN                  d «       eD � ci c]  } |  ejB                  | d!d"d#d$«      “Œ c} Z( ejJ                  «         ejR                  d%d&¬'«      Z* ejV                  d(d)d*¬+«      Z, ejJ                  «         ejZ                  «        ddd«        ej\                  d,«      5   ej^                  «       D ]  \  Z0Z1 ejd                  d-e0› d.e1› �«       Œ  ejf                  d/«       ddd«       e,�re*ji                  «       rMe*jk                  d0«      D �cg c]1  }|ji                  «       sŒ|ji                  «       jm                  «       ‘Œ3 c}Z7ne de$ Z7 ejp                  d!d1 e#e7«      › d2�¬3«      Z9 ee7d4„ ¬5«      Z:e9jw                  «        e:jv                  r# ejx                  d6«        ejz                  «        d7„ Z>e:j                  e>d8¬9«      e:d:<   e:j�                  d:dd;¬<«      jƒ                  d*¬=«      Z:e:ej„                  d><   ej„                  j‡                  d>«      Z:e:��‰e:jv                  �s| ejL                  d?«        ejˆ                  d@«      ZE eFeEe«      D ]l  \  ZGZ0e:e0   j‘                  «       j“                  «       r e:j”                  e:e0   j—                  «          ndZLeL€ŒLeGj›                  dAe0› �eLdB   › eLe0   dC›dD�«       Œn  ejœ                  e:d*d*ejž                  j¡                  dEddFdG¬H«      ejž                  j¡                  dIddFdG¬H«      ejž                  j¡                  dJddFdG¬H«      ejž                  j¡                  dKddFdG¬H«      ejž                  j£                  dLdM¬N«      ejž                  j£                  dOdP¬N«      dQœ¬R«       e:j¥                  d¬S«      j§                  dT«      ZT ejª                  dUeTdVdW«        ejJ                  «         ejL                  dX«        ej8                  dYe:dB   j­                  «       «      ZWeW�r˜ eeW«      ZX ej^                  «       D � �ci c]  \  } }|  |eX«      “Œ c}} ZY ejˆ                   e#e«      «      ZZ eFeZeYj_                  «       «      D ]Ã  \  ZG\  Z0Z[eG5   ejd                  d-e0› d-�«        ejš                  dZe[j¸                  dC›dD�e[jº                  «       e[j¼                  D ]^  Z_e_jÀ                  €d[ne_jÀ                  d\›Zae_j¸                  €d[ne_j¸                  d]›Zb ejN                  e_j`                  › d^ea› d_eb› �«       Œ` 	 ddd«       ŒÅ  ejJ                  «         ejL                  d`«        ejÆ                  «       s ejN                  da«       n] ejV                  dbeW› �dc¬d«      rF	  ejÈ                  eW«      Ze eeW ejÌ                  eXeYee«      «      ZgeWeg e#ee«      fej„                  de<   ej„                  j‡                  de«      Zkekr®ekd   eWk(  r¥ek\  ZlZgZm ejf                  dg«        ejˆ                  d8d@g«      \  ZnZoenj›                  dhegdi   › dD�egdj   «       eo5  egdk   D ]  Zp ejd                  dlep› �«       Œ 	 ddd«        ejd                  dmegdn   › �«        ejN                  doem› dp�«       yyyy ejf                  dq«       yc c} w # 1 sw Y   �Œ@xY w# 1 sw Y   �ŒïxY wc c}w c c}} w # 1 sw Y   �Œ~xY w# eh$ r<Ziej„                  jÕ                  ded«        ejx                  dfei› �«       Y dZi[i�ŒSdZi[iww xY w# 1 sw Y   ŒÉxY w)vu  Multi-strategy stock screener â€” Streamlit dashboard.

Screens a universe of stocks through four investing philosophies
(Buffett, Burry, Roaring Kitty, Simons) and ranks them. Free data via
yfinance. Educational tool only â€” not investment advice.

Run:  streamlit run app.py
é    )ÚannotationsN)Údata)Ú	sentiment)Úscreen)ÚDESCRIPTIONSÚ
STRATEGIES©Ú	UNIVERSESzMulti-Strategy Stock Screeneru   ðŸ“ˆÚwide)Ú
page_titleÚ	page_iconÚlayoutFi  )Úshow_spinnerÚttlc                ó   — t        |    «       S ©Nr	   )Únames    úapp.pyÚ_resolve_universer      s   € ä�T‰?ÓÐó    i  c                ó*   — t        t        | «      «      S r   )r   Úlist)Útickerss    r   Ú_run_screenr      s   € ä”$�w“-Ó Ð r   c                ó,   — t        j                  | «      S )u˜   Deep-dive fetch. Cached so reruns don't re-hit Yahoo â€” which also keeps
    the sentiment payload (and therefore its cache key) stable between reruns.)Údata_modÚfetch)Útickers    r   Ú_fetchr   $   s   € ô �>‰>˜&Ó!Ð!r   u   Reading the tapeâ€¦i`T  c                ó,   — t        j                  |«      S r   )r   Úanalyze)r   Úpayloads     r   Ú
_sentimentr#   +   s   € ä×Ñ˜WÓ%Ð%r   ÚControlsÚUniversezMax tickers to scané   iù  é(   z6Fewer tickers = faster. Yahoo rate-limits large scans.)ÚhelpzStrategy weightsz4Reweight the composite to match your own conviction.g        g       @g      ð?gš™™™™™¹?z,Or screen specific tickers (comma-separated)zAAPL, GME, BRK-B)Úplaceholderz
Run screenÚprimaryT)ÚtypeÚuse_container_widthzHow each lens scores a stockz**u   ** â€” uÖ   Scores are 0â€“100 relative to hand-tuned metric bands, not buy signals. Missing data is excluded from the average, not scored. Free Yahoo fundamentals are sometimes stale or absent â€” always verify before acting.ú,z
Screening u    tickersâ€¦©Útextc                óB   — t         j                  | |z  d| › d|› �¬«      S )Nz	Screened ú/r.   )ÚprogÚprogress)ÚdÚts     r   ú<lambda>r6   U   s)   € ¬D¯M©M¸!¸a¹%È	ÐRSÐQTÐTUÐVWÐUXÐFY¨MÓ,Z€ r   )r3   uC   No data returned. Yahoo may be rate-limiting â€” try fewer tickers.c                ó2  — g g }}t         j                  «       D ]X  \  }}t        j                  | j	                  |«      «      sŒ+|dkD  sŒ1|j                  | |   |z  «       |j                  |«       ŒZ |r!t        t        |«      t        |«      z  d«      S d S )Nr   é   )ÚweightsÚitemsÚpdÚnotnaÚgetÚappendÚroundÚsum)ÚrowÚvalsÚwsr   Úws        r   Ú	_weightedrE   ]   s€   € Ø�rˆbˆÜ—}‘}“ò 	‰GˆD�!Ü�x‰x˜Ÿ™ ›Õ&¨1¨q«5Ø—‘˜C ™I¨™MÔ*Ø—	‘	˜!•ð	ñ 13Œu”S˜“Y¤ R£Ñ(¨!Ó,Ð<¸Ð<r   r8   )ÚaxisÚWeightedÚlast)Ú	ascendingÚna_position)ÚdropÚresultÚResultsé   zTop ÚTickerz.0fz/100ÚBuffettéd   z%.0f)Ú	min_valueÚ	max_valueÚformatÚBurryúRoaring KittyÚSimonsu   Weighted â­�z%.1f)rT   ÚPricez$%.2f)rP   rU   rV   rW   rG   rX   )r,   Ú
hide_indexÚcolumn_config)Úindexzutf-8zDownload CSVzscreen_results.csvztext/csvz	Deep divezInspect a tickerÚScoreu   â€”z.3gz.0%z: `u   `  Â·  zAI sentiment readzpSet `ANTHROPIC_API_KEY` (environment variable, or in `.streamlit/secrets.toml`) to enable the AI sentiment read.u   Analyse sentiment â€” Ú	secondary)r+   r   zSentiment read failed: u|   AI-generated from recent public headlines. Educational only â€” **not investment advice.** Verify every claim before acting.Ú	SentimentÚscoreÚverdictÚbulletsz- z**Watch next:** Ú
suggestionz	Based on z2 Yahoo Finance headline(s) plus the metrics above.zBSet your universe and weights in the sidebar, then **Run screen**.)r   ÚstrÚreturnz	list[str])r   ztuple[str, ...]rd   zpd.DataFrame)r   rc   rd   zdata_mod.StockData)r   rc   r"   rc   rd   Údict)qÚ__doc__Ú
__future__r   Úpandasr;   Ú	streamlitÚstÚthemeÚscreenerr   r   r   Úscreener.enginer   Úscreener.strategiesr   r   Úscreener.universer
   Úset_page_configÚinjectÚ
cache_datar   r   r   r#   ÚsidebarÚheaderÚ	selectboxr   ÚkeysÚuniverse_namer   ÚsliderÚminÚlenÚlimitÚdividerÚ	subheaderÚcaptionr9   Ú
text_inputÚcustomÚbuttonÚrunÚ
soundtrackÚexpanderr:   r   ÚdescÚmarkdownÚinfoÚstripÚsplitÚupperÚscanr3   r2   ÚdfÚemptyÚerrorÚstoprE   ÚapplyÚsort_valuesÚreset_indexÚsession_stater=   ÚcolumnsÚtop_colsÚzipÚcolr<   ÚanyÚlocÚidxmaxÚbestÚmetricÚ	dataframerZ   ÚProgressColumnÚNumberColumnÚto_csvÚencodeÚcsvÚdownload_buttonÚtolistÚpickÚsdÚresultsÚcolsÚresr_   r`   ÚsignalsÚsÚvalueÚvalÚpctÚ	availableÚ	headlinesÚnewsr"   ÚreadÚ	ExceptionÚexcÚpopÚcachedÚ_Ún_newsÚheadÚbodyÚb)r   r5   Úevaluates   000r   ú<module>r½      s�  ðñõ #ã Û ã Ý %Ý Ý "ß 8Ý 'à €× Ñ Ð=ÈÐX^Õ _à €‡�„ð €‡�˜E wÔ/òó 0ðð €‡�˜E wÔ/ò!ó 0ð!ð €‡�˜E wÔ/ò"ó 0ð"ð €‡�Ð1°{ÔCò&ó Dð&ð
 ‡Z�Zñ Ø€B‡I�IˆjÔØ �B—L‘L ©T°.°)·.±.Ó2BÓ-CÓD€MÙ Ó.€GØˆB�I‰IÐ+¨Q±±C¸³LÀ#Ó0FÉÈBÑPSÐT[ÓP\ÓH]ØSôU€Eà€B‡J�J„LØ€B‡L�LÐ#Ô$Ø€B‡J�JÐEÔFØEOÖP¸Tˆt�Y�R—Y‘Y˜t S¨#¨s°CÓ8Ñ8ÒP€GØ€B‡J�J„LØˆR�]‰]ÐIØ'9ô;€Fà
ˆ"�)‰)�L yÀdÔ
K€CØ€B‡J�J„LØ€E×ÑÔ÷ð" €R‡[�[Ð/Ó0ñ Ø(�l×(Ñ(Ó*ò .‰
ˆˆdØˆ�‰�b˜˜˜g d VÐ,Õ-ð.à€B‡G�Gð	Eô÷ò Ø‡|�|„~Ø+1¯<©<¸Ó+<ÖJ aÀÇÁÅ	�—‘“	—‘Õ!ÒJ‰à�v˜ˆˆàˆ2�;‰;�s :©c°$«i¨[¸Ð!DÔE€Dñ 
�ÑZÔ	[€BØ‡J�J„Là	‡x‚xØˆ�‰ÐVÔWØˆ�‰Œ	ò=ð —X‘X˜i¨a�XÓ0€B€z�NØ	�‰˜
¨eÀˆÓ	H×	TÑ	TÐZ^Ð	TÓ	_€Bà!#€B×Ñ�XÑð ×Ñ×Ñ˜(Ó#€Ø�>˜"Ÿ(›(Ø€B‡L�L�Ôàˆr�z‰z˜!‹}€HÙ˜ :Ó.ò T‰	ˆˆTØ,.¨t©H¯N©NÓ,<×,@Ñ,@Ô,Bˆr�v‰v�b˜‘h—o‘oÓ'Ò(ÈˆØÑØ�J‰J˜˜d˜V�}¨¨h©Ð(8¸dÀ4¹jÈÐ=MÈTÐ;RÕSðTð
 €B‡L�LØ
Ø Øà×'Ñ'×6Ñ6°yÈAÐY\ÐekÐ6ÓlØ×%Ñ%×4Ñ4°WÈÐUXÐagÐ4ÓhØ×-Ñ-×<Ñ<¸_ÐXYÐehÐqwÐ<ÓxØ×&Ñ&×5Ñ5°hÈ!ÐWZÐciÐ5ÓjØ×(Ñ(×5Ñ5°nÈVÐ5ÓTØ×%Ñ%×2Ñ2°7À7Ð2ÓKñ
õ	ð �)‰)˜%ˆ)Ó
 ×
'Ñ
'¨Ó
0€CØ€B×Ñ�~ sÐ,@À*ÔMð €B‡J�J„LØ€B‡L�L�ÔØˆ2�<‰<Ð*¨B¨x©L×,?Ñ,?Ó,AÓB€DÚÙ�D‹\ˆà<L¸J×<LÑ<LÓ<N×O©.¨$°�4™ "›Ñ%ÓOˆØˆr�z‰z™#˜j›/Ó*ˆÙ # D¨'¯-©-«/Ó :ò 	@ÑˆC‘�$˜Øñ @Ø�—‘˜b   b˜MÔ*Ø�—	‘	˜' c§i¡i° _°DÐ#9¸3¿;¹;ÔGØŸ™ò @�AØ#$§7¡7 ?™%¸1¿7¹7À3¸-�CØ#$§7¡7 ?™%¸1¿7¹7À3¸-�CØ�B—J‘J !§&¡& ¨¨S¨E°¸¸Ð>Õ?ñ@÷@ð @ð	@ð 	ˆ�
‰
ŒØˆ�‰Ð(Ô)Ø"ˆy×"Ñ"Ô$ØˆB�J‰Jð Uõ VàˆR�Y‰YÐ/°¨vÐ6¸[ÕIð:Ø*�y×*Ñ*¨4Ó0�Ù! $Ð(9¨	×(9Ñ(9¸"¸gÀtÓ(LÓM�Ø15°t¹SÀ»YÐ0G�× Ñ  Ñ-ð
 ×!Ñ!×%Ñ% kÓ2ˆÙ�f˜Q‘i 4Ò'Ø$‰OˆAˆt�VØˆB�G‰Gð Sô Tà#˜Ÿ™ Q¨ FÓ+‰JˆD�$Ø�K‰K˜¨¨W© °dÐ%;¸TÀ)¹_ÔMØñ *Ø˜i™ò *�AØ�B—K‘K " Q C Õ)ñ*÷*ð ˆB�K‰KÐ*¨4°Ñ+=Ð*>Ð?Ô@ØˆB�J‰J˜ 6 (Ð*\Ð]Õ^ð (ˆ6ð= ðT €B‡G�GÐPÕQùòu Q÷ñ ú÷"ñ üò Kùó~ P÷@ñ @ûð& ò :Ø× Ñ ×$Ñ$ [°$Ô7Ø�—‘Ð2°3°%Ð8×9Ò9ûð:ú÷*ð *úsq   ÃB-`;Æ `6ÆA`;ÈAaÊ	aÊ aÖ&a×7B0a ÜAa- ß b1à6`;à;aáaá a*	á-b.á21b)â)b.â1b: