
    ?atj.                        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Jr  \R                  " S5        \R                  R                  S\R                  R                  \R                  R                  \5      5      5        SSKr\R                   " S5        SSKJrJrJr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 J!r!  \ S
3r"S r#S r$\%S:X  Gah  SSK&r&\&RN                  " SS9r(\(RS                  S\*SSS9  \(RW                  5       r,\,RZ                  (       a  \,RZ                  R]                  5       /O\r/\0" SS 35        \0" S\Rb                  " 5       Re                  S5       35        \0" SSRg                  \/5       35        \0" S5        \0" S\S    S\S    S35        \0" S\ 35        \0" S S35        0 r4\R                  " 5       r5Sr6\7" \/S 5       H  u  r8r-\0" S!\8 S"\9" \/5       S#\- S$S% 35        \-S&S'.r: \$" \-5      r;\;c  \0" S(5        S)\:S*'   O@\;r:\0" S+\;S,    S-\;S.   S/ S0\;S1   S2 S3\;S4   S2 S5\;S6    S7\;Ry                  S8S95       S:35         \:\4\-'   M     \R                  " 5       \5-
  rA\0" SS 35        \0" S<5        \0" S=\AS>-  S? S@35        \0" SA\6 35        \4R                  5        V s/ s H  o Ry                  S*5      SB:X  d  M  U PM     sn rC\C(       aK  \C V s/ s H  o S.   PM	     sn rD\0" SC\9" \C5       S"\9" \/5       35        \0" SD\R                  " \D5      S/ 35        \0" S 5        \0" 5         \0" SE5        \0" SFSG 35        \0" SHRg                  / SFPSISJ PS$PSKSJ PS$PS.SL PS$PSMSJ PS$PSNSJ PS$PSOSP PS$PSQSJ PS$PSRSJ PS$PSSSJ PS$PSTSJ PS$PSUSJ PS$PSVSJ PS$PSWSJ PS$PSXSJ PS$PSYSJ PS$PSZS[ P5      5        \0" SFS\ 35        \C GH   rF\0" SHRg                  / SFP\FS]   SJ PS$P\FS^   SJ PS$P\FS.   S_ PS$P\FS1   S` PS$P\FS4   S` PS$P\FS6   SP PS$P\FRy                  S8S5      Sa PSbP\FRy                  ScS5      Sa PSbP\FRy                  SdS5      Sa PSbP\FRy                  SeS5      Sa PSbP\FRy                  SfS5      Sa PSbP\FRy                  SgS5      Sa PSbP\FRy                  ShS5      Sa PSbP\FRy                  SiS5      Sa PSbP\FRy                  SjS5      Sa PSbP\FS,   Sk P5      5        GM#     \C(       Ga  \0" SFS\ 35        \0" SHRg                  / SFPSlSJ PS$P\R                  " \C V s/ s H  o S^   PM	     sn 5      Sm PS$P\R                  " \C V s/ s H  o S.   PM	     sn 5      S_ PS$P\R                  " \C V s/ s H  o S1   PM	     sn 5      S` PS$P\R                  " \C V s/ s H  o S4   PM	     sn 5      S` PS$P\R                  " \C V s/ s H  o S6   PM	     sn 5      Sn PS$P\R                  " \C V s/ s H  o Ry                  S8S5      PM     sn 5      Sa PSbP\R                  " \C V s/ s H  o Ry                  ScS5      PM     sn 5      Sa PSbP\R                  " \C V s/ s H  o Ry                  SdS5      PM     sn 5      Sa PSbP\R                  " \C V s/ s H  o Ry                  SeS5      PM     sn 5      Sa PSbP\R                  " \C V s/ s H  o Ry                  SfS5      PM     sn 5      Sa PSbP\R                  " \C V s/ s H  o Ry                  SgS5      PM     sn 5      Sa PSbP\R                  " \C V s/ s H  o Ry                  ShS5      PM     sn 5      Sa PSbP\R                  " \C V s/ s H  o Ry                  SiS5      PM     sn 5      Sa PSbP\R                  " \C V s/ s H  o Ry                  SjS5      PM     sn 5      Sa PSbP\R                  " \C V s/ s H  o S,   PM	     sn 5      Sk P5      5        \0" S 5        \0" So\" 35        \G" \"Sp5       rH\R                  " \4\HSq\*Sr9  SSS5        gg! \= a@  r>SSK?r?\6S -  r6S&\:S*'   \*" \>5      \:S&'   \0" S;\> 35        \?R                  " 5          Sr>C>GN(Sr>C>ff = fs  sn f s  sn f s  sn f s  sn f s  sn f s  sn f s  sn f s  sn f s  sn f s  sn f s  sn f s  sn f s  sn f s  sn f s  sn f s  sn f s  sn f ! , (       d  f       g= f)su  
Полная тренировка MoE v12 для всех 14 MOEX тикеров.
Запуск:  python3 train_experts_all.py
         python3 train_experts_all.py --ticker SBER   # один тикер

Архитектура: MultiTimeframeMoE (16 LSTM экспертов + XGBoost, H1 + MTF контекст D1/W1)
Flow: 85% train → OOS thresholds → retrain 100% → save models/saved/{ticker}_moe_v12.joblib
    N)datetimeignoretrain)MOEX_TICKERSSAVE_DIRTARGET_CONFIGDEVICE)MultiTimeframeMoE_prepare_df_get_feature_cols_build_dataset
_flat_mask)ExpertEnsemble)MODEL_CONFIGTICKER_SHORT_WEIGHTSDEFAULT_SHORT_WEIGHTz/moe_training_log.jsonc           	          [        U 5      n[        U R                  5       5      nX#-
  n[        [	        U[	        US5      -  S5      S5      nU[
        ;   a  U[
        U   -  nU$ )u3   Вычисляет scale_pos_weight для XGBoost.         ?      @)lenfloatsumminmaxr   )y_fulltickernposnegscales         train_experts_all.py_get_scale_weightsr#      s^    FA



C
'CC#c1+%s+S1E%%%f--L    c                    [         R                   " 5       n[        S[        R                  " 5       R	                  S5       S35        [        U 5      nUR                  SSSS9nU(       d  SS	S
.$ UR                  R                  SS5      nUR                  R                  SS5      n[        USS5      nUR                  n[        SUS SUS SUS 35        U(       a  [        S[        U5       S35        [        S5        [        U SS9nUb  [        U5      S:  a  SSUb  [        U5      OS 3S
.$ [        5       n	U	 V
s/ s H  oUR                  ;   d  M  U
PM     nn
UR                  R!                  5       n[#        [        U5      S9n[        S[        UR$                  5       S[        U5       S35        UR'                  XSSS9  UR(                  " U6   [        S 5        UR+                  X5      n[-        XXUS!9n[.        R0                  " US"   R2                  US#   R2                  /5      n[5        [        U5      [        U5      5      nUU* S UU* S nn[7        U5      R2                  [        U5      * S n[9        UR;                  5       5      nS$UU'   [        S%U S&[        U5       S'U[        U5      -  S S(35        US"   R=                  5       nUS#   R=                  5       n[        S)US S*US 35        [        S+[        U5       S,35        [        S-[        U5       S.35        [>        S/   RA                  5       nURC                  S0S1S2S3S3S4S5S6S7.5        URA                  5       n[5        [E        USS2S4   R;                  5       [E        [        U5      USS2S4   R;                  5       -
  S85      -  S55      S95      US:'   [F        RH                  " SS0 UD6nURK                  UUSS2S4   5        USS2S84   R;                  5       n[        U5      U-
  n[5        [E        U[E        US85      -  S55      S95      nU[L        R                  " U [N        5      -  nURA                  5       nUUS:'   [F        RH                  " SS0 UD6nURK                  UUSS2S84   5        URQ                  U5      nURQ                  U5      nUUSS2S4   :H  R=                  5       nUUSS2S84   :H  R=                  5       n UR=                  5       n!UR=                  5       n"UU   n#UU   n$[        U#5      S:  a  U#R=                  5       OSn%[        U$5      S:  a  U$R=                  5       OSn&Xl        UUl)        UUl*        SUl+        SUl,        XES;.Ul        Xrl
        Xbl-        Xbl.        Xl/        [        U5      Ul0        [b        Rd                  Rg                  [h        U Rk                  5        S<35      n'URm                  U'5        [         R                   " 5       U-
  n(0 S=S>_S?U _S@[        U5      _SAU_SBU_SCU_SDU(       a  [        U5      OSE_SF[o        U(SG-  S85      _SHU'_SI[o        U[        U5      -  SJ-  S85      _SK[o        USJ-  S85      _SL[o        USJ-  S85      _SM[o        USJ-  S85      _SN[o        U SJ-  S85      _SO[o        U!SJ-  S85      _SP[o        U"SJ-  S85      _SQ[o        U%SJ-  S85      _SR[o        U&SJ-  S85      0E$ s  sn
f )Tum   Тренирует MoE v12 для одного тикера. Возвращает dict с метриками.z  [z%H:%Mu"   ] Загрузка данных...NTF)limitverboseretrain_on_fullerroru   train() вернул False)statusmessagelongg?shortoos_val_accr   z  OOS: val_acc=.1%   , L≥.2f   , S≥u'     Отобрано экспертов: z/16u#     Retrain на 100% данных...)r&      u'   Недостаточно данных: )
n_featuresu     LSTM эксперты (u   ) на u    строк...)r'   epochsz  Forward pass...)keep_expertsoutcome_longoutcome_shortg        u     Флет-фильтр: /z ()u&     Исходные success rate: long=z, short=u!     Размер датасета: z samplesu     XGBoost на z samples...xgb   gQ?i,  gffffff?g?r      )	max_depthlearning_raten_estimators	subsamplecolsample_bytree	reg_alpha
reg_lambdamin_child_weightr   r   scale_pos_weight)r,   r-   z_moe_v12.joblibr*   okr   rowsval_acclong_thshort_thselected_experts   elapsed_min<   pathflat_pctd   long_srshort_srtrain_acc_longtrain_acc_shorttrain_pos_rate_longtrain_pos_rate_shortflat_false_longflat_false_short )8timeprintr   nowstrftimer
   r   optimal_thresholdsgetgetattrrL   r   r   r   columnsensembleget_norm_statsr   expert_names	train_allset_norm_statspredict_allr   npcolumn_stackvaluesr   r   intr   meanr   copyupdater   r;   XGBClassifierfitr   r   predictrf_longrf_shortrf_modelcalibratorsr.   rI   feature_colsn_base_featuresosrP   joinr   lowersaveround))r   t0moerG   oos_long_thoos_short_thr.   oos_selecteddf_fullall_featuresc	available
norm_statsensemble_fullsignals_fullX_fullr   min_len	flat_maskn_flatrS   rT   
params_xgbpxgb_long	pos_short	neg_shortscale_short	xgb_shorttrain_preds_longtrain_preds_shortrU   rV   rW   rX   flat_preds_longflat_preds_shortrY   rZ   	save_pathelapseds)                                            r"   train_moe_forr   '   sa   	B	C''011S
TU F
#C	tU	CB!.JKK((,,VT:K))--gt<L#}a0K''L	OK,F;s2C6,WZI[
\]7L8I7J#NO 
/1&-G#g,,!0Whoh{X[\cXd  BC  XD  /E  F  	F$&L(ALq,@LIA,,.J"c)n=M	%c-*D*D&E%FgcRYl^[i
jkGTJ  *-	 ,,W@LG=)57F__gn5<<go>V>]>]^_F#f+s6{+GWHI&xy(9FF 7#**CK<=9I!FF9	%fXQs9~.>bIAVWZ@[[\
]^ n%**,G',,.H	273-xQT~
VW	-c&k](
CD	OCK=
45e$))+Jsc  	AF1a4L$4$4$6S[6RSUVRV<K[K[K]=]_`9a$acf gilmA  %1%HLL1&q!t  "IFi'Ic)c)Q&77=sCK'++F4HIIKA'A!!&A&IMM&&A,'  ''/!))&1&&A,6<<>N(F1a4L8>>@O*//1,113 'y1O(303O0Dq0Ho**,aO256F2G!2K',,.QR !LCKCLCLCO&1IC'!OK i.C X&,,.)9'IJIHHYiikBG$& 	G 	;	
 	; 	L 	C-2 	uWr\1- 		 	E&3y>1C7; 	53* 	E(S.!, 	% 4a8 	53!6:  	u%83%>B!" 	&:S&@! D#$ 	53!6:%& 	E"2S"8!<' g Bs   [<[<__main__z"Train MoE v12 for all MOEX tickers)descriptionz--tickerzSingle ticker only)typedefaulthelp
zF======================================================================u     MoE v12 TRAINING — z%d.%m.%Y %H:%Mu     Трекеры: z, uU     Архитектура: 16 LSTM экспертов + XGBoost + MTF контекстz  TARGET_CONFIG: SL=atr_mult_slu	   ×ATR TP=atr_mult_tpu   ×ATRz
  Device: r   z
[r9   z]  z2==================================================r)   )r   r*   u     ⏭ Пропущенskippedr*   u     ✓ rN   u   мин — val_acc=rI   r/   r0   rJ   r1   r2   rK   u   , экспертов=rL   u   /16, флет=rQ   ?%u     ❌ Ошибка: u)     ТРЕНИРОВКА ЗАВЕРШЕНАu     Время: rO   z.1fu    минu     Ошибок: rG   u     Успешно: u     Средняя val_acc: uK     ДЕТАЛЬНАЯ СТАТИСТИКА ПО КАЖДОМУ ТИКЕРУ:z  z<============================================================ u
   Тикерz>6Rowsz>8u   L≥thru   S≥thru   Экспz>4u	   Флет%zL_SR%zS_SR%Acc_LAcc_Su	   ТоргLu	   ТоргSflongfshortu   минz>5zd----------------------------------------------------------------------------------------------------r   rH   z>7.1%z>5.2fz>5.1fz% rS   rT   rU   rV   rW   rX   rY   rZ   z>4.1fu   СРЕДНЕЕz>6.0fz>4.0fu
     Лог: w   )indentr   )J__doc__sysrz   r\   jsonwarningsnumpyrj   r   filterwarningsrP   insertdirnameabspath__file__config
set_devicer   r   r   r	   
models.moer
   r   r   r   r   models.expertsr   xgboostr;   r   r   r   LOG_FILEr#   r   __name__argparseArgumentParserparseradd_argumentstr
parse_argsargsr   uppertickersr]   r^   r_   r{   results_logt_starterrors	enumerateir   entryresultra   	Exceptione	traceback	print_exc
total_timerl   rG   accsrn   vopenfdump)r   s   0r"   <module>r      s   % $ $      ! 277??277??8#<= >    '  @ @ d d )  K KZ-.BJ z$$1UVF

dAUVD'+{{t{{  "#G	Bvh-	#HLLN$;$;<L$M#N
OP	tyy12
34	ac	 }!= >iVcHdGeej
kl	Jvh
 	VHB-KiikGFw*	6A3aG~Rxq9:!W5	""6*F~.0"+hvm45 6!!'	!23 7 8#I.s36&:LS9Q R,,23E,F+G H""(**Z"=!>a	A B $F1 +4 w&J	Bvh-	57	N:b=-W
56	VH
%& '')	E)UU8_-D!)	EB	&()b)b)"3r7)1S\N;<*2774=*=>?	VH	G	WY	Bvh-	 6 6B 6|B 6q 6 61 6YrN 6! 6Ib> 6 69UW. 6XY 6O66(,6,-6.5b\69:6;B2,6FG6RL66!"6%&6'22&666768CB7G6GH6 RL6 6 #26 '(6 )1}6 7 
Bwi. * * *1X;r" *! *AfIb> * *1Y<2F *a *9e$*$%*&'
mE%:*:;*%&r***+* z!$U+* ,.* y#E*	* +-	* ./UU:a-@,G	* HJ	*
 '*51*
 24*
 56EE:KA4Nu3U*
 VX* ,Q/6* 79* :;?UVW9XY^8_* `b* (+E2* 35* 67UU;Ma5PQV4W* XZ* =!%(* 	+  
7)n 	A 	A 	A#B' 	Aq 	AR1HRF)R1H)I%(P 	APQ 	A31I,34U;	A;<	A31I,34U;	A;<	A=?WW]_E`]_XY
m]_E`=abg<h	Ahi	A <A./<=eD	A EF	A r:r!%%
1-r:;EB		A CE		A
 b9b%%	!,b9:5A	A
 BD	A
 EGGGjlLmjlefUUS]^_M`jlLmDnotCu	A
 vx	A R@R%% 03R@A%H	A IK	A LN77xzS{xzstTYTYZklmTnxzS{K|  ~C  KD	A DF	A "E"Q%% 5a8"EFuM	A NP	A QSPWPW  CE  YF  CE}~Y^Y^_uvwYx  CE  YF  QG  HM  PN	A NP	A bAb%% 1!4bAB5I	A JL	A MOGGz|T}z|uvUZUZ[mnoUpz|T}L~  @E  LF	A FH	A B7BqM*B78?	A 		B 
VH	Jxj
!"	h			+qC8 
	w H  	"aKF%E(O VE'N(,-!!	" 
F)2 2I33E`<:9Lm@S{E  YFAT}7 
	s    a ?a 6b	b	&b2bbb-b"b'?b,5b1+b6!b;c cc
9c/c%c"c b5bb
c,