
    6_j"                     P   S SK rS SKrS\R                  S\R                  S\R                  S\R                  S\S\S\S	\S
\R                  4S jr   SS\R                  S\S\S\S
\R                  4
S jjr	   SS\R                  S\S\S\S
\R                  4
S jjr
S\R                  S\R                  S\S\S
\4
S jrS\R                  S\R                  S\S\S
\4
S jr SS\R                  S\S
\R                  4S jjrS\R                  S
\R                  4S jrg)    Ncloseshighslows
atr_valuesatr_mult_slatr_mult_tpmax_bars	directionreturnc                    [        U 5      n[        R                  " U[        R                  S9n	[	        US-
  5       H  n
[        R
                  " X:   5      (       d  X:   S:X  a  M*  X
   nX:   nUS:X  a  XU-  -   nXU-  -
  nOXU-  -
  nXU-  -   n[        XU-   S-   5      n[	        U
S-   U5       HB  nUS:X  a  UU   U:  nUU   U:*  nOUU   U:*  nUU   U:  nU(       a  SX'     M  U(       d  MA    M     M     U	$ )Ndtype   r   )lennpzerosint32rangeisnanmin)r   r   r   r   r   r   r	   r
   noutcomesientryatrtpsllimitjtp_hitsl_hits                      1/home/ai/projects/AI_Strategy/features/targets.py_scan_outcomer#      s    	FAxx*H1q5\88JM""jmq&8	m>{**B{**B{**B{**BA8|a'(q1ue$AA~qRaBaBqRv % 8 O    dfc                 j   U R                  5       n SU R                  ;  a  [        S5      eU S   R                  nU S   R                  nU S   R                  nU S   R                  n[	        U 5      n[
        R                  " U[
        R                  S9n	[        US-
  5       H  n
[
        R                  " Xz   5      (       d  Xz   S:X  a  M*  XJ   nXU
   U-  -   nXU
   U-  -
  n[        XU-   S-   5      n[        U
S-   U5       H!  nX_   U:  a  SX'     Mt  Xo   U::  d  M  S	X'     M     M     XS
'   U $ )Nr   z7add_atr() must be called before compute_trade_outcome()CloseHighLowr   r   r      outcome)copycolumns
ValueErrorvaluesr   r   r   r   r   r   r   )r%   r   r   r	   r   r   r   r   r   r   r   r   r   r   r   r   s                   r"   compute_trade_outcomer0   1   s4    
BBJJRSS[FvJEe9DE!!JBAxx*H1q5\88JM""jmq&8	][00][00A8|a'(q1ue$Ax2~w"} %   yMIr$   c                    U R                  5       n SU R                  ;  a  [        S5      eU S   R                  U S   R                  U S   R                  U S   R                  4n[	        / UQUPUPUP7SS06U S'   [	        / UQUPUPUP7SS	06U S
'   [	        / UQUPUPSP7SS06U S'   [	        / UQUPUPSP7SS	06U S'   U $ )Nr   z7add_atr() must be called before compute_dual_outcomes()r'   r(   r)   r
   r   outcome_longoutcome_short   outcome_long_fastoutcome_short_fast)r,   r-   r.   r/   r#   )r%   r   r   r	   arrs        r"   compute_dual_outcomesr9   W   s	    
BBJJRSS 	7BvJ--r%y/?/?
5	C ']][]+]x][\]B~'__k_;__\^_B ,\S\+\{\B\Z[\B,^c^;^^R^[]^BIr$   highlowstartendc                    [         R                  " XU 5      nU[         R                  " XU 5      -   nXR-
  nUS-
  U-
  n[        Xg5      nUS:  a+  XX-
  n	XX-   S-   n
X   [         R                  " X	U
 5      :  a  U$ [	        US-   US-
  5       Ho  nX   XS-
     :  d  M  X   XS-      :  d  M!  X-
  nUS-
  U-
  n[        X5      nUS:  d  M@  X-
  n	X-   S-   n
X   [         R                  " X	U
 5      :  d  Mk  X   s  $    U$ )u  
Ищет ближайший валидный пик в окне [start, end).

Критерии пика:
  1. High[j] — локальный максимум (High[j] >= High[j-1] и High[j] >= High[j+1])
  2. Пик центрирован: в симметричном окне [j-r : j+r], где r = min(j-start, end-1-j),
     нет High выше, чем High[j] (т.е. j — истинная вершина на этом участке графика)
  3. Выбирается первый (ближайший к start) валидный пик

Если валидный пик не найден — возвращает глобальный максимум окна (фолбэк).
r   r*   )r   maxargmaxr   r   )r:   r;   r<   r=   
global_maxr@   	left_dist
right_distradiuscheck_lcheck_rr   left_dright_drs                  r"   _find_valid_peak_highrJ   o   s   $ 3(JRYYt#//F Iq6!J'F{//A%<266$w"788 519cAg&7dq5k!dg!e&<YFAgkGF$AAv%%!)7bffT'%:;;7N ' r$   c                    [         R                  " XU 5      nU[         R                  " XU 5      -   nXR-
  nUS-
  U-
  n[        Xg5      nUS:  a+  XX-
  n	XX-   S-   n
X   [         R                  " XU
 5      ::  a  U$ [        US-   US-
  5       Ho  nX   XS-
     ::  d  M  X   XS-      ::  d  M!  X-
  nUS-
  U-
  n[        X5      nUS:  d  M@  X-
  n	X-   S-   n
X   [         R                  " XU
 5      ::  d  Mk  X   s  $    U$ )uy  
Ищет ближайшую валидную впадину в окне [start, end).

Критерии впадины:
  1. Low[j] — локальный минимум (Low[j] <= Low[j-1] и Low[j] <= Low[j+1])
  2. Впадина центрирована: в симметричном окне [j-r : j+r], где r = min(j-start, end-1-j),
     нет Low ниже, чем Low[j]
  3. Выбирается первая (ближайшая к start) валидная впадина

Если валидная впадина не найдена — возвращает глобальный минимум окна (фолбэк).
r   r*   )r   r   argminr   )r:   r;   r<   r=   
global_minrL   rB   rC   rD   rE   rF   r   rG   rH   rI   s                  r"   _find_valid_trough_lowrN      s   $ #'JRYYs~..FIq6!J'F{//A%;"&&W!566 519cAg&6SQZCFca%j$8YFAgkGF$AAv%%!)6RVVC$8996M ' r$   horizonc                    U R                  5       n U S   R                  nU S   R                  nU S   R                  n[        U 5      n[        R                  " U[        R
                  [        R                  S9n[        R                  " U[        R
                  [        R                  S9n[        XQ-
  5       H@  nUS-   n	US-   U-   n
[        X4X5      n[        X4X5      nXU   -  S-
  Xh'   XU   -  S-
  Xx'   MB     X`S'   XpS'   U $ )	u  
Для каждой свечи находит ближайший ВАЛИДНЫЙ пик и впадину
в следующих `horizon` барах.

Пик/впадина считаются валидными, если:
  - Это локальный экстремум (выше/ниже соседей)
  - Центрирован: в симметричном окне [pos-r : pos+r] нет точек выше/ниже

Возвращает регрессионные цели:
  pct_to_peak:    High[пик] / Close[i] - 1  — потенциал роста (+, %)
  pct_to_trough:  Low[впадина] / Close[i] - 1  — потенциал падения (-, %)
r'   r(   r)   r   r   g      ?pct_to_peakpct_to_trough)
r,   r/   r   r   fullnanfloat64r   rJ   rN   )r%   rO   closer:   r;   r   rQ   rR   r   r<   r=   	peak_high
trough_lows                r"   compute_peak_trough_targetsrY      s      
BwKEf:D
U)

CBA''!RVV2::6KGGArvvRZZ8M1;A!ego)$U@	+DuB
"1X-3%a036   $}'Ir$   c                 D    U S   R                  5       R                  5       $ )Nr+   )value_counts
sort_index)r%   s    r"   outcome_distributionr]      s    i=%%'2244r$   )g      ?g      @d   )r^   )numpyr   pandaspdndarrayfloatintr#   	DataFramer0   r9   rJ   rN   rY   Seriesr]    r$   r"   <module>rh      s    )JJ)::) **) 

	)
 ) ) ) ) ZZ)\ 	#
## # 	#
 \\#P 	
  	
 \\0-
**-	- - 
	-
 -`+
**+	+ + 
	+
 +` %
%% \\%P5R\\ 5bii 5r$   