
    }jC+                     f    S r SSKrSSKrSSKJrJrJr   " S S5      r	S\R                  S\4S jrg)	z
Adaptive gating module for MoERegression.

This module implements adaptive entry filters based on market volatility.
Key insight: ALL successful trades occur in low volatility regimes (<0.5% ATR).
    N)DictTupleOptionalc            	       `   \ rS rSrSrS!S\4S jjrS\4S jrS\S\	4S	 jr
S\S\4S
 jrS\S\S\4S jrS\S\S\4S jrS\S\S\4S jrS\S\S\S\4S jr S!S\R(                  S\S\4S jjr S"S\S\S\4S jjr S#S\R.                  S\R(                  S\	S\R.                  4S jjrS rg)$AdaptiveGating   z6Adaptive gating based on market volatility and regime.Nconfigc                 @    U=(       d    U R                  5       U l        g)z&Initialize adaptive gating parameters.N)get_default_configr	   )selfr	   s     9/home/ai/projects/AI_Strategy/features/adaptive_gating.py__init__AdaptiveGating.__init__   s    9 7 7 9    returnc                      SSSSSSSSS	S
SSS.$ )zGet default configuration.333333?      ?      ?g{Gzt?g{Gz?      g?   0   g      @)min_volatility_lowmin_volatility_normalmax_volatility_highmin_momentum_5min_momentum_10min_adxmax_adx_rangemin_volume_ratiovolume_confirm_barsmax_time_to_target_hoursmin_atr_sl_multmin_atr_tp_mult )r   s    r   r   !AdaptiveGating.get_default_config   s<     #&%(#& $#  !$#$ )+  #"/
 	
r   atr_pctc                 P    XR                   S   :  a  gXR                   S   :  a  gg)z4Determine volatility regime based on ATR % of price.r   LOW_VOLr   
NORMAL_VOLHIGH_VOLr	   )r   r(   s     r   get_volatility_regime$AdaptiveGating.get_volatility_regime0   s+    [[!566{{#899r   c                 B    U R                  U5      nUS:X  a  gUS:X  a  gg)z3Check if market volatility is suitable for trading.r*   Tr+   F)r.   )r   r(   
vol_regimes      r   check_volatility_filter&AdaptiveGating.check_volatility_filter9   s-    //8
"<' r   
momentum_5momentum_10c                 T    XR                   S   :  =(       a    X R                   S   :  $ )zCheck if momentum is favorable.r   r   r-   )r   r4   r5   s      r   check_momentum_filter$AdaptiveGating.check_momentum_filterF   s,    kk*:;; >{{+<==	?r   adxc                     U R                  U5      nUS:X  a  X R                  S   :  $ US:X  a  US:  =(       a    X R                  S   :*  $ g)z#Check if market regime is suitable.r*   r   r+   r   r    F)r.   r	   )r   r(   r9   r1   s       r   check_regime_filter"AdaptiveGating.check_regime_filterK   sX    //8
 "++i000 <'"9DO(D!DD r   volume
avg_volumec                 ,    X-  nX0R                   S   :  $ )zCheck if volume is sufficient.r!   r-   )r   r=   r>   volume_ratios       r   check_volume_filter"AdaptiveGating.check_volume_filter[   s    *{{+=>>>r   bars_to_targetcurrent_barmax_horizonsc                 Z    [        U[        US5      5      nUS-  nXPR                  S   :*  $ )z4Check if target is reachable within reasonable time.      r#   )maxr	   )r   rC   rD   rE   max_bars_expected	max_hourss         r   check_time_limitAdaptiveGating.check_time_limit`   s7      K0CD &*	KK(BCCCr   df_rowc                    U=(       d    / SQnSS0 S.nUR                  SS5      nUR                  SS5      nUR                  SS5      nUR                  S	S5      nUR                  S
S5      nUR                  SU5      n	UR                  SS5      n
U R                  U5      (       d  SUS S3US'   U$ SUS   S'   SUS'   U R                  XV5      (       d  SUS SUS 3US'   SUS   S'   U$ SUS   S'   SUS'   U R                  XG5      (       d  SUS SUS 3US'   SUS   S'   U$ SUS   S'   S US'   U R	                  X5      (       d  S!U[
        -  S" S#3US'   SUS   S$'   U$ SUS   S$'   S%US'   U R                  U
[        U5      (       d(  S&[        S' S(U R                  S)    S*3US'   SUS   S+'   U$ SUS   S+'   S,US'   S-US.'   U$ )/z
Run all adaptive filters on a single signal.

Args:
    df_row: Row of features (pandas Series)
    max_horizons: Maximum horizons from model

Returns:
    Dict with filter results and score

      <   FN)passedreasonscoresr(   r   r4   r5   ADX_14VolumerG   
volume_avgrC   rQ   zHigh volatility: z.2%z ATRrU         ?rV   
volatilityzVolatility OKzWeak momentum: 5b=z, 10b=        momentumzMomentum OKzRegime not tradeable: ADX=z.1fz, ATR=regimez	Regime OKzLow volume: z.2fzx avgr=   z	Volume OKzTime limit: z.0fzh > r#   htimezAll filters passedTrT   )
getr2   r7   r;   rA   vol_avgrL   rD   rK   r	   )r   rN   rE   resultsr(   r4   r5   r9   r=   r>   rC   s              r   check_adaptive_gating$AdaptiveGating.check_adaptive_gatingk   sg    $3| 
 **Y*ZZa0
jj2jj1%Ha(ZZf5
$4b9 ++G44"3GC= EGHN*-,'+ ))*BB"4Z4DF;WZJ[ \GH,/GHj)N(+*%) ''55"<SIVGTW= YGH*-GHh'N&)(#' '';;".vg~c.B% HGH*-GHh'N&)(#' $$^[,OO".yoT$++NhBiAjjk lGH(+GHf%N$'&!0 r   gating_resultsmodel_confidencec                 |   US   (       d  gSnUR                  S0 5      nSnX5[        R                  " [        UR	                  5       5      5      -  -  nSnX6U-  -  nUR                  SS5      nUS:  a  S	nOUS
:  a  SnOSnS	n	X9U-  -  nUR                  SS5      n
U
S:  a  SnOSnSnX<U-  -  n[        US5      $ )z
Calculate overall quality score (0-1).

Score is based on:
- Gating filters passed (0.4 weight)
- Model confidence (0.3 weight)
- Volatility regime (0.2 weight)
- Momentum strength (0.1 weight)
rT   r\   rV   g?r   r(   r   r   g?r   g?r4   g{Gz?rZ   )ra   npmeanlistvaluesmin)r   rf   rg   scoregating_scoresgating_weightconfidence_weightr(   volatility_bonusvolatility_weightr4   momentum_bonusmomentum_weights                r   calculate_quality_score&AdaptiveGating.calculate_quality_score   s     h' '**8R8m.B.B.D)E!FFF  %555 !$$Y2S="s]""%555 $''a8
 N N>115#r   
signals_dfmodel_predictionscurrent_bar_colc                   ^ ^^ UR                  5       nSUR                  ;  a  US   US   -  US'   SUR                  ;  a2  US   US   R                  S5      -
  US   R                  S5      -  US'   SUR                  ;  a2  US   US   R                  S5      -
  US   R                  S5      -  US'   S	UR                  ;  a  S
US	'   SUR                  ;  a%  US   R                  S5      R	                  5       US'   UR                  UU 4S jSS9nUR                  S 5      US'   UR                  UU 4S j5      US'   U$ )z
Apply adaptive filters to a DataFrame of signals.

Returns filtered DataFrame with added 'quality_score' and 'gating_passed' columns.
r(   	atr_entrycurrent_pricer4   
prev_close   r5   	   rW      rY   rX   r   c                 H   > TR                  U TR                  S/ SQ5      S9$ )NrE   rP   )rE   )rd   ra   )rowkwargsr   s    r   <lambda>7AdaptiveGating.apply_adaptive_filters.<locals>.<lambda>  s"    223VZZP^`lEm2nr   rG   )axisc                     U S   $ )NrT   r&   )xs    r   r   r   
  s    !H+r   gating_passedc                 \   > TR                  U TR                  U R                  S5      5      $ )Nr   )rv   ra   name)r   ry   r   s    r   r   r     s%    d2216G6K6KAFFTW6XYr   quality_score)copycolumnsshiftrollingrj   apply)r   rx   ry   rz   r   signalsrf   s   ` ` `  r   apply_adaptive_filters%AdaptiveGating.apply_adaptive_filters   ss    //# GOO+!(!58P!PGIw.%,_%=@U@[@[\]@^%^bijvbwb}b}~  cA  %AGL!/&-o&>AVA\A\]^A_&_cjkwcxc~c~  @A  dB  &BGM"7??* "GHw.$+H$5$=$=b$A$F$F$HGL! !n ' 

 $2#7#78M#N #1#7#7Y$
  r   r-   )N)r   )rD   )__name__
__module____qualname____firstlineno____doc__r   r   r   floatstrr.   boolr2   r7   r;   rA   intrk   rL   pdSeriesrd   rv   	DataFramer   __static_attributes__r&   r   r   r   r      sB   @:t :
D 
8U s u  ? ?E ?d ?
5 u   ?% ?U ?t ?
	Du 	D3 	D&*	D/3	D 37JBII J+/J;?JZ :=/d /16/AF/f 6C' '13'/2' ,.<<' 'r   r   	trades_dfr   c                 h   U S   U S   -  U S'   / SQn/ SQn[         R                  " U S   XS9U S'   0 nU Hx  nX S   U:H     n[        U5      S:  d  M  US	   R                  5       nUS	   R	                  5       nUS	   S:  R                  5       [        U5      -  nUUU[        U5      S
.X4'   Mz     U$ )z
Analyze historical trades to find optimal volatility thresholds.

Args:
    trades_df: DataFrame of closed trades

Returns:
    Dict with optimal thresholds
r|   entry_pricer(   )r   r   r   rQ   )r*   r+   r,   )binslabelsr1   r   pnl)	total_pnlavg_pnlwin_ratecount)r   cutlensumrj   )	r   r   r   rc   r^   regime_tradesr   r   r   s	            r   get_best_volatility_thresholdsr     s     %[1Im4LLIi D2F ffYy%9TIl G!L"9V"CD}!%e,002I#E*//1G%e,q0557#m:LLH '"$]+	GO  Nr   )r   pandasr   numpyri   typingr   r   r   r   r   r   r&   r   r   <module>r      s<      ( (B BJ%bll %t %r   