
    vYpjS              	          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,S\R                  S\S\R                  4S jjr/ SQ4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\R0                  S\4S jrS0S\R                  S\S\R                  4S jjr/ SQrS1S\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\R0                  4S# jr S\R                  S\R                  4S$ jr!S2S\R                  S\S\R0                  4S% jjr"S2S\R                  S\S\R                  4S& jjr#S,S\R                  S\S\R0                  4S' jjr$S,S\R                  S\S\R                  4S( jjr%S3S\R                  S)\&S\R                  4S* jjr'g)4    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                 F   U R                  5       n U S   R                  U S   R                  U S   R                  pCn[        U 5      n[        R                  " U5      n[        SU5       HD  nX'   X7   -
  n[        X'   XGS-
     -
  5      n	[        X7   XGS-
     -
  5      n
[        XU
5      Xg'   MF     [        R                  " U5      R                  SU-  SS9R                  5       R                  n[        R                  " U5      n[        R                  " U5      n[        SU5       H3  n[        X'   X'S-
     -
  S5      X'   [        X7S-
     X7   -
  S5      X'   M5     [        R                  " U5      R                  SU-  SS9R                  5       R                  n[        R                  " U5      R                  SU-  SS9R                  5       R                  n[        R                  " US	:  US	5      nS
U-  U-  U S'   S
U-  U-  U S'   S
[        R                  " U S   U S   -
  5      -  [        R                  " U S   U S   -   S	:  U S   U S   -   S	5      -  n[        R                  " U5      R                  SU-  SS9R                  5       R                  U S'   U $ )u   
Average Directional Index — сила и направление тренда.
Использует Wilders Smoothing (SMMA) по оригинальному методу Уайлдера (1978).
Добавляет колонки: adx, pdi, mdi.
rO   rP   r   r         ?F)alphar%   r   rI   r4   pdimdiadx)r   valueslenr9   zerosrangerU   rX   rV   Seriesr-   r   r7   )r   r/   highlowclosenr\   ihlhclcatr_up_move	down_moveplus_dmminus_dmatr_safedxs                     r   add_adxr   w   sq    
B&z(("U)*:*:BwK<N<NuDBA 
!B1a[Wsv51:%&%!*$%BB	  99R=3v:e<AACJJD hhqkGI1a[4!9,a0
3s8cf,a0	 
 ii $$3v:e$DIIKRRGyy#''c&j'GLLNUUH xxudE2Hg(BuIh)BuI 
rvvbi"U)+,	,rxx5	BuI8MPU8UWYZ_W`cefkclWlns/t	tB		"!!F
5!AFFHOOBuIIr   )r	   r   r   periodsc                     U R                  5       n U S   R                  5       R                  nU HF  n[        R                  " U5      R                  U5      R                  5       R                  U SU 3'   MH     U $ )uh   Реализованная волатильность (std of returns) за несколько окон.r   rv_)r   r   r   rV   r   r   rK   )r   r   returnsps       r   add_realized_volatilityr      sf    	Bk$$&--G		'*221599;BBS9 Ir   c                 ,   U R                  5       n U S   R                  U S   R                  p2[        U 5      n[        R                  " U5      n[        SU5       H;  nX&   X6   :  d  M  X&   S:  d  M  [        R                  " X&   X6   -  5      S-  XV'   M=     US:X  a  SOSn[        R                  " [        R                  " U5      R                  U5      R                  5       S	[        R                  " S5      -  U-  -  5      R                  X'   U $ )
u   Parkinson volatility estimator (HL-based).
Записывается в parkinson_vol (period=20) или parkinson_vol_10 (period=10).rO   rP   r   r      r   parkinson_vol_10parkinson_vol   )r   r   r   r9   r   r   logsqrtrV   r   r   sum)r   r/   r   r   r   hl_ratior   cols           r   add_parkinson_volatilityr      s     
B6
!!2e9#3#3#BAxx{H1a[7SV!&&36!12a7HK  !'"
/Cgg
		(##F+//1Q]V5KLf G Ir   c                    U R                  5       n U S   R                  U S   R                  U S   R                  U S   R                  4u  p#pE[        U 5      n[        R                  " U5      n[        SU5       Hj  n[        R                  " X(   X8   -  5      S-  n	[        R                  " XX   XH   -  5      S-  n
SU	-  S[        R                  " S5      -  S-
  U
-  -
  Xx'   Ml     US:X  a  S	OS
n[        R                  " [        R                  " U5      R                  U5      R                  5       5      R                  X'   U $ )u   Garman-Klass volatility estimator.
Записывается в garman_klass_vol (period=20) или garman_klass_vol_10 (period=10).rO   rP   Openr   r   r   rm   r   garman_klass_vol_10garman_klass_volr   r   r   r9   r   r   r   r   rV   r   r   r   )r   r/   r   r   open_r   r   gkr   r   cor   s               r   add_garman_klass_volatilityr      s    
B j//E1A1A2f:CTCTVXY`VaVhVhhDuBA	!B1a[VVDGcf$%*VVEHux'(A-bAq	MA-33  $*R<
5GCggbiim++F388:;BBBGIr   c                 2   U R                  5       n U S   R                  U S   R                  U S   R                  U S   R                  4u  p#pE[        U 5      n[        R                  " U5      n[        R                  " U5      n[        SU5       Hq  n	[        R                  " X)   X9   -  5      n
[        R                  " XY   XI   -  5      nU
S-  US-  -   Xy'   [        R                  " XI   XYS-
     -  5      nUS-  X'   Ms     US:X  a  SOS	n[        R                  " [        R                  " U5      R                  U5      R                  5       [        R                  " U5      R                  U5      R                  5       -   5      R                  X'   U $ )
u   Yang-Zhang volatility estimator (overnight + Rogers-Satchell).
Записывается в yang_zhang_vol (period=20) или yang_zhang_vol_10 (period=10).rO   rP   r   r   r   r   r   yang_zhang_vol_10yang_zhang_volr   )r   r/   r   r   r   r   r   rA   	overnightr   r   r   ocr   s                 r   add_yang_zhang_volatilityr      sY    
B j//E1A1A2f:CTCTVXY`VaVhVhhDuBA	!BI1a[VVDGcf$%VVEHux'(a"'!VVEHuqSz)*Qw	  "(2
3CCgg
		"f%**,ryy/C/K/KF/S/X/X/ZZf G Ir   r   c                    [        U 5      nUS:  a  g/ SQnU Vs/ s H  o3US-  :  d  M  UPM     nn[        U5      S:  a  g/ nU H  nX-  nUS:  a  M  / n[        U5       H  nXU-  US-   U-   nUR                  5       n	X-
  n
[        R                  " U
5      nUR                  5       UR                  5       -
  nUR                  5       nUS:  d  Ms  UR                  X-  5        M     U(       d  M  UR                  U[        R                  " U5      45        M     [        U5      S:  a  g[        R                  " U VVs/ s H  u  p>UPM	     snn5      n[        R                  " U VVs/ s H  u  nnUPM
     snn5      n [        R                  " UUS5      n[        [        R                  " US   S	S
5      5      $ s  snf s  snnf s  snnf ! [         a     gf = f)uN  Hurst exponent via Rescaled Range (R/S) analysis.

Классический метод Hurst (1951):
  Для каждого lag L: делим series на chunk'и размера L, для каждого
  считаем R = max(cumdev) - min(cumdev), где cumdev — кумулятивная
  сумма отклонений от среднего chunk'a; S = std chunk'a.
  R/S = mean(R/S). Hurst = slope log(R/S) vs log(L).

H < 0.5 → mean-reverting, H > 0.5 → trending, H ≈ 0.5 → random walk.
На малых выборках возвращает 0.5 (random walk fallback).
   rm   )r   r             @   r      r   g-q=r   r1   r   )r   r   r   r9   cumsumrX   minrK   appendr   polyfitfloatclip	Exception)r   r   lagsL	rs_valuesn_chunksrs_chunkkchunkr   devcumdevRS_log_LrA   log_RSpolys                      r   	_rs_hurstr      s    	GA2v !D*t!16zAtD*
4y1}I6a<xAEAEQ;/E::<D,CYYs^F

vzz|+A		A5y& ! 8a!234! $ 9~FF),)$!A),-EVVY/YEArRY/0Fzz%+RWWT!Wc3/00= +4 -/  s(   GGG

1G
	;G 
G#"G#r   c                    U R                  5       n [        R                  " U S   U S   R                  S5      -  5      R	                  S5      R
                  n[        U5      n[        R                  " US5      n[        X5       H  n[        X%U-
  U 5      XE'   M     X@S'   U S   S:  R                  [        5      U S'   U S   S:  R                  [        5      U S	'   U S   S-
  R                  5       S
-  U S'   U $ )uD  Hurst exponent over rolling window.

Цель (audit 2026-08-03): модель должна различать trending vs
mean-reverting режимы. SBER в up-тренде давал 12/12 SHORT SL —
модель не учитывала, что H>0.5 = trending, SHORT mean-revert
стратегия обречена.
r   r   r   rm   	hurst_100g?is_trendingg?is_mean_reverting       @hurst_confidence)r   r9   r   rT   r;   r   r   fullr   r   ry   r   rU   )r   r   r   r   
hurst_valsr   s         r   	add_hurstr     s     
BffR[2g;#4#4Q#778??BIIGGACJ6!'f*Q"78
  !{O K4/77>B}!+5==eDB o388:S@BIr   )r   r   r   r   c                    U R                  5       n U S   U S   -   U S   -   S-  nU S   R                  S[        R                  5      nX#-  nUR	                  USS9R                  5       nUR	                  USS9R                  5       nXe-  R                  5       nXpS	'   U S   U-
  U-  S
-  R                  S5      U S'   U S   U:  R                  [        5      U S'   U $ )u  VWAP (Volume Weighted Average Price) distance features.

Цель: использовать объём-on-price информацию как фильтр.
`vwap_dist_pct` > 0 — цена выше VWAP (бычий pressure).
`above_vwap` — бинарный флаг.
rO   rP   r   g      @r_   r   r   r3   vwap_24r4   vwap_dist_pct
above_vwap)
r   r8   r9   r:   r   r   bfillr;   ry   r   )r   r   typical_pricevolvpvol_sumvp_sumvwaps           r   add_vwap_featuresr   7  s     
BZ"U)+bk9S@M
X,

q"&&
)C		Bkk&ak0446GZZAZ.224F##%DyMwK$.$6<DDQGB7d*2259B|Ir   )r   r   r   c           	         U R                  5       n SU R                  ;   a6  [        R                  " U S   SSS9n UR                  R                  S5      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 $ ! [        [        4 a    Un GNf = f)%u   Добавляет временные признаки: час, день недели, месяц, циклические кодировки.	timestampsT)unitutczEurope/MoscowDate Timez%Y.%m.%d %H:%M)formathourday_of_weekmonthday_of_monthquarterr	   
is_weekendr      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dt
tz_convertAttributeError	TypeErrorr   ry   r   	dayofweekr   dayr   r9   pisincosr7   )r   r  dt_mskhour_raddow_rad	month_rads         r   add_temporal_featuresr  P  s   	B bjj ^^B{O#4@	UU%%o6F
 ^^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~
 IY 	* 	F	s   L, ,MM)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   r   rI   r   r4      r   r   r   r   r   g      Y@)	r   r   r9   r   r   rV   r   r   r   )r   r   r   roc10roc15roc20roc30r   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   r   r   )	r   r/   r   r   err   
total_movechangesnoises	            r   compute_efficiency_ratio_arrayr0    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   r0  r   r/   s     r   add_efficiency_ratior3    s"    	B;BGBIr   c           
          U S   R                   nU S   R                   nU S   R                   n[        U5      n[        R                  " U5      odSS USS& [        R                  R                  X#-
  [        R                  " X&-
  5      [        R                  " X6-
  5      /5      n[        R                  " U5      R                  USS9R                  5       R                   n[        R                  " U5      n	[        R                  " U5      n
U	R                  USS9R                  5       R                   nU
R                  USS9R                  5       R                   n[        R                  " SSS	9   X-
  S
:  US
:  -  n[        R                  " US[        R                  " XU-
  -  5      -  [        R                  " U5      -  S5      nSSS5        [        R                   " WS-  SS5      $ ! , (       d  f       N)= f)u   Choppiness Index. Возвращает np.ndarray [0, 1].

v12.7: Vectorized — uses pandas rolling sum instead of nested loop.
O(n) instead of O(n × period).
rO   rP   r   Nr  r   r   ignore)divideinvalidrI   r4   r   r   )r   r   r9   r   maximumreducerU   rV   r   r   r   rX   r   errstater7   log10r   )r   r/   r   r   r   r   
close_backr\   tr_sumhigh_series
low_serieshhll
valid_maskchops                  r   compute_choppiness_arrayrD    s    f:D
U)

CwKED	A !JSbzjn			

t !
s  
B YYr]""6q"9==?FFF ))D/K3J			V		3	7	7	9	@	@B			F		2	6	6	8	?	?B 
Hh	7w%'FUN;
xx"((6"W-..&1AA
 
8 774#:q!$$ 
8	7s   3AG//
G=c                 B    U R                  5       n [        X5      U S'   U $ )u@   Choppiness Index — добавляет choppiness в DataFrame.r   )r   rD  r2  s     r   add_choppinessrF    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 5      n [        U 5      n [        U 5      n [        U 5      n [!        U 5      n [        U SS9n [        U SS9n [!        U SS9n U S   R#                  SS9R%                  5       U S'   U S   R'                  SSS9R%                  5       U S	'   [)        U 5      n [+        U 5      n U(       d  [-        U 5      n U $ )
u_  
Добавляет все технические индикаторы.

Parameters
----------
skip_temporal : bool
    Если True, пропускает временные признаки (hour, day_of_week и т.д.).
    Рекомендуется для D1/W1, где час всегда 0, день недели не информативен.
r   )r/   r      r   sma_200Fr#   ema_200)r   r   r   r.   rB   rM   r]   rb   rt   r*  r3  rF  r   r   r   r   r   r   r   r-   r   r   r  )r   rG  s     r   engineer_featuresrL    s8    
B	RB	B	B	B	r	B	B	R	 B	!"	%B	B	b	!B		B	B	 	$B	!"	%B	$R	(B	"2	&B	!"R	0B	$R	3B	"2b	1BwK''s'388:ByMwKOOUO;@@BByM	2B	2	B"2&Ir   rf   )   )r   r   )r   )r   )r4   )r   )r   )F)(pandasrV   numpyr9   	DataFramer   listrz   r   r.   rB   r   rM   r]   rb   rt   INTERACTION_COLSr{   FEATURE_COLSr   r   r   r   r   ndarrayr   r   
HURST_COLSr   	VWAP_COLSr  TEMPORAL_COLSr(  r*  r0  r3  rD  rF  boolrL   r   r   <module>rZ     sy    BLL R\\  tCy4'7 2<< 
 
tCy4'7 
2<< 

 
c 
2<< 
bll C u r||  c 2<< BLL R\\ 	 	",, 	 2<< # bll 	( (c (2<< (V DO  tCy SUS_S_  s BLL "BLL # r||  ",,  R\\ 22rzz 2e 2j",,  bll 4 S
",,  R\\ , 7	7bll 7r|| 7t!",, !2:: !H  
r|| 
S 
"** 
R\\ 3  %% %%s %%BJJ %%Pr|| S ",, )",, )t ) )r   