
    pjQ              
         U d Z ddlm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
 ddlmZ  e
d	      Z ee      j                         j                   d
   Zedz  Zddddddddddddddddddddddddddddd Zd!ed"<   dddd#	 	 	 	 	 	 	 	 	 	 	 	 	 d.d$Zd/d%Zd0d&Zd1d2d'Z	 	 	 	 	 	 	 	 	 	 	 	 	 	 d3d(Z	 	 	 	 	 	 	 	 	 	 d4d)Z	 	 	 	 	 	 	 	 	 	 d5d*Zd6d+Zd7d,Zd8d-Zy)9z
Structured signal explainability for the command center.

Each sleeve gets criteria checklists (met / not met), sizing, and trade reminders
so automated signals stay auditable without reading source code.
    )annotationsN)datetime)Path)Any)ZoneInfo)STRATEGY_DEFINITIONSzAmerica/New_York   z1RenTech/strategy_stack/sleeve_risk_fractions.jsonzVIX < 12 (complacency)u>   R1 weekly long strangle (long call ~45Δ + long put ~18Δ OTM)r1_strangle_dter1_time_stop_daysu-   TP +50% debit · SL −50% debit · time stopz)2% of capital per entry (if PMCC enabled))band	structuredte_keytime_stop_key
exit_rules	risk_noteu   12 ≤ VIX ≤ 20 (normal vol)uO   R2a put diagonal (sell 21d ~30Δ / buy 45d ~15Δ) + R2b put credit spread (30d)r2_time_stop_daysuI   R2a: $50 TP / −$150 SL per contract · 14d · R2b: 50% credit TP · 21dz:R2a diagonal risk budget + R2b at put-spread risk fractionu   20 < VIX ≤ 30 (elevated fear)u7   R3 put credit spread (~45 DTE, short ~15Δ / long ~7Δ)r3_time_stop_daysu%   TP 50% of max credit · time stop 24dz$2% capital max-loss sizing per entryzVIX > 30 (extreme panic)u<   R4 wide put credit spread (~45 DTE, short ~15Δ / long ~5Δ)r4_time_stop_days)pmccdiagonalnakedcredit_spreadzdict[str, dict[str, Any]]_REGIME_COPYvalue	thresholdnotec               N    | |t        |      d}|||d<   |||d<   |r||d<   |S )N)idlabelmetr   r   r   )bool)cidr    r!   r   r   r   rows          :/opt/rentech/trading_bot/RenTech/monitor/signal_explain.py
_criterionr&   :   sD     "%uT#YGCG$KFJ    c                    t         j                         si S 	 t        j                  t         j	                  d            } t        | t              r| j                  d      xs i S i S # t        j                  $ r i cY S w xY w)Nutf-8encodingstrategy_params)	_VRP_PARAMS_PATHis_filejsonloads	read_text
isinstancedictgetJSONDecodeError)raws    r%   _load_vrp_paramsr7   M   sr    ##%	jj)33W3EF3=c43Hsww()/RPbP 	s   AA( &A( (B ?B c                \    	 t        |       }||k(  sy d|dS # t        t        f$ r Y y w xY w)N$z,.0f)float	TypeError
ValueError)xvs     r%   _fmt_usdr?   W   s?    !HQ1T(|z" s     ++c                >   | rt        t        |             dk  ry 	 t        j                  t        |       d d d      j	                         }|xs t        j
                  t              j	                         }t        d||z
  j                        S # t        $ r Y y w xY w)N   z%Y%m%dr   )
lenstrr   strptimedatenowNYmaxdaysr<   )expiryas_ofexprefs       r%   _leg_dterN   a   s    SV%)FBQ:??A(R(..01sSy&&'' s   A3B 	BBc                ^   t               }| xs i }|xs i }|j                  d      xs$ |j                  d      xs |j                  d      }	|j                  d      xs |j                  d      }
|j                  d      }||	|
t        |	      t        |
      kD  }|j                  d      }|j                  d      xs |r|d	   j                  d
      nd }|j                  d      }|j                  dd      }t        ddt	        |      |	dt        |	      dnd |
dt        |
      dndd      t        dd| d|t	        |      nd|j                  d      r|j                  dd      d d nd d| d|j                  dd            t        dd | d!"      g}|t        |j                  d#d$            t        |j                  d%d&            t        |j                  d'd(            }}}|j                  t        d)d*d+d,t        |      dd-| d.| d/| d0| d1| 2             |d	kD  r||z  nd3}g }|D ]  }t        |j                  d
|xs d            }t        j                  |i       }|j                  d4      xs g }g }|D ]  }|j                  d5d      }|j                  |j                  d6      |j                  d7      |t        t        |            |j                  d8      |j                  d9      |j                  d:d;      d<        t        |j                  d=|j                  d>d                  }t        |j                  d?      xs d	      }|j                  d@      }|j                  dA      } | r|rt        |       |z  n|}!|j                  i dB|j                  dCdD      d
|d=|dE|j                  dE|      d)|j                  dFd      d?|dG|j                  dG      dH|j                  dH      d@|dA| dI|!dJ|j                  dJ      dK|j                  dK      dL|j                  dL      dM|j                  dM      d4|dN|j                  dNd             |j                  t        dO| | dP|j                  dL      dQv |j                  dL      dR2             |j                  t        dS| | dT|dUv |dV| dWt        |       X              t        j                  t        |xs d      i       }"|"j                  dY      }#dZd[|rd\nd]t        dZ   d^   ||t        |d_      ||"j                  dF      |"j                  dE      |#r|j                  |#      nd |"j                  dN      |"j                  d`      dadbdc
|ddS )eNspy_lastspy_livespy_last_bar
spy_sma200sma200spy_gt_sma200vix_live
regime_nowr   regimeentry_time_gate_passentry_after_etz15:40u*   SPY above SMA(200) — global risk-on gatezSPY z.2fzSMA200 zSMA(200)uE   No new option entries when SPY ≤ SMA(200); open legs still managed.r   
entry_timezEntry window open (after z ET)F
created_at    z>= z ETdecision_hintkill_switchzKill switch inactivez7RenTech/live/config/KILL_SWITCH file halts new entries.r   
vix_r1_max   
vix_r2_max   
vix_r3_max   vix_bandzVIX maps to active regime bandTzVIX u    → zR1<u	    · R2≤u	    · R3≤u    · R4>r   r           legsrJ   open_actionsymbolrightstrikeratio   )actionrm   rJ   dtern   ro   rp   decisionentry_actionproposed_qtyrisk_budget_usdrisk_per_contract_usdsource_sourcerecommendationr   r   entry_limit_per_sharecombo_mid_per_sharemax_risk_at_stake_usdtime_stop_daysstop_threshold_unrealized_usdquote_qualitysizing_formular   quote_z: live option quotes usable)live_bag_midsynthetic_liquidz live_bag_mid or synthetic_liquid	decision_z: entry decision)ENTERenteropenzqty=u    · risk budget r   r   r   	spy_thetazSPY Theta (lit4 + VRP)	ibkr_livebacktest_referencerulesr	   r   zEShort at bid / cover at ask (backtest); IB combo limit DAY entry livezGLit4 sleeves: one position per spec; VRP may hold open until TP/SL/time)
fund_weightsleeve_notional_usdactive_regimeregime_bandr   r   r   r   	executionoverlap)r   r    ry   rules_summarycriteriatrade_detailstrades)r7   r4   r:   r&   r"   appendrC   r   rN   intr?   r   round)$
live_state	spy_gatesrecommendationsfund_navr   r`   paramsstategatesrP   rT   spy_gtvixrX   
entry_gateentry_afterr   r1r2r3
sleeve_navr   recregcopyrk   leg_rowslegrL   rt   qtyrisk_budgetrpcmax_riskreg_copyts_keys$                                       r%   explain_vrpr   l   s5    F"EOEyy$Z		*(=Z>AZHYY|$;		((;FYY'F~(.63Ex5=0
))J
CYY|$g_);)?)?)IbfF12J)),g6K 	8L2:2FDx-.D7=7Ifc23zX	
 	'}D9 * 6DE6;ii6M%))L"-cr2SWK=,?B/	
 	"OJ		
#&H0 &**\2./&**\2./&**\2./ B
 	0U3Z,E&:t9RD	"WRDI	
 ,4a<K'SJ#%F =
#''(FLb12R(wwv$" 	C''(B'COO!ggm4!ggh/!#CH- WWW-!ggh/ WWWa0
	 swwz377>2+FGH#''.).Q/gg/0gg-.),E#J$+#'')-=># H TXXk37	
 DHHVR0  (1H)I &sww/D'E "; ( ( !#''*:"; 09X1Y  !9 !#''*:";  !" dhh|R8#	
* 	%23(,PPggo.<	
 	C5!%'(66C5 0+1F0GH	
k=
~ FLb 126H\\/*F)!&+,@-k:7C&#(Q#7##<</!k24:fjj0",,|4!k2``
 % r'   c                   | j                  d      xs i }| j                  d      xs i }| j                  d      xs g }t        |j                  dd            }t        |j                  dd            }t        |j                  dd	            }	t        |j                  d
d            }
|dkD  r||z  nd}t        dddd| j                  dd             t        dddt        |j                  dd            dd      g}|
dk7  r!|j	                  t        dd|
 dd             g }|D ]  }t        |j                  d            }t        |j                  d             }t        |j                  d!      xs d      d"kD  }|j                  d#d$      }|j	                  t        d%| | d&| d'|	 d(| d)t        |j                  d*d+            d+k(  r|xr |n||j                  d,      Cd-|j                  d,       d.|j                  d/       d0t        |j                  d1d            d2nd d3d4t        |j                  d5d            dd6t        |j                  d!d            d7             |t        |j                  d!      xs d      z  }t        |j                  |d            }|j	                  ||j                  d!      t        |d8      t        |d8      t        ||z
  d8      ||d9        |sk|ri|j                         D ]V  \  }}|t        |      z  }|j	                  ||t        |d8      t        t        |j                  |d            d8      d:       X d;d<| j                  d=d>      t        d;   d?   ||t        |d8      | j                  d@      | j                  dA      |dBdCdD|dES )FNtargetsconfiggate_checks
sma_window   mom_lookback_days   mom_skip_days   bond_baseline_mult      ?r   rj   	rebalancez$Weights apply next session (shift-1)TzAs of rK   z
latest barra   
cash_yieldz)Uninvested sleeve weight earns cash yieldcash_annual_yieldg{Gz?.1%z annual / 252r   bond70u   TLT/IEF baseline × z Production bond70_sma200 varianttrend_okmom_oktarget_weightg&.>tickerr]   gate_z: close > SMA(z) AND zd-zd momentum > 0weight_modebinaryclosezclose u    · SMA smau    · mom momentumz.2%ztrend + momentumz	baseline baseline_weightu    → target r   r	   )rm   r   target_notional_usdib_market_value_usdgap_usdr   r   )rm   r   r   r   tactical_awzTactical All Weatherry   backtest_csvr   cash_weighttotal_invested_weightz$ETF shares (SPY, TLT, IEF, GLD, DBC)z&Daily signal; weights execute next bar)r   r   r   r   r   
instrumentr   r   r    ry   r   r   r   	positions)
r4   r   r:   r&   r   r"   rC   r   itemsr   )tacr   r   ib_mvr   r   r   sma_wmom_lbmom_skip	bond_multr   r   r   gr   r   investedsymtgt_usdhavews                         r%   explain_tacticalr     s    ggi &BGWWX$"FGGM"(bE

<-.E/56F6::or23Hfjj!5s;<I+3a<K'SJ 	2#'''<89:		
 	76::&94@A#FmT		
&H C&yk27		
 ')I 
j)*aeeHo&/415<eeHb!u%~eWF8*BvhnU'*6::mX+N'OS['[#Vai uuW~1 QUU7^,HQUU5\N(5QRQVQVWacdQeKfgjJkl, quu->'B!CC HUZ[\[`[`aprs[tUuvyTz{	
 uQUU?%;%@qAAUYYsA&'!"!7',Wa'8',T1~ 43$ 
	
+
B Wmmo 		FC 58+G!%&+0!+<+0uyya7H1I1+M			 '''(N3-m<WE&#(Q#777=1%(WW-D%E@A
  r'   c                   | j                  d      xs i }| j                  d      xs g }t        | j                  dd            }|dkD  r||z  nd}t        ddd	| j                  d
      xs | j                  d      d| j                  d       d| j                  dd             t        dd| dt        |      |k(  xs t        |      dkD  xr t        |      |k  |rdj	                  |j                               nd|r| dd|z  ddnd       g}| j                  d      r0|j                  t        ddd	dj	                  | d                      | j                  d      r1|j                  t        ddd dj	                  | d         d!             g }	|D ]  }
|
j                  d"d      }t        |
j                  d#            }|rt        |j                  |d            nd}||z  }|	j                  ||
j                  d$      |
j                  d%      ||r|ndt        |d&      t        t        |j                  |d            d&      d'        |	sj|rh|j                         D ]U  \  }}|	j                  |d	|t        |t        |      z  d&      t        t        |j                  |d            d&      d(       W d)d*| j                  d+d,      t        d)   d-   ||t        |d&      |d.d/d0d1|	d2S )3Nr   rankingstop_k   r   rj   signal_monthu+   Month-end momentum signal (12−1 on close)Tsignal_dateeffective_datez
Effective u	    · mode moder]   r   z	Hold top z sectors at equal weightz, nonez	 names @ r   r   z eachri   new_entriesz!New sector entries vs prior monthr   exits_from_priorexitsu1   Sectors exited vs prior month — action requiredFzReduce or remove these namesr   heldrankaqr_momr	   )rm   r   r   r   r   r   r   )rm   r   r   r   r   sector_momentumzSector Momentumry   r   r   z:Monthly (business month-end); trade effective next sessionzSPDR sector ETFs (long only)z4% annual on uninvested weight)r   r   r   r   r   
slack_cashr   )r4   r   r&   rB   joinkeysr   r"   r:   r   r   r   )secr   r   r   r   r   r   r   r   r   rr   r   r   r   s                  r%   explain_sectorr  l  s    ggi &BGwwz"(bH#$E+3a<K'SJ 	9''-(ECGG4D,Ecgg&678	#''&RTBUAVW	
 	w67LE!Qc'lQ&6&P3w<5;P/6$))GLLN+FCHyuS(9?d	
&H  ww}3iiM 23		
 ww!"Cii$6 783	
 ')I 
eeHb!AEE&M"*.E'++c1%&Cq.f55+&*',Wa'8',U599S!3D-Eq'I
	

  mmo 		FC! %&+0eAh1F+J+0uyya7H1I1+M		  "''(N3-.?@I&#(Q#7U8:
  r'   c               8   t        j                  | i       }| |j                  d|       d|j                  dg       t        dddd      t        d	d
|dkD  |dd      g||dkD  rt        ||z  d      nd|j                  dd      |j                  dd      dg dS )Nroler   r   live_pluginzIBKR live signal pluginFzYNot yet driven from IB bars in run_live_fund_signals; use backtest runner + manual reviewra   r   zAllocated in fund combiner   r   z> 0ri   r	   runnerr]   summary)r   r   r  r  r   )r   r4   r&   r   )	sleeve_idr   r   defns       r%   explain_reference_sleever	    s    ##Ir2D&),&'2.)p	 +a$S)
  'GORS|5K)?#CYZhhx,xx	2.	
 5 r'   c                   | j                  d      xs i }| j                  d      xs i }|j                  d      xs i }|j                  d      xs i }t        |j                  d      xsK |j                  d      xs8 | j                  d      xs i j                  di       j                  d	      xs d
      }| j                  d      xs i j                  d      xs i }i }|j                  d      xs g D ]  }t        |j                  dd            j                         dvr/t        |j                  dd            }	|	sM|j                  |	d      t        |j                  d      xs d      z   ||	<    t	        | j                  d      xs i j                  d            }
|j                  d      xs g }|j                  d      xs
 t               }|j                  d      xs i }g }|j                  dd      dkD  r9|j                  t        ||||t        |j                  dd            |
             |j                  dd      dkD  r=|j                  t        |j                  d      xs i |t        |d         |             |j                  dd      dkD  r=|j                  t        |j                  d      xs i |t        |d         |             dD ]@  }t        |j                  |d            }|dkD  s$|j                  t        |||             B t        j                  t              j                         |d |d!S )"zCBuild ``signal_explain`` block merged into command_center_snapshot.signalsfundtarget_weightsmodelfund_nav_usd_live_ibkrfund_nav_usdibkr	portfolionet_liquidation_usdg     j@r   sec_typer]   )STKETFrm   rj   market_valuer   riskkill_switch_activer   live_signal_stater   r   )r   r   r   r   r   r`   r   )r   r   r   r   r   )r   r   r   r   )
vxx_regimevxx_long_callmacro_awtsmom
equity_dip)r   r   zgGreen checks = criterion currently satisfied. Use this panel to audit automated signals before trading.)generated_atr  blurbsleeves)r4   r:   rC   upperr"   _read_live_stater   r   r   r  r	  r   rF   rG   	isoformat)snapsigr  weightsr  r   ibpr   pr   killrecsr   r   r"  ref_idr   s                    r%   build_signal_explanationsr.    s'   
((9

#C88F!rDhh'(.BGHHW#E		*+ 	99^$	HHV"''R8<<=RS	 	H 88F!r
&
&{
3
9rC EWW[!'R QquuZ$%++-^C!%%"%&3,uQUU>5J5Oa/PPE#JQ &!'R,,-ABCD77$%+D,-C1A1CJ$*I$&G{{;"Q&%# $!!'++k1"=> 		
 {{=!$q(GGM*0b!!'-"89		
 {{$a(1,GG-.4"!!'*;"<=		
 U _'++fa()q5NN3FT\]^_ !R(224 H  r'   c                     t         dz  } | j                         sy 	 t        j                  | j	                  d            }t        |t              r|S d S # t        j                  $ r Y y w xY w)Nz(RenTech/data/logs/live_signal_state.jsonr)   r*   )_REPOr.   r/   r0   r1   r2   r3   r5   )pathr6   s     r%   r$  r$  3  sc    ==D<<>jj9: d+s55 s   6A A A+*A+)r#   rC   r    rC   r!   r"   r   r   r   r   r   
str | Nonereturndict[str, Any])r3  r4  )r=   r   r3  r2  )N)rJ   rC   rK   zdatetime | Noner3  z
int | None)r   dict[str, Any] | Noner   r5  r   zlist[dict[str, Any]]r   r:   r   r:   r`   r"   r3  r4  )
r   r4  r   r:   r   r:   r   dict[str, float]r3  r4  )
r   r4  r   r:   r   r:   r   r6  r3  r4  )r  rC   r   r:   r   r:   r3  r4  )r&  r4  r3  r4  )r3  r5  )__doc__
__future__r   r/   r   pathlibr   typingr   zoneinfor    RenTech.monitor.strategy_catalogr   rG   __file__resolveparentsr0  r-   r   __annotations__r&   r7   r?   rN   r   r   r  r	  r.  r$   r'   r%   <module>rB     s   #      A !X ((+NN  )U$,E@ 1f,aQ 2N,=; +S,=;3!+' !R 	 

    &T%T %T *	T
 T T T Tnf	f f 	f
 f fR\	\ \ 	\
 \ \~@EPr'   