iGSrSSKJrJr SSKJrJrJrJr SSKr SSK r SSK J r SSKJr SSKJrJrJr "SS 5rg) z_ Yahoo Finance Data Collector Sprint 1: Foundation - Market data collection from Yahoo Finance )datetime timedelta)DictListOptionalTupleN)logger)DatabaseManager)FundamentalData PriceDataStockc \rSrSrSrSS\S\S\4SjjrSS\S\S \ \ 4S jjr SS\S \S \ S \ 4S jjr S\S \ 4SjrS\\S \\\ 44SjrS\S \ \4SjrS\S \ \\\44SjrSrg)YahooFinanceCollectorz:Collects market data from Yahoo Finance for Italian stocks db_manager max_retries retry_delayc(XlX lX0lg)z Initialize Yahoo Finance collector Args: db_manager: Database manager instance max_retries: Maximum number of retry attempts retry_delay: Delay between retries in seconds Nrrr)selfrrrs 7C:\PYTHON\Trading\src\data_collector\yahoo_collector.py__init__YahooFinanceCollector.__init__s%&&tickerpriorityreturnc bURU5nU(d[R"SU35 gURR 5nUR [ 5RUS9R5nU(a6[R"SUS35 URU5 UsSSS5 $[ UURSU5URS5URS5S US S 9nURU5 UR5 URU5 [R"S US UR35 URU5 UsSSS5 $!,(df  g=f![ a&n[R""SUSU35 SnAgSnAff=f)z Add a new stock to the database Args: ticker: Stock ticker symbol (e.g., 'ENEL.MI') priority: Stock priority level ('primary' or 'secondary') Returns: Stock object if successful, None otherwise z Could not fetch info for ticker NrStock z already exists in databaselongNamesectorindustryzBorsa ItalianaT)rnamer"r#marketr is_activez Added stock: z - zError adding stock : )_get_stock_infor warningr get_sessionqueryr filter_byfirstinfoexpungegetaddcommitrefreshr$ Exceptionerror)rrr stock_infosessionexisting_stockstockes r add_stockYahooFinanceCollector.add_stock!sb) --f5J!A&JK,,.'!(u!5!?!?v!?!N!T!T!V!KK&0K LMOON3)/.!# F;%>>(3'^^J7+%" E" & mF83uzzlCD&;/..>  LL.vhb< = sH1E>E>A$E-2 E>- E;7E>;E>> F.F))F.days force_updatec URR5nUR[5R US9R 5nU(d$[ R"SUS35 SSS5 gU(dhUR[5R URS9R5nUS:a'[ R"SUS US 35 SSS5 g OUR[5R URS9R5nUR5 US:a[ R"S US US35 O[ R"SUS35 [R"5nU[!US9- n [ R"SUSU R#5SUR#535 [$R&"XUSSS9n U R((a#[ R*"SU35 SSS5 g[ R"S[-U 5SU35 US- S-n [-U 5U S-:a6[ R*"S[-U 5SUS[/U 5SUS3 5 O&[ R"S [-U 5S!US"35 [1U R2[4R65(a U R2R9S5U lSn Sn U R;5GH;upS#nUR[5R URUS$9R 5nU(Ga"U(GdU"US%5b[=U"US%55O UR>UlU"US&5b[=U"US&55O UR@Ul U"US'5b[=U"US'55O URBUl![=U"US(55Ul"U"US)5b[/U"US)55O URFUl#U"US*5b[=U"US*55O URHUl$[R"5Ul%U S+- n GMn[URUU"US%5b[=U"US%55OSU"US&5b[=U"US&55OSU"US'5b[=U"US'55OS[=U"US(55U"US)5b[/U"US)55OSU"US*5b[=U"US*55OSS,S-9 nURMU5 U S+- n GM> UR5 U S:a [ R"S.U S/U S U35 O[ R"S.U S0U35 SSS5 g !,(df  g=f![Na&n[ R"S1US2U35 SnAgSnAff=f)3z Collect historical price data for a stock Args: ticker: Stock ticker symbol days: Number of days of historical data to collect force_update: Force update even if data exists Returns: True if successful, False otherwise rr  not found in databaseNFstock_idrzPrice data for z already exists (z records)Tu🗑️ Deleted z existing price records for z (force_update mode)u🆕 No existing data for z, starting fresh downloadr=zDownloading price data for z from z to startendprogress auto_adjustzNo price data available for z Downloaded z rows from Yahoo Finance for gv@g?u!⚠️ WARNING: Downloaded only z rows for z , expected ~z; days. Yahoo Finance may have limited data for this ticker.u✓ Data validation passed: z rows is adequate for z days periodcXn[U[R5(a [U5S:aURSOSn[R "U5(aU$S$![ [4a gf=fNr isinstancepdSerieslenilocnotnaKeyError IndexErrorrowcolvals r get_valueBYahooFinanceCollector.collect_historical_prices..get_valuesf("%(C)#ryy9958X\chhqkt*,((3--3ATA (*5(#'(AA$"A$$A76A7rBdateOpenHighLowCloseVolume Adj Closeyfinance rBr]openhighlowclosevolume adj_close data_sourceAdded z new, updated z price records for z'Error collecting historical prices for r')(rr*r+r r,r-r r5r idcountr.deleter2rnowrr]yfdownloademptyr)rPintrMcolumnsrN MultiIndexget_level_valuesiterrowsfloatrgrhrirjrkrl created_atr1r4)rrr=r>r7r9existing_count deleted_countend_date start_datedf expected_rows records_addedrecords_updatedr]rVrYexisting price_datar:s rcollect_historical_prices/YahooFinanceCollector.collect_historical_pricesWsyu ,,.' e,66f6EKKMLL6&1G!HI /.$ i0"EHH5# &) ofX=N~N^^g$hi##/.*  i0"EHH5" NN$$q( &7 Fbcibjj~$A &@Ha$bc$<<>% t(<<  9& HYGZZ^_g_l_l_n^opq[[xRWejk88NN%A&#JK S/.V k#b'2OPVxXY!%u s 2 r7]S00NN;CG9JvhW%%(%7$8 4&IOP KK">s2wiG]^b]cco pqbjj"--88!#!jnBKCQWBXBdyf'=!>jn@I#u@U@aiU&; >/#B", !>$.>>.#A#-.."@!+| < $.>>/#B!"%/NN3C$D#$ *~~k:%&&0^^4E%F'($/)*!++ 0 K(  9&BCY/..\  LLA&A3O P sNI;AI*/I;82I**I;3F.I*!I;* I84I;8I;; J+J&&J+tickerscV0nUGHSn[R"SU35 URR5nUR [ 5R US9R5nU(d)[R"SUS35 SX#'SSS5 MUR [5R URS9R[RR55R5nU(aUR[SS 9-nO[R "5[S S 9- n[R "5n["R$"X7USSS 9n U R&(a)[R"S U35 S X#'SSS5 GM[)U R*[,R.5(a U R*R1S5U lSn U R35GHupUR [5R URU S9R5n U (aMJSn[URU U"U S5b[5U"U S55OSU"U S5b[5U"U S55OSU"U S5b[5U"U S55OS[5U"U S55U"U S5b[7U"U S55OSU"U S5b[5U"U S55OSSS9 nUR9U5 U S- n GM UR;5 [R"SU SU35 S X#'SSS5 GMV U$!,(df  GMj=f![<a,n[R>"SUSU35 SX#'SnAGMSnAff=f)z Update daily prices for multiple stocks Args: tickers: List of stock ticker symbols Returns: Dictionary with ticker as key and success status as value zUpdating daily prices for rr z not found, skippingFNrArdrCrDzNo new data for Trr\cXn[U[R5(a [U5S:aURSOSn[R "U5(aU$S$![ [4a gf=frKrLrUs rrY.get_valueZsf,&)h#-c299#=#=9jnBKCQWBXBdyf'=!>jn@I#u@U@aiU&; C CJ;s;t;za49ac4iaFchtn2sxho8N/Orr)rrrtypingrrrrpandasrNrerslogurur src.database.db_managerr src.database.modelsr r r rrrrrs3 )..3AAccr