
    btj?                     l	   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        \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Jr  SSKJrJr  SSKr\R>                  rSr S	S	S
SSS.SSSSSS.S.r!/ SQq"S\#S\$S\#S\$S-  4S jr%S\#S\#S\$S\$4S jr&\'S:X  Ga  SSK(r(\(RR                  " SS9r*\*RW                  SSSS 9  \*RW                  S!S"S#S$9  \*RW                  S%S"S&S$9  \*RW                  S'S"S(S$9  \*RY                  5       r-\-R\                  R_                  5       r 0 r00 r1\-Rd                  =(       d)    \-Rf                  (       + =(       a    \-Rh                  (       + r2\-Rf                  =(       d)    \-Rd                  (       + =(       a    \-Rh                  (       + r3\-Rh                  (       a  \2(       d  \3(       aR  \5" S)S* 35        \5" S+\  35        \5" S,5        \5" S-\Rl                  " 5       Ro                  S.5       35        \5" S* S)35        \!Rq                  5        HT  u  r9r:\9S/:X  a  \2(       a  \9S0:X  a	  \3(       d  M"  \%" \ \:\:S   5      r;\;\0\9'   \;(       a  \&" \ \:S   \:5      \1\9'   MM  S1S20\1\9'   MV     \-Rh                  (       d  \2(       Ga  \3(       Ga  \5" S)S3 35        \5" S4\  35        \5" S3 5        \5" S5S6S7 S8S9S: S8S;S: 35        \5" S<S= S8S> S8S> 35        S H  r9\9\1;  d  M  M     \1Ry                  S/0 5      r=\1Ry                  S00 5      r>S? H  u  r?r@\A" \=\$5      (       a  \=Ry                  \?S@5      OS@rB\A" \>\$5      (       a  \>Ry                  \?S@5      OS@rC\A" \B\D5      (       a  \A" \C\D5      (       a  \?SA;   a   \5" S<\?S7 S8\A" \B\#5      (       a  \BO\B\@  S: S8\A" \C\#5      (       a  \CO\C\@  S: 35        M     \5" 5         SB H  u  rErF\1Ry                  \E0 5      rG\0Ry                  \E0 5      rH\GRy                  S15      SC:X  d  MA  \5" S<\FSD SE\HRy                  SFSG5       SH\GSI    SJ\GSK   SL SM\GSN   SO SP\GSQ   SR SS\GST   SR 35        M     \5" 5         gg)Uu  
Эксперимент: SL=3×ATR, TP=6×ATR (RR 1:2) vs текущий SL=1.5×ATR, TP=1.5×ATR (RR 1:1).

Запуск:
  python3 experiment_rr.py                           # обучить + бэктест
  python3 experiment_rr.py --backtest-only           # только бэктест (по сохранённой модели)
  python3 experiment_rr.py --ticker SBER --compare   # сравнить обе модели

Сравнение:
  - val_acc, WinRate, Sharpe, MaxDD, Total Return
    N)datetimeignoretrain)MultiTimeframeMoE_prepare_df_get_feature_cols_build_dataset
_flat_mask)ExpertEnsembleHORIZONSSBERg      ?d   u!   RR 1:1 (SL=1.5×ATR, TP=1.5×ATR) )atr_mult_slatr_mult_tpmax_barslabelsuffix      @g      @   u   RR 1:2 (SL=3×ATR, TP=6×ATR)_rr1x2)rr1x1rr1x2)r   r   r   ticker
target_cfgr   returnc                 F   SSK nUR                  R                  5       nUR                  R                  5         UR                  R	                  [
         Vs0 s H  oUX   _M	     sn5        [        SS 35        [        SU  SUS    35        [        SUS	    S
US    SUS    35        [        S S35        [        R                  " 5       n[        U 5      nUR                  SSSS9nU(       d!  [        S5        XCl        [        [        l        g[        USS5      n	UR                  R                  SS5      n
UR                  R                  SS5      nUR                  n[        SU	S SU
S SUS 35        [        SUS    S35        [!        U SS9nUb  [#        U5      S:  a2  [        SUb  [#        U5      OS 35        XCl        [        [        l        g[%        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UR/                  UUSSS!9  UR0                  " U6   UR3                  UU5      n[5        UUUUUS"9n[6        R8                  " US#   R:                  US$   R:                  /5      n[=        [#        U5      [#        U5      5      nUU* S UU* S nn[?        U5      R:                  [#        U5      * S n[A        URC                  5       5      nS%UU'   [        S&U S'[#        U5       S(U[#        U5      -  S S)35        US#   RE                  5       nUS$   RE                  5       n[        S*US S+US 35        S,S-S.S/S/S0S1S2S3SS4S5.nUR                  5       nUSS2S4   RC                  5       n[#        U5      U-
  n[=        [G        U[G        US65      -  S15      S75      US8'   [H        RJ                  " SD0 UD6nURM                  UUSS2S4   5        UR                  5       n USS2S64   RC                  5       n![#        U5      U!-
  n"[=        [G        U"[G        U!S65      -  S15      S75      n#U#[         RN                  R                  U S95      -  n#U#U S8'   [H        RJ                  " SD0 U D6n$U$RM                  UUSS2S64   5        UUl        UUl(        U$Ul)        SUl*        XS:.Ul        Xl        Xl+        Xl,        UUl-        [#        U5      Ul.        [^        R`                  Rc                  [d        U Rg                  5        S;U S<35      n%URi                  U%5        [        R                  " 5       U-
  n&[        S=U% S(U&S>-  S? S@35        UR                  R                  5         UR                  R	                  [
         Vs0 s H  oUXE   _M	     sn5        SAU US   U[#        U5      U	U
U[k        U5      [k        U5      U[#        U5      -  SB-  [m        U&S>-  S65      U%SC.$ s  snf s  snf s  snf )Eu9   Тренирует MoE с заданным TARGET_CONFIG.r   N
z<============================================================u     ОБУЧЕНИЕ:  r   z  SL=r   u
   ×ATR, TP=r   u   ×ATR, max_bars=r   TF)limitverboseretrain_on_fullu$     [ERROR] train() вернул Falseoos_val_acclongg?shortz
  OOS: val_acc=.1%u   , L≥.2fu   , S≥u%   
  Retrain на 100% данных с z...)r    r   u1     [ERROR] недостаточно данных: )
n_features)r!   epochs)keep_expertsoutcome_longoutcome_short        u     Флет-фильтр: /z ()z  Success rate: long=z, short=   gQ?i,  gffffff?g?g      ?   *   )	max_depthlearning_raten_estimators	subsamplecolsample_bytree	reg_alpha
reg_lambdamin_child_weightrandom_state	verbosityn_jobs   g      @scale_pos_weightr   )r$   r%   _moe_v12.joblibu   
  ✓ Сохранено: <   .1fu    мин)okr   )statusr   configr   rowsval_acclong_thshort_thlong_srshort_srflat_pctelapsed_minpath )7rG   TARGET_CONFIGcopyclearupdateTARGET_KEYSprinttimer   r   old_moe_target
moe_modulegetattroptimal_thresholdsgetselected_expertsr   lenr   columnsensembleget_norm_statsr   	train_allset_norm_statspredict_allr	   npcolumn_stackvaluesminr
   intsummeanmaxxgbXGBClassifierfitTICKER_SHORT_WEIGHTSrf_longrf_shortrf_modelr#   rI   feature_colsn_base_featuresosrP   joinSAVE_DIRlowersavefloatround)'r   r   r   
cfg_moduleold_cfgkt0moerE   r#   oos_long_thoos_short_thoos_selecteddf_fullall_featuresc	available
norm_statsensemble_fullsignals_fullX_fully_fullmin_len	flat_maskn_flatrL   rM   
params_xgbplpos_lneg_lxgb_longpspos_sneg_sscale_s	xgb_short	save_pathelapseds'                                          experiment_rr.pytrain_with_configr   4   s    &&++-G""$##{$K{!
%5{$KL	Bvh-	 *W*=)>
?@	E*]+,Jz-7P6QQablmwbxay
z{	VHB-	B F
#C	tU	CB46#* #1
 #}a0K((,,VT:K))--gt<L''L	k#.f[4EVLY\K]
^_ 
2:g3F2Gs
KL&-G#g,,ARYRe#g,klAmno#* #1
 $&L(ALq,@LIA,,.J"c)n=MGYTJ  *- ,,Wi@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	!'#hxn
EF scb	J 
	B1a4LEK%E US]%:C!@#FB  &2&HLL1&		B1a4LEK%E#ec%m+S137Gv**..vs;;G$B!!'B'IMM&&A,' !CLCKCLCL&1IC'!OK Ci.C X&,,.)9&'QRIHHYiikBG	(2gbj5EX
NO ""$##K$HKq
]K$HI W%G >(OS^+c1Wr\1- U %LF BJ %Is   X'X>X5Xc                 	   [        SUS    S35        [        R                  R                  [        U R                  5        SU S35      n[        R                  R                  U5      (       d  [        SU 35        SSS	.$ [        U 5      nUR                  U5      nU(       d  SS
S	.$ [        U 5      nUc  SSS	.$ UR                  U5      nUb  [        U5      S:  a  SSS	.$ [        U5      nUS   R                  U* S n	US   R                  U* S n
US   R                  U* S nUS   R                  U* S nUS   nUS   nUS   n/ nSnSnSnSnSnSnSn[        U5       H  nUR                  U   S   nU	U   nU
U   nU(       a  UU-
  nUU   nUU   nSnUn US:X  a  UU:  a  SnUn O UU::  a  SnUn OUU::  a  SnUn O
UU:  a  SnUn Uc
  UU:  a  SnUn U(       a4  US:X  a	  U U-
  U-  n!OUU -
  U-  n!UR                  UUU U!S-  UUS.5        SnU(       a  M  US ;   d  M  US!:X  a  SOS"nUnUnUnS#nUU-  n"UU-  n#US:X  a  UU"-
  nUU#-   nM  UU"-   nUU#-
  nM     [        U5      n$[!        S$ U 5       5      n%[!        S% U 5       5      n&U%[#        U$S&5      -  S-  n'[!        S' U 5       5      n(U%(       a5  [$        R&                  " U V)s/ s H  n)U)S(   S:  d  M  U)S(   PM     sn)5      OSn*U&(       a5  [$        R&                  " U V)s/ s H  n)U)S(   S:  d  M  U)S(   PM     sn)5      OSn+[)        [!        S) U 5       5      [#        [)        [!        S* U 5       5      5      S+5      -  5      n,[$        R*                  " U V)s/ s H  n)U)S(   PM
     sn)5      n-U$S&:  am  U-R'                  5       [#        U-R-                  5       S+5      -  [$        R.                  " S,[$        R&                  " U V)s/ s H  n)U)S-   PM
     sn)5      -  5      -  OSn.[!        S. U 5       5      n/[!        S/ U 5       5      n0[!        S0 U 5       5      n1[        S1U$ 35        [        S2U'S3 S4U% S5U$ S635        [        S7U/ S8U0 S9U1 35        [        S:U(S; S<35        [        S=U*S> S?U+S> S<35        [        S@U,S> 35        [        SAU.S> 35        SBU US   U$U'U%U&U/U0U1U(U*U+U,U.SC.$ s  sn)f s  sn)f s  sn)f s  sn)f )Dus   Загружает обученную модель и проводит бэктест по всей истории.u   
  ── БЭКТЕСТ: r   u    ──rA   rB   u+     [WARN] Модель не найдена: errormodel_not_found)rF   r   load_failedNno_datar   no_predictionsCloseatrHighLowr   r   r   Fr-   r   r   signalLONGTPSL	TIME_STOP)	directionentryexitpnl_pctreason	bars_held)BUYSELLr   SHORTTc              3   :   #    U  H  oS    S:  d  M  Sv   M     g7fr   r   r?   NrQ   .0ts     r   	<genexpr>!backtest_model.<locals>.<genexpr>(  s     5&QiL1$4qq&   	c              3   :   #    U  H  oS    S:  d  M  Sv   M     g7fr   rQ   r   s     r   r   r   )  s     7Fq	lQ&6Fr   r?   c              3   *   #    U  H	  oS    v   M     g7f)r   NrQ   r   s     r   r   r   +  s     4V|Vs   r   c              3   @   #    U  H  oS    S:  d  M  US    v   M     g7fr   r   NrQ   r   s     r   r   r   .  s     M&QiL1<LLAiL&   c              3   @   #    U  H  oS    S:  d  M  US    v   M     g7fr   rQ   r   s     r   r   r   /  s      #U&QiLSTDTLAiL&r   g{Gz?i8"  r   c              3   :   #    U  H  oS    S:X  d  M  Sv   M     g7f)r   r   r?   NrQ   r   s     r   r   r   5       =v!8)<AAvr   c              3   :   #    U  H  oS    S:X  d  M  Sv   M     g7f)r   r   r?   NrQ   r   s     r   r   r   6  r   r   c              3   :   #    U  H  oS    S:X  d  M  Sv   M     g7f)r   r   r?   NrQ   r   s     r   r   r   7  s     Dv!8)CAAvr   u     Всего сделок: z  WinRate: rD   z% (r.   r/   z  TP: z, SL: z, TimeStop: u+     Суммарная доходность: +.2f%u!     Средняя прибыль: r'   u!   % / Средний убыток: z  Profit Factor: u     Sharpe (год): rE   )rF   r   rG   total_tradeswinratewinslossestpsl	time_stoptotal_returnavg_winavg_lossprofit_factorsharpe)rW   rw   rP   rx   ry   rz   existsr   loadr   predict_proba_alignedr_   rh   rangeilocappendrk   rm   rf   rl   absarraystdsqrt)2r   r   r   
model_pathr   rE   dfresultn_result
close_valsatr_vals	high_valslow_valssl_multtp_multr   tradesin_tradeentry_price	entry_atr	entry_idxr   sl_pricetp_priceir   closer   r   highlowhit
exit_pricepnlsl_disttp_disttotalr   r   r   r   r   r   r   r   returnsr   	tp_trades	sl_trades	ts_tradess2                                                     r   backtest_modelr     s   	'
7(;'<G
DEh6<<>*:(6('(RSJ77>>*%%;J<HI!,=>> F
#C	*	B!M:: 
V	B	z!I66&&r*F~Vs*!,<== 6{HG##XIJ/J%y	
+H6
!!8)*-I%y	
+H 'G'G*%HFHKIIIHH8_Q)1qkIIQ<D1+C CJF"8#C!)JH_C!)J(?C!)JX%C!)J {yH4!"
&%3{BC&3{BC!*(&"Sy!!*  !xFo5"(E/wIKIIHGmGGmGF" 7? 7? 7? 7?A F KE5&55D7F77FS]"S(G4V44LMQbggVHVq|a7G|q|VHIWXGNTrwwfIf)q8H)fIJZ[HM&MMC#U&#U UVX\]^ _M hhf5f)f56Gz  CD  {DW\\^c'++-66BGGmsTtmshiUVWbUcmsTtLuAu9vv  JKF=v==I=v==IDvDDI	'w
/0	K}CvQugQ
78	F9+VI;l9+
FG	7T7J!
LM	-gc]:[\deh[iij
kl	mC0
12	s|
,- W%$& + II
 6Tts$   S$	SS"	S	S#4S(__main__zRR Experiment: 1:1 vs 1:2)descriptionz--tickeru*   Тикер для эксперимента)defaulthelpz	--compare
store_trueu>   Сравнить обе модели (если обучены))actionr  z--train-rr1x2u"   Обучить только RR 1:2z--train-rr1x1u"   Обучить только RR 1:1r   u   ██████████████████████████████████████████████████████████████████████u     ЭКСПЕРИМЕНТ RR: uX     Сравнение: RR 1:1 (SL=1.5×ATR, TP=1.5×ATR) vs RR 1:2 (SL=3×ATR, TP=6×ATR)u     Дата: z%d.%m.%Y %H:%Mr   r   rF   r   zF======================================================================u-     СРАВНЕНИЕ РЕЗУЛЬТАТОВ: z
  u   Параметрz<30r   u   RR 1:1 (1.5×ATR)z<25u   RR 1:2 (3×/6×ATR)z  z------------------------------z-------------------------))rI   r&   )zSuccess Rate Longr&   )zSuccess Rate Shortr&   )u   Всего сделок.0f)WinRaterD   )u   TP сделокr  )u   SL сделокr  )TimeStopr  )u   Сумм доходностьr'   )zProfit Factorr'   )u   Sharpe (год)r'   u   —)rI   ))r   zRR 1:1)r   zRR 1:2rE   z>8z
: val_acc=rI   zN/Au    | сделок=r   z | WR=r   rD   z% | return=r   r   z% | PF=r   r'   z
 | Sharpe=r   )I__doc__sysrw   rX   jsonwarnings	importlibnumpyrf   pandaspdr   filterwarningsrP   insertdirnameabspath__file__rG   
set_device
models.moer   r   r   r	   r
   models.expertsr   r   xgboostrn   ry   TICKERCONFIGSrV   strdictr   r  __name__argparseArgumentParserparseradd_argument
parse_argsargsr   upperresults_train
results_bttrain_rr1x1train_rr1x2comparerW   nowstrftimeitemskeycfgrr]   rowrow2paramfmt
isinstancev1v2r|   bt_keyr   bttrrQ       r   <module>r>     s  
 0 / /       ! 277??277??8#<= >    '  d d 3 ??	
 4 0" 9@c @t @S @TD[ @FZ3 Z Z Z$ Zz z$$1LMF

F9ef
L?  A
Cgh
CghD[[ FMJ ""Q4+;+;';'PDLL@PK""Q4+;+;';'PDLL@PK<<;+8*o-fX67hjX\\^445EFGHI
"o MMOS7N;C7N;fc3x=9c,VS]CHJsO'1JsO $ ||6(m=fXFG',A.A#-FaH]^aGbcd6(!F81VH-.%C*$ & nnWb)~~gr*
JE3 +5S$*?*?&UB+5dD+A+A%'uB"e$$B)>)>5LCXBuSkB)<)<2RJPS"TTU%b#..Rr3%j#FH I
 	GMFE+B""62.Bvvh4'5*Jrvvi/F.G H((*>(:'; < mC0 1""$^"4T!: ; 1#6 7""$X,s!35 6	 H 
G_ r=  