\.iDdZddlZddlZddlZddlZddlZddlmZmZddlm Z ddl m Z ddl m Z ddlmZddlmZmZmZmZmZdd lmZdd lmZdd lmZdd lmZdd lm Z ddl!m"Z"ddeddddedddde dddde"dddZ#d0de$fdZ%de$fdZ&d Z'd!e$d"ed#ed$efd%Z(d&Z)d'e*d$efd(Z+d)e,fd*Z-d+e,d"ed$efd,Z.d+e,d"efd-Z/d.Z0e1d/k(re0yy)1u, Warren AI - Scan Settimanale Multi-Mercato Analisi fondamentale stile Warren Buffett per mercati europei (IT, FR, DE) Usa calcoli deterministici invece di LLM per: - Velocità: ~2 secondi invece di 3-4 minuti - Affidabilità: niente errori di rete o rate limiting - Costo: $0 invece di $0.60 per scan Usage: python warren_scan.py # Default: FTSE MIB (IT) python warren_scan.py --market FR # CAC 40 (France) python warren_scan.py --market DE # DAX 40 (Germany) python warren_scan.py --market ALL # All markets (sequential) N)datetime timedelta)Path)desc)logger)DatabaseManager)Stock PriceDataFundamentalData OpportunityOpportunityDetailed)YahooFinanceCollector)WarrenAnalyzer)get_all_tickers)get_cac40_tickers)get_dax40_tickers)get_dow30_tickerszFTSE MIBzBorsa Italianau🇮🇹)name full_name tickers_funcflagzCAC 40zEuronext Parisu🇫🇷zDAX 40Xetrau🇩🇪z Dow Jones 30z NYSE/NASDAQu🇺🇸ITFRDEUSAsectorc(g}|j^|jdkr |jd|jdn/|jdkDr |jd|jdd|j^|jdkr |jd|jdn/|jdkDr |jd |jdd |j_|jd kr!|jd |jd dn/|jdkDr |jd|jd d|j.|jdkr|jd|jd|j ^|j dkr |jd|j dn/|j dkDr |jd|j dd|j |j|jdkDr|j |jz }d}|r|jnd}|rdD] }||vsd}n|}|r||}|r|dnd} || kr|jd|d d| d d!n|d"kDr|jd#|d d$|jk|j_|jdkDrP|j|jz } | d%kr|jd&| d'd(n| d)kDr|jd*| d'd+|j.|jd kr|jd,|jd |j/|jd-kr |jd.|jd d/t|dk(|fS)0u@ Valida qualità e range dei dati fondamentali. Blocca analisi su dati Yahoo corrotti o anomali. I valori fuori range generano errori, ma i campi mancanti sono gestiti separatamente. Args: fundamentals: FundamentalData object Returns: tuple: (is_valid: bool, issues: List[str]) rzPE ratio negativo: .2fdzPE ratio troppo alto: z (max 100)zPB ratio negativo: zPB ratio anomalo: z (max 20)gzROE troppo negativo: .1%z (min -50%)?zROE irrealistico: z (max 100%)zDebt/Equity negativo: zDividend yield negativo: z.2%g?zDividend yield sospetto: z (max 20%)F)auto automotive industrial machineryz capital goodsTggɿzFCF Yield troppo negativo: z (min z.0%)g?zFCF Yield anomalo: z (max 50%)zNet Debt/EBITDA anomalo: .1fz x (min -5) zNet Debt/EBITDA eccessivo: z x (max 10)zGross margin negativo: gz"Operating margin troppo negativo: z (min -100%))pe_ratioappendpb_ratioroedebt_to_equitydividend_yield free_cashflow market_caplowernet_debtebitda gross_marginoperating_marginlen) fundamentalsravg_fcf_yield_3yissues fcf_yieldis_auto_industrialsector_lkwfcf_yield_to_check min_thresholdnet_debt_ebitdas warren_scan.pyvalidate_fundamental_qualityrGGsF(  1 $ MM/ 0E0Ec/JK L  " "S ( MM2<3H3H2MZX Y(  1 $ MM/ 0E0Ec/JK L  " "R ' MM.|/D/DS.IS T#   d " MM1,2B2B31G{S T    # MM.|/?/?.DKP Q"".<3N3NQR3R .|/J/J3.OPQ"".  & & * MM5l6Q6QRU5VW X  ( (4 / MM5l6Q6QRU5VV`a b !!-,2I2I2U  " "Q &$22\5L5LLI!& )/v||~RH\BX~-1* "+ !&6&B%5"'9=M=YE`eM!M1 ;|?\?\]`>aamn o K1 f %%cg}t|dddkr|jd|Sd|vxsd|v}d|vxsd|v}|sY|sW|j|jd |j|jd |j|jd |j |j |jd |S) zt Genera warning se mancano i campi chiave per il calcolo v2. Non blocca l'analisi, ma informa l'utente. schema_versionz(Schema v1: FCF/EV/EBITDA non disponibiliBank Insurance UtilitiesEnergyz FCF mancantezEnterprise Value mancantezEBITDA mancantezDebito/Cassa mancanti)getattrr/r4enterprise_valuer8 total_debt total_cash)r<rwarnings is_financial is_utilitys rFcompleteness_warningsrXs H|-q1A5BCV#<{f'nd}|rtAjB|d|d||.|,|d kr'|dkDr"tAjD|d|dd|ddd}id|d|jFd|j.xsd d!|jd"|jd#|r |jHndd$|r |jJndd%|r |jLndd&|d'|d(|r |jNndd)|r |jPndd*|r |jRndd+|r |j&ndd,|r |jTndd-|r |j$ndd.|r |jVnd|r |jXnd|r |jZnd|r |j\nd||r |j^nd|r |j`nd|r |jbnd|r |jdnd|d/ }||fcdddS#1swYyxYw)0u Recupera dati dello stock dal database con validazione qualità Returns: tuple: (data_dict, warnings_list) or (None, [error]) if failed tickerNzStock not found in databasestock_idzNo price data availablerLzStale price data (z days old)rzInvalid price (<=0)z=No fundamental data available - cannot perform value analysisyfinance_cashflow)r] data_sourcer%)rr=zInvalid fundamental data: ; u ⚠️ z: D/E source = z , value = r$z': Net cash position detected (net_debt=z.0fz), overriding D/E from z.4fz to 0.0gr[rrN/Aprice price_dater.r0r1r2debt_to_equity_reportedr3revenue_growthearnings_growthr5betar4rR) r8r9r:r7 dividend_rateshares_outstandingrSrTr=)3 get_sessionqueryr filter_byfirstr idorder_bydaterr rnowdaysr/closelimitallr4r5sumr;rGrjoinprintextendrXr2debt_to_equity_rawdebt_to_equity_sourcer7rdebuginforr.r0r1r3rfrgrhrRr8r9r:rirjrSrT)dbr[rUsessionstock latest_pricer<days_oldr= fcf_yieldsfundamentals_historyfr?is_validvalidation_issues warning_msgredebt_to_equity_raw_yahoor|r2r7datas rFget_stock_datarsH  yW e$..f.=CCE788yy }}Y/99XX: (9>>&&( )%%' }}_5??XX@ (?'',,. / 344yy"LLN\%6%66<< a< OO0 *E F    "/00/yy4YZZ7yy<   '}}_= Y6IY J Xo**//1 2 U1X SU $#*==#AEHH-/..3356q ! & -A*q||OOall: !!), - ":Z@ 'C <<%2-' ## 6tyyAR7S6TUK J{m, - OOK ( -lELL8q=UcfiUi KK(A(3P''5c&:'C !N f EJJ  ell+e  \''  ,++    --4   --4  |<##  n  &'>  \l99t  \l99t  ||;;QU  \,11t L%%4! $ <\77T% &  = =SW' (.:l))t9EL554AM = =SW ;G\77TEQ,"A"AW[5A,11t5A,11t 09 >X~syyys3:U8CU87AU8U8)DU80 U8=J1U88V market_coder collectoranalyzercH$t|}|d}tdt|dd|dtdttdt|d|dd d }d }|D]%}|j||d } | r|d z }!|d z }'td |d|dttdg} t j t dz } |j5} |D]}| jtj|j} | s9| jtj| jjttj j}|r|j | ks| j#| ddd| rtdt| dd }d }t%| d D]X\}}td|dt| d|d dd|j'|rtd|d z }Itd|d z }Ztd |d |d!tntd"ttd#td$t|d%|dd d&|j)|}t+d'|j-D}t||z }|d kDrWtd |d(|d)|j/Dcgc] \}}|r | }}}|r-td*d+j1|ntd,|d-tttd.tt j t dz }i}|j5} | jt2j5t2j6|k\j9}|D]}|j:||j<< dddg}g}t|d d d d iigggd/ }t%|d D ]\}}td0|dt|d1|d dd t?||\}}|r|||d2|<|D]o}d3|vs|d4xxd z cc<tAjBd5|} | s.tE| jGd }!|!|d6|<|!dkDsV|d7j#|d8|!d9q|jI|} |d:xxd z cc<| d;|jJk(r|d}#|jMd?}$|jMd@}%g}&|"9|#r7|"|#z }'|'|jNkr#|&j#dA|'dBdC|jNdB|$C|%rA|%d k7r|$|%z nd}(|(3|(|jPkDr$|&j#dD|(dEdF|jPdEdG|&s|&j#| dH|dIj#|dJdKj1|&dLn| d;|jRk(r|dMxxd z cc<g})|jMdN|)j#dO|jMdP|)j#dQ|jMdR|)j#dS|jMd>|)j#dT|dUk(rdV}*n|)r|dWd+j1|)dX}*n|dY}*|dZj#|*|jMd[d\| d[<|jMd]d | d]<| jMd^d | d^<|jM|}+d d d_d`da},|,jM| d;d }-|+r|,jM|+d ndb}.|.d k\r!|-|.kDrd| dc<|+| dd<|j#| nde| dc<|j#| | dfdgk\ r|j5} | jtj|j}/t j j!}0t jT|0tjVjY}1|1t d z}2| jt2j5t2j<|k(t2j6|1k\t2j6|2kt2jZdhk(j}3|3r|/r |/jnd|3_.| d|3_/|jMd[d\|3_0| df|3_1| d;|3_| d^|3_2| di|3_3| dj|3_4| dH|3_5t j |3_6nnt3|/r |/jnd|| d|jMd[d\| df| d;| d^| di| dj| dHt j dhdkl }4| jo|4| jtpj5tpj\|/r |/jndk(tpjr|0k(j}5| jMdmi}6| jMdni}7| jMdoi}8| jMdpi}9| jMdqi}:| jMdri};ids|/r |/jnddt|0du|dv| dfdw| d;d^| d^dj| djdx|6jMdyijMdzd |6jMd{ijMdzd z|6jMd|ijMdzd z|6jMd}ijMdzd z|6jMd~ijMdzd z d|6jMdyijMdzd d|6jMd{ijMdzd d|6jMd|ijMdzd d|6jMd}ijMdzd d|6jMd~ijMdzd d|6jMdyijMdd d|6jMdyijMdd d|6jMdyijMdd d|6jMd{ijMdRd id|6jMd{ijMdd d|6jMd|ijMdd d|6jMd|ijMdd d|6jMd}ijMdd d|6jMd}ijMdd d|6jMd}ijMdd d|6jMd}ijMdd d|6jMd}ijMdd d|6jMd~ijMdd d|6jMd~ijMdd d| jMdd xsd d| jMdd xsd d| jMdd xsd d|8jMdd d|8jMdd dd d|8jMdd id|8jMdd d|8jMdd d|9jMdd d|9jMdd dd d|9jMdd d|9jMdd d|9jMdd d|:jMdd d|:jMdd d|:jMdd d|:jMdd dN|jMdNd xsd dP|jMdPd xsd dR|jMdRd xsd d|jMdd xsd di| di|jMdd xsd |jMdd xsd |jMdd xsd |7jMdd |7jMdd |7jMdde|;jMdd |7jMddexs|;jMdde|7jMddexs|;jMdde|;jMdde|7jMddeddǜ }<|5rE||=dvs tu|5|=|>twjx|d|0n6tqdi|<}?| jo|?twjx|d|0ddd| df}@| d;}A|Adk(rtd@d͝n(@dk\rtd@dAntd@dA ||||||dԜS#1swYxYwcc}}w#1swY xYw#1swY|xYw#tz$r%}Btdt}BddYd}B~B d}B~BwwxYw)aC Scan a specific market and return results. Args: market_code: Market identifier (IT, FR, DE) db: Database manager instance collector: Yahoo collector instance analyzer: Warren analyzer instance Returns: dict: Results including analyzed stocks, quality stats, etc. rF======================================================================rz WARREN AI - SCAN ru🔄 Auto-onboarding z tickers to rz...r)marketrKu ✅ u tickers ready | ⚠️ z skippedu7🔍 Checking fundamentals (refresh if > 7 days old)...rsrZr\Nu-📥 Downloading/refreshing fundamentals for z tickers...z [/z]  T)endflushu✅u❌u downloaded | ❌ z failedu# ✅ All tickers have fundamentalsu$📊 Step 1: Aggiornamento prezzi...z Aggiornamento z titoli )rc3&K|] }|sd yw)rKN).0successs rF zscan_market..sLgGLsu aggiornati | ⚠️ z erroriz Errori su: , u ✅ Tutti z titoli aggiornati con successou!🤖 Step 2: Analisi Warren AI...) totalanalyzedcritical insufficient stale_datarU stale_tickerscritical_detailsinsufficient_detailscritical_failures[z] Analizzando rUStalerz\((\d+) days old\)rrz: Data z days old (>1 week)r valutazionerr4r5r7r8z FCF Yield: r#z < zNet Debt/EBITDA: r,zx > x ragionamentorz : Hard Fail (rar*rr.zP/Er0zP/Br1ROEz Market CapzPST.MIu{PST.MI: Criticità FCF/Debito non standard per settore finanziario/ibrido. Classificazione declassata a Dati Insufficienti.z: Dati insufficienti - mancano .zT: Dati insufficienti per assenza di metriche avanzate non indispensabili al settore.rrrbrc fair_valuerLr`)AVOIDHOLDBUY STRONG BUYupgraded upgrade_fromFscore< weekly_scan current_pricemargin_of_safetynew) r]r[ company_namerrrecommendationrrr reasoning found_datesourcestatusscore_breakdownscore_parametersfair_value_methodsfair_value_method_weightsfair_value_adjustmentsfair_value_parametersr] scan_dater[ final_scorer raw_score valuationrqualitygrowthbonuses penaltiesvaluation_score quality_score growth_score bonus_total penalty_totalpe_scorepepb_scorepbdividend_scoredividend roe_score debt_scoredebtrevenue_growth_scorerevenueearnings_growth_scoreearnings margin_bonusmarginsdebt_coverage_bonus debt_coveragefcf_payout_bonus fcf_payout peg_bonuspegev_ebitda_bonus ev_ebitdaroe_negative_penalty roe_negativedebt_excess_penalty debt_excess roic_scoreroicinterest_coverage_scoreinterest_coveragepiotroski_scorepiotroski_fscore fair_value_pe fair_value_pb fair_value_psfair_value_fcf_yieldr?fair_value_ev_ebitdafair_value_dividend weight_pe weight_pb weight_psweight_fcf_yieldweight_ev_ebitdaweight_dividendfv_basebase_fair_valuefv_quality_premiumquality_premiumfv_utility_bonus utility_bonusfv_country_penaltycountry_penaltyr2rfrgr3growth_rate_originalgrowth_rate_usedis_growth_cappedgraham_multiplierrVrW is_luxuryr@z4.1) rfrgr3r r r rrVrWrr@rJ)r]rr[z*: Updated opportunity_detailed record for z.: Created new opportunity_detailed record for ru🎯 BUY! Score: z/100Fu ✅ Score: z/100 - u 📊 Score: u ❌ Errore: 2)r market_infotickersresultsupgraded_stocks quality_statsr)? MARKET_CONFIGryr; add_stockrrrrrkrlr rmrnr rorprrqr/ enumeratecollect_fundamental_dataupdate_daily_pricesrwvaluesitemsrxr filterrrvrr[rresearchintgroupanalyzeRATING_CRITICAL_DANGERgetHARD_FAIL_FCF_YIELD_THRESHOLD#HARD_FAIL_NET_DEBT_EBITDA_THRESHOLDRATING_DATA_INSUFFICIENTcombinemintimerr]rrrrrrr updated_ataddr rsetattrrr~ Exceptionstr)Crrrrrronboarded_count skipped_countr[resultmissing_fundamentalsrefresh_thresholdrrlatest_fundamental success_count fail_countiupdate_results failed_countrfailed_tickers last_weeklast_week_recs recent_oppsopprrr stock_datarUwarningmatchrfcfmcapndr8detailsr?nd_ratiomissingmsglast_rec upgrade_map current_level last_level stock_objtoday today_start today_endexisting opportunityexisting_detailedrr fv_methodsfv_method_weightsfv_adjustments fv_parameters detailed_datakeyvalueopportunity_detailedrresC rF scan_marketr_IsS ,K)k.)+G (O [ !!3K4G3H IJ (O G !#g,|K W=XXcde  "#7; IAv Cs!C 456bD#UY Z11&9e " e a   }o%7 |7KL  35  01 S\N(;v3F2Gs KSWX227;NL)>)>)@LLM~&6La }o%;L>QR8F8L8L8N^_VWV]&^^  M$))N";!<= > ]O+JKL G G -. G !22IN  &=3dST 0#1"f#= J4< j)&1 ( "G')%l3q83 " *? I '*5;;q>':HEMM/:6B (!| -.A B I I'-hghZ?R$S!" " %%j1F * % * %m$(G(GGj)Q.) nn_5!~~l3^^J/#1?t #d I 8#I#IIYsO3xGmGmnqFr'st>f.4krF{tH+8;g;g0g):8C.XMyMyz}L~~(ABNN6.#9:0188F8=QUQZQZ[bQcPdde9fg &(*K*KKn-2->>*-5NN5)>>*-5NN5)>>%(0NN5)>>,/7NN<0X%XC!'(G RYHZG[[\]!'(|}45<F8 (nnWa8F7O#)::lA#>F< &))&1H$%q!LK'OOF=,A1EM9A15rJQ=:#=%)z")1~&&&v.%*z" NN6 "g"$^^%kf ' e 4 > >f > M S S UI%LLN//1E"*"2"25(,,:K:K:M"NK +iQ.? ?I&}}[9@@#**f4#..+=#..:#**m;   eg  Y\\D#))/#->>(E#B"(/+1-+@'-l';*0*A-34F-G&,^&<'/||~#0#('  K0)0 6I(J(Q(Q+44X\]+55>)eg& '-jj1BB&GO'-zz2Db'I$!',@"!EJ(. 3NPR(S%%+ZZ0H"%MN$*JJ/F$KMb%"IILL4b%#Ub%!&b% &vg b%)&*?b%%f\&:b%+F3E,Fb%$_%8%8b%I%M%MgWX%Y%4%8%8B%G%K%KGUV%W&X%4%8%82%F%J%J7TU%V&W&5%8%8B%G%K%KGUV%W&X&5%8%8b%I%M%MgWX%Y &Zb%"*?+>+>{B+O+S+ST[]^+_#b%$()<)+>y"+M+Q+QR]_`+aSb%X/0C0CKQS0T0X0XYgij0kYb%Z./B/B;PR/S/W/WXegh/i[b%`%fjj&;&@qab%b26::>QST3U3ZYZcb%d*6::6H!+L+QPQeb%j(a)@kb%l(a)@mb%n(ob%p/ {A0Nqb%r/ {A0Nsb%t.z~~j!/Lub%z$%6%:%:4%C{b%|$%6%:%:4%C}b%~$Qb%@+,=,A,A+q,QAb%B+,=,A,A+q,QCb%D*+<+@+@Q+OEb%J">#5#56G#KKb%L-n.@.@ARTU.VMb%N+N,>,>PQ,ROb%P-n.@.@ARTU.VQb%V#JNN:q$A$FQWb%X#JNN:q$A$FQYb%Zz~~eQ7<1[b%\)*..9I1*M*RQR]b%^()@_b%`+5..9I1*M*RQR+5>>:KQ+O+TST*4..9I1*M*RQR1A0D0DE[]^0_,<,@,@ASUV,W,<,@,@ASUZ,[-:->->?RTU-V)9(<(<^U(S(WdWhWhiwy~W&6&:&:<&O&yS`SdSdeqsxSy%2%6%6{E%J.>.B.BCWY^._+0Cb%MH)*7*=*=*?GJC"*MM '(93 FG vh.XY^X_$`a0C/S]/S, $89 vh.\]b\c$deWkf\7OE /Ke#)%56" E7'+?@ UG7;-@AiW0t#"*&  [ 8 8\_<d9d?d@dAdBdCdDdEdFdGdHdIdJdKdLd2dMdNdOdPdQdRdSdTdUgdVd2dWdXdYdZd[dFgd\gd]d^d_gd`dadbdcdddedfdgdhdidjdkdHdldldmdndodpdqdrdsdtdudvdwdxdKdydzd{d|d}d~dddddddS)z Return complete scoring methodology with all thresholds, formulas, and constants. This enables AI to understand exactly how scores are calculated. z4.0z'0-100 points (raw max ~130, normalized)(z*Financial health and competitive advantagez 20 pointsu≥15%u≥10%z"20 * (ROE / 0.15) capped at 20 pts)weightexcellent_thresholdgood_thresholdformulaz 10 pointsu≥2.0u≥1.5z<1.0)rbrcrdpoor_thresholdu≥20%z%10 * (margin / 0.20) capped at 10 pts)r1 current_ratio profit_margin) max_points descriptionmetricsr"z%Revenue and earnings growth potentialz34% (Financial Services, Utilities, Basic Materials)z5%)mature_sectors other_sectorsu ≥sector_capu≥3%)rbsector_aware_caprcrdu≥5%)rbrcrd)rfrgz!Undervaluation vs intrinsic valuez2Based on margin of safety (discount to fair value)z/20 * (margin_of_safety / 0.30) capped at 20 ptsu ≥20% marginu ≥15% marginz 0-15% marginz<0% margin (overvalued)) strong_buybuyholdavoid)rirj calculationre thresholdsiz/Conservative debt avoidance (Buffett principle)zNet Debt / EBITDA ratioz$>5x (CRITICAL - automatic low score)z3-5x (-30 pts)z2-3x (-20 pts)z1-2x (-10 pts)z <1x (0 pts)) hard_fail high_penaltymedium_penalty low_penalty no_penalty) max_penaltyrjmetricrtzMSchema v3 enhancement - compensate growth stocks penalized by traditional P/Eu5PEG < 1.0 → +5 pts (undervalued relative to growth)u+PEG < 1.5 → +3 pts (reasonable valuation)) excellentgood)ricriteriau0EV/EBITDA < 8 → +5 pts (strong FCF generation)u,EV/EBITDA < 12 → +3 pts (decent valuation)r-u≥8%z,Rewards consistent free cash flow generation)ri3y_avg_thresholdrj) max_bonusrjpeg_ratio_bonusrfcf_yield_bonusz.Schema v4 - Professional-grade quality metricszNOPAT / Invested CapitaluEBIT × (1 - Tax Rate)z)Total Assets - Current Liabilities - Cashu≥15% → 10 ptsu≥10% → 7 ptsu≥5% → 4 ptsu <5% → 0 pts)r}r~ acceptablepoorz24%z25%z30%z21%)ItalyFranceGermanyr)rirenopatinvested_capitalscoring tax_fallbackzEBIT / Interest Expenseu≥5.0x → 5 ptsu≥3.0x → 3 ptsu≥1.5x → 1 ptu<1.5x → 0 ptsu8None (Financial Services, Utilities) → 2.5 pts neutral)r}r~rrnot_applicableFinancial ServicesrO)rirerexcluded_sectorsz 0-9 pointsu 8-9 → 5 ptsu 6-7 → 3 ptsu 4-5 → 1 ptu 0-3 → 0 pts)z 1. ROA > 0z2. Operating Cash Flow > 0u3. ΔROA > 0 (YoY improvement)z"4. Accruals < 0 (OCF > Net Income))u5. ΔLong-term Debt ≤ 0u6. ΔCurrent Ratio > 0z'7. No New Equity (shares not increased)u8. ΔGross Margin > 0u9. ΔAsset Turnover > 0) profitabilityleverage efficiency)riranger criteria_9)rirjrrr)rr value_score debt_penaltyforward_looking_bonusesadvanced_quality_scorez&min(100, int((raw_score / 130) * 100))z,base_score (0-100) + advanced_quality (0-20)z2~130 points (base ~110 with bonuses + advanced 20)z 0-100 points)rermax_raw final_rangez3Sector-aware intrinsic value estimation (Schema v3)zAWeighted average of 4 valuation methods + country risk adjustmentz35%z20%)pe_basedpb_basedps_baseddividend_baseduCGraham formula: Fair Value = EPS × (8.5 + 2g) × sector_multiplierz&15x (conservative for cyclical sector)z430x (luxury/premium brands command higher multiples)z22.5x (standard))rzConsumer Cyclicalz Other sectors)rj multipliersz2Discount for sovereign risk and currency stabilityz--20% (higher debt/GDP, political instability)z-10% (moderate fiscal concerns)z-10% (conservative baseline)z*0% (reserve currency, stable institutions))rj adjustments)rjmethodweightssector_aware_graham_multipliercountry_risk_penaltyuScore ≥80 AND Margin ≥20%uScore ≥70 AND Margin ≥15%uScore ≥60 OR Margin 0-15%zScore <60 AND Margin <0%z5x)z%Missing critical metrics for analysisrrrrCRITICALzDATA INSUFFICIENTz -5% (burning cash unsustainably)z5x (excessive leverage))fcf_yield_thresholdnet_debt_ebitda_threshold)rJtotal_score_range components normalizationfair_value_calculation rating_systemhard_fail_conditionsrrrHrF_get_scoring_methodologyrsm  F!K#./7*2#G #./7*2*0 &#./7*2#J &2!F#..c-1-0?*1'#./7*1(*!BSL"1**6   #P3!G$4&6#3"/   n"#%\ M!$#$%W N!$#%(/#Q$#(0!O"$95(S%8 2&7 /  "'"'#($ %&#$8%8 3&8 1*d  *>{(K &#$)%4 /&4 /  * % 45'#%C<'yY v@GK)  QY!!!"'  e*R)_%7 / TL?=G  %## 8:21/V!H  $F)B! MJ JrHrct|}ddddddd}g}g}|D]F}|d}||vr ||xxdz cc<|j|d|d3|j|dH|rt|t|z nd}|rt|t|z nd} ||t|dt| d|r t |nd|r t |dSddS)z6Calculate aggregate statistics for the scanned market.rrrrKrr)total_stocks_analyzedrating_distribution average_scoreaverage_margin_of_safety top_score bottom_score)r;r/rwroundmaxr*) rr total_stocks ratings_countscoresrrrating avg_score avg_margins rF_calculate_summary_statsrswz'_format_quality_stats..s efgheirHTr[reverse)r[r) overall_quality_percentage total_tickerssuccessfully_analyzedrdata_insufficientstale_data_countrrr)rr%sortedr)r quality_pctr[rss rF_format_quality_statsrsyFGNyORSyS#- 3mN6SSWdelWmmpsstYZK',K&;&w/!.z!:*:6*>:),7)--.@"E - 1 12H" M!'}'8'8"'M'S'S'U[isw x 4 0    sB( scan_datac!|d}|d}|d}|d}t|dd}tj}td} | |j d z } | d z } | d z d z } | j dd | j dd d dgdddddddddddddddd|j d |j ||d|d |d!d"d#t|d$ tgt||t|d%} |D]}|d&}d'}|j5}|jtj|(j}|r^|jt j|j")j%t't j(j}|jt*j|j")j%t't*j(j}|r|rid&|d|dd*|j,xsd+d,|j.rt1|j.nd'd-|j2rt1|j2nd'd.|j4rt1|j4nd'd/|j6rt1|j6nd'd0|j8rt1|j8nd'd1|j:rt1|j:d2znd'd3|j<rt1|j<nd'd4|j>rt1|j>d2znd'd5|j@rt1|j@d2znd'd6|jBrt1|jBd2znd'd7|jDrt1|jDd2znd'd8|jFrt1|jFnd'd9|jHrt1|jHnd'd:|jJrt1|jJnd'|jLrt1|jLnd'|jNrt1|jNnd'|j(r|j(j d nd'd;}d'd'd'||d|jQd*d+|d<|d=|jQd>ijQd?ijQd@dA|jQd>ijQdBijQd@dAz|jQd>ijQdCijQd@dAz|jQd>ijQdDijQd@dAz|jQd>ijQdEijQd@dAz |jQd>ijQdFijQd@dAz|jQd>ijQd?ijQd@dA|jQd>ijQd?ijQdGdA|jQd>ijQd?ijQdHdA|jQd>ijQd?ijQdIdAdJ|jQd>ijQdBijQd@dA|jQd>ijQdBijQd1dA|jQd>ijQdBijQdKdAdL|jQd>ijQdCijQd@dA|jQd>ijQdCijQdMdA|jQd>ijQdCijQdNdAdO|jQd>ijQdDijQd@dA|jQd>ijQdDijQdPdA|jQd>ijQdDijQdQdA|jQd>ijQdDijQdRdA|jQd>ijQdDijQdSdA|jQd>ijQdDijQdTdAdU|jQd>ijQdEijQd@dA|jQd>ijQdEijQdVdA|jQd>ijQdEijQdWdAdX|jQd>ijQdFijQd@dA|jQd>ijQdFijQdYdA|jQd>ijQdFijQdZdA|jQd>ijQdFijQd[dAd\d]d^|d_|d`|da|dadAkD|jQdbijQdGdA|jQdbijQdHdA|jQdbijQdcdA|jQdbijQdddA|jQdbijQdTdA|jQdbijQdIdAde|jQdfijQdGdA|jQdfijQdHdA|jQdfijQdcdA|jQdfijQdddA|jQdfijQdTdA|jQdfijQdIdAdg|jQdhijQdidA|jQdhijQdjdA|jQdhijQdkdA|jQdhijQdldAdmdn|jQdoijQdpdA|jQdoijQdqdA|jQdoijQdrdsdt|jQduijQdvdA|jQduijQdwdsdx|jQdoijQdydsxs"|jQduijQdyds|jQdoijQdzdsxs"|jQduijQdzds|jQduijQd{ds|jQdoijQd|dsd}d~|dd}|r|jQd1|jQd3|jQd4d|jQd5|jQd6d|jQd.|jQd/|jQd0|jQd|jQdd|jQd8|jQd9|jQd8.|jQd9r|d9dAk7rtS|d8|d9z dnd'd|jQd:|jQd:1|jQd-r |d-dAk7rtS|d:|d-z d2zdnd'd|jQd-|jQd7|jQdd|jQdY|jQdZ|jQdddd|d<| djU| | d|d|j d dz }| d|dz }tW|dd5}tYjZ| |ddsd'd'd'tW|dd5}tYjZ| |ddsd'd'd't]t]dt]d|t]d||S#1swY xYw#1swYyxYw#1swYUxYw)z Generate comprehensive JSON report for AI consumption. Contains ALL information that determines the score, including constants and methodology. rrrrc |dSNrrrs rFrz&generate_json_report.. 1W:rHTrreports%Y-%m-%djsonlatestparentsexist_okzThis JSON report provides complete transparency into Warren AI's value investing analysis. It contains ALL data, formulas, thresholds, and calculations used to generate stock scores and recommendations.a<Warren AI follows Warren Buffett's conservative Deep Value investing principles: 'Rule #1: Don't lose money. Rule #2: Never forget Rule #1.' We prioritize capital preservation, strong fundamentals, sustainable competitive advantages (moats), and buying quality businesses at significant discounts to intrinsic value.)zL1. Review 'scoring_methodology' to understand the complete scoring algorithmzL2. Check 'summary_statistics' for market-wide trends and rating distributionzM3. Analyze individual stocks in 'stocks' array - each contains full breakdownzB4. Use 'data_quality_report' to assess reliability of the analysisuO5. Focus on STRONG BUY/BUY rated stocks with high margins of safety (≥15-20%)zCore Buffett principle - buy at significant discount to fair value to protect against errors in valuation or unexpected events. Minimum 15% for BUY, 20% for STRONG BUY.zIntrinsic value estimate using sector-aware Graham formula + P/E, P/B, P/S, Dividend yield methods. Adjusted for country risk (IT: -20%, FR/DE: -10%, USA: 0%).uFinancial health metrics - ROE ≥15% (excellent), Current Ratio ≥2.0, Profit Margin ≥20%. Measures competitive advantage sustainability.zmConservative debt avoidance - Net Debt/EBITDA >3x triggers harsh penalties. >5x is automatic CRITICAL rating.zuSchema v3 enhancement - PEG Ratio and EV/EBITDA bonuses compensate growth stocks penalized by traditional P/E ratios.)rrrrforward_bonusesudScore ≥80 + Margin ≥20%. Exceptional quality at deep discount. Highest conviction opportunities.uoScore ≥70 + Margin ≥15%. Strong fundamentals with adequate safety margin. Recommended for value portfolios.uiScore ≥60 OR Margin 0-15%. Decent business but limited upside or fair valuation. Wait for better entry.zgScore <60 + Margin <0%. Weak fundamentals or overvalued. Not suitable for conservative value investing.zbHard fail conditions met (FCF yield <-5% OR Net Debt/EBITDA >5x). Extreme risk - avoid completely.zSMissing critical metrics. Cannot perform reliable analysis. Wait for complete data.raWarren AI intentionally uses conservative assumptions (country risk penalties, sector-aware growth caps, harsh debt penalties) to prioritize capital preservation. This may cause it to miss some opportunities, but significantly reduces downside risk - aligned with Buffett's philosophy.)purpose philosophy how_to_use key_conceptsinterpretation_guideconservative_biasrrrz3.0z1Warren AI - Deterministic Value Investing Scanner) rscan_timestampr market_namemarket_full_name country_flagrJ generatortotal_stocks_scanned)ai_instructionsmetadatascoring_methodologystockssummary_statisticsdata_quality_reportr[NrZr\rrbrcr5r.r0ps_ratior1r!rgrhrfrgr3r7r8r4) peg_ratio ev_to_ebitda last_updatedrrrrrrrrrradvanced_qualityrrr)rrrrr)rrrrr)r revenue_scoreearnings_scorerrrrr)rrrrrrrr)rrrrr piotroski)rrrr)rrrrrr)rrr breakdownrrrrpsr?)rrrfcf_yield_basedev_ebitda_basedrr) pe_weight pb_weight ps_weightfcf_yield_weightev_ebitda_weightdividend_weightrrrrr )rrrr )rrris_undervaluedrmethod_weightsrrr r r F)r r r rris_mature_sector)rrrVrWrr@)rVrWrr@)rr sector_flagsr)r[rrrralgorithm_parametersr) roe_percentrgprofit_margin_percent)revenue_growth_percentearnings_growth_percentrr)r.r0rrrrL)r7r8net_debt_ebitda_ratio)r4fcf_yield_percentr)r5dividend_yield_percentrrz1Schema v4 - Professional-grade quality indicators) roic_percentinterest_coverage_ratiornote)financial_healthgrowth_metricsvaluation_ratios debt_metrics cash_flow market_dataadvanced_quality_metricsfundamental_datar warren_scan__z.jsonz _latest.jsonwutf-8encoding)indent ensure_asciiu$📊 JSON Report (AI-ready) salvato:u ✅ Storico: u ✅ Latest: )/rrrrrstrftimemkdir isoformatr;rrrrkrlr rmrnr rorprrqr rrtfloatr5r.r0rr1rgrhrfrgr3r7r8r4rrr%rr/openrdumpry)rrrrrrrresults_sortedr reports_base dated_folder json_folder latest_folder json_reportr3r[rArr fundamental price_data stock_entryjson_file_datedjson_file_latestrs rFgenerate_json_reportr1sy M*KM*K "Go.MG)=tLN I ?L)"4"4Z"@@L'K 8+f4MdT2t4 dY%O@"q!P$[ EIDCA%z %"A3 8#++J7'113&&v. +K 8'/#L$'L   896wI4]CU+K\!K2! ^^ # MM%(22&2AGGIE%mmO<FF"XXG(4 4 456uuw %]]95??"XX@(4 /0:" &"v"!%,,"7%" J*>$?]a "#;CWCWE+*>*>$?]a"#;CWCWE+*>*>$?]a"{u[__s%:;TX"([MfMf{/H/H)Ilp"(S^SlSl{/H/H3/N)Orv")U`UoUo% 0J0JS0P*Quy"*WbWrWr51L1Ls1R+Sx|")U`UoUo% 0J0JS0P*Quy"#;CWCWE+*>*>$?]a" !{?Q?Q% (:(:";W[!""([MfMf{/H/H)Ilp#"$FQEZEZU;+@+@%A`dKVKcKck.F.F(GimQ\QaQa (8(8(A(A*(Mgk)"J# L6Njj51 /JJ0"599+rJNNwXYZJJ0"599)RHLLWVWXYJJ0"599(BGKKGUVWXJJ0"599)RHLLWVWXYJJ0"599+rJNNwXYZ [ JJ0"599:LbQUUV]_`a b"(,=r!B!F!F{TV!W![![\cef!g$*JJ/@"$E$I$I+WY$Z$^$^_cef$g$*JJ/@"$E$I$I+WY$Z$^$^_cef$g*0**5F*K*O*OP[]_*`*d*deoqr*s ""(,=r!B!F!FyRT!U!Y!YZacd!e%+ZZ0A2%F%J%J9VX%Y%]%]^cef%g&,jj1BB&G&K&KIWY&Z&^&^_egh&i  "(,=r!B!F!FxQS!T!X!XY`bc!d)/4Er)J)N)NxY[)\)`)`ajlm)n*0**5F*K*O*OPXZ\*]*a*ablno*p "(,=r!B!F!FyRT!U!Y!YZacd!e(. 3Db(I(M(MiY[(\(`(`ajlm(n/5zz:KR/P/T/TU^`b/c/g/ghwyz/{,2JJ7H",M,Q,QR[]_,`,d,deqst,u%+ZZ0A2%F%J%J9VX%Y%]%]^cef%g+1::6G+L+P+PQZ\^+_+c+cdoqr+s  "(,=r!B!F!F{TV!W![![\cef!g06 ;Lb0Q0U0UVace0f0j0jky{|0}/5zz:KR/P/T/TU`bd/e/i/ijwyz/{" "(,=r!B!F!FGY[]!^!b!bcjlm!n&,jj1BB&G&K&KL^`b&c&g&ghnpq&r39::>OQS3T3X3XYkmo3p3t3tvIKL4M+1::6G+L+P+PQceg+h+l+lmxz{+| )=$4l"(!8$\2$*+=$>"();">~uU[ #:B?CCNTYZ #5r:>>|USY #:B?CCLRWX!',CR!H!L!L[Z_!`*0**5G*L*P*PQegl*m !%0 /kv r $.>>%#8%/^^O%D-7^^O-L% /9nn=M.N/9~~>O/P# !+z : *z : *z :!+ !<$.NN>$B %!+z :(nnX6isiwiwyCjDjPU_UcUcdlUmr|}ErFJKrKU:j3IJW_L`3`bc-dRV! &0^^O%DwAwEwEFUwVwbgqguguvBgCHRS_H`deHe ?0KjYeNf0fjm/mop)qlp #-..">.8nn=M.N$.NN>$B  %+JJv$6/5zz:M/N(. 3E(FO -?%/K* +N H$$[1WK2\"l;-qASAST^A_@``e$ffO$k],'OO osW 5@ +q?@ g 6@! +q?@ G 02 _- ./ O,- ./ s# # Z@@@@s0NAC@;AC A+ACCAC C ACCAC"c|d}|d}|d}|d}|d}ttdtdtdt|dd }|Dcgc] }|d d k(s |} }|Dcgc] }|d d k(s |} }i} |j5} |D]} | jtj tj | k(tjd k(j}|dkDs_| jtj tj | k(tjd k(jtjjj}||r|jjdnd|r |jndd| | < dddtj }|jd}|jd}t#d}||z }|dz }|j%d d |j%d d d|dd|d}||z }|d|ddz }t'|dd5}|j)d |d!d"|d#d$|d!d%|d&d' |j)d(tj jd)d*|j)d+t+|d,t+|d*|j)d-|d.|d/z|d0z d1z}d1|z }|d2k\rd3n|d4k\rd5nd6}|d2k\rd7n|d4k\rd8nd9}|j)d:|d;|d<d=|d0d,|d0d> |d?dkDr|j)d@|d?dA|d.dkDr|j)dB|d.dC|d/dkDr|j)d@|d/dD|j)dE|dFs |dGs|dHr |j)dI|dGrA|j)dJ|dGD]}|j)dK|dL|j)dM|dHrA|j)dN|dHD]}|j)dK|dL|j)dM|dFrm|j)dOt|dFj-D],\} }|j)dP| dQdRj/|dL.|j)dM|j)dS|j)dT|j)dU|r|j)dV|j)dW|j)dXt+|dY|j)dZ|D]Y} | d d k(rd[n | d d k(rd\nd]}!|j)d^|!d_| d`da| d!db| dcdd| d de| dfdg| dhdidj| dkdidl[|j)dm| rd|j)dn| D]N}|j)do|d`dp|d!dq|dfdr|dhdids|dkdidt|dudkDrdvndwdx|dud<dy|dzd{P| rd|j)d|| D]N}|j)d}|d`dp|d!dq|dfdr|dhdids|dkdidt|dudkDrdvndwdx|dud<dy|dzd{P| s| s|j)d~|j)d|j)dt1|dddD]\}"}|d d k(rd[}#n|d d k(rd\}#n |d dk(rd]}#nd}#|dudkDrdvndw}$d}%|d`| vr| |d`}&d|&dd|&dd|&ddid}%|j)d|#d|"d|d`d|d!|%d|dfd|d d|dhdid|dkdid|$d|dud<d|j)d|j)d|j)d|D]a}|d d k(rd\n |d dk(rd]nd}#|dudkDrdvndw}$|j)d|#d|d`d|d!d|dfd|d d|$d|dud<d|dzdc|j)d|j)ddddt3j4||ttd|td|d|dd}'t7j8dDcgc](}|j;|'s|j=ds'|*}(}|(r5|(D]0}) t7j>|)tAjBd|)2d4}*tj tG|*z }+|jID]z},|,jKs|,jLdk7s$ tjN|,jLd}-|-|+kr1t3jP|,tAjRd|,d|*d|td1|d.|d/z|d0z d1zz }|d4ks|jWdGryttdtdtdtd|d<dtd|d.d|d/td|d?|jWdGr-ttd|dGD]}/td|/|dr}ttdt|dj-dd }0|0ddD]\} }1td| d|1dt+|0dkDrtdt+|0dz dttdtdtdtdtdtdtt+| }td|tdt+|d,t+|td|d<d|d.d|d/d>ttdtd|Scc}wcc}w#1swY IxYw#1swYxYwcc}w#tD$rYCwxYw#tTtDf$r&}.tAjBd|,d|.Yd}.~.d}.~.wwxYw)z&Generate HTML report for scan results.rrrrrru📋 RISULTATI FINALIc |dSrrrs rFrz&generate_html_report..,rrHTrrrrrz%d/%m/%Yr%)count last_date last_priceNz %Y%m%d_%H%Mrrrrrrrz.htmlz _latest.htmlrrrub Warren AI - Scan Results

🎯 Warren AI - Scan rz'

Mercato: rrz (rz)

z

Data: z%d/%m/%Y %H:%Mz

z+

Azioni analizzate: rzI

Motore: Analisi deterministica (no API cost)

rrrr!_rZrBerrorz#28a745z#ffc107z#dc3545z`

📊 Qualità Dati: r,z% (analizzate: r*ru | ⚠️ z con dati vecchiu | ❌ z CRITICAL DANGERz DATA INSUFFICIENTz

rUrrz
Dettagli warning
u0

❌ CRITICAL DANGER:

    z
  • z
  • z
u5

⚠️ DATA INSUFFICIENT:

    u+

    ⚠️ Warning:

      z
    • z : rz
z
z
u&

📣 Novità Questa Settimana

zu
z

z9 azioni hanno migliorato la raccomandazione:

zz strong-buyrprqz z
TickerNomeCambioScorePrezzoFair Value
r[z' z ru → z- ru* €rr u! €rz
u(

🌟 Raccomandazioni STRONG BUY

z0

z - z&

Score: u0/100

Prezzo: €u% → Fair Value: €z

Margin of Safety: z4%

Analisi: rz

u!

💰 Raccomandazioni BUY

z)

uo

📭 Nessuna raccomandazione BUY questa settimana. Warren sta aspettando il pitch perfetto! ⚾

u

📊 TOP 10 Score

z r-rKrrru=📜 r4z2x BUYUltimo BUY: r5u a €r6zz z
#TickerNomeScoreValutazionePrezzoFair ValueMargin
z z u €z z%
u

📋 Tutti i Risultati

zs z"> zu✅ Report storico salvato: u✅ Report latest aggiornato: rzRemoved legacy root HTML: rzRemoved old report folder: z (>z days)zSkipped folder z: u#⚠️ ALERT QUALITÀ DATI CRITICOuQualità dati: z% (soglia: 90%)z CRITICAL: z, DATA INSUFFICIENT: z Dati vecchi: u🔴 Problemi Critici:u • ru⏰ Dati Vecchi (>2 giorni):c |dSrrrs rFrz&generate_html_report..Qs qtrHz giorniu • ...e altri z tickeru💡 Azioni Suggerite:z% 1. Verificare connessione internetu, 2. Controllare se Yahoo Finance è onlinez0 3. Eseguire manualmente update_daily_prices()z1 4. Consultare i log: logs/warren_scan_cron.logu📊 Raccomandazioni BUY: u📊 Azioni analizzate: u📊 Qualità dati: z % (CRITICAL: uJ🎯 Aprire il file HTML nel browser per visualizzare i risultati completi),ryrrkrlr rr[rr4rprrrnr rrrrrr!r$writer;rrxrshutilcopy2oslistdir startswithendswithremoverr}OSErrorriterdiris_dirrstrptimermtreer~ ValueErrorr%)2rrrrrrrr&rstrong_buy_recommendationsbuy_recommendations buy_historyrr[ buy_countlast_buyrr timestamp date_folderr' reports_datereports_latest html_filenamehtml_file_datedhtml_file_latestr degradationr quality_class quality_colordetailwarnsu upgrade_classr9 row_class margin_class history_badgehist html_patternroot_html_filesold_fileretention_days cutoff_datefolder folder_dater^issue sorted_stalerss2 rFgenerate_html_reportrksM*K "G "G 12Oo.M G (O !" (OG)=tLN. 01H1HIY1Z0[[abc =c'l^1SQX\NZ`ab \^%Z0=3PPTabiTjjmpp K' %0B%6 +Y[J[Yah %0B%6 +Y[J[Yaj  ``m_noHHSTWGXY'01=3I2J!O P  & * GGj|!< ==MN O  $q ( GGgmJ788HI J  (1 , GGj~!> ??QR S   $ 6H(I][qMr GGo p/0JK+,>?2FGGd6(%012 34OP+,BC2FGGd6(%012 Z(EF%+M*,E,K,K,M%NWMFEGGl6(+dii>N=OuUVW GG& '     GG< = GGL M GGk#o"6!77pq r GG] ^$ 01-0@L0P `abo`pty`yW\@F K 7!!"8 .6 $ABCDRBSATTYZ[\iZjYkk!!"7 -o.s34lOC01   GG$ % & GG> ?/  x[MQvYK(!!"7 -(()/(:3'??defgsetuxdyz$%&8$9A$=5IJ !34S9:&&'&7%89     GG7 8(  x[MQvYK(!!"7 -(()/(:3'??defgsetuxdyz$%&8$9A$=5IJ !34S9:&&'&7%89   *2E GGF G ,- ^ _nSb115 DAq</( =!U*! =!V+" # &'(:&;a&?7ULM{k)"1X;/$abfgnboapqcdhitducvv|}ABN}OPS|TTb!e GG {3 Cx[M" vYK 'wZL! }  /"3'(,$% >A&8$9##>?  # :   12 G H A!"=!1U!:1]K[_eKekrI&'(:&;a&?7UL GG {3x[M" vYK wZL }   >A&8$9##>? ~          !uz"z LL"23 G ((9 :; *+;*< =>")M":!;1=L"$**S/hQQ\\,5OTUT^T^_fTgqhOh' H  (# 9(DE N,,.9.#AAK&&(  ==?v{{h6 &// ZH ,MM&)KK"=fXSHXX^ _`  G- 3mN6SSWdelWmmpsstKR=,,-?@  h 34 h  C0@A =455J=YgKhJijk mL9:;<   / 0 G * +&'9: )w'( )  ) G 0 1!-"@"F"F"H%3TCL ,Sb 1 9 xr$w78 9< 2%*3|+ BC S 1}Z?X>YYno|~LpMoNNO PQ G VW (O u "aRLz"z"Ji   (  vhb<= sv o-&o-0 o2>o2A!o78B7o7W4p,ppp#-p*Ap&7pp p#"p#&q5qqctjd}|jdtdgdd|j }t }|j t|}t}|jdk(rgd }n |jg}|D]L}t||||}t||t|||t|d kDs9||d k7sBtd Nty) NzLWarren AI - Scan multi-mercato per analisi fondamentale stile Warren Buffett)rjz--marketr)rrrrALLzbMarket to scan: IT (FTSE MIB), FR (CAC 40), DE (DAX 40), USA (Dow Jones 30), ALL (sequential scan))typedefaultchoiceshelprmrrKrzH ====================================================================== )argparseArgumentParser add_argumentr0 parse_argsr create_tablesrrrr_rkr1r;ry)parserargsrrrmarkets_to_scanrrs rFmainrzls  $ $bF  0 q     D  B&b)IH {{e3;;-'*  RHE Y+YH5  ! # r7J(J ( )* GrH__main__)NN)2__doc__r@rrrr>rrrpathlibr sqlalchemyrlogurursrc.database.db_managerrsrc.database.modelsr r r r r "src.data_collector.yahoo_collectorrsrc.analysis.warren_analyzerrsrc.config.ftse_mib_stocksrget_ftse_mib_tickerssrc.config.cac40_stocksrsrc.config.dax40_stocksrsrc.config.usa_djia_stocksrrr0rGrXrr_rlistrdictrr1rkrz__name__rrHrFrs["  (4ccD7N558 %,  %)  )  ")  ' 8[&s[&|>BJ^S^o^BW^cq^B Od#d#n#L(eDeoeeP KDKoK\ ) X zFrH
TickerNomeScoreValutazioneMarginRagionamento
z z% z