
    KWj5                     	   S r SSKrSSKrSSKrSSKrSSKrSSKrSSKrSSK	r
SSKJr  \R                  " S5        S\R                  S'   \R                  R                  S\R                  R!                  \R                  R#                  \5      5      5        SSKJrJrJrJrJrJrJrJr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&J'r'  SSK(J)r)J*r*  SSK+J,r,  SSK-J.r.  SSK/J0r0  SSK1J2r2  Sr3\Rh                  " \3SS9  \3 S3r50 r6/ SQr7/ SQr8SSK9J:r:J;r;  S r<SZS jr=S r>\?S:X  Ga`  SSK@r@\@R                  " SS9rB\BR                  S\DSSS9  \BR                  S \DSS!S9  \BR                  5       rF\FR                  (       a  \FR                  /O\rH\FR                  (       a  \FR                  /O\7rJ\K" \H5      \K" \J5      -  rL\M" S"S# 35        \M" S$\R                  " 5       R                  S%5       35        \M" S&S'R                  \H5       35        \M" S(S'R                  \J5       35        \M" S)\L S*35        \M" S+\ 35        \M" S# 5        \M" 5         \R                  " 5       rQSrRSrS\H H  rG\J H  rI\RS,-  rR\M" S-\R S.\L S/\R                  " 5       R                  S05       S1\G S2\I 3
SS39  \G\IS4S5.rT \>" \G\I5      rU\Uc  \M" S65        S7\TS8'   S\TS9'   OI\UrT\UR                  S:S;5      rW\M" S<\US=   S> S?\US@   S> SA\USB    SC\USD   S> SE\WSF S'\USG   SH SI\USJ    35         \T\6\G SL\I 3'   \\" \5SM5       r]\R                  " \6\]SN\DSO9  SSS5        M     M     \R                  " 5       \Q-
  r_\M" S"S# 35        \M" SP5        \M" SQ\_SR-  SH SS35        \M" ST\S 35        \M" S# 5        \6R                  5        V s/ s H  o R                  S85      SU:X  d  M  U PM     sn ra\a(       a  \a V s/ s H  o S=   PM	     sn rb\a V s/ s H  o S@   PM	     sn rc\a V s/ s H  o SB   S:  d  M  U SD   PM     sn rd\M" SV\R                  " \b5      S> 35        \M" SW\R                  " \c5      S> 35        \M" SX\R                  " \d5      S> 35        \M" SY\5 35        \M" 5         gg! \X a@  rYSSKZrZ\SS,-  rSS4\TS8'   \D" \Y5      \TS4'   \M" SK\Y 35        \ZR                  " 5          SrYCYGNSrYCYff = f! , (       d  f       GMv  = fs  sn f s  sn f s  sn f s  sn f )[u  
Полная тренировка ExpertEnsemble (16 LSTM экспертов + RF) для всех 14 MOEX тикеров × 3 TF.
Запуск: python3 train_experts_all.py
Время: ~5-6 часов (H1 ~17 мин/тикер, D1 ~5 мин, W1 ~1 мин)
    N)datetimeignore0CUDA_VISIBLE_DEVICES)	MOEX_TICKERSTARGET_CONFIGDEVICETICKER_SHORT_WEIGHTSTICKER_LONG_WEIGHTSTICKER_THRESHOLDSDEFAULT_SHORT_WEIGHTDEFAULT_LONG_THDEFAULT_SHORT_TH)load_dataframe)engineer_features
add_targetFEATURE_COLSINTERACTION_COLSTEMPORAL_COLS)add_directional_signalsDIRECTIONAL_COLS)add_curated_contextCONTEXT_COLS)compute_dual_outcomes)ExpertEnsemble)RandomForestClassifier)accuracy_scorezmodels/savedT)exist_okz/experts_training_log.json)H1D1W1)            )_build_dataset_get_feature_colsc                  ~    [        [        R                  [        [        -   [
        -   [        -   [        -   5      5      $ N)listdictfromkeysr   r   r   r   r        2/home/ai/projects/AI_Strategy/train_experts_all.pyget_directional_feature_colsr0   &   s-    .=LO__boopqqr.   c                    [        XU5      n[        U5      n[        USS9nUR                  S/S9R                   H$  nUS;  d  M  [
        R                  " X4   SS9X4'   M&     S H  nX4   R                  [        5      X4'   M     [        U5      n[        U5      n[        U40 [        D6nUR                  5       R                  S	S
9$ )N   )horizonobject)include)DateTimecoerce)errors)OpenHighLowCloseT)drop)r   r   r   select_dtypescolumnspd
to_numericastypefloatr   r   r   r   dropnareset_index)ticker	timeframelimitdfcols        r/   _prepare_dfrL   )   s    	5	1B	2	B	B	"B
3;;&&mmBGH=BG < 0'..' 0	 	$B	R	 B	r	3]	3B99;"""--r.   c                 &   [         R                   " 5       n[        X5      nUb  [        U5      S:  a  [        SUb  [        U5      OS 35        g[	        5       nU Vs/ s H  oUUR
                  ;   d  M  UPM     nn[        U5      n[        [        U5      S-  5      nUR                  SU R                  5       n	UR                  US R                  5       n
[        U5      nUR                  XSS9  [        R                  " U [        5      n[        R                  " U S5      n[        S	U S
3SSS9  U	S   R                  R!                  ["        R$                  5      nU	S   R                  R!                  ["        R$                  5      nUR'                  XXSUSS9  [        S5        UR)                  X5      nUR)                  X5      nUR+                  X5      nUR+                  X5      n[-        U	UXUS9nU	S   R                  R!                  ["        R.                  5      nU	S   R                  R!                  ["        R.                  5      n[-        U
UXUS9nU
S   R                  R!                  ["        R.                  5      nU
S   R                  R!                  ["        R.                  5      n[1        [        U5      [        U5      [        U5      5      nUU* S UU* S UU* S nnn[1        [        U5      [        U5      [        U5      5      nUU* S UU* S UU* S nnnSSKJn  [        [        U5      S-  5      nSnSnUS:  ar  [        U5      U-
  S:  a`  USU n USU n!USU n"UUS n#UUS n$UUS n%U" XSS9nUR7                  U U!U"U#U$U%5        UR9                  US5      n&UR9                  US5      n'Ov[;        SSSSUS9n([;        SSSSSUS.S9n)U(R7                  UU5        U)R7                  UU5        U(R9                  U5      SS2S 4   n&U)R9                  U5      SS2S 4   n'U(U)S!.nU&S":  R!                  ["        R.                  5      n*U'S":  R!                  ["        R.                  5      n+[=        [?        UU*5      5      n,[=        [?        UU+5      5      n-S#n.UGbM  [        W#5      S:  Ga=  UR9                  U#S5      n/UR9                  U#S5      n0S$u  n1n2S%u  n3n4["        R@                  " S"S&S'5       H  n5U/U5:  n6U6RC                  5       S:  aV  [=        W$U6   RE                  5       5      n7U7S"-
  ["        RF                  " U6RC                  5       5      -  n8U8U3:  a
  U7S(:  a  U8n3U5n1U0U5:  n9U9RC                  5       S:  d  M  [=        W%U9   RE                  5       5      n7U7S"-
  ["        RF                  " U9RC                  5       5      -  n8U8U4:  d  M  U7S(:  d  M  U8n4U5n2M     [I        U1U25      n.["        RJ                  " U&U'5      U.:  n:S)n;Sn<U:RC                  5       S:  a[  U&U:   U'U:   :  n=["        RL                  " U=UU:   UU:   5      n>[=        U>RE                  5       5      n;[        U:RC                  5       5      n<[N        R                  " U [P        [R        S!.5      n?U.U?S*'   [T         S+U RW                  5        S,URW                  5        S-3n@UURY                  5       URZ                  UU,U-U;U<U U[        U5      [        U5      S.[\        U?S/.nAUby  UR^                  WAS0'   UR`                  UAS1'   URb                  UAS2'   URd                  UAS3'   URf                  UAS4'   URh                  UAS5'   URj                  UAS6'   URl                  UAS7'   OUb  US   WAS8'   US   UAS9'   [n        Rp                  " WAW@5        [         R                   " 5       U-
  nBS:[        U5      [        U5      [        U5      U,U-U;U<U.U@[s        UBS-  S;5      S<.$ s  snf )=u[   Тренирует ExpertEnsemble + ExpertFusion + RF для одного тикера×TF.N   u     ⏭ Too few rows: r   g?F)verbosebalancedz!  Training ExpertFusion (short_w=z)... T)endflushoutcome_longoutcome_short<   )epochsshort_weightrO   u   ✓)fusion_embedding)EnsembleModeld   2   *   )long_weightrX   random_statelongshort
   )n_estimators	max_depthr_   n_jobsclass_weightg      ?)r   r2   r2   )r`   ra   g      ?333333?)rh   rh   )    eri   g;On?g?gzG?g        auto_th/_z_experts.joblib
experts_v3)featuresexpert_stateexpert_namesn_base_featureslong_accuracyshort_accuracy
hi_conf_wr	hi_conf_nrG   rH   n_trainn_testtypedevice
thresholdsensemble_longensemble_xgb_longensemble_lgb_longensemble_blend_longensemble_shortensemble_xgb_shortensemble_lgb_shortensemble_blend_short
model_longmodel_shortok   )statusrowsrv   rw   rr   rs   rt   ru   rj   pathelapsed_min):timerL   lenprintr0   r@   intiloccopyr   	train_allr
   getr   r   valuesrC   npfloat32train_fusionpredict_allcompute_fusion_embeddingr&   int32minmodels.ensemblerZ   fitpredict_probar   rD   r   arangesummeansqrtmaxmaximumwherer   r   r   SAVE_DIRlower
state_dictrp   r	   rf_longxgb_longlgb_longblend_weights_longrf_short	xgb_short	lgb_shortblend_weights_shortjoblibdumpround)CrG   tft0rJ   feature_colsc	availablen_basesplittrain_dftest_dfexpert_ensemblerX   r^   y_longy_shorttrain_signalstest_signalstrain_fusion_embtest_fusion_embX_trainy_train_longy_train_shortX_testy_test_longy_test_short	min_trainmin_testrZ   	val_splitensemble_modelrf_fallbackX_train_basey_train_base_longy_train_base_shortX_val
y_val_longy_val_shortp_longp_shortr   r   y_pred_longy_pred_shortlong_acc	short_accrj   
p_val_longp_val_shortbest_long_thbest_short_thbest_score_longbest_score_shortth	conf_longwrscore
conf_shorthi_confrt   ru   hi_longwinsrz   r   	save_dataelapsedsC                                                                      r/   train_experts_forr   7   s   	B	V	 B	zSWs]$SWA$FGH/1L(<LqOLI<^FB#Ewwv##%Hggefo""$G %V,Oh5A (++F4HIL%))&*=K 
-l^4
@cQUVn%,,33BJJ?F'..55bjjAG  f(*u ! V	CM $//DM"..wBL&??T%>>wRO X}o.>@GN+2299"((CL_-44;;BHHEMG\?-<>F.)0077AK?+2299"((CL CL#l"3S5GHI+2I:;+?yjkAZ\iktjtju\v=\G3v;K 0#l2CDH(.yz(:K	
<SUackbkblUmKF .CL3&'INKCCL94r9z	*()4*:I6	
#!)*-
#IJ/&#R
 	<):<N *k	;  --ff= ..vw? )B$
 *B \2
 	G\*Wm,&&v.q!t4((0A6&:C<''1KcM))"((3L^K=>Hn\<@AI G!c%j2o#11%@
$225'B&.#m,6))))D%/B"b(I}}"$:i05578cRWWY]]_%==?*rTz&+O#%L$*J~~2%;z2779:cRWWZ^^-=%>>++d
',$$&M 0  lM2 zz&'*g5GJI{{}q/GG$44xxW!5|G7LM499;'
&	 #&&vRb/cdJ#Jy Zq("((*_ED'224'44!!# w<f+ I" !%3%;%;	/")7)@)@	%&)7)@)@	%&+9+L+L	'(&4&=&=	"#*8*B*B	&'*8*B*B	&',:,N,N	()		 "-f"5	,#.w#7	- 
KK	4 iikBGBw<f+!# Wr\1- S =s   `5`__main__z)Train ExpertEnsemble for all MOEX tickers)descriptionz--tickerzSingle ticker only)rx   defaulthelpz--tfzSingle timeframe only
zF======================================================================u     EXPERT ENSEMBLE TRAINING — z%d.%m.%Y %H:%Mu     Трекеры: z, z  TF: u     Всего: u    комбинацийz
  Device: r2   z
[rk   z] z%H:%Mu    — rQ   )rS   error)rG   rH   r   u     ⏭ Skippedskippedr   r   rj   rh   u     ✓ L=rr   z.1%z S=rs   z HiConf(ru   z)=rt   z (th=z.2fr   z.1fu    мин) → r   u     ❌ Ошибка: rl   wr   )indentr   u*     ТРЕНИРОВКА ЗАВЕРШЕНА!u     Время: rV   u    минu     Ошибок: r   u!   
  Средняя Long accuracy: u!     Средняя Short accuracy: u     Средняя HiConf WR: u   
  Лог: r)   )f__doc__sysoswarningsr   jsonr   numpyr   pandasrA   r   filterwarningsenvironr   insertdirnameabspath__file__configr   r   r	   r
   r   r   r   r   r   data.loaderr   features.technicalr   r   r   r   r   features.directionalr   r   features.contextr   r   features.targetsr   models.expertsr   sklearn.ensembler   sklearn.metricsr   r   makedirsLOG_FILEresults_log
TIMEFRAMESHORIZONS
models.moer&   r'   r0   rL   r   __name__argparseArgumentParserparseradd_argumentstr
parse_argsargsrG   tickersr   tfsr   total_combosr   nowstrftimejoint_start	completedr9   entryresultr   rj   	Exceptione	traceback	print_excopenfr   
total_timer   
ok_entriesl_accss_accshc_wrsr   )vs   0r/   <module>r.     s,  
 - , ,       !%(

! " 277??277??8#<= >` ` ` ' k k J > 2 ) 3 * Ht $Z12
 8r.F z$$1\]F

dAUV
S$=TUD#{{t{{mGww477)JCw<#c(*L	Bvh-	+HLLN,C,CDT,U+V
WX	tyy12
34	F499S>"
#$	N<.(=
>?	Jvh
 	VH	GiikGIFBNIC	{!L>HLLN4K4KG4T3UUZ[aZbbcdfcghptu%B'JE&*626>M+&/E(O$%E&M"E$jjC8GHVO%<S$AVL\E]^aDb c$$*;$7#86,;OPS:T U!!(R}0Ec/J-X^_eXfWgi j -2K6(!B4()h$		+qC@ %$7  @ w&J	Bvh-	68	N:b=-W
56	VH
%&	VH(//1M1UU8_5L!1MJ.89jO$j9/9:z!$%z:+5L:a;!9K/!L/:L22776?32GHI1"''&/#1FGH,RWWV_S,ABC	L

#$	GS V  & !")h!$Qg,QC01##%%& %$ N9:LsO   -RAR(S)S#S#S(.S-S2	S2S5SS
S 