
    /qXjP,              	       z   S SK rS SKrS\R                  S\R                  4S jrSS\R                  S\\   S-  S\R                  4S jjrSS\R                  S\\   S-  S\R                  4S jjr	SS\R                  S\S\R                  4S	 jjr
SS\R                  S\S
\S\R                  4S jjrSS\R                  S\S\R                  4S jjrS\R                  S\R                  4S jrS\R                  S\R                  4S jr/ SQrS S\R                  S\S\R                  4S jjr/ SQrS\R                  S\R                  4S jr/ SQrS\R                  S\R*                  4S jrS\R                  S\R                  4S jrS!S\R                  S\S\R*                  4S jjrS!S\R                  S\S\R                  4S jjrSS\R                  S\S\R*                  4S jjrSS\R                  S\S\R                  4S jjrS"S\R                  S\S\R                  4S jjrg)#    Ndfreturnc                     U R                  5       n U S   R                  S5      U S'   U S   R                  S5      U S'   U S   R                  S5      U S'   U $ )NClose   return_1   return_5   	return_20)copy
pct_changer   s    3/home/ai/projects/AI_Strategy/features/technical.pyadd_returnsr      sZ    	B[++A.BzN[++A.BzNk,,R0B{OI    windowsc                     Uc  / SQnU R                  5       n U H@  nU S   R                  US9R                  5       U SU 3'   U S   U SU 3   -  S-
  U SU 3'   MB     U $ )N)r	   
   r   2   r   windowsma_r   close_to_sma_)r   rollingmeanr   r   ws      r   add_smar      s{    !	BG,,A,6;;=T!:"$W+T!:">"B]1#  Ir   c                 ,   Uc  SS/nU R                  5       n U H*  nU S   R                  USS9R                  5       U SU 3'   M,     SU;   aF  SU;   a@  U S   U S   -
  U S	'   U S	   R                  S
SS9R                  5       U S'   U S	   U S   -
  U S'   U $ )N      r   Fspanadjustema_ema_12ema_26macd	   macd_signal	macd_hist)r   ewmr   r   s      r   add_emar.      s    r(	BGa>CCET!: 	W}w\BxL06
vJNN%N@EEG=V*r-'88;Ir   periodc                    U R                  5       n U S   R                  5       nUR                  US:  S5      nU* R                  US:  S5      nUR                  USS9R	                  5       nUR                  USS9R	                  5       nXVR                  S[        R                  5      -  nSSSU-   -  -
  U S'   U S   R                  S5      U S'   U $ )	Nr   r           r   r   min_periodsd   rsir   )	r   diffwherer   r   replacenpnanfillna)r   r/   deltagainlossavg_gainavg_lossrss           r   add_rsirB   $   s    	BwKE;;uqy#&DF>>%!)S)D||6q|9>>@H||6q|9>>@H	$$Q/	/Bsa"f~&BuI5	  $BuIIr   num_stdc                 B   U R                  5       n U S   R                  US9R                  5       U S'   U S   R                  US9R                  5       nU S   X#-  -   U S'   U S   X#-  -
  U S'   U S   U S   -
  U S   -  U S'   U S   U S   -
  U S   U S   -
  S-   -  U S'   U $ )	Nr   r   bb_midbb_upperbb_lowerbb_width绽|=bb_position)r   r   r   std)r   r/   rC   bb_stds       r   add_bollingerrM   1   s    	Bg;&&f&5::<BxL[   /335F\G$44BzN\G$44BzNnr*~5HEBzNGr*~5"Z.2j>:Y\a:abB}Ir   c                 ~   U R                  5       n U S   U S   -
  nU S   U S   R                  5       -
  R                  5       nU S   U S   R                  5       -
  R                  5       n[        R                  " X#U/SS9R                  SS9nUR                  USS9R                  5       U S'   U S   U S   -  U S'   U $ )	NHighLowr   r   )axisr2   atratr_pct)r   shiftabspdconcatmaxr   r   )r   r/   high_low
high_close	low_closetrs         r   add_atrr]   <   s    	B&zBuI%HV*r'{0022779JER[..00557I	H)41	=	A	Aq	A	IB

&a
8==?BuIuI7+ByMIr   c                     U R                  5       n U S   R                  SS9R                  5       U S'   U S   U S   R                  S[        R
                  5      -  U S'   U S   R                  S5      U S'   U $ )NVolumer	   r   volume_sma_5r   volume_ratior   )r   r   r   r8   r9   r:   r;   r   s    r   add_volume_featuresrb   G   sz    	BH--Q-7<<>B~H>(:(B(B1bff(MMB~N+2215B~Ir   c                   ^  T R                  5       m / SQn[        U 4S jU 5       5      (       aO  T S   T S   -  T S'   T S   S-
  T S   S	-
  -  T S
'   T S   T S   -  T S'   T S   T S   S-
  -  T S'   T S   T S   -  T S'   T $ )N)rH   rS   r5   rJ   close_to_sma_50r   ra   c              3   @   >#    U  H  oTR                   ;   v   M     g 7fN)columns).0cr   s     r   	<genexpr>+add_interaction_features.<locals>.<genexpr>R   s     
(Cq

?Cs   rH   rS   bb_width_x_atr_pctr5   r   rJ         ?rsi_x_bb_posrd   r   cts50_x_ret20bb_width_x_rsira   atr_pct_x_vol_ratio)r   all)r   reqs   ` r   add_interaction_featuresrt   O   s    	B
gC

(C
(((#%j>ByM#A  i"nM1BS1HI> !23boE?!*~ER@$&yMB~4F$F !Ir   )rl   rn   ro   rp   rq   horizonc                     U R                  5       n U S   R                  U* 5      U S   -  S-
  U S'   U S   S:  R                  [        5      U S'   U $ )Nr   r   targetr   target_direction)r   rT   astypeint)r   ru   s     r   
add_targetr{   d   sY    	Bg;$$gX.G<q@BxL lQ.66s;BIr   )r   r
   r   close_to_sma_5close_to_sma_10close_to_sma_20rd   r5   rH   rJ   r)   r+   r,   rS   ra   kst_normefficiency_ratio
choppinessc           	         U R                  5       n SU R                  ;   aR  [        R                  " U S   SSS9n[	        UR
                  S5      (       a  UR
                  R                  S5      OUnO#[        R                  " U S   S-   U S	   -   S
S9nUnUR
                  R                  R                  [        5      U S'   UR
                  R                  R                  [        5      U S'   UR
                  R                  R                  [        5      U S'   UR
                  R                  R                  [        5      U S'   UR
                  R                  R                  [        5      U S'   UR
                  R                  S:  R                  [        5      U S'   S[        R                  -  U S   -  S-  n[        R                   " U5      U S'   [        R"                  " U5      U S'   S[        R                  -  U S   -  S-  n[        R                   " U5      U S'   [        R"                  " U5      U S'   S[        R                  -  U S   -  S-  n[        R                   " U5      U S'   [        R"                  " U5      U S'   U S   S:  U S   S:  -  R                  [        5      U S'   U S   S:  U S   S:  -  R                  [        5      U S '   U S   U S    -   S!:  R                  [        5      U S"'   [        R$                  " U S   S#:H  U S   S-
  [        R$                  " U S    S#:H  U S   S-
  S$5      5      U S%'   U $ )&u   Добавляет временные признаки: час, день недели, месяц, циклические кодировки.	timestampsT)unitutc
tz_convertzEurope/MoscowDate Timez%Y.%m.%d %H:%M)formathourday_of_weekmonthday_of_monthquarterr	   
is_weekend      hour_sinhour_cos   dow_sindow_cosr!   	month_sin	month_cosr      is_main_sessionis_evening_sessionrm   is_market_openr   session_hour)r   rg   rV   to_datetimehasattrdtr   r   ry   float	dayofweekr   dayr   r9   pisincosr7   )r   r   dt_mskhour_raddow_rad	month_rads         r   add_temporal_featuresr   w   s   	B bjj ^^B{O#4@6=bee\6R6R!!/2XZ^^BvJ,r&z9BRS&&u-BvJ		++2259B}))//((/BwK--e4B~II%%,,U3ByM		++q088?B| 255y2f:%*HVVH%BzNVVH%BzN "%%i"]++a/GFF7OByMFF7OByM BEE	BwK'",IffY'B{OffY'B{O
 !jB.2f:?CKKERB!#Fr!1bj2o FNNuUB 12R8L5MMRUU]]^cdB
 
"BvJO
()Q.6
RDB~
 Ir   )r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   c                    U S   R                   n[        U5      n[        R                  " U5      n[        R                  " U5      n[        R                  " U5      n[        R                  " U5      n[	        SU5       H  nXS-
     S:  a  X   XS-
     -  S-
  S-  X7'   XS-
     S:  a  X   XS-
     -  S-
  S-  XG'   XS-
     S:  a  X   XS-
     -  S-
  S-  XW'   XS-
     S:  d  Mm  X   XS-
     -  S-
  S-  Xg'   M     [
        R                  " U5      R                  SSS	9R                  5       R                   n[
        R                  " U5      R                  SSS	9R                  5       R                   n	[
        R                  " U5      R                  SSS	9R                  5       R                   n
[
        R                  " U5      R                  SSS	9R                  5       R                   nUS
U	-  -   SU
-  -   SU-  -   nUS-  $ )u  KST (Know Sure Thing) oscillator — взвешенная сумма сглаженных ROC.

ROC periods: 10, 15, 20, 30
SMA (smoothing) periods: 10, 10, 10, 15
Weights: 1, 2, 3, 4
KST = RCMA1 + 2*RCMA2 + 3*RCMA3 + 4*RCMA4

Returns np.ndarray normalized to ~[-1, +1].
r      r   rI   r   r4      r   )r3   r         g      Y@)	valueslenr9   zerosrangerV   Seriesr   r   )r   closenroc10roc15roc20roc30is_roc10s_roc15s_roc20s_roc30ksts                r   compute_kst_arrayr      s    wKEE
AHHQKEHHQKEHHQKEHHQKE2q\R=5 5R=014;EHR=5 5R=014;EHR=5 5R=014;EHR=5 5R=014;EH  ii&&rq&9>>@GGGii&&rq&9>>@GGGii&&rq&9>>@GGGii&&rq&9>>@GGG
AK
!g+
-G
;C;r   c                 B    U R                  5       n [        U 5      U S'   U $ )uN   KST (Know Sure Thing) oscillator — добавляет kst_norm в DataFrame.r   )r   r   r   s    r   add_kstr      s     	B&r*BzNIr   c           	         U S   R                   n[        U5      n[        R                  " U5      n[	        X5       Hn  n[        X%   X%U-
     -
  5      n[        R
                  " [        R                  " X%U-
  US-    5      5      n[        R                  " U5      nUS:  a  Xh-  OSXE'   Mp     [        R                  " USS5      $ )uA   Kaufman Efficiency Ratio. Возвращает np.ndarray [0, 1].r   r   rI   r1   r   )	r   r   r9   r   r   rU   r6   sumclip)	r   r/   r   r   err   
total_movechangesnoises	            r   compute_efficiency_ratio_arrayr      s    wKEE
A	!B6Ef*$556
&&6z!a%!89:w&+em
"	 
 772q!r   c                 B    U R                  5       n [        X5      U S'   U $ )uN   Kaufman Efficiency Ratio — добавляет efficiency_ratio в DataFrame.r   )r   r   r   r/   s     r   add_efficiency_ratior      s"    	B;BGBIr   c                    U S   R                   nU S   R                   nU S   R                   n[        U5      n[        R                  " U5      n[	        X5       H  nSn[	        Xq-
  S-   US-   5       HU  n	X)   X9   -
  n
U	S:  a  [        X)   XIS-
     -
  5      OSnU	S:  a  [        X9   XIS-
     -
  5      OSnU[        XU5      -  nMW     [        X'U-
  S-   US-    5      n[        X7U-
  S-   US-    5      nX-
  S:  a?  US:  a9  S[        R                  " XU-
  -  5      -  [        R                  " U5      -  Xg'   M  S	Xg'   M     [        R                  " US-  SS5      $ )
u9   Choppiness Index. Возвращает np.ndarray [0, 1].rO   rP   r   r1   r   r   rI   r4   r   )
r   r   r9   r   r   rU   rX   minlog10r   )r   r/   highlowr   r   chopr   tr_sumjhlhclchhlls                  r   compute_choppiness_arrayr      sa   f:D
U)

CwKED	A88A;D6qzA~q1u-A36!B01ATWuU|+,1B/01uSVeEl*+!Bc""o%F	 .
 &j1nQU+,Z!^AE*+7U?v~BHHVBw%788288F;KKDGDG  774#:q!$$r   c                 B    U R                  5       n [        X5      U S'   U $ )u@   Choppiness Index — добавляет choppiness в DataFrame.r   )r   r   r   s     r   add_choppinessr   
  s!    	B/;B|Ir   skip_temporalc                    U R                  5       n [        U 5      n [        U 5      n [        U 5      n [	        U 5      n [        U 5      n [        U 5      n [        U 5      n [        U 5      n [        U 5      n [        U 5      n [        U 5      n U S   R                  SS9R                  5       U S'   U S   R                  SSS9R                  5       U S'   U(       d  [        U 5      n U $ )u_  
Добавляет все технические индикаторы.

Parameters
----------
skip_temporal : bool
    Если True, пропускает временные признаки (hour, day_of_week и т.д.).
    Рекомендуется для D1/W1, где час всегда 0, день недели не информативен.
r      r   sma_200Fr#   ema_200)r   r   r   r.   rB   rM   r]   rb   rt   r   r   r   r   r   r-   r   )r   r   s     r   engineer_featuresr     s     
B	RB	B	B	B	r	B	B	R	 B	!"	%B	B	b	!B		BwK''s'388:ByMwKOOUO;@@BByM"2&Ir   rf   )   )r   g       @)r   )r   )F)pandasrV   numpyr9   	DataFramer   listrz   r   r.   rB   r   rM   r]   rb   rt   INTERACTION_COLSr{   FEATURE_COLSr   TEMPORAL_COLSndarrayr   r   r   r   r   r   boolr    r   r   <module>r      sT    BLL R\\  tCy4'7 2<< 
 
tCy4'7 
2<< 

 
c 
2<< 
bll C u r||  c 2<< BLL R\\ 	 	",, 	 2<< # bll 	3bll 3r|| 3l!",, !2:: !H  
r|| 
S 
"** 
R\\ 3  % %s %BJJ %.r|| S ",, ",, t  r   