
    ictj,                        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	\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  SSKJr  SSKJr  SSKJr  SS	KJrJr  SS
KJr  SSKJr  Sr / SQr!S r"SXS jr#\ 4S jr$\%S:X  Ga  SSK&r&\&RN                  " SS9r(\(RS                  S\*SSS9  \(RS                  S\*SSS9  \(RS                  S\+\ SS9  \(RY                  5       r-\-R\                  (       a  \-R\                  /O\r/\-R`                  (       a  \-R`                  /O\!r1\2" SS 35        \2" S\-Rf                   S35        \2" S 5        \2" 5         / r4\R                  " 5       r5\/ H  r.\1 H  r0\2" \.S S \0S! S"3S#S$S%9  \R                  " 5       r6\$" \.\0\-Rf                  S&9r7\R                  " 5       \6-
  r8\7c
  \2" S'5        MW  \2" \7S(    S)\7S*   S+ S,\7S-   S+ S.\7S/    S0\7S1   S+ S2\8S3 S435        \4Rs                  \75        M     M     \2" SS 35        \2" S55        \2" S 5        \2" S6S7S S S8S! S S9S: S S;S< S S=S< S S>S? S S@S< S SASB 35        \2" SC5        \:" \4SD SE9 HC  r;\2" S6\;SF   S S \;SG   S! S \;S(   SH SI\;S*   SJ S \;S-   SJ S6\;S1   SJ S6\;S/   SK SL\;SM   SK 35        ME     \R                  " 5       \5-
  r<\2" SN\<SO SP\<SQ-  S3 SR35        SSr=\>" \=ST5       r?\R                  " \4\?SU\*SV9  SSS5        \2" SW\= 35        \2" 5         gg! , (       d  f       N"= f)Yu
  
Walk-forward validation (7 folds) for MOEX instruments.

Usage:
    python run_walkforward.py                    # all tickers × all TFs
    python run_walkforward.py --ticker SBER      # single ticker
    python run_walkforward.py --ticker SBER --tf D1 --folds 5
    Nignoreauto)MOEX_TICKERSTARGET_CONFIG)FEATURE_COLS)DIRECTIONAL_COLS)CONTEXT_COLS)INTERACTION_COLSTEMPORAL_COLS)RandomForestClassifier)MultiOutputClassifier   )H1D1W1c                      [        [        R                  [        [        -   [
        -   [        -   [        -   5      5      n U $ N)listdictfromkeysr   r   r	   r
   r   )colss    run_walkforward.pyget_directional_feature_colsr       s1    .=LO__boopqDK    c                 0    SSK Jn  U" XSSSSUSSSSSSS9$ )u   Подготавливает DataFrame для walk-forward валидации.
Делегирует в features.pipeline.prepare_df().r   )
prepare_dfFT2   N)with_mtfwith_short_specificwith_targetswith_crypto_featureslimitmin_rows	shift_mtfwinsor_boundslog_nan_conversioninclude_str_dtypereset_index)features.pipeliner   )tickertfr"   unified_prepare_dfs       r   _prepare_dfr-   $   s9     C!"  r   c                    [        X5      nUb  [        U5      S:  a  [        SUb  [        U5      OS 35        g[        R                  " SS5      n[        5       nU Vs/ s H  ofUR                  ;   d  M  UPM     nnX7   R                  R                  [        R                  5      n[        R                  " USS9n[        R                  " US	   R                  US
   R                  /5      n	[        U5      n
[        [        XS-   -  5      US-   5      n/ n[        U5       GH?  nUS-   U-  n[!        X-   U
5      nX-
  nSn[#        [        UU5      5      n[#        [        X5      5      n[        U5      S:  d  [        U5      S:  a  Mi  UU   UU   nnU	U   U	U   nn[%        ['        SSSSSS95      nUR)                  UU5        UR+                  U5      n[-        [        R.                  " USS2S4   USS2S4   :H  5      5      n[-        [        R.                  " USS2S4   USS2S4   :H  5      5      nUR1                  U5      n[3        U["        5      (       a  S nU" US   5      nU" US   5      nO*UR4                  S   S:  a	  USS2S4   OUSS2S4   nSU-
  n[        R6                  " UU5      S:  n Sn!Sn"U R9                  5       S:  a_  UU    UU    :  n#[        R:                  " U#UU S4   UU S4   5      n$[-        U$R/                  5       5      n![        U R9                  5       5      n"UR=                  US-   [        U5      [        U5      UUU!U"S.5        GMB     U(       d  gU U[        U5      [        U5      [-        [        R.                  " U V%s/ s H  n%U%S   PM
     sn%5      5      [-        [        R.                  " U V%s/ s H  n%U%S   PM
     sn%5      5      [-        [        R.                  " U V%s/ s H  n%U%S   S:  d  M  U%S   PM     sn%5      5      [        [9        S U 5       5      5      US.	n&U&$ s  snf s  sn%f s  sn%f s  sn%f )u  Walk-forward: обучаем на растущем окне, валидируем на следующих 1/fold данных.

Используется purged gap (MAX_BARS) между train и val для предотвращения
boundary label leakage (Lopez de Prado).
N   u     ⏭ Too few rows: r   max_barsd   g        )nanoutcome_longoutcome_short   r      
   *   balanced)n_estimators	max_depthn_jobsrandom_stateclass_weightc                 L    U R                   S   S:  a	  U S S 2S4   $ U S S 2S4   $ )Nr5   r   )shape)ps    r   _sprun_walkforward.<locals>._spi   s+    "#''!*q.qAw=a1g=r   g      ?g333333?)fold
train_sizeval_sizelong_acc	short_acc
hi_conf_wr	hi_conf_nrH   rI   rK   rJ   c              3   *   #    U  H	  oS    v   M     g7f)rK   N ).0rs     r   	<genexpr>"run_walkforward.<locals>.<genexpr>   s      FA;s   )	r*   	timeframefoldstotal_samplesmean_long_accmean_short_accmean_hi_conf_wrtotal_hi_conffold_results)r-   lenprintr   getr   columnsvaluesastypenpfloat32
nan_to_numcolumn_stackmaxintrangeminr   r   r   fitpredictfloatmeanpredict_proba
isinstancerA   maximumsumwhereappend)'r*   r+   rS   dfMAX_BARSfeature_colsc	availableXyn	fold_sizerY   rE   	val_startval_end	train_endtrain_start	train_idxval_idxX_trainX_valy_trainy_valmodely_predrH   rI   y_probarC   p_longp_shorthi_confrJ   rK   hi_longwinsrO   summarys'                                          r   run_walkforwardr   7   s    
V	 B	zSWs]$SWA$FGH  S1H/1L(<LqOLI<
##BJJ/A
aS!A
N+22B4G4N4NOPAAACQY((R-8ILeAX*	i+Q/(	{I67	uY01y>B#g,"39qz9qz%"r*,20:<

 			'7# u%1q!t!<=>"''&A,%1+"=>?	 %%e,gt$$>_F'!*oG&-mmA&6&:WQT]1FFlG::fg.#5
	;;=1Wo(88G88GU7A:%6gqj8IJDtyy{+JGKKM*I1Hg,E
 "$"
 	[ n  \"Rrww|'L|!*|'LMN(NA;(N OP <)f<aSTU`SadeSe/!L/<)f!ghS F FFG$
G N] =P (M(N)fs$    Q	7Q	!QQQ	Q__main__zWalk-forward validation)descriptionz--tickerzSingle ticker)typedefaulthelpz--tfzSingle timeframe (H1/D1/W1)z--foldszNumber of folds
zF======================================================================u     WALK-FORWARD VALIDATION — z folds6s 2sz:  T)endflush)rS   u   ⏭ skippedrS   z folds | L=rU   z.1%z S=rV   z HiConf(rX   z)=rW   z (z.1fzs)u     СВОДНАЯ ТАБЛИЦАz  TickerTFFolds5sLong8sShortz	HiConf WR9szN HiConfSamples7sz>  ------------------------------------------------------------c                     U S   U S   4$ )Nr*   rR   rM   )xs    r   <lambda>r      s    (Q{^/Lr   )keyr*   rR   3dz   z7.1%5dz    rT   u   
  Время: z.0fzs (<   u    мин)zwalkforward_results.jsonw   )indentr   u+     Результаты сохранены: r   )A__doc__sysoswarningstimejsonnumpyr`   pandaspdfilterwarningspathinsertdirnameabspath__file__config
set_devicer   r   features.technicalr   features.directionalr   features.contextr	   r
   r   sklearn.ensembler   sklearn.multioutputr   N_FOLDS
TIMEFRAMESr   r-   r   __name__argparseArgumentParserparseradd_argumentstrre   
parse_argsargsr*   tickersr+   tfsr[   rS   all_resultst_startt0r   elapsedrq   sortedrO   
total_timeout_pathopenfdumprM   r   r   <module>r      s   % $ $      ! 277??277??8#<= >    &  . + 1 ) > 3 5 
& '. [~ z$$1JKF

dQ
S$=Z[
	WCTUD#{{t{{mGww477)JC	Bvh-	*4::,f
=>	VH	GKiikGBVBKqBr*$?B%fb

CGiikB&Gm$WW%& '/4C@P8QRU7V W#O45R@Q8RSV7W Xc]"& ' w'  $ 
Bvh-	
+,	VH	Bxm1T"IQwrl!F2;a|1[Y[L\\]^hik]llmnwxzm{
|}	-K%LM1X;r"!AkN2#6a'
2c?#D)1-=+>t*DB$%d+2a.@-DD?I[\^H_a 	b N
 w&J	Z,C
2c/B(
KL *H	h			+qC8 
	7z
BC	Gq j 
	s   .M
M,