
    if.                         d Z ddlZddlZddlmZmZmZ ddlm	Z	 	 ddl
Z
dZ G d d	      Zy# e$ r dZ ej                  d       Y &w xY w)
u   
Feature Engineering Avancé pour Trading
Inspiré de: https://github.com/asavinov/intelligent-trading-bot
Utilise TSFresh, statistiques avancées et TA-lib
    N)ListDictOptional)statsTFu8   ⚠️ TA-Lib non installé. Fonctionnalités limitées.c                   R   e Zd ZdZeddee   dedee	ef   fd       Z
edee   dee	ef   fd       Zedee   dee	ef   fd       Zedee   dee	ef   fd       Ze	 	 	 ddej                  d
eej                     deej                     deej                     dee	ef   f
d       Zedee	ef   fd       Ze	 	 	 ddee   d
eee      deee      deee      dee	ef   f
d       Zeddee	ef   deee	      dej                  fd       Zedee	ef   dee	ef   fd       Zy	)FeatureEngineeruE   
    Générateur de features avancées pour le machine learning
    priceswindowreturnc                    t        |       |k  ri S t        j                  | | d       }t        j                  |      |dd z  }i }t        j                  |      |d<   t        j
                  |      |d<   t        j                  |      |d<   t        |      dkD  rt        j                  |      |d<   t        j
                  |      |d<   t        j                  |      |d	<   t        j                  |      |d
<   t        j                  |d      |d<   t        j                  |d      |d<   t        j                  |d      |d<   t        |      dkD  rGt        j                  t        |            }t        j                  ||      \  }}}}	}
||d<   |dz  |d<   t        |      dkD  r2t        |      dkD  rt        j                  |dd |dd       d   nd|d<   |S )u=   
        Calcule des features statistiques avancées
        Nmeanstdvariancer   return_mean
return_stdskewnesskurtosis   percentile_252   percentile_50K   percentile_75   trend_slope   trend_r_squared)r   r   
autocorr_1)lennparraydiffr   r   varr   skewr   
percentilearange
linregresscorrcoef)r	   r
   recent_pricesreturnsfeaturesxslope	interceptr_valuep_valuestd_errs              ./feature_engineering.pycalculate_statistical_featuresz.FeatureEngineer.calculate_statistical_features   s   
 v;I!12''-(="+== 77=1&&/!vvm4 w<!&(ggg&6H]#%'VVG_H\" $)::g#6HZ  $)>>'#:HZ  )+mR(HH_%(*mR(HH_%(*mR(HH_% }!		#m,-A:?:J:J1m:\7E9gw&+H]#*1Q,H&' w<!UXY`UadeUeR[["wqr{%KD%QklH\"    c                     i }| d   }dD ]2  }t        |       |kD  r| | dz
     }||z
  |z  }||d| <   +d|d| <   4 dD ]:  }t        |       |kD  r"|| | dz
     z
  | | dz
     z  dz  }||d| <   3d|d| <   < |S )	zG
        Features de momentum sur plusieurs horizons temporels
        r   )      
      r   r   	momentum_r   r8   r9   r:   d   roc_)r    )r	   r,   current_priceperiod
past_pricemomentumrocs          r3   calculate_momentum_featuresz+FeatureEngineer.calculate_momentum_featuresH   s    
 r
 ) 	3F6{V##VGAI.
)J6*D199VH-.129VH-.	3 " 	.F6{V#%wqy(99VVGAI=NNRUU,/4x),-4x)	. r5   c           	         i }dD ]j  }t        |       |k\  rRt        j                  | | d       | | d z  }t        j                  |      t        j                  d      z  |d| <   cd|d| <   l t        |       dk\  rHt        dd      D cg c]  }t        | |   | |d	z
     z
         }}t        j                  |      |d
<   |S d|d
<   |S c c}w )u)   
        Features de volatilité
        r<   Nr      volatility_r      ir   atr_14)r    r!   r#   r   sqrtrangeabsr   )r	   r,   r
   r+   irangess         r3   calculate_volatility_featuresz-FeatureEngineer.calculate_volatility_featuresd   s    
  " 	5F6{f$''&&"23ffWR6HH3566'?RWWS\3Q;vh/034;vh/0	5 v;"<A#qMJqc&)fQqSk12JFJ!#HX  "#HX Ks   Cc                    i }| d   }dD ]Z  }t        |       |k\  rBt        | | d       }t        | | d       }||z
  }|dkD  r||z
  |z  }||d| <   Jd|d| <   Sd|d| <   \ t        |       dk\  r2t        | dd       }t        | dd       }	||z
  |z  |d	<   ||	z
  |z  |d
<   t        |       dk\  r/t        | dd       }
|
dz  t        fd| dd D              }||d<   |S )u;   
        Features basées sur les patterns de prix
        r   )r9   r:   r   Nr   position_in_range_g      ?r:   idistance_from_high_20distance_from_low_20r   ig)\(?c              3   .   K   | ]  }|k  s	d   yw)r   N ).0p	thresholds     r3   	<genexpr>z=FeatureEngineer.calculate_pattern_features.<locals>.<genexpr>   s     !LQ)^!!Ls   
support_touches)r    maxminsum)r	   r,   r?   r@   highlow
range_sizeposition_in_rangehigh_20low_20low_50touches_supportrX   s               @r3   calculate_pattern_featuresz*FeatureEngineer.calculate_pattern_features|   sQ   
 r
 # 	>F6{f$66'(+,&&*+!CZ
>)6)<
(J%>OH1&:;>AH1&:;:=-fX67	> v;"&,'G&F18=1HM0YH,-0=0F-/WH+, v;"&FI!!LVCD\!LLO*9H&'r5   Nhighslowsvolumesc                 ^   i }t         rt        |       dk  r|S 	 t        |       dk\  rt        j                  | d      d   nd|d<   t        j                  | ddd	
      \  }}}t        |      dkD  r|d   |d<   |d   |d<   |d   |d<   t        |       dk\  rt        j
                  | d      d   n| d   |d<   t        |       dk\  rt        j                  | d      d   n| d   |d<   t        |       dk\  rt        j                  | d      d   n| d   |d<   t        |       dk\  rJt        j                  | dddd      \  }}	}
|d   |d<   |	d   |d<   |
d   |d<   |d   |
d   z
  |	d   z  |d<   |L|Jt        |      dk\  r<t        j                  ||| ddd      \  }}t        |      dkD  r|d   |d<   |d   |d<   |?|=t        |       dk\  r/t        j                  ||| d      }t        |      dkD  r|d   |d<   |?|=t        |       dk\  r/t        j                  ||| d      }t        |      dkD  r|d   |d<   |:t        |      dk\  r,t        j                  | |      }t        |      dkD  r|d   |d <   |S # t        $ r#}t        j                  d!|        Y d}~|S d}~ww xY w)"z1
        Features TA-Lib (si disponible)
           rH   )
timeperiodr   r   rsi_14      	   )
fastperiod
slowperiodsignalperiodr   macdmacd_signal	macd_histr:   sma_20ema_12ema_26r   )rl   nbdevupnbdevdnmatypebb_upper	bb_middlebb_lowerbb_widthNr7   )fastk_periodslowk_periodslowd_periodstoch_kstoch_dadxcciobvu#   ❌ Erreur calcul TA-Lib features: )TALIB_AVAILABLEr    talibRSIMACDSMAEMABBANDSSTOCHADXCCIOBV	Exceptionloggingerror)r	   rg   rh   ri   r,   rt   
macdsignalmacdhistuppermiddlelowerslowkslowdr   r   r   es                    r3   calculate_talib_featuresz(FeatureEngineer.calculate_talib_features   s    #f+"2O3	EILVXZIZ6b!A"!E`bHX */FrVXgh)i&D*h4y1}#'8 *4R.'(0% JMVXZIZ6b!A"!E`fgi`jHXILVXZIZ6b!A"!E`fgi`jHXILVXZIZ6b!A"!E`fgi`jHX 6{b ',||FrST^_hi'j$vu',Ry$(.r
%',Ry$(-b	E"I(='K$  T%5#e*:J${{5$R78q Juu:>*/)HY'*/)HY'  T%5#f+:KiitVCs8a<&)"gHUO  T%5#f+:KiitVCs8a<&)"gHUO "s7|r'9ii0s8a<&)"gHUO
   	EMM?sCDD	Es   I$J   	J,	J''J,c                     ddl m }  i }| j                         }|j                  }t        j                  dt        j
                  z  |z  dz        |d<   t        j                  dt        j
                  z  |z  dz        |d<   |j                         }t        j                  dt        j
                  z  |z  dz        |d<   t        j                  dt        j
                  z  |z  dz        |d	<   |d
k\  rdnd|d<   |S )zH
        Features temporelles (heure, jour de la semaine, etc.)
        r   )datetimer      hour_sinhour_cos   day_sinday_cosr8   r   
is_weekend)r   nowhourr!   sinpicosweekday)r   r,   r   r   days        r3   calculate_time_featuresz'FeatureEngineer.calculate_time_features   s    
 	&lln xx!vva"%%i$&6&;<!vva"%%i$&6&;< kkm ffQY_q%89 ffQY_q%89 '*QhAr5   c                    i }|j                  t        j                  |              |j                  t        j                  |              |j                  t        j	                  |              |j                  t        j                  |              t        rt        |       dk\  rt        j                  |       }|rt        j                  |      n|}|rt        j                  |      n|}|rt        j                  |      nd}|j                  t        j                  ||||             |j                  t        j                                |S )u:   
        Génère toutes les features disponibles
        rk   N)updater   r4   rD   rO   rf   r   r    r!   r"   r   r   )	r	   rg   rh   ri   all_featuresprices_arrayhighs_array
lows_arrayvolumes_arrays	            r3   generate_all_featuresz%FeatureEngineer.generate_all_features  s
     	OJJ6RS 	OGGOP 	OII&QR 	OFFvNO s6{b088F+L-2"((5/K+/$\J18BHHW-dM H Hk:}! 
 	OCCEFr5   r,   feature_namesc                     |t        | j                               }|D cg c]  }| j                  |d       }}t        j                  |      j                  dd      S c c}w )zF
        Convertit un dict de features en array numpy pour ML
                r   r   )sortedkeysgetr!   r"   reshape)r,   r   namefeature_valuess       r3   features_to_arrayz!FeatureEngineer.features_to_array(  sZ    
  "8==?3M>KLd(,,tS1LLxx'//266 Ms   A c                     i }| j                         D ]O  \  }}t        j                  |      st        j                  |      rd||<   6t        j                  |dd      ||<   Q |S )z0
        Normalise les features pour ML
        r   ir=   )itemsr!   isnanisinfclip)r,   
normalizedkeyvalues       r3   normalize_featuresz"FeatureEngineer.normalize_features4  sa    
 
"..* 	<JCxx"((5/"%
3 #%''%s";
3	< r5   )r:   )NNN)N)__name__
__module____qualname____doc__staticmethodr   floatintr   strr4   rD   rO   rf   r!   ndarrayr   r   r   r   r   r   rU   r5   r3   r   r      sS    ,tE{ ,C ,QUVY[`V`Qa , ,\ DK De<L  6 d5k d3:>N  . '4; '4U
;K ' 'R SW=A@D@ @HRZZ<P @&.rzz&:@)1"**)=@IMcSXjIY@ @D T#u*%5  0 <@;?>B#d5k #$,T%[$9##+DK#8# '/tE{&;# HLCQVJGW# #J 	7De$4 	7XdSViEX 	7dfdndn 	7 	7 T#u*%5 $sEz:J  r5   r   )r   numpyr!   r   typingr   r   r   scipyr   r   r   ImportErrorwarningr   rU   r5   r3   <module>r      s\   
   ' ' POo o  POGOONOPs   - A	A	