
    i5                         d Z ddlZddlZddlmZmZmZmZ ddl	m
Z
 ddlZddlZ	 ddlmZmZ ddlmZ ddlmZ dZ G d d      ZdaddZy# e$ r d	Z ej,                  d
       Y ,w xY w)u   
Méthodes Ensemble ML pour Trading
Inspiré de: https://github.com/N00Bception/AI-CryptoTrader
Combine Random Forest, Gradient Boosting et autres modèles
    N)ListDictOptionalTuple)deque)RandomForestClassifierGradientBoostingClassifier)StandardScaler)train_test_splitTFuK   ⚠️ scikit-learn non installé. Installez avec: pip install scikit-learnc                      e Zd ZdZddZd Z	 	 	 ddee   deee      dee   dee   d	ee   d
e	j                  fdZde	j                  defdZddZ	 	 dde	j                  dee   ded
eeeef   fdZdefdZdefdZdedefdZy)EnsembleMLPredictoru>   
    Prédicteur ensemble combinant plusieurs modèles ML
    c                     || _         t        |      | _        d | _        d | _        t               | _        dddd| _        g | _        d| _	        t        r| j                          y t        j                  d       y )N)maxleng      ?)random_forestgradient_boosting
indicatorsFu1   ⚠️ Ensemble ML désactivé (sklearn manquant))max_historyr   training_datar   r   r
   scalermodel_weightspredictions_history
is_trainedSKLEARN_AVAILABLE_initialize_modelsloggingwarning)selfr   s     ./ensemble_ml.py__init__zEnsembleMLPredictor.__init__   su    &"+6 "!%$& !!$
 $& ##%OOOP    c                     t        ddddd      | _        t        dddddd      | _        t	        j
                  d	       y
)u   Initialise les modèles MLd   
      *   )n_estimators	max_depthmin_samples_splitmin_samples_leafrandom_stateg?   )r&   learning_rater'   r(   r)   r*   u"   ✅ Modèles ensemble initialisésN)r   r   r	   r   r   info)r   s    r   r   z&EnsembleMLPredictor._initialize_models5   sP     4 
 "< "
 	9:r    Npricesvolumesrsi	ema_shortema_longreturnc                    t        |      dk  ryg }|d   }dD ]I  }t        |      |kD  r(||| dz
     z
  || dz
     z  }	|j                  |	       9|j                  d       K t        |      dk\  rCt        j                  |dd       t        j                  |dd       z  }
|j                  |
       n|j                  d       t        |      dk\  r t        j
                  |dd       |dd z  }t        j                  |      dkD  rDt        j                  |t        j                  |      z
  t        j                  |      z  d	z        nd}|j                  |       t        j                  |      dkD  rGt        j                  |t        j                  |      z
  t        j                  |      z  d
z        d	z
  nd}|j                  |       n|j                  ddg       t        |      dk\  r0t        j                  |dd       }|j                  ||z
  |z         n|j                  d       t        |      dk\  r0t        j                  |dd       }|j                  ||z
  |z         n|j                  d       ||j                  |dz         n|j                  d       ||||z
  |z  }|j                  |       n|j                  d       |rIt        |      dk\  r;|d   }t        j                  |dd       }|dkD  r||z  nd}|j                  |       n|j                  d       t        |      dk\  rRt        |dd       }t        |dd       }||z
  }|dkD  r||z
  |z  }|j                  |       n#|j                  d       n|j                  d       t        j                  |      j                  dd      S )z0
        Extraction de features pour ML
        2   N)      r+   r#   r$   r7   r   r$   ir8      ig      Y@      ?)lenappendnpstdmeandiffextendmaxminarrayreshape)r   r.   r/   r0   r1   r2   featurescurrent_priceperiodret
volatilityreturnsskewkurtsma_20sma_50ema_diffcurrent_volume
avg_volumevolume_ratiohigh_20low_20range_20position_in_ranges                           r   extract_featuresz$EnsembleMLPredictor.extract_featuresL   st    v;r
 ( 	#F6{V#$vvgai'88FF719<MM$"	# v;"st-st0EEJOOJ'OOA v;"ggfSTl+fSn<GUWU[U[\cUdghUh277Wrwww'77266'?JqPQnoDOOD! Z\Y_Y_`gYhklYl277Wrwww'77266'?JqPQTUUrsDOOD!OOQF# v;"WWVCD\*FOO]V3v=>OOAv;"WWVCD\*FOO]V3v=>OOA ?OOC%K(OOC  X%9!H,8HOOH%OOA s7|r)$R[N/J:Dq.>J6aLOOL)OOA v;"&,'G&F'H!|%2V%;x$G! 12$OOC xx!))!R00r    rF   labelc                 b    |y| j                   j                  |j                         |d       y)uh   
        Ajoute un échantillon d'entraînement
        label: 1 = prix monte, 0 = prix descend
        N)rF   rY   )r   r<   flatten)r   rF   rY   s      r   add_training_samplez'EnsembleMLPredictor.add_training_sample   s5    
 !! ((*#
 	r    c                    t         syt        | j                        |k  r0t        j                  dt        | j                         d| d       y	 t        j                  | j                  D cg c]  }|d   	 c}      }t        j                  | j                  D cg c]  }|d   	 c}      }t        t        j                  |            dk  rt        j                  d       yt        ||d	d
|      \  }}}}| j                  j                  |      }	| j                  j                  |      }
| j                  j                  |	|       | j                  j                  |
|      }| j                   j                  |	|       | j                   j                  |
|      }||z   }|dkD  r$||z  | j"                  d<   ||z  | j"                  d<   d| _        t        j                  d|dd|d       t        j                  d| j"                  d   dd| j"                  d   d       yc c}w c c}w # t&        $ r"}t        j(                  d|        Y d}~yd}~ww xY w)u1   
        Entraîne les modèles ensemble
        Fu+   ⏳ Pas assez de données pour entraîner (/)rF   rY      uB   ⚠️ Une seule classe dans les données, impossible d'entraînerg?r%   )	test_sizer*   stratifyr   r   r   Tu   ✅ Modèles entraînés - RF: z.2%z, GB: u   📊 Poids: RF=z.2fz, GB=u   ❌ Erreur entraînement: N)r   r;   r   r   r-   r=   rD   uniquer   r   r   fit_transform	transformr   fitscorer   r   r   	Exceptionerror)r   min_samplessampleXyX_trainX_testy_trainy_testX_train_scaledX_test_scaledrf_scoregb_scoretotal_scorees                  r   train_modelsz EnsembleMLPredictor.train_models   sH    !t!!"[0LLFs4K]K]G^F__`al`mmnop+	4;M;MN&,NOA8J8JKf&/KLA 299Q< 1$ de 0@1"q0,GVWf
 "[[66w?N KK11&9M "">7;))//vFH ""&&~w?--33M6JH #X-KQ6>6L""?3:B[:P""#67"DOLL:8C.xX[n]^LL?4+=+=o+Ns*S T"001DEcJL M K OKL  	MM6qc:;	s=   H7 .H-:$H7 H2*=H7 (EH7 -
H7 7	I" II"indicators_signalindicators_confidencec                 :   t         r| j                  r||r||ddifS ddddifS 	 | j                  j                  |      }| j                  j                  |      d   }| j                  j                  |      d   }|d   | j                  d	   z  |d   | j                  d
   z  z   | j                  d	   | j                  d
   z   z  }|dk(  r|dz  }|dz  |dz  z   }n|dk(  r|dz  }|dz  d|z
  dz  z   }|dkD  rd}	|}
n|dk  rd}	d|z
  }
nd}	d}
dt        |d         t        |d         t        |      | j                  d	   | j                  d
   d}|	|
|fS # t        $ r7}t        j                  d|        |r||ddifcY d}~S ddddifcY d}~S d}~ww xY w)ur   
        Prédiction ensemble combinant tous les modèles
        Retourne: (signal, confiance, détails)
        Nmethodindicators_onlyHOLDr:   no_predictionr   r7   r   r   BUYr#   gffffff?g333333?SELLg?gffffff?ensemble)r|   rf_proba_upgb_proba_upensemble_proba_up	rf_weight	gb_weightu!   ❌ Erreur prédiction ensemble: indicators_fallbackri   )r   r   r   re   r   predict_probar   r   floatrh   r   ri   )r   rF   ry   rz   features_scaledrf_probagb_probar   indicators_scoresignal
confidencedetailsrw   s                r   predictzEnsembleMLPredictor.predict   s"    !8;K (*?(L]A^^^3? ;;;3	4"kk33H=O ))77HKH--;;OLQOH d00AAd001DEEF##O4t7I7IJ]7^^!` !E)#82#= %6%<?ORU?U%U!"f,#82#= %6%<DT@TX[?[%[! !4'.
"T)!22
 
 %$Xa[1$Xa[1%*+<%=!//@!//0CDG :w.. 	4MM=aSAB (*?(LaAbbb37 333		4s*   D3E 	F# FF	FFFfilepathc                    | j                   sy	 ddl}| j                  | j                  | j                  | j
                  | j                   d}t        |d      5 }|j                  ||       ddd       t        j                  d|        y# 1 sw Y   "xY w# t        $ r"}t        j                  d|        Y d}~yd}~ww xY w)	u#   Sauvegarde les modèles entraînésFr   N)r   r   r   r   r   wbu   💾 Modèles sauvegardés: Tu   ❌ Erreur sauvegarde: )r   pickler   r   r   r   opendumpr   r-   rh   ri   )r   r   r   datafrw   s         r   save_modelszEnsembleMLPredictor.save_models0  s    	!%!3!3%)%;%;++!%!3!3"ooD h% %D!$% LL7zBC	% %  	MM3A378	s0   A
B B, B BB 	C"B??Cc                    t         j                  j                  |      sy	 ddl}t	        |d      5 }|j                  |      }ddd       d   | _        |d   | _        |d   | _        |d   | _	        |d	   | _
        t        j                  d
|        y# 1 sw Y   TxY w# t        $ r"}t        j                  d|        Y d}~yd}~ww xY w)u%   Charge les modèles depuis un fichierFr   Nrbr   r   r   r   r   u   📂 Modèles chargés: Tu   ❌ Erreur chargement: )ospathexistsr   r   loadr   r   r   r   r   r   r-   rh   ri   )r   r   r   r   r   rw   s         r   load_modelszEnsembleMLPredictor.load_modelsI  s    ww~~h'	h% &{{1~& "&o!6D%)*=%>D"x.DK!%o!6D"<0DOLL3H:>?& &  	MM3A378	s/   B# BAB# B B# #	C,C		C
predictionactual_resultc                 Z   ||k(  }| j                   j                  |||d       t        | j                         dkD  r| j                   j                  d       t        | j                         dk\  r<t	        d | j                   dd D              dz  }t        j                  d|d	       yy)
uM   
        Met à jour les poids des modèles selon leurs performances
        )r   actualcorrectr"   r   r#   c              3   ,   K   | ]  }|d    s	d  yw)r   r7   N ).0ps     r   	<genexpr>z?EnsembleMLPredictor.update_model_performance.<locals>.<genexpr>x  s     !\qQZ|!!\s   
iNu   📊 Accuracy récente (10): z.1%)r   r<   r;   popsumr   debug)r   r   r   r   recent_accuracys        r   update_model_performancez,EnsembleMLPredictor.update_model_performancea  s     .  ''$#)
 	 t''(3.$$((+ t''(B.!!\T-E-Ecd-K!\\_aaOMM9/#9NOP /r    i  )NNNN)r"   )Nr:   )__name__
__module____qualname____doc__r   r   r   r   r   r=   ndarrayrX   intr\   rx   strr   r   r   r   r   r   r   r    r   r   r      s   Q0;. VZRV48\1tE{ \1Xd5k=R \1%e_\1@H\1"*5/\1=?ZZ\1|BJJ s 6p PT.1?4

 ?4x} ?4&+?46;C<L6M?4BC 2C 0Q3 Qs Qr    r   c                 0    t         t        |       a t         S )u6   Récupère ou crée l'instance du prédicteur ensemble)ensemble_predictorr   )r   s    r   get_ensemble_predictorr     s     !0=r    r   )r   numpyr=   r   typingr   r   r   r   collectionsr   jsonr   sklearn.ensembler   r	   sklearn.preprocessingr
   sklearn.model_selectionr   r   ImportErrorr   r   r   r   r   r    r   <module>r      s{   
   . .   	cS48aQ aQJ  Y  cGOOabcs   A A)(A)