
    pj                        d Z ddlmZ ddlZddlmZ ddlmZ ddl	Z
 ee      j                         j                  d   Zedz  dz  d	z  Zd
Zedz  ZdZddZddddZddd	 	 	 	 	 	 	 	 	 ddZy)z
Equity universes for buy-the-dip and cross-sectional sleeves.

Russell 3000: cached CSV from a public GitHub mirror of index membership
(see ``RUSSELL3000_TICKERS_URL``). Not point-in-time; refresh periodically.
    )annotationsN)StringIO)Path   RenTechdatauniversezWhttps://raw.githubusercontent.com/shashankvemuri/Finance/master/russell3000_tickers.csvzrussell3000_tickers.csvzoMozilla/5.0 (compatible; trading_bot/1.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36c                ^    | j                         j                         j                  dd      S )N.-)stripupperreplace)symbols    J/opt/rentech/trading_bot/RenTech/strategy_stack/equity_universe_loaders.py_to_yahoo_symbolr      s$    <<>!))#s33    F)refreshc           	        t         j                         r| st        j                  t               }nt        j
                  j                  t        dt        i      }t        j
                  j                  |d      5 }t        j                  t        |j                         j                  dd                  }ddd       t        j                  d	d	
       j                  t         d       d|j                   v rdn|j                   d   }||   j#                         j%                  t&              j&                  j)                         j&                  j+                         }|j&                  j-                  ddd      }|j&                  j/                  dd      }t1        t3        ||   j5                                     }t7        |      dk  rt9        dt7        |       dt                |S # 1 sw Y   ;xY w)zS
    Return Yahoo-style tickers for Russell 3000 (snapshot list, ~2.5k names).
    z
User-Agent)headersx   )timeoutzutf-8r   )errorsNT)parentsexist_okF)indexTickerr   r   r   )regexz^[A-Z][A-Z0-9\-]{0,9}$)nai  zRussell 3000 list too short (z tickers); check )RUSSELL3000_CACHEis_filepdread_csvurllibrequestRequestRUSSELL3000_TICKERS_URL_USER_AGENTurlopenr   readdecodeUNIVERSE_DIRmkdirto_csvcolumnsdropnaastypestrr   r   r   matchsortedsettolistlenRuntimeError)r   dfreqrespsym_colrawokouts           r   fetch_russell3000_tickersr@       s      "7[[*+nn$$%<|U`Fa$b^^##C#5 	VXdiik&8&8&8&STUB	V4$7
		#5	1"bjj0hbjjmG
W+



%
%c
*
.
.
4
4
6
:
:
@
@
BC
''//#s%/
0C	0U	;B
SW^^%&
'C
3x#~:3s8*DUVgUhijjJ	V 	Vs   =>G44G>)max_tickersrefresh_cachec               l   ddl m}m} | j                         j	                         }|dv r |||||      S |dv rddl}ddl m} t               }	|r|dkD  r|	dt        |       }	 ||      }
t        dt        |	       d	d
       |j                  |	d|
|rdnd      }i }|j                         D ]r  \  }}||j                  r|j                         }t        j                   |j"                        j%                  d      |_        |j'                         } ||      ||<   t |S t)        d|       )z_
    Daily panels with ``close``, ``ret``, ``sma_200``, ``aqr_mom`` for dip / L/S engines.
    r   ) _compute_daily_backtest_features_load_aqr_equity_dict)sp500sp100)r	   rA   rB   )russell3000r3krussell_3000N)_parse_daily_period_yearsu/   🔍 Downloading Russell 3000 equity universe (u    names) …T)flush1dg        g      8@)	timeframelookback_yearsmax_age_hoursz3universe must be sp500, sp100, or russell3000; got )RenTech.strategy_stack.mainrD   rE   lowerr   universe_scannerrK   r@   intprintr7   download_and_cache_dataitemsemptycopyr"   to_datetimer   tz_localize
sort_index
ValueError)r	   daily_periodrA   rB   rD   rE   uusrK   tickersyears
equity_rawequity_dicttr9   df2s                   r   load_equity_panel_dictrg   8   sM    d A$#'	
 	
 	22%I+-;?0K 01G),7?G~[Yaef// !.#D	 0 

 02%%' 	CEArzRXX'')Csyy1==dCCI.."C=cBKN	C 
J8,W
XXr   )r   r2   returnr2   )r   boolrh   z	list[str])
r	   r2   r^   r2   rA   rT   rB   ri   rh   zdict[str, pd.DataFrame])__doc__
__future__r   urllib.requestr$   ior   pathlibr   pandasr"   __file__resolver   _REPOr,   r'   r    r(   r   r@   rg    r   r   <module>rt      s    #    X ((+y 6)J6]  !#<< L 4 27 8 -Y-Y-Y 	-Y
 -Y -Yr   