
    pj8                    Z   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	m
Z
mZmZmZmZmZ ed   Zed   Zd	Zd
ed<   dZded<   dZded<   dZded<   dZded<   dZded<    ed       G d d             Zd(dZd)d Zd*d!Zd+d"Z	 	 	 	 	 	 	 	 	 	 d,d#Zd-d$Zd-d%Z 	 	 	 	 	 	 	 	 d.d&Z!d/d'Z"y)0z
Regime intersection matrix and action mapping (SPX Regime State Space v2).

``classify_regime`` maps **every** discretized 6-tuple to a regime + action
(exhaustive partition; no ``none`` bucket).
    )annotationsN)	dataclass)Literal)FeatureState
HurstStateMaDistState	SkewStateSpotVolState	TermStateVrpState)%D_structural_damage
C_crash_upA_mean_reversionA1_extended_aboveA2_extended_below
B_momentum
B1_bullish
B2_bearishC1_squeeze_skewedC2_squeeze_buildingC3_vol_rising_neutralC4_vol_rising_bearE1_backwardation_bear_momE2_backwardation_bear_fearE3_backwardation_bull_trendE4_backwardation_extendedE5_backwardation_high_volE6_backwardation_chopF1_high_vrp_flat_aboveF2_high_vrp_flat_belowF3_high_vrp_flat_neutralF4_high_vrp_trend_aboveF5_high_vrp_trend_neutralF6_high_vrp_randomG1_choppy_bull_low_vrpG2_choppy_bear_low_vrpG3_choppy_neutral_low_vrpG4_low_vrp_randomB3_momentum_steep_skewB4_momentum_normal_skewH1_range_boundH2_chop_normal_skewH3_trend_steep_skewH4_trend_normal_skewH5_random_steep_skewH6_random_flat_skewH7_random_normal_skew)	cashiron_condor_neutraliron_condor_neg_deltairon_condor_pos_deltaput_credit_spreadcall_debit_spreadput_debit_spreadlong_call_calendarlong_straddle)lownormalhighztuple[VrpState, ...]
VRP_STATES)antirandom
persistentztuple[HurstState, ...]HURST_STATES)flatr<   steepztuple[SkewState, ...]SKEW_STATES)contangobackwardationztuple[TermState, ...]TERM_STATES)negativepositiveztuple[SpotVolState, ...]SPOT_VOL_STATES)belowneutralaboveztuple[MaDistState, ...]	MA_STATEST)frozenc                  6    e Zd ZU ded<   ded<   ded<   ded<   y	)
RegimeStateRegimeIdregimeActionIdactionr   feature_statestr	rationaleN)__name__
__module____qualname____annotations__     T/opt/rentech/trading_bot/RenTech/strategy_stack/spx_regime_state_space/classifier.pyrR   rR   Z   s    Nr_   rR   c                   | \  }}}}}}|dk(  r|dk(  r|dk(  rt        | ddd      S |dk(  r_|dk(  r9|dk(  r|d	k(  rt        | d
dd      S |dk(  rt        | ddd      S t        | ddd      S |dk(  rt        | ddd      S t        | ddd      S |dk(  rt|dk(  r#d}|dk(  rt        | d|d      S t        | d|d      S |dk(  r&|dk(  r|dk(  rt        | ddd       S t        | d!d"d#      S |dk(  rt        | d$dd%      S t        | d&d'd(      S |dk(  r|d)k(  r|d*v rt        | ||      S |d)k(  r9|d	k(  r4|dk(  rt        | d+d"d,      S |dk(  rt        | d-d.d/      S t        | d0d'd1      S |dk(  r!|dk(  rt        | d2d"d3      S t        | d4d'd5      S t        |      \  }}	t        | d6|d7| d8      S |dk(  r|dk(  rV|d	k(  rt        | |      S |d9k(  r t	        |      \  }}	t        | d:|d;| d8      S t	        |      \  }}	t        | d<|d=| d8      S |d)k(  r4|dk(  rt        | d>dd?      S |dk(  rt        | d@ddA      S t        | dBddC      S t	        |      \  }}	t        | dD|dE| d8      S |d)k(  rE|d9k(  rt        | ||      S |d	k(  rt        | dFd'dG      S t        |      \  }}	t        | dH|dI| d8      S |dk(  rV|d	k(  rt        | |      S |d9k(  r t	        |      \  }}	t        | dJ|dK| d8      S t	        |      \  }}	t        | dL|dM| d8      S |d9k(  r t        |      \  }}	t        | dN|dO| d8      S |d	k(  rt        | dPd'dQ      S t        |      \  }}	t        | dR|dS| d8      S )Tz5Map any 6-tuple to regime + action (exhaustive tree).r=   rA   rL   r   r2   u?   High VRP + below MA + persistent trend → capital preservationrJ   rN   rC   r   r9   z7Crash-up: spot-vol+ / flat skew / persistent / above MAr   r7   u%   Vol squeeze with skew → ride upsider   u*   Spot-vol+ / above MA → calendar long volrM   r   r:   u%   Spot-vol+ / neutral MA → long gammar   r8   u,   Spot-vol+ / below MA → defensive put debitrG   r;   r   u4   Backwardation + below MA + low VRP → bear momentumr   u+   Backwardation + below MA → defensive bearr   z3Backwardation bull: low VRP + persistent + above MAr   r4   u7   Backwardation + extended above MA → harvest call skewr   u2   Backwardation + high VRP + neutral MA → long volr   r3   u.   Backwardation + neutral MA → neutral harvestr?   )rD   r<   r   z$High VRP chop + flat skew + above MAr    r6   z$High VRP chop + flat skew + below MAr!   z&High VRP chop + flat skew + neutral MAr"   z&High VRP + persistent trend + above MAr#   z(High VRP + persistent + neutral/below MAr$   u*   High VRP + random walk → harvest by MA ()rD   r)   u/   Low VRP momentum + steep skew → directional (r*   u0   Low VRP momentum + normal skew → directional (r%   z$Low VRP + anti-persistent + above MAr&   z$Low VRP + anti-persistent + below MAr'   u,   Low VRP + choppy + neutral MA → long gammar(   u'   Low VRP + random walk → directional (r+   u1   Normal VRP + choppy + flat skew → range harvestr,   z#Normal VRP + choppy + normal skew (r-   z!Normal VRP + trend + steep skew (r.   z"Normal VRP + trend + normal skew (r/   z"Normal VRP + random + steep skew (r0   zNormal VRP + random + flat skewr1   z#Normal VRP + random + normal skew ()_rs_mean_reversion_harvest	_ic_by_ma_momentum_trend_debit_by_ma)
stvrphurstskewtermspot_volmarV   act_s
             r`   classify_regimerq   b   s~   +-(CdHb f},.2=!M	
 	
 :=$ (M	  $'';	  %$<	  ?'7	   :	
 	
 ='Fe|/J	  ,=	  =$1'I	  +'I	  &=+D	  #!<	
 	
 f}F?t'::*2r488F?tv~W},+:	  W},':	  *%8	  L W}-+<	  +%:	  2Q 8A>	
 	
 e|L v~&r2..w%b)Q,EbTK	  ""%FC)B2$aH	  F?W},':	  W},&:	  +>	  b!Q5bT;	
 	
 7?*2r4886> %C	  2Q!1"Q7	
 	
 6>"2r**7?!"%FC%3B4q9	  b!Q"0A6	
 	
 w2Q"0A6	
 	
 v~!!-	
 	
 r]FC

-bT3	 r_   c                    t        j                  t        t        t        t
        t        t              D ]*  }t        |      }|j                  | k(  s|j                  c S  y)z=Lookup action for a regime id (first matching lattice point).r3   )	itertoolsproductr>   rB   rE   rH   rK   rO   rq   rT   rV   )rT   comborss      r`   
map_actionrw   _  sU    "" 
 U#9999
 !r_   c                 8   i } t        j                  t        t        t        t
        t        t              D ]W  }|}t        |      }|j                  dk(  r*|j                  dk7  rt        d| d|j                         |j                  | |<   Y t        |       g fS )uN   Return (n_states, duplicates) — duplicates should be empty; n_states == 324.r2   r   zunexpected cash for z -> )rs   rt   r>   rB   rE   rH   rK   rO   rq   rV   rT   AssertionErrorlen)seenru   rh   rv   s       r`   verify_full_coverager|   o  s    )+D""  !R 992990E#E #7t4		{!KLL99R t9b=r_   c                     i } t        j                  t        t        t        t
        t        t              D ]9  }t        |      }| j                  |j                  d      dz   | |j                  <   ; | S )z8Count how many of 324 lattice points map to each regime.r      )rs   rt   r>   rB   rE   rH   rK   rO   rq   getrT   )countsru   rv   s      r`   regime_distribution_summaryr     sh    F"" 	9 U#"JJryy!4q8ryy	9 Mr_   c                     t        ||| |      S )N)rT   rV   rW   rY   )rR   )rh   rT   rV   rY   s       r`   rc   rc     s     fV2QZ[[r_   c                    | dk(  ry| dk(  ryy)NrN   )r4   zskewed IC (neg delta)rL   )r5   zskewed IC (pos delta))r3   zdelta-neutral ICr^   rn   s    r`   re   re     s    	W}?	W}?4r_   c                    | dk(  ry| dk(  ryy)NrN   )r7   z
bull debitrL   )r8   z
bear debit)r3   z
neutral ICr^   r   s    r`   rg   rg     s    	W}0	W}/.r_   c                    |dk(  rdnd}|dk(  rt        | ddd| d      S |dk(  rt        | d	d
d| d      S t        | ddd| d      S )NrD   r<   rN   r   r4   zMean-reversion harvest (z skew) + above MArL   r   r6   z skew) + below MAr   r3   z skew) + neutral MArc   )rh   rn   rk   skew_lbls       r`   rd   rd     s    
 '/wxH	W}#&xj0AB	
 	
 
W}&xj0AB	
 	
 

"8*,?@	 r_   c                j    |dk(  rt        | ddd      S |dk(  rt        | ddd      S t        | d	d
d      S )NrN   r   r7   z<Momentum: low/normal VRP + persistent + flat skew + above MArL   r   r8   z<Momentum: low/normal VRP + persistent + flat skew + below MAr   r3   z$Momentum trend but neutral MA anchorr   )rh   rn   s     r`   rf   rf     s_    	W}J	
 	
 
W}J	
 	
 
.	 r_   )rh   r   returnrR   )rT   rS   r   rU   )r   ztuple[int, list[FeatureState]])r   zdict[str, int])
rh   r   rT   rS   rV   rU   rY   rX   r   rR   )rn   r   r   ztuple[ActionId, str])rh   r   rn   r   rk   r	   r   rR   )rh   r   rn   r   r   rR   )#__doc__
__future__r   rs   dataclassesr   typingr   6RenTech.strategy_stack.spx_regime_state_space.featuresr   r   r   r	   r
   r   r   rS   rU   r>   r]   rB   rE   rH   rK   rO   rR   rq   rw   r|   r   rc   re   rg   rd   rf   r^   r_   r`   <module>r      s3   #  !    ),\ 
 $=
  <'G$ G%@" @%B" B,D) D%B	" B $  zz! & \\\ \ 	\
 \5/  	8r_   