
    Tj              
       (   S SK Jr  S SKrS SKrS SKJr  S SKJ	r	  S SK
JrJrJrJrJr  S SKJr  S SKrS SKJrJr  / SQrSS	\R.                  S
\\\      S\\R.                  \R6                  4   4S jjr\4S\R.                  S\R6                  S\4S jjr SS\R.                  S\R6                  S\4S jjrS\R.                  S\R6                  S\ 4S jr!S S\R.                  S\R6                  S\"S\\    4S jjr#S\\	   S\4S jr$S\S\ 4S jr%g)!    )OptionalN)RandomForestClassifier)StandardScaler)accuracy_scoreprecision_scorerecall_scoref1_scoreclassification_report)TimeSeriesSplit)RANDOM_SEED	TEST_SIZE)return_1return_5	return_20close_to_sma_5close_to_sma_10close_to_sma_20close_to_sma_50rsibb_widthbb_positionmacdmacd_signal	macd_histatr_pctvolume_ratiodffeature_colsreturnc                    Uc  [         nU R                  5       R                  5       n U Vs/ s H  o"U R                  ;  d  M  UPM     nnU(       a  [	        SU S35      eSU R                  ;  a  [	        S5      eX   nU S   nXE4$ s  snf )Nu4   prepare_data: отсутствуют колонки u    в датафреймеtarget_directionu   prepare_data: отсутствует колонка 'target_direction'. Вызовите add_target() перед prepare_data())MODEL_FEATURESdropnacopycolumnsKeyError)r   r   cmissingXys         -/home/ai/projects/AI_Strategy/models/train.pyprepare_datar,      s    %				B&>,Q2::*=q,G>MgYVnopp+  Y  Z  	Z
A
A4K ?s   BBr)   r*   	test_sizec                 N   [        U 5      S:  a  [        S[        U 5       S35      e[        [        U 5      SU-
  -  5      nU[        U 5      :  a  [        U 5      S-
  nUS:X  a  SnU R                  S U nU R                  US  nUR                  S U nUR                  US  nXEXg4$ )N   u=   train_test_split_time: слишком мало данных (u)    строк), нужно минимум 5   r   )len
ValueErrorintiloc)r)   r*   r-   	split_idxX_trainX_testy_trainy_tests           r+   train_test_split_timer:   $   s    
1vzXY\]^Y_X`  aJ  K  L  	LCFa)m,-ICFFQJ	A~	ffZi GVVIJFffZi GVVIJFG++    r6   r8   
model_typec                     UR                  SS5      UR                  SS5      UR                  SS5      UR                  SS5      [        S	S
.n[        S0 UD6nUR                  X5        U$ )Nn_estimators   	max_depth
   min_samples_splitr/   min_samples_leaf   )r>   r@   rB   rC   random_staten_jobs )getr   r   fit)r6   r8   r<   kwargsparamsmodels         r+   train_modelrN   3   sk     

>37ZZR0#ZZ(;Q?"JJ'91=#F #,V,E	IIgLr;   r7   r9   c           
          U R                  U5      n[        X#5      [        X#SS9[        X#SS9[	        X#SS9[        X#SS9S.$ )Nr   )zero_division)accuracy	precisionrecallf1r
   )predictr   r   r   r	   r
   )rM   r7   r9   y_preds       r+   evaluate_modelrW   F   sK    ]]6"F"62$V1EvQ?vQ7!6vUV!W r;   n_splitsc                    [        U 5      U::  a  [        S[        U 5       SU S35      e[        [        U[        U 5      S-
  5      S9n/ n[	        UR                  U 5      5       Hp  u  nu  pgU R                  U   nU R                  U   n	UR                  U   n
UR                  U   n[        X5      n[        XU5      nX]S'   UR                  U5        Mr     U$ )Nu6   cross_validate: слишком мало данных (u    строк) для u    фолдовr0   )rX   fold)
r1   r2   r   min	enumeratesplitr4   rN   rW   append)r)   r*   rX   tscvresultsrZ   	train_idxval_idxr6   X_valr8   y_valrM   metricss                 r+   cross_validaterf   Q   s    
1vQRUVWRXQYYmnvmw  xE  F  G  	GC#a&1*$=>DG&/

1&>""y&&#w&&#wG- u5w '? Nr;   scalerpathc                 @    [         R                  " X[        S.U5        g )N)rM   rg   features)joblibdumpr"   )rM   rg   rh   s      r+   
save_modelrm   b   s    
KK%~NPTUr;   c                 .    [         R                  " U 5      $ N)rk   load)rh   s    r+   
load_modelrq   f   s    ;;tr;   ro   )rf)r/   )&typingr   pandaspdnumpynpsklearn.ensembler   sklearn.preprocessingr   sklearn.metricsr   r   r   r	   r
   sklearn.model_selectionr   rk   configr   r   r"   	DataFrameliststrtupleSeriesr,   floatr:   rN   dictrW   r3   rf   rm   rq   rH   r;   r+   <module>r      s<      3 0 j j 3  )R\\ $s)1D PUVXVbVbdfdmdmVmPn  MV ,R\\ ,bii ,E ,$ \\YY &",, 		 d bll ryy C T
 "Vh~6 Vc VS T r;   