
    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m	Z	 ddl
ZddlZe	d   Ze	d   Ze	d	   Ze	d
   Ze	d   Ze	d   Zeeeeeeef   ZdZdZdZdZdZdZdZdZdZdZdZ  ee!      jE                         jF                  d   Z$e$dz  dz  dz  Z%edd/dZ&d0dZ' ed       G d  d!             Z(dddd"	 	 	 	 	 	 	 	 	 	 	 d1d#Z)d$e d%d2d&Z*dd'	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d3d(Z+d4d)Z,d5d*Z-d6d+Z.d7d,Z/d8d-Z0d9d.Z1y):z
State-space features for SPX/SPY options regime routing (v2 spec).

Six dimensions: VRP, Hurst, vertical skew, vol term structure, spot-vol correlation,
spot-to-MA distance. Each is discretized into ordinal states for regime intersection.
    )annotationsN)	dataclass)Path)Literal)lownormalhigh)antirandom
persistent)flatr   steep)contangobackwardation)negativepositive)belowneutralaboveg{Gz?gQ?g{Gz?<      
      g      пg      ?2      RenTechdatazvix_futures_cboe.parquet)max_lagsc                  | j                         j                  t        j                        }t	        |      |dz   k  rt        d      S g }g }|j                         }t        dt        |      dz         D ]  }|t	        |      k\  r n||d |d|  z
  }|j                  dk  r/t        j                  |d      }|dk  st        j                  |      sa|j                  t        t        j                  |                   |j                  |        t	        |      dk  rt        d      S t        j                  t        j                  |      t        j                  |      d      \  }	}
t        |	      S )	zDVariance-of-lags Hurst estimate; <0.5 mean-reverting, >0.5 trending.   nan      N)ddofr   r   )dropnaastypenpfloat64lenfloatto_numpyrangeintsizevarisfiniteappendsqrtpolyfitlog)seriesr   slagstauarrlagdiffvslope_s              R/opt/rentech/trading_bot/RenTech/strategy_stack/spx_regime_state_space/features.pycalculate_hurst_exponentr@   ,   s.   rzz*A
1v1U|DC
**,CQH)* 
#c(?34y3u:%99q=FF4a 6Q

5$%C
 3x!|U|zz"&&,sQ7HE1<    c           	        t         j                         rt        j                  t               }t        j                  |j
                        j                  d      |_        d|j                  v rE|d   j                  t              }|j                  |       j                         j                         S 	 ddl}| j%                         t        j&                  d      z
  j)                  d      }| j+                         t        j&                  d      z   j)                  d      }d	D ]  }|j-                  |||d
d
d
      }||j.                  r)t1        |j                  t        j2                        r|d   j4                  dddf   }n|d   }t        j                  |j
                        j                  d      |_        |j7                  d      j                  |       j                         j                         c S  t        j                  t         j"                  | d      S # t        $ r) t        j                  t         j"                  | d      cY S w xY w)z?VIX3M cash index; CBOE parquet preferred, else yfinance ^VIX3M.Nvix3mr   )indexnamer   )daysz%Y-%m-%dr    )z^VIX3MVIX3MF)startendprogressauto_adjustthreadsClose)
CBOE_PANELis_filepdread_parquetto_datetimerD   tz_localizecolumnsr&   r*   reindexffillbfillyfinanceImportErrorSeriesr'   r!   min	Timedeltastrftimemaxdownloadempty
isinstance
MultiIndexilocrename)	rD   ctr6   yfrH   rI   symrawcloses	            r?   _load_vix3m_seriesrj   H   s   __Z(>>"((+77=bjj 7""5)A99U#))+1133< YY[2<<R00:::FE99;1--
7
7

CC" 	Dkk#UeQV`ekf;#))ckk2==1L%%ad+ELEnnU[[1==dC||G$,,U399;AACC	D 99RVV5w77  <yyu7;;<s   5H( (/IIT)frozenc                  ~    e Zd ZU eZded<   eZded<   eZ	ded<   e
Zded<   eZded<   eZded<   eZded	<   d
Zded<   y)FeatureConfigr-   	rv_windowiv_target_dtehurst_windowspot_vol_window	ma_windowr*   skew_put_deltaskew_call_delta   vrp_median_min_periodsN)__name__
__module____qualname__	RV_WINDOWrn   __annotations__IV_TARGET_DTEro   HURST_ROLLINGrp   SPOT_VOL_WINDOWrq   	MA_WINDOWrr   SKEW_PUT_DELTArs   SKEW_CALL_DELTArt   rv    rA   r?   rm   rm   e   sS    Is&M3&%L#%*OS*Is*NE*,OU,"%C%rA   rm   )iv30_by_dayskew25_by_dayconfigc                  |xs
 t               }| j                         }t        j                  |j                        j                  d      |_        |d   j                         |d<   |d   j                  |j                        j                         t        j                  d      z  |d|j                   <   |d   j                  |j                  d      j                         |d|j                   <   |d   |d|j                      z  d	z
  |d
<   t        j                  |d   j!                  t"                    }|j                  |j$                  |j$                  dz        j'                  t(        d      |d<   d|j*                  vrt-        d      |d   |d<   |d   j                         |d<   |d   j                  |j.                        j1                  |d         |d<   t3        |j                        }||d<   |d   |d   z  |d<   |D 	cg c]%  }	t        j4                  |	      j7                         ' }
}	|j9                  |
      j;                         }|xs i }|xs i }g }g }|
D ]B  }	|j=                  |j?                  |	             |j=                  |j?                  |	             D ||d<   ||d<   |d   dz  }|d   jA                  |d   jC                         |      |d<   |d   |d|j                      z
  |d<   |d   jE                  |jF                        jI                         |d<   d|j                   }|jK                         D cg c]   \  }}tM        ||      jO                         " }}}t        jP                  ||j                        }t        jR                  ||gd      S c c}	w c c}}w )z
    Build continuous + discretized features aligned to ``days``.

    ``iv30_by_day`` / ``skew25_by_day`` optional Theta-derived IV; when missing,
    IV is proxied from VIX/100 and skew is NaN (skew state defaults to ``normal``).
    Nri   ret_1g     o@rvr#   )min_periodssma_      ?ma_distr"   F)rh   hurst	vix_closezspy_df must include vix_closespy_retvix_retspot_vol_corrrC   
term_ratioiv30skew25g      Y@vrp30
vrp_medianrv_col)rD   )axis)*rm   copyrP   rR   rD   rS   
pct_changerollingrn   stdmathr2   rr   meanr'   r4   r&   r*   rp   applyr@   rT   KeyErrorrq   corrrj   	Timestamp	normalizerU   rV   r1   getwherenotna	expandingrv   medianiterrowsdiscretize_rowto_dict	DataFrameconcat)spy_dfrF   r   r   r   cfgolog_pxrC   didxpaneliv_mapskew_mapiv_vals	skew_valsproxy_ivr   r>   row
state_rowsstatess                         r?   build_regime_featuresr   q   s{    
#MOCAnnQWW%11$7AG7&&(AgJj00?CCE		RWHXXA3==/ !'
 2 23==a 2 P U U WAS]]OW:D"8 99C?AiLVVAgJ%%e,-F 0 0c>N>NRS>STZZ  [ AgJ
 !))#677W:AiL[>,,.AiL9--c.A.ABGG)UAoqww'EAgJnqz1AlO04
512<<?$$&
5C
5IIcN  "EBF"H"$G$&I *vzz!}%a)* E&ME(O[!E)H&M''f(;(;(=xHE&M6]UR+?%@@E'N.22s?Y?Y2ZaacE,#--!FMR^^M]^61c.V4<<>^J^\\*EKK8F99eV_1--- 6( _s   *O#%O
r   r   c               z   t        j                  t        | j                  d      | j                  d            t	        | j                  d            t        | j                  d            t        | j                  d            t        | j                  d            t        | j                  d            d      S )	Nr   r   r   r   r   r   r   )	vrp_statehurst_state
skew_state
term_statespot_vol_statema_dist_state)	rP   rZ   _discretize_vrpr   _discretize_hurst_discretize_skew_discretize_term_discretize_spot_vol_discretize_ma_dist)r   r   s     r?   r   r      s    99()9377<;PQ,SWWW-=>*3778+<=*377<+@A2377?3KL01CD	
	 	rA   )r   c                   t        | |      t        |      t        |      t        |      t	        |      t        |      fS )N)r   r   r   r   r   r   )vrpr   skewr   r   r   r   s          r?   discretize_featuresr      s@     	Z(% $]+G$ rA   c                    | t        j                  t        |             syt        |       }|dk  ry|)t        j                  t        |            rt        |      nd}||kD  rdS dS )Nr           r   r	   r   r0   r*   )r   r   r<   meds       r?   r   r      s]    
{$--c
3c
A3w!-$--f2N%-TWCW6*(*rA   c                t    | t        j                  t        |             syt        |       }|dk  ry|dkD  ryy)Nr   g      ?r
   r   r   )hr<   s     r?   r   r      s9    yeAh/aA3w3wrA   c                    | t        j                  t        |             syt        |       }|t        k  ry|t        kD  ryy)Nr   r   r   )r   r0   r*   SKEW_FLAT_HISKEW_NORMAL_HI)r   r6   s     r?   r   r      s;    |4==t5dA<>rA   c                h    | t        j                  t        |             syt        |       dkD  rdS dS )Nr   r   r   r   )ratios    r?   r   r      s/    }DMM%,7#ElS0?@j@rA   c                h    | t        j                  t        |             syt        |       dk\  rdS dS )Nr   r   r   r   )r   s    r?   r   r      s/    |4==t5t+:;;rA   c                    | t        j                  t        |             syt        |       }|t         k  ry|t        kD  ryy)Nr   r   r   )r   r0   r*   MA_DIST_BAND)distr   s     r?   r   r      s=    |4==t5dAL=<rA   )r5   	pd.Seriesr   r-   returnr*   )rD   zpd.DatetimeIndexr   r   )r   pd.DataFramerF   zlist[pd.Timestamp]r   'dict[pd.Timestamp, float | None] | Noner   r   r   zFeatureConfig | Noner   r   )r   r   r   strr   r   )r   float | Noner   r   r   r   r   r   r   r   r   r   r   r   r   FeatureState)r   r   r   r   r   VrpState)r   r   r   
HurstState)r   r   r   	SkewState)r   r   r   	TermState)r   r   r   SpotVolState)r   r   r   MaDistState)2__doc__
__future__r   r   dataclassesr   pathlibr   typingr   numpyr'   pandasrP   r   r   r   r   r   r   tupler   r   r   r   r}   HURST_MAX_LAGSr~   rz   r|   r   r   r   __file__resolveparents_REPOrN   r@   rj   rm   r   r   r   r   r   r   r   r   r   r   rA   r?   <module>r      s   #  !    *+34
-.	/0	-.12Xz9i{Z[ 		X ((+Y'*DD
 DR 88: $& & & <@=A#'<.<.
<. 9	<.
 ;<. !<. <.~ 794D 
*  $	  	
     (+A<rA   