
    '(it                       U 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Z	 ee
                                          j        dz  Zdddd	g d
dddddg ddddddg ddddddg ddddddg ddd d!d"d#g d$dd%d&d'd(g d)dd*d+d,d-d.d/gdd0d1d2d3g d4dd5d6d7dg d8dd9d:d;dg d<dgZd=ed><   g d?g d@g dAg dBg dCg dDg dEg dFg dGg dHg dIdJZdKedL<   dMdNgdOgdPgdQdRgdSgdTdUgdVdWgdXgdYgdZgd[d\gd[gd]ZdKed^<   ddcZdddZddeZdfdgdhdidjdkdldidmdndodigZd=edp<   ddtZddxZdd|ZddZddZddZddZddZddZddZddZ e!dk    r e              dS dS )a  Generate sectors_data.json for the SPX sectors dashboard page.

Data layers:
  - 11 GICS sectors (S&P 500 weights, 2026-Q1 snapshot)
  - For each sector: GICS industries (Level 3) with intra-sector weight
  - Forward P/E reference (Yardeni / FactSet style 2026-Q1 public values)
  - Trailing P/E live from yfinance per sector SPDR ETF

Re-check quarterly:
  - Sector weights / industry breakdown: State Street SPDR fact sheets
  - Forward P/E: Yardeni "S&P 500 Sectors & Industries Forward P/Es" weekly
    )annotationsN)Pathzsectors_data.jsonzInformation TechnologyXLKg     >@g     ;@))Software      @@)Semiconductorsg      9@)z*Technology Hardware, Storage & Peripherals      2@)#Semiconductor Materials & Equipment      @)zIT Services       @)zCommunications Equipment      @)z.Electronic Equipment, Instruments & Componentsr   )sectoretf
weight_pct
forward_pe
industries
FinancialsXLFgffffff,@g      /@)),Financial Services (incl. BRK.B, V, MA, AXP)g      G@)Banks (Diversified & Regional)      :@)	Insurance      1@)zCapital Marketsr   )zConsumer Finance      @zHealth CareXLVg      %@g     1@))Pharmaceuticalsr   ) Health Care Equipment & Suppliesr   )Biotechnology      ,@)zLife Sciences Tools & Services      (@)z Health Care Providers & Servicesg      &@)zHealth Care Technologyr   zConsumer DiscretionaryXLYg$@      8@))zBroadline Retail (AMZN-driven)r   )zAutomobiles (TSLA-driven)r   )zHotels, Restaurants & Leisure      5@)zSpecialty Retail      *@)z Textiles, Apparel & Luxury Goodsr   )zHousehold Durablesr   )zLeisure Products      @)Distributorsr   zCommunication ServicesXLCg333333#@g     3@))*Interactive Media & Services (GOOGL, META)g     H@)zEntertainment (NFLX, DIS, WBD)g      3@)zWireless Telecom (TMUS, VZ, T)r"   )z&Diversified Telecommunication Servicesr   )zMedia (advertising/cable)r   IndustrialsXLIg333333!@      6@))Aerospace & Defenser	   )	Machineryr   )z'Ground Transportation (Rail / Trucking)      "@)zAir Freight & Logisticsr   )zBuilding Productsr   )zElectrical Equipmentr   )z"Industrial Conglomerates (GE, HON)r.   )zProfessional Servicesr.   )zCommercial Services & Supplies      @)z Trading Companies & Distributorsr   )zConstruction & Engineeringr%   )zPassenger Airlinesr%   zConsumer StaplesXLPgffffff@r#   ))zBeverages (KO, PEP)r+   )zHousehold Products (PG)r	   )zTobacco (PM, MO)r    )zFood Productsr    )z/Consumer Staples Merchandise Retail (COST, WMT)r"   )zFood & Staples Retailingr   )zPersonal Care Productsr%   EnergyXLEg333333@g      +@)Oil, Gas & Consumable Fuelsg      V@)Energy Equipment & Servicesr    	MaterialsXLBg@r	   ))#Chemicals (LIN, SHW, APD, ECL, DOW)g     Q@)zMetals & Miningr$   )zContainers & Packagingr    )zConstruction Materialsr   	UtilitiesXLUg333333@))zElectric Utilitiesg      O@)zMulti-Utilitiesr"   )z)Independent Power & Renewable Electricityr   )zGas Utilitiesr/   )zWater Utilitiesr   zReal EstateXLREg@)	)-Specialized REITs (data center, self-storage)g      B@)Telecom Tower REITs (AMT, CCI)r$   )zIndustrial REITs (PLD)r$   )zRetail REITsr    )zResidential REITsg      $@)zHealth Care REITsr   )zOffice REITsr   )zHotel & Resort REITsr   )z$Real Estate Management & Developmentg       @
list[dict]SECTORS)NVDAAVGOAMDQCOMINTCAMATLRCXKLACMUTXNADIMRVLMCHPMPWRNXPIONASMLTERARM)MSFTORCLCRMSAPADBENOWINTUPLTRIBMCRWDPANWFTNTSNOWWDAYADSKTEAMDDOGZSNET)LLYJNJABBVMRKPFEBMYZTSVTRS)	AMGNVRTXGILDREGNBIIBALNYMRNABMRNINCY)ISRGABTMDTSYKBSXEWBDXBAXZBHRMDPODDIDXXSTEDXCMRVTYWSTALGNGEHC)JPMBACWFCCUSBPNCTFCMTBFITBRFHBANKEYCFGCMA)
zBRK-BVMAAXPPYPLFISFICOFGPNDFS)PGRCBAIGMETPRUALLAFLHIGTRVMMCAONAJGWTWAIZ)RTXBALMTGEGDNOCLHXTDGHEIHIIAXONTXT)GOOGLGOOGMETAPINSMTCH)XOMCVXCOPEOGOXYMPCPSXVLOHESFANGKMIWMBETDVN)r   r   r   r   r   r   r   r   r,   r(   r3   zdict[str, list[str]]INDUSTRY_TICKERSSOXXSMHzSOXX (partial)IGVIBBXBIIHEKBEKREITAXARXOPXESIYMVPNSRVR)r   r
   r   r   r   r   r,   r3   r4   r7   r;   r<   	ETF_HINTStickerstrreturnfloat | Nonec                    	 t          j        |           j        pi }|                    d          }|t	          |          nd S # t
          $ r Y d S w xY w)N
trailingPE)yfTickerinfogetfloat	Exception)r   r   vs      P/home/raptorx-1/project/yardeni/sentiment_indicator/web/generate_sectors_data.py_live_trailing_per     se    y  %+HH\""=uQxxxd2   tts   AA 
AAc                    	 t          j        |                               ddd          }|j        rg S d t	          |j        |d                   D             S # t          $ r g cY S w xY w)zjFull-history monthly close prices for an ETF, used for regime / NBER backtests.
    Returns [] on failure.max1moTperiodintervalauto_adjustc                    g | ]U\  }}|t          |t                    r||k    "|                    d          t          t          |          d          dVS )N%Y-%m-%d   dateclose
isinstancer   strftimeround.0dtps      r   
<listcomp>z2_live_etf_history_monthly_full.<locals>.<listcomp>  c     
 
 
A}jE&:&:}Q [[,,uU1XXq7I7IJJ@F    Closer   r   historyemptyzipindexr   r   hists     r   _live_etf_history_monthly_fullr    s    
y  ((SW(XX: 	I
 
TZg77
 
 
 	

    			   2A $A A)(A)c                    	 t          j        |                               ddd          }|j        rg S d t	          |j        |d                   D             S # t          $ r g cY S w xY w)z5y weekly close prices for an ETF, formatted for charting.
    Returns [] on failure. We use weekly to keep JSON size sane (~260 points).5y1wkTr   c                    g | ]U\  }}|t          |t                    r||k    "|                    d          t          t          |          d          dVS )Nr      r   r   r   s      r   r  z/_live_etf_history_5y_weekly.<locals>.<listcomp>.  r  r  r  r  r
  s     r   _live_etf_history_5y_weeklyr  '  s    
y  ((uRV(WW: 	I
 
TZg77
 
 
 	

    			r  z2001 dot-comz
2001-03-01z
2001-11-30)namestartendz2008 GFCz
2007-12-01z
2009-06-30z
2020 COVIDz
2020-02-01z
2020-04-30NBER_RECESSIONSseries
start_dateend_datec                    | sdS t          fd| D             d          }d}| D ]}|d         |k    r	|d         } |||dk    rdS t          ||z  dz
  dz  d          S )	u   Cumulative total return of an ETF time-series between two dates.
    Picks the first close ≥ start_date and the last close ≤ end_date.
    Returns None if either anchor is missing (ETF not yet listed).Nc              3  @   K   | ]}|d          k    |d         V  dS )r   r   N )r   rr  s     r   	<genexpr>z)_series_return_between.<locals>.<genexpr>F  s5      NNqai:6M6M'
6M6M6M6MNNr  r   r   r      d   r  )nextr   )r  r  r  start_close	end_closer  s    `    r   _series_return_betweenr%  @  s      tNNNNFNNNPTUUKI  V9  '
IIi/;!3C3Ct)k)A-4a888r  date_strmonthsintc                    ddl m} |                     d          \  }}}t          |          t          |          }}|dz  |dz
  z   |z   }t	          |d          \  }}|dd|dz   ddS )	z:date_str + N months, returned as ISO date string (day=01).r   )r   -   r   04d02dz-01)datetimer   splitr(  divmod)	r&  r'  r   ym_totalnynms	            r   _add_monthsr7  R  s    nnS!!GAq!q663q66qAVq1u'EE2FB&&&rAv&&&&&r  weekly_historydict[str, list[dict]]sectorsc           	     
   |                      dg           }|si S |d         d         }d |D             }i }|D ]L}|                      |d         g           }|s!|d         d         |d         d |D             d||d         <   Md	 |D             }|D ]}	|	d
         }
|	d         }||z  }|dk    ri }|                                D ]E\  }}|d                              |
          }||dk    r)||d         z  }|d         ||z  z  ||<   Ft          |                                          }|dk    r|                                D ]7\  }}||                             |
t          ||z  dz  d          d           8|S )u  Approximate per-sector SPX weight over 5y from ETF total-return ratios.

    Math: anchor at "today's known weights". For each historical date t:
        raw_i(t) = w_i(today) × (ETF_i_price(t) / ETF_i_today) / (SPY(t) / SPY_today)
        w_i(t)   = raw_i(t) / Σ_j raw_j(t) × 100
    The (ETF_i / SPY) ratio captures relative cumulative return → reverse-engineers
    each sector's market-cap fraction. Then renormalize so the 11 sectors sum to 100%.

    Caveat: assumes intra-sector share-count proportions are stable (no major
    IPO/buyback rebalancing). For 5y this is a decent approximation; for sector-
    weight time series of true accuracy, S&P / FactSet historical data needed.
    SPYr   c                ,    i | ]}|d          |d         S r   r  r   r  s     r   
<dictcomp>z+_compute_weight_history.<locals>.<dictcomp>o  s"    222qy!G*222r  r   r   c                ,    i | ]}|d          |d         S r   r  r?  s     r   r@  z+_compute_weight_history.<locals>.<dictcomp>z  s"    AAAQ1V9ajAAAr  )today_closew_today
series_mapc                    i | ]}|g S r  r  )r   r   s     r   r@  z+_compute_weight_history.<locals>.<dictcomp>}  s    !D!D!Dc#r!D!D!Dr  r   r   rD  NrB  rC  r!     )r   r   )r   itemssumvaluesappendr   )r8  r:  spy	spy_todayspy_mapsector_anchorssr  outr  r   spy_t	spy_ratiorawr   ancetf_t	etf_ratior4  raw_ws                       r   _compute_weight_historyrX  \  s     

UB
'
'C 	B I22c222G ')N 
 
##AeHb11 	!":g.AA&AAA$
 $
qx   "E!D^!D!D!DC Y Yy'
I%	>>&,,.. 	@ 	@HC%))$//E}

M 22I9~Y)>?CHHCJJLL!!A::))++ 	Y 	YJCHOOTuu}s?RTU9V9VWWXXXX	YJr  monthly_historydictc           
     T   |                      dg           }|si S g }t          D ]p}|                    d|d          dd|d         |d         d           |                    d	|d          dd
|d         t          |d         d          d           qd |D             dgz   g |D ]}|d         |d         |d         |d         i d}t	          ||d         |d                   }||d         d<   D ]j}|dk    r	t	          |                      |g           |d         |d                   }	|	|d         |<   |	|t          |	|z
  d          nd|d         | d<   k                    |           dfd}
dddd |
d          ddd
dd |
d
          dg}|z   ddS )u4  For each NBER recession, compute per-sector total return during:
        - Recession period (peak → trough)
        - Early Recovery: 12 months after recession end
    And one regime spanning the entire sample (1999-12 → today) for "Full History" reference.
    Returns dict ready for JSON serialization.r<  zRecession (r  )	recessionr  r  )regimephaser  r  zEarly Recovery (early_recoveryr+  c                    g | ]
}|d          S r   r  r   rO  s     r   r  z*_build_sector_rotation.<locals>.<listcomp>  s    ***Q%***r  r^  r_  )r^  r_  r  r  returnsrd  Nr  _alphar   r   rZ  c                8    i }D ] fdD             }|r-t          t          |          t          |          z  d          nd |<   dk    rF fdD             }|r-t          t          |          t          |          z  d          nd | d<   |S )Nc                    g | ]D}|d          k    |d                                        )|d                                        ES )r_  rd  r   r   r  r   r_  s     r   r  z?_build_sector_rotation.<locals>._avg_across.<locals>.<listcomp>  sT    uuua1W:;N;NSTU^S_ScScdgShShStAiL$$S))StStStr  r  r<  c                    g | ]J}|d          k    |d                               d          ,|d                               d          KS )r_  rd  re  rh  ri  s     r   r  z?_build_sector_rotation.<locals>._avg_across.<locals>.<listcomp>  s      Q  Q  Qa1W:Y^K^K^cdencocscswz  uC  uC  uC  dD  dD  dP9))S...99  dP  dP  dPr  re  )r   rH  len)r_  rP  valsavalsr   all_etfsrowss   `   @r   _avg_acrossz+_build_sector_rotation.<locals>._avg_across  s    ') 	[ 	[Cuuuuu4uuuD:>HuSYYT2A666DCHe|| Q  Q  Q  Q  Q4  Q  Q  QKP&ZeCJJU,CQ&G&G&GVZsNNN#
r  u   AVG · Recessionu   —u   AVG · Early Recoveryu  Per-sector cumulative total return during NBER recession peaks/troughs and the 12-month period immediately after each recession ('early recovery'). alpha = sector return − SPY return for that window. ETFs without coverage (e.g. XLC inception 2018, XLRE 2015) show n/a.)regimesetfsmethod)r_  r   r   rZ  )r   r  rJ  r7  r%  r   )rY  r:  rK  rq  recregrowspy_retr   retrp  	compositern  ro  s               @@r   _build_sector_rotationrz    s    

eR
(
(C 	G  2CK222 \u:	
 
 	 	 	 	7V777%Zs5z2..	
 
 	 	 	 	 +*'***eW4HD 
 
XWG]`af]gtvww(c'lCJGG 'Iu 	| 	|Ce||()<)<S")E)Es7|UXY^U_``C"%C	N3IL]d]pU3=!-D-D-Dw{C	Nc>>>**C       &kRW`er}r}  J  sK  sK  	L  	L*6FRW`er}r}  O  sP  sP  	Q  	QI t#S		 	 	r  c                     	 t          j        d                              d          } | j        rdS t	          t          | d         j        d                   d          S # t          $ r Y dS w xY w)z10Y Treasury yield (percent), used as the risk-free anchor for ERP.
    Source: yfinance ^TNX (CBOE 10Y Treasury Yield Index). Returns the most
    recent close in percent (e.g. 4.31 means 4.31%).z^TNX5d)r   Nr  r=  r  )r   r   r  r  r   r   ilocr   )r  s    r   _live_10y_treasury_yield_pctr~    s|    y  (((55: 	4U4=-b122A666   tts   /A! -A! !
A/.A/tickers	list[str]dict | Nonec           	        | sdS d}d}d}g }| D ]}	 t          j        |          j        pi }n%# t          $ r |                    |           Y Aw xY w|                    d          }|                    d          }t          |t          t          f          rbt          |t          t          f          rF|dk    r@|dk    r:|t          |          z  }|t          |          t          |          z  z  }|dz  }|                    |           |dk    rdS t          ||z  d          d||t          |d	z  d          t          |d	z  d          d
S )u7  Aggregate forward P/E for a sub-industry as a true portfolio P/E:
        Σ(market_cap_i) / Σ(market_cap_i / forward_PE_i)
    i.e. total portfolio market cap divided by total forward earnings —
    mathematically equivalent to a market-cap-weighted HARMONIC mean of P/E.
    This matches the Yardeni / FactSet / JPM "Guide to Markets" sector P/E
    convention. The naive arithmetic mcap-weighted PE is wrong because it
    over-weights high-PE outliers (e.g. ARM @ 109) whose earnings
    contribution is tiny. Returns None when no constituents have valid data.N        r   	forwardPE	marketCapr   r  uG   portfolio P/E (= Σ mcap / Σ forward earnings, harmonic mcap-weighted)g    eA)valuers  constituents_usedconstituents_skippedtotal_mcap_billion_usd"total_forward_earnings_billion_usd)
r   r   r   r   rJ  r   r   r(  r   r   )	r  sum_mcapsum_earningsusedskippedtr   fpemcaps	            r   _weighted_industry_fwd_per    s     tHLDG  	9Q<<$*DD 	 	 	NN1H	 hh{##xx$$cC<(( 	ZsEl-K-K 	PSVWPWPW\`cd\d\dd#HE$KK%**44LAIDDNN1qtx,.22[! '"'3":":.3L34F.J.J  s   /AAr   trailing_pec                r    | r|r| dk    s|dk    rdS || z  dz
  dz  }|dk    rdS t          | |z  d          S )u   Implied PEG = fwdPE / implied_growth%, where
    implied_growth% = (trailing_PE / forward_PE - 1) * 100.
    Returns None when growth ≤ 0 (PEG undefined / "infinitely expensive").r   Nr   r!  rF  r   )r   r  
growth_pcts      r   _implied_pegr    sa      [ J!OO{a?O?Ot
*Q.#5JQtj(!,,,r  rI  list[float | None]c                    d | D             }t          |          dk     rdgt          |           z  S t          j        |          t          j        |          dk    rd | D             S fd| D             S )zOPer-element z-score. Drops None from mean/std calculation; None passes through.c                    g | ]}||S Nr  r   r   s     r   r  z_zscore.<locals>.<listcomp>  s    0001!-Q---r  r  Nr   c                    g | ]}|dnd 	S )Nr  r  r  s     r   r  z_zscore.<locals>.<listcomp>$  s     ???1q}$???r  c                D    g | ]}|t          |z
  z  d          nd S )NrF  r  )r   r   musds     r   r  z_zscore.<locals>.<listcomp>%  s4    OOO1q}E1r6R-###$OOOr  )rk  
statisticsmeanstdev)rI  validr  r  s     @@r   _zscorer    s    00000E
5zzA~~vF##			B		%	 	 B	Qww??????OOOOOOOOOr  
ust10y_pct!tuple[float | None, float | None]c                    | | dk    rdS d| z  }|t          |d          dfS t          |d          t          ||z
  d          fS )zKEarnings Yield = 1/fwdPE (in %); ERP = EY - 10Y Treasury yield (both in %).Nr   )NN      Y@r  r  )r   r  eys      r   _ey_erpr  (  sY    Z1__z		BR||T!!Q<<rJ2222r  c                    t                      } d t          D             dgz   }d |D             }g }d}d}t          D ]}t          |d                   }t          d |d         D                       }g }	|d         D ]\  }
}|
|t	          |d         |z  d	z  d
          t
                              |
g           d}t          t                              |
g                     }|3|d         |d<   ||d<   t          |d         |           \  }}||d<   ||d<   |	
                    |           t          |d         |           \  }}t          |d         |          }|
                    |d         |d         |d         ||d         |||t	          |d          |	d
           ||d         z  }||d         |d         z  z  }|rt	          ||z  d          nd }t          ||           \  }}d\  }}d |D             }d |D             }t          |          }t          |          }t          |          D ]P\  }}||         ||         }}||d |d<   ||||dd|d<   *t	          ||z  ||z  z   d
          |d<   ||||d|d<   Qt          ||          }t          ||          }dt	          |d          || |||||dddd d!d"d#d$d%d&d'd(d)d*|d+S ),Nc                    g | ]
}|d          S rb  r  rc  s     r   r  z!build_payload.<locals>.<listcomp>9  s    111Aqx111r  r<  c                .    i | ]}|t          |          S r  )r  )r   r  s     r   r@  z!build_payload.<locals>.<dictcomp>:  s#    RRRQA5a88RRRr  r  r   c              3      K   | ]	\  }}|V  
d S r  r  )r   r3  ws      r   r  z build_payload.<locals>.<genexpr>B  s&      66da666666r  r   r   r  rF  )r  weight_in_sector_pctweight_in_spx_pct	etf_hintsr  r   forward_pe_metaearnings_yield_pcterp_pctr   r  )
r   r   r   r  r   r  r  implied_pegindustry_total_checkr   )g333333?g?c                8    g | ]}|d          rd|d          z  ndS )r  g      ?Nr  rc  s     r   r  z!build_payload.<locals>.<listcomp>n  s1    XXX1Am,<Fq'''$XXXr  c                    g | ]
}|d          S )r  r  rc  s     r   r  z!build_payload.<locals>.<listcomp>o  s    ***QAiL***r  composite_scoreuA   PEG undefined (implied growth ≤ 0); composite score unavailable)	z_inv_pegz_erpalphabetanotecomposite_score_breakdown)r  r  r  r  z2026-Q1z,S&P / State Street SPDR fact sheets, 2026-Q1z*State Street SPDR ETF fact sheets, 2026-Q1z0yfinance live (sector SPDR ETF .info.trailingPE)z)Yardeni / FactSet 2026-Q1 public releasesu   yfinance live, market-cap-weighted aggregation across the industry's top constituents (≥80% AUM coverage). Industries not yet in INDUSTRY_TICKERS fall back to inheriting the parent sector's fwd P/E.z9yfinance ^TNX (CBOE 10Y Treasury Yield Index), live closeu:   EY = 1 / forward P/E (盈利收益率, 类似债券 yield)uf   ERP = EY - 10Y Treasury yield (Equity Risk Premium 简化版, 越高股票相对债券越有吸引力)uT   PEG = forward P/E / implied growth %, 其中 implied_growth% = (trail/fwd - 1) * 100u   Composite Value Score (简化 2-factor): score = 0.6 × z(1/PEG) + 0.4 × z(ERP), z-score 在 11 个板块内部标准化. 越高 = 综合性价比越好. 完整 3-factor 版还需历史 PE z-score (需付费源 / 手工 Yardeni 数据).uw  yfinance full-history monthly closes (auto-adjusted), 用于价格走势图. 覆盖范围: 9 核心 sector ETF (XLK/XLF/XLV/XLY/XLP/XLI/XLB/XLE/XLU) 1998-12 起, XLRE 2015-10 起, XLC 2018-06 起 (GICS 改版). 注: 这不是历史 PE 时间序列, 仅是价格走势; 因 yfinance 对 ETF 无历史 EPS, 真历史 PE 需要付费源 (FactSet/Bloomberg) 或 SimFin/AV 重建.u  Per-sector approx SPX weight, monthly, 1998-12+. 重建公式: w_i(t) = w_i(today) × (ETF_i(t)/ETF_i(today)) ÷ (SPY(t)/SPY(today)), 再 normalize 使各时点 11 板块加和 = 100%. 假设 sector 内 share-count 比例稳定. 近似精度: 5y ±0.5pp, 27y 长期 ±2pp 量级 (有 GICS 改版导致结构性偏差, 主要是 2018 XLC 重组). 真实历史 SPX 板块权重需要 S&P/FactSet 付费源.uA  板块在 NBER 衰退/复苏 regime 下的累计回报 + 相对 SPY 的 alpha. Recession 期 = NBER 顶到 NBER 底; Early Recovery = NBER 底 + 12 个月. 覆盖 2001 dot-com / 2008 GFC / 2020 COVID 三次衰退. XLC (inception 2018), XLRE (inception 2015) 仅覆盖 2020 COVID. ETF 来自 yfinance auto-adjusted 月线.)sector_weightsindustry_breakdownr  forward_pe_sectorforward_pe_industryust10y_yieldearnings_yielderpr  r  historical_pricessector_weight_historysector_rotation)as_ofweight_total_checkspx_forward_peust10y_yield_pctspx_earnings_yield_pctspx_erp_pcthistorical_prices_max_monthly!sector_weight_history_max_monthlyr  data_sourcesr:  )r~  r>   r   rH  r   r   r   r  r   r  rJ  r  r  	enumeraterz  rX  )ust10yhistory_tickersmonthly_fullr:  weight_totalfwd_pe_weightedrO  r  	ind_totalr   r  pctind_objaggr  r  pegr  spx_eyspx_erpALPHABETAinv_pegserpsr  r  izpzer  weight_historys                                  r   build_payloadr  2  s   )++F 21111UG;ORR/RRRLGLO &= &='%11 66ao66666	
< 	' 	'ID#(+%*1\?S+@5+H!%L%L&]]444	 G ,,<,@,@r,J,JKKC(+G%-0)*!#g,77C02,-%(	"g&&&&!L/622C1\?K88H+xo*o&("(-i(;(;( 	
 	
 	
 	,'1\?Q|_<<AMWU?\91===SWNnf55OFG
 KE4XXPWXXXH**'***D!!IDMME'""  11uQxB:#'A "ud[. .A)**
 $)dRi)?#C#CA "ud. .A)** -\7CCO,\7CCN #L!44(""()5-;*L"NM!L/
 XZ{qehM<I*
 *
V k6 6 6r  Nonec                    t                      } t                              t          j        dz             }|                    t          j        | dd                     t          j        |t                     t          dt                      t          dt          | d                    d| d	          d
| d          d| d          d| d          d           d S )Nz.tmpr  F)indentensure_asciizwrote z  sectors: r:  z  weight_total: r  z  SPX fwd P/E: r  z  10Y: r  z%  SPX ERP: r  %)r  OUTPUTwith_suffixsuffix
write_textjsondumpsosreplaceprintrk  )payloadtmps     r   mainr    s   ooG 

V]V3
4
4CNN4:gaeDDDEEEJsF	
6

		.c'),-- 	. 	. !56	. 	. 01	. 	. *+	. 	. M*		. 	. 	.    r  __main__)r   r   r   r   )r   r   r   r=   )r  r=   r  r   r  r   r   r   )r&  r   r'  r(  r   r   )r8  r9  r:  r=   r   r9  )rY  r9  r:  r=   r   rZ  )r   r   )r  r  r   r  )r   r   r  r   r   r   )rI  r  r   r  )r   r   r  r   r   r  )r   rZ  )r   r  )"__doc__
__future__r   r  r  r  pathlibr   yfinancer   __file__resolveparentr  r>   __annotations__r   r   r   r  r  r  r%  r7  rX  rz  r~  r  r  r  r  r  r  __name__r  r  r   <module>r     s     # " " " " "  				               
h			!	!	(+>	> +
 
 
   
 
 
   
 
 
  +	
 	
 	
 " +
 
 
   
 
 
 * %
 
 
   11
	 	 
 
 
  
 
 
   

 

 

 ]_ _ _ _ _R    
    ) ) )
' ' '5 5 5  
  
3 3 3$ $ $Y0* 0*  0 0 0 0p uo,<+=U^w',en!5>$)7$)7,176;V_',g# #	               & |LII|LII|LII    9 9 9 9$' ' ' '4 4 4 4nA A A AH
 
 
 
) ) ) )X	- 	- 	- 	-	P 	P 	P 	P3 3 3 3G G G GT   $ zDFFFFF r  