
    6i>                         d Z ddlZddlmZmZmZ ddlZ	 ddlm	Z	m
Z
  ej                  d      Z G d d      Zdad	efd
Zy# e$ r d\  Z	Z
Y 1w xY w)u   
Advanced Feature Engineering - Extraction de 50+ features techniques avancées
Améliore drastiquement la précision du modèle IA
    N)DictListOptional)	EMA_SHORTEMA_LONG)      AdvancedFeatureEngineeringc                      e Zd ZdZd Zddee   dee   defdZde	j                  defdZde	j                  defd	Zde	j                  defd
Zde	j                  de	j                  defdZde	j                  defdZde	j                  de	j                  defdZde	j                  dedefdZdde	j                  dede	j                  fdZde	j                  defdZde	j                  dedefdZde	j                  dedefdZde	j                  de	j                  de	j                  fdZde	j                  de	j                  defdZde	j                  dedefdZy)AdvancedFeatureExtractoru+   Extracteur de features techniques avancéesc                 .    t         j                  d       y )Nu*   ✅ Advanced Feature Extractor initialisé)loggerinfo)selfs    ?/home/ubuntu/crypto_trading_bot/advanced_feature_engineering.py__init__z!AdvancedFeatureExtractor.__init__   s    @A    Npricesvolumesreturnc                 F   |rt        |      dk  ri S t        j                  |      }|rt        j                  |      nt        j                  t        |            }i }|j	                  | j                  |             |j	                  | j                  |             |j	                  | j                  |             |j	                  | j                  ||             |j	                  | j                  |             |j	                  | j                  ||             |S )ut   
        Extrait toutes les features avancées
        
        Returns:
            Dict avec 50+ features
        2   )lennparrayonesupdate_extract_price_action_features_extract_momentum_features_extract_volatility_features_extract_volume_features_extract_trend_features_extract_cycle_features)r   r   r   prices_arrayvolumes_arrayfeaturess         r   extract_all_featuresz-AdvancedFeatureExtractor.extract_all_features   s     Vr)Ixx'-4)"''#f+:N 	;;LIJ 	77EF 	99,GH 	55lMRS 	44\BC 	44\=QRr   c                    i }t        |      dk\  rN|d   }|d   }|d   }t        ||z
        |z  }|dk  rdnd|d<   ||kD  r||k  rdnd|d	<   ||k  r||kD  rdnd|d
<   t        |      dk\  rdt        j                  |dd       }t        j                  |dd       }|d   }	||	z
  |	z  |d<   |	|z
  |	z  |d<   ||k7  r|	|z
  ||z
  z  |d<   nd|d<   t        |      dk\  rt        j                  |dd       }
t        j                  |dd       }|d   }|
|k7  rZ||z
  |
|z
  z  }||d<   t        |dz
        dk  rdnd|d<   t        |dz
        dk  rdnd|d<   t        |dz
        dk  rdnd|d<   |S d|d<   d|d<   d|d<   d|d<   |S )z:Features de price action (candlesticks, swings, fibonacci)   gMbP?   r   is_dojiis_bullish_engulfingis_bearish_engulfing   Ndistance_to_highdistance_to_lowposition_in_range      ?r   fibonacci_levelg r?g?near_fib_382near_fib_50g-?near_fib_618)r   absr   maxmin)r   r   r&   candle1candle2candle3	body_sizerecent_high
recent_lowcurrent_pricehigh_50low_50current	fib_levels                 r   r   z7AdvancedFeatureExtractor._extract_price_action_features:   s)    v;!RjGRjGRjG Gg-.8I'05'8!aHY 6=w5F7U\K\qcdH+, 6=w5F7U\K\qcdH+, v;"&&.Kst-J"2JM,7-,G=+XH'(+8:+E*VH&' j(1>1KP[^hPh0i,-03,- v;"ffVCD\*GVVF34L)FRjG& $v-'F2BC	.7*+ 14I4E0F0M1ST(/29s?/Cd/J!PQ'03I4E0F0M1ST(  /2*++,(*+'+,(r   c                    i }t        |      dk\  r| j                  |d      }| j                  |d      }||z
  }t        |      dk\  rg }t        t        |      dz
        D ]F  }| j                  |dd|z    d      }| j                  |dd|z    d      }	|j                  ||	z
         H t        |      dk\  r9| j                  t	        j
                  |      d      }
||
z
  |d<   ||
kD  rdnd|d	<   ||d
<   |d   dkD  r||d   z  nd|d<   | j                  |d      }t        |      dk\  r1| j                  |dd       }||d<   |dk  rdnd|d<   |dkD  rdnd|d<   t        |      dk\  r#| j                  |d      }||d<   |dk  rdnd|d<   dD ]/  }t        |      |kD  s|d   ||    z
  ||    z  dz  }||d| <   1 |S )u   Features de momentum avancées      #   N	   macd_histogramr-   r   
macd_crossmacdr,   macd_normalized   istochastic_rsir1   stoch_rsi_oversoldP   stoch_rsi_overbought
williams_riwilliams_oversold)r)      
   r1   d   roc_)	r   _emarangeappendr   r   _calculate_rsi_array_stochastic_williams_r)r   r   r&   ema12ema26	macd_linemacd_valuesiema12_iema26_isignal_line
rsi_values	stoch_rsirX   periodrocs                   r   r   z3AdvancedFeatureExtractor._extract_momentum_featuress   s*    v;"IIfb)EIIfb)EI 6{b  s6{R/0 :A"iiu1r:G"iiu1r:G&&w'89:
 {#q("&))BHH[,A1"EK1:[1HH-.2;k2IQqH\*(HVDJ2JQRN)fRj*@XYH&' ..vr:
z?b ((CD)9:I)2H%&2;b.QaH)*4=NqH+, v;"))&"5J%/H\"1;c1AAqH() % 	0F6{V#r
VVG_4wG3N,/4x)	0
 r   c                 d   i }t        |      dk\  r*| j                  |d      }|d   dkD  r||d   z  dz  nd|d<   dD ]X  }t        |      |kD  st        j                  || dz
  d       || dz
  d z  }t        j                  |      dz  }||d	| d
<   Z t        |      dk\  rwt        j                  t        j                  |dd       |dd z        dz  }t        j                  t        j                  |dd       |dd z        dz  }|dkD  r||z  nd|d<   t        |      dk\  rt        j                  t        j                  |dd       |dd z        }	t        j                  t        j                  |dd       |dd z        }
|	|
dz  kD  rd|d<   |S |	|
dz  k  rd|d<   |S d|d<   |S )u!   Features de volatilité avancéesrS   r,   r   r\   atr_percent)rZ   r[   r1   r-   Nvolatility_dr1   iivolatility_ratior   ig      ?   volatility_regimeffffff?)r   _atrr   diffstd)r   r   r&   atrrn   returns
volatilityvol_5vol_20current_volhistorical_vols              r   r    z5AdvancedFeatureExtractor._extract_volatility_features   s    v;"))FB'CBH*q.sVBZ'73&>VWH]# " 	?F6{V#''&&"45wqy8LLVVG_s2
4>;vha01		? v;"FF2776"#;/&B-?@3FEVVBGGF34L1F3rNBCcIF=CaZ56>QH'( v;"&&!6B!GHKVVBGGF34L$9F3rN$JKN^c1101,-  ~3301,-  12,-r   c                    i }t        |      dk  r|S | j                  ||      }|d   |d   kD  rdnd|d<   t        |      dk\  r|d   |d   z
  |d   dz   z  }||d<   t        |      dk\  r-| j                  |d	d
 |d	d
       }|dkD  r|d   |z
  |z  nd|d<   t        j                  |d	d
       }|dkD  r|d   |z  nd|d<   t        j                  |dd
       }t        j                  |d	d       }	|	dkD  r||	z
  |	z  nd|d<   |S )u   Features de volume avancéesr1   r,   r-   r   	obv_trendr[   	obv_sloper2   Nprice_vs_vwapvolume_ratio_currentvolume_trend)r   _calculate_obv_calculate_vwapr   mean)
r   r   r   r&   obv
obv_changevwap
avg_volume
recent_vol	older_vols
             r   r!   z1AdvancedFeatureExtractor._extract_volume_features   sK   w<"O !!&'2%(Ws3x%7Q s8r>b'CH,SA>J$.H[! v;"''stgcdmDDFJQhd):d(BTUH_% WWWST]+
GQTU~72;+C[\'( WWWRS\*
GGGCO,	KTWX=J$:i#G^_ r   c                    i }t        |      dk\  r/| j                  |d      }||d<   |dkD  rdnd|d<   |dkD  rdnd|d<   t        |      d	k\  rK| j                  |d	      }d
}|d   |d   z   dz  ||z  z   }|d   |d   z   dz  ||z  z
  }|d   |kD  rdnd|d<   t        t        dfD ]S  }t        |      |dz   k\  s| j                  ||      }	| j                  |dd |      }
|
dkD  r|	|
z
  |
z  nd}||d| d<   U |S )u   Features de tendance avancéesrS   adxr	   r-   r   strong_trend(   very_strong_trendr[   r)   r,   r+   ru   above_supertrendc   rZ   Nr   ema_slope)r   _calculate_adxrx   r   r   r^   )r   r   r&   r   r{   
multiplierbasic_ubbasic_lbrn   ema_current	ema_5_agoslopes               r   r"   z0AdvancedFeatureExtractor._extract_trend_features   sR    v;"%%fb1C!HUO,/"Hq!H^$14rAqH() v;"))FB'CJr
VBZ/14zC7GGHr
VBZ/14zC7GGH06r
X0E11H'( !(B/ 	7F6{fqj("ii7 IIfSbk6:	AJQy0I=TU163vhf-.	7 r   c                 4   i }t        |      dk  r|S t        j                  |dd       t        j                  |dd       z
  }|dkD  r!|d   t        j                  |dd       z
  |z  nd}t        |      dk\  rt        j                  |dd       nt        j                  |      }|d   }|dkD  r||z  nd}t        |      dk\  r|d   |d	   z
  |d	   z  nd}	|d
k  r|dkD  rd|d<   |S |dkD  r|dkD  rd|d<   |S |	dkD  rd|d<   |S |	dk  rd|d<   |S d|d<   |S )u   Features de cycle de marchér   r7   Nr   r,   r6   r-   r[   r   g333333?g333333?market_cycle_phaserw   g{Gz?ru   g{Gzr)      )r   r   r=   r>   r   )
r   r   r   r&   price_range_50current_positionr   current_volumevolume_ratiomomentums
             r   r#   z0AdvancedFeatureExtractor._extract_cycle_features  sq   v;O st-vcd|0DDSadeSeF2Jst)==Okn/27|r/ARWWWST]+rwwwGW
 6@1n~
2! @C6{b?PF2J,s;VW c!lS&8-.H)*  #s(:-.H)*  _-.H)*  -.H)*  ./H)*r   rn   c                     t        |      |k  rt        j                  |      S d|dz   z  }t        j                  |d|       }||d D ]  }||z  |d|z
  z  z   } |S )zCalcule EMAru   r-   N)r   r   r   )r   r   rn   r   r   prices         r   r^   zAdvancedFeatureExtractor._ema+  sr    v;776?"&1*%
ggfWfo&FG_ 	BE:%#Z*@AC	B
r   c                 <   t        |      |dz   k  rt        j                  dg      S t        j                  |      }t        j                  |dkD  |d      }t        j                  |dk  | d      }t        j
                  |d|       }t        j
                  |d|       }g }t        |t        |            D ]M  }	||dz
  z  ||	   z   |z  }||dz
  z  ||	   z   |z  }|dk(  rd}
n||z  }ddd|z   z  z
  }
|j                  |
       O t        j                  |      S )zCalcule RSI pour un arrayr-   r   r   Nr\   )r   r   r   ry   wherer   r_   r`   )r   r   rn   deltasgainslossesavg_gainavg_lossrl   rh   rsirss               r   ra   z-AdvancedFeatureExtractor._calculate_rsi_array5  s#   v;!#88RD>!!VQ/&1*vgq1775&>*776'6?+
vs6{+ 
	#A FQJ/%(:fDH FQJ/&);vEH1}(SAF^,c"
	# xx
##r   valuesc                     t        |      dk  ryt        j                  |      }t        j                  |      }|d   }||k(  ry||z
  ||z
  z  dz  S )zCalcule Stochasticru   r   r,   r\   r   r   r=   r>   )r   r   highlowrH   s        r   rb   z$AdvancedFeatureExtractor._stochasticP  sU    v;?vvf~ffVn*3;34#:.#55r   c                     t        |      |k  ryt        j                  || d       }t        j                  || d       }|d   }||k(  ry||z
  ||z
  z  dz  S )zCalcule Williams %Rr7   Nr,   ir   )r   r   rn   r   r   closes         r   rc   z$AdvancedFeatureExtractor._williams_r[  sj    v;vvffWX&'ffVVGH%&r
3;$*-55r   c                     t        |      |dz   k  ryt        j                  t        j                  || dz
  d             }t        j                  |      S )u&   Calcule ATR (simplifié sans high/low)r-   r   N)r   r   r<   ry   r   )r   r   rn   true_rangess       r   rx   zAdvancedFeatureExtractor._atrf  sH    v;!#ffRWWVVGAIJ%789ww{##r   c                    t        j                  t        |            }|d   |d<   t        dt        |            D ]M  }||   ||dz
     kD  r||dz
     ||   z   ||<   #||   ||dz
     k  r||dz
     ||   z
  ||<   C||dz
     ||<   O |S )zCalcule OBVr   r-   )r   zerosr   r_   )r   r   r   r   rh   s        r   r   z'AdvancedFeatureExtractor._calculate_obvm  s    hhs6{#Aq#f+& 	"Aay6!A#;&QqSGAJ.AVAaC[(QqSGAJ.AQqSA	" 
r   c                    t        |      t        |      k7  st        |      dk(  rt        |      dkD  r|d   S dS t        j                  |      dkD  r.t        j                  ||z        t        j                  |      z  S |d   S )zCalcule VWAPr   r,   )r   r   sum)r   r   r   s      r   r   z(AdvancedFeatureExtractor._calculate_vwapz  sr    v;#g,&#f+*:!$Vq6":7a7=?VVG_q=Prvvfw&'"&&/9`V\]_V``r   c                    t        |      |dz   k  ryg }g }t        dt        |            D ]X  }||   ||dz
     z
  }||dz
     ||   z
  }|j                  ||kD  r|dkD  r|nd       |j                  ||kD  r|dkD  r|nd       Z t        j                  || d       }t        j                  || d       }	||	z   dk(  ryt        ||	z
        ||	z   z  dz  }
t        d|
      S )u   Calcule ADX (simplifié)r-   r1   r   Nr\   )r   r_   r`   r   r   r<   r>   )r   r   rn   upsdownsrh   updownavg_upavg_downr   s              r   r   z'AdvancedFeatureExtractor._calculate_adx  s   v;!# q#f+& 	@AVAaC[(B!A#;*DJJR$Y26rq9LLtaxQ?		@ fWX'775&?+ H!&8#$(9:S@3}r   )N)rS   )__name__
__module____qualname____doc__r   r   floatr   r'   r   ndarrayr   r   r    r!   r"   r#   intr^   ra   rb   rc   rx   r   r   r    r   r   r   r      s   5B!4; !e !X\ !F7RZZ 7D 7r. . .`"2:: "$ "Hrzz BJJ SW @bjj T :#bjj #2:: #RV #N2:: s u $2:: $s $BJJ $6	6"** 	6 	6	6"** 	6c 	6e 	6$2:: $s $u $RZZ "**  abjj a2:: a% aRZZ   r   r   r   c                  .    t         
t               a t         S )z7Retourne l'instance globale de l'extracteur de features)_feature_extractorr   r   r   r   get_feature_extractorr     s     !57r   )r   numpyr   typingr   r   r   loggingconfigr   r   ImportError	getLoggerr   r   r   r   r   r   r   <module>r      ss   
  ' '  * 
		7	8F FT  7 c   Ix s   A 
AA