o
    ·»j]&  ã                	   @   s:  d Z ddlZddlZddlZddlZddlmZ ddlmZ ddl	m
Z
 eeƒ ¡ jZej dd¡ ej dd¡ ddlZddlZddlmZ e
d	ƒZd
d„ Zdd„ Zg d¢Zdd„ Zdd„ dd„ dd„ dd„ dd„ dd„ dd„ dd„ dœZdd„ Zedkr›eƒ Zeeƒ eeƒ e dd„ eD ƒe ed  d!ƒ¡ dS dS )"a  
speed_study.py -- [2026-09-28] 22-day test of the speed / shape / room measures found
on 9/28 (AGEN, TGB, IMMX vs NWL, SG). Every stock on each day's 9:28 list
(bars/bars_<date>.json.gz), 14-day references as of that morning
(data/reference/<date>/<SYM>.json -- built only from the 14 sessions BEFORE the day).

Measures at every minute (nothing from later in the day):
  move_norm   signed move from the open / the stock's 14-day average move by this minute
  r2_30       smoothness: R^2 of the last 30 closes (signed by slope)
  eff15       straightness: net move / path over 15 bars
  acc15/acc5  acceleration (later half vs earlier half of the steps, in 1-min ATRs)
  vrel15      15-min volume / its 14-day normal for those minutes
  rvol        volume so far / 14-day normal by this minute
  vwap_pct    price vs VWAP
  room_pct    distance to the nearest 14-day resistance band above (None = above all levels)
  pos14       position in the 14-day range (0 = low, 100 = high)

A. Snapshots at 10:00 / 10:30 / 11:00 / 12:00: does each measure separate stocks that
   rise from there to the close (and the day's big winners)? AUC, both halves.
B. Signals (first time per stock-day, 9:45-15:15): what price did next, vs every
   stock at the same minutes (time-matched baseline).
é    N)Údatetime)ÚPath)ÚZoneInfoz/var/www/screener/tradez%/var/www/screener/trade1/sim/analysis)ÚauczAmerica/New_Yorkc               	      s¨  dd„ ˆ D ƒ}dd„ |D ƒ}‡ fdd„dD ƒ\}}}}}|d }	d gt ˆ ƒ d }
}d }}g }tt ˆ ƒƒD ]]}|rlt|| ||  t|| ||d	   ƒt|| ||d	   ƒƒ}|d u r`|n||| d
  }||
|< ||| ||  ||  d ||  7 }||| 7 }| |rŽ|| n|| ¡ q6g }d}tt ˆ ƒƒD �]¨}||| 7 }tt|| dƒdƒ}|| ||  d¡|| || |	 d	 d tˆd | dƒ |tˆd | d	ƒ || ||  d	 d dœ}dD ]ö}||k�rß|
| �rß||| |d	 … ‰‡fdd„t|ƒD ƒ}ˆd ˆd  tdd„ |D ƒƒ}}|d tˆƒt ˆƒ ‰‰t‡fdd„tt ˆƒƒD ƒƒ}t‡‡fdd„tˆƒD ƒƒ| ‰t‡fdd„ˆD ƒƒ}t‡‡‡fdd„tˆƒD ƒƒ}|d }|�rod	||  ndˆdk�rwd	nd |d|› �< |�r†|| nd|d|› �< t||d … ƒt ||d … ƒ t|d |… ƒ|  |
|  |d|› �< t‡fdd„||| d	 |d	 … D ƒƒ}|�rØt||| d	 |d	 … ƒ| nd |d |› �< qéˆ 	d!¡�rôt
 ˆ 	d!¡�pïi || ¡ni }| 	d"¡|d#< | 	d$¡|d%< |d ||  d	 d |d&< ||d	 |d' … }|�r+t|ƒ||  d	 d nd |d(< |�r>t|ƒ||  d	 d nd |d)< | |¡ qž||d |	 d	 d fS )*Nc                 S   s   g | ]
}t  |d  t¡‘qS )r   )r   ÚfromtimestampÚET©Ú.0Úb© r   ú</var/www/screener/trade/reports/open_window/./speed_study.pyÚ
<listcomp>*   ó    zseries.<locals>.<listcomp>c                 S   s$   g | ]}|j d  d |j d ‘qS )é	   é<   é   )ÚhourÚminute©r	   Úxr   r   r   r   +   ó   $ c                 3   s"   � | ]‰ ‡ fd d„ˆD ƒV  qdS )c                    s   g | ]}|ˆ  ‘qS r   r   r   ©Úir   r   r   ,   ó    z$series.<locals>.<genexpr>.<listcomp>Nr   )r	   )Úbarsr   r   Ú	<genexpr>,   ó   €  zseries.<locals>.<genexpr>)é   é   é   é   é   r   g        r   é   r   é…  ú%H:%Méd   Úabs_move_pctçš™™™™™©?Úcum_vol)ÚmÚtÚcÚ	move_normÚrvolÚvwap_pct)r!   é   r   c                    s    g | ]}ˆ |d   ˆ |  ‘qS )r   r   ©r	   Úk)Úcsr   r   r   D   s     éÿÿÿÿc                 s   s   � | ]}t |ƒV  qd S ©N)Úabs)r	   Úsr   r   r   r   E   ó   € r   c                 3   ó   � | ]	}|ˆ  d  V  qdS ©r   Nr   r0   )Úxmr   r   r   G   ó   € c                 3   s$   � | ]\}}|ˆ  |ˆ  V  qd S r4   r   ©r	   r1   Úy)r:   Úymr   r   r   H   s   €" c                 3   r8   r9   r   )r	   r=   )r>   r   r   r   I   r;   c                 3   s,   � | ]\}}|ˆˆ |ˆ    d  V  qdS r9   r   r<   )Úsloper:   r>   r   r   r   J   s   €* Úr2_ÚeffÚaccc                 3   s(   � | ]}ˆ d  t t|dƒdƒ V  qdS )Úvol_per_minr   r#   N)ÚminÚmaxr   )Úrefr   r   r   O   ó   €& ÚvrelÚsr14Údist_to_resistance_pctÚroom_pctÚpos_in_range_pctÚpos14Úto_closeé=   Úbest60Úworst60)ÚlenÚrangerE   r5   ÚappendrD   ÚstrftimeÚsumÚ	enumerateÚgetÚ
volatilityÚsr_position) r   rF   r*   ÚidxÚoÚhÚlr+   ÚvÚday_openÚatrÚaÚpvÚvvÚvwapr   ÚtrÚrowsÚcumr)   ÚrÚnÚstepsÚnetÚpathÚsxxÚsstÚssrÚhalfÚnormÚspÚfutr   )r   r2   rF   r?   r:   r>   r   Úseries)   sd   @($*þ$ 2F*4€,&&ru   c            	   
   C   s¬   g } t t d¡ƒD ]J}t t |d¡¡}|d }|d D ]6}t ||¡}|d | d }dd„ |D ƒ}|d u s=t|ƒd	k r>qt	||ƒ\}}|  
||||d
k|dœ¡ qq	| S )Nzbars/bars_2026-*.json.gzÚrtÚdateÚtop30_currentÚsymbolsr   c                 S   s*   g | ]}t  |d  t¡ d¡dk r|‘qS )r   r$   z16:00)r   r   r   rU   r   r   r   r   r   d   s   * zload_all.<locals>.<listcomp>r%   r!   )ÚdayÚsymÚocÚbigrg   )ÚsortedÚHEREÚglobÚjsonÚloadÚgzipÚopenÚREFrR   ru   rT   )	ÚdataÚpÚdrz   r6   rF   Úblrg   r|   r   r   r   Úload_all\   s   ùrŠ   )r,   Úr2_30Úr2_15Úeff15Úacc15Úacc5Úvrel15r-   r.   rK   rM   c                    s¾  t dd„ | D ƒƒ}t|d t|ƒd … ƒ‰tdt| ƒ› dt|ƒ› dtdd„ | D ƒƒ› d	�ƒ d
D �]+‰ g }| D ]%}t‡ fdd„|d D ƒd ƒ}|r\| d¡d ur\| |d |d |f¡ q7tdˆ › dt|ƒ› dtdd„ |D ƒƒ› �ƒ tddd›ddd›ddd›ddd›ddd›ddd ›dd!d ›�ƒ tD ]Æ‰‡fd"d#„|D ƒ}‡fd$d#„|D ƒ}‡‡fd%d#„|D ƒ}‡‡fd&d#„|D ƒ}‡‡fd'd#„|D ƒ}	‡‡fd(d#„|D ƒ}
‡fd)d#„|D ƒ}‡fd*d#„|D ƒ}t|ƒd+k�r[t|ƒd+k�r[t	||ƒt	||ƒt	|	|
ƒ}}}|�r%|�r%|d, |d,  d-k�r%t
t|d, ƒt|d, ƒƒd.k�r%d/nd0}tdˆd›d|d1›d|�p5d-d1›d|�p<d-d1›dt	||ƒ�pFd-d2›dt |¡d3›dt |¡d3›|› �ƒ q•q0d S )4Nc                 S   ó   h | ]}|d  ’qS ©rz   r   r   r   r   r   Ú	<setcomp>p   r   zpart_a.<locals>.<setcomp>r   u   
######## A. Snapshots â€” z stock-days over z days (c                 s   s   � | ]}|d  V  qdS ©r}   Nr   r   r   r   r   r   s   r7   zpart_a.<locals>.<genexpr>z big winners))z10:00z10:30z11:00z12:00c                 3   s    � | ]}|d  ˆ kr|V  qdS )r*   Nr   )r	   ri   )Úcpr   r   r   w   ó   € rg   r‹   rz   r}   z
--- at z: z! stock-days; rising to the close c                 s   s"   � | ]\}}}|d  dkV  qdS ©rN   r   Nr   ©r	   Ú_ri   r   r   r   r   z   r   ú   ÚmeasureÚ10ú zAUC riseú>8z1st halfz2nd halfz | zAUC bigú>7zmedian rosez>11zmedian fellc                    s4   g | ]\}}}|d  dkr|  ˆ ¡dur|ˆ  ‘qS r—   ©rX   r˜   ©Úfr   r   r   }   ó   4 zpart_a.<locals>.<listcomp>c                    s4   g | ]\}}}|d  dkr|  ˆ ¡dur|ˆ  ‘qS r—   r    r˜   r¡   r   r   r   ~   r£   c                    s<   g | ]\}}}|ˆv r|d  dkr|  ˆ ¡dur|ˆ  ‘qS r—   r    ©r	   rˆ   r™   ri   ©r¢   Úh1r   r   r      ó   < c                    s<   g | ]\}}}|ˆv r|d  dkr|  ˆ ¡dur|ˆ  ‘qS r—   r    r¤   r¥   r   r   r   €   r§   c                    s<   g | ]\}}}|ˆvr|d  dkr|  ˆ ¡dur|ˆ  ‘qS r—   r    r¤   r¥   r   r   r   �   r§   c                    s<   g | ]\}}}|ˆvr|d  dkr|  ˆ ¡dur|ˆ  ‘qS r—   r    r¤   r¥   r   r   r   ‚   r§   c                    s,   g | ]\}}}|r|  ˆ ¡d ur|ˆ  ‘qS r4   r    ©r	   r™   r
   ri   r¡   r   r   r   ƒ   ó   , c                    s,   g | ]\}}}|s|  ˆ ¡d ur|ˆ  ‘qS r4   r    r¨   r¡   r   r   r   „   r©   r!   ç      à?r   r'   z  <- consistentÚ z8.2fz7.2fz11.2f)r~   ÚsetrR   ÚprintrV   ÚnextrX   rT   ÚFEATSr   rD   r5   ÚstÚmedian)r†   ÚdaysÚsnapr   ri   ÚupÚdnÚu1Úd1Úu2Úd2ÚbgÚnbÚAÚA1ÚA2Úflagr   )r•   r¢   r¦   r   Úpart_ao   sH   
ÿ
€,@"JD
ÿ
ÿÿ€ôørÀ   c                 C   sR   | d dko(|   d¡pddko(d| d   kodkn  o(| d d u p(| d d	kS )
Nr,   r   r‹   r3   çffffffæ?r   r.   rK   r   r    ©ri   r   r   r   Ú<lambda>Ž   s   : rÃ   c                 C   s   | d dko|   d¡pddkS )Nr,   r   r‹   r3   rÁ   r    rÂ   r   r   r   rÃ   �   s    c                 C   s:   | d dko|   d¡pddkod| d   kodkS   S )Nr,   r   r‹   r3   rÁ   r   r.   r    rÂ   r   r   r   rÃ   ‘   s   : c                 C   s   | d dkS )Nr,   r   r   rÂ   r   r   r   rÃ   ’   s    c                 C   s   |   d¡pddkS )Nr‹   r3   gš™™™™™é?r    rÂ   r   r   r   rÃ   “   s    c                 C   sd   |   d¡pddko1|   d¡pddko1|   d¡pddko1|   d	¡p!dd
ko1d| d   ko/d
kS   S )NrŽ   i÷ÿÿÿrª   r�   r   g333333ã?rŒ   rÁ   r�   r   r.   r    rÂ   r   r   r   rÃ   •   s   6 ÿc                 C   s6   |   d¡pddko| d dko| d d uo| d dk S )Nr‹   r3   rÁ   r,   r   rK   r   r    rÂ   r   r   r   rÃ   ˜   s   6 c                 C   s<   |   d¡pddko|   d¡pddko| d dko| d d	kS )
Nr�   r   g      ø?r�   r!   r.   r    r,   r   r    rÂ   r   r   r   rÃ   š   r§   )z0S1 move>=2x + smooth + <=2% over VWAP + room>=1%zS2 move>=2x + smoothz%S3 move>=2x + smooth + <=2% over VWAPzS4 move>=2x onlyzS5 smooth only (R2_30>=0.8)z0S6 AGEN TURN (acc, straight, vol>=2x, <=2% VWAP)z'S7 smooth + into resistance (room < 1%)z0CLIMAX (acc5>=1.5, vol>=5x, >=4% VWAP, move>=3x)c           
         st  t dd„ | D ƒƒ}t|d t|ƒd … ƒ‰i ‰ | D ]}|d D ]}ˆ  |d g ¡ |d ¡ qqdd„ ˆ  ¡ D ƒ‰ td	ƒ td
dd›ddd›ddd›ddd›ddd›ddd›ddd›ddd›ddd›�ƒ t ¡ D ]Î\}}g }| D ]+}|d D ]$}d|d   kr…dkr›n qw| d¡d ur›||ƒr›| ||f¡  nqwqq|s¬td
|d›ddd›�ƒ qi‡ fd d!„|D ƒ}‡ ‡fd"d!„|D ƒ}‡ ‡fd#d!„|D ƒ}	td
|d›dt|ƒd›dt	d$d%„ |D ƒƒd›dt	d&d%„ |D ƒƒt|ƒ d' d(›d)t
 d*d%„ |D ƒ¡d+›d)t
 |¡d,›d)|�rt
 |¡ndd-›d.|	�rt
 |	¡ndd/›d0t
 d1d%„ |D ƒ¡d2›d)t
 d3d%„ |D ƒ¡d,›d4�ƒ qid S )5Nc                 S   r‘   r’   r   r   r   r   r   r“   Ÿ   r   zpart_b.<locals>.<setcomp>r   rg   r)   rN   c                 S   s   i | ]
\}}|t  |¡“qS r   )r°   Úmean)r	   r)   r_   r   r   r   Ú
<dictcomp>¥   r   zpart_b.<locals>.<dictcomp>ud   
######## B. Signals (first per stock-day, 9:45-15:15) â€” to close vs all stocks at the same minuterš   ÚsignalÚ50r�   Úeventsz>6zbig Wzrose%zavg to closez>12zvs baserž   z1st/2nd half vs basez>20rP   rŸ   rQ   r/   iY  r‹   r   Ú6c                    s$   g | ]\}}|d  ˆ |d   ‘qS )rN   r)   r   r˜   )Úbaser   r   r   ²   r   zpart_b.<locals>.<listcomp>c                    s0   g | ]\}}|d  ˆv r|d ˆ |d   ‘qS ©rz   rN   r)   r   ©r	   r   ri   ©rÊ   r¦   r   r   r   ³   ó   0 c                    s0   g | ]\}}|d  ˆvr|d ˆ |d   ‘qS rË   r   rÌ   rÍ   r   r   r   ´   rÎ   c                 s   s   � | ]	\}}|d  V  qdS r”   r   )r	   r   r™   r   r   r   r   µ   r;   zpart_b.<locals>.<genexpr>c                 s   s    � | ]\}}|d  dkV  qdS r—   r   r˜   r   r   r   r   µ   r–   r%   z5.0fz% c                 s   s   � | ]	\}}|d  V  qdS )rN   Nr   r˜   r   r   r   r   ¶   r;   z+11.2fz+7.2fz+9.2fú/z+.2fz%  c                 s   ó(   � | ]\}}|d  dur|d  V  qdS )rP   Nr   r˜   r   r   r   r   ¸   rG   z+6.2fc                 s   rÐ   )rQ   Nr   r˜   r   r   r   r   ¸   rG   ú%)r~   r¬   rR   Ú
setdefaultrT   Úitemsr­   ÚSIGNALSrX   rV   r°   rÄ   )
r†   r²   r   ri   ÚnameÚfnÚevÚexÚe1Úe2r   rÍ   r   Úpart_bž   sL   ÿP2€Pÿ
ÿþþýýórÛ   Ú__main__c                 C   s$   g | ]}|d  |d |d dœ‘qS )rz   r{   r|   )rz   r{   r|   r   r   r   r   r   r   ¿   r   r   zspeed_study_index.jsonÚw)!Ú__doc__rƒ   r�   Ú
statisticsr°   Úsysr   Úpathlibr   Úzoneinfor   Ú__file__ÚresolveÚparentr   rm   ÚinsertÚ	referencer…   rY   Ú
separationr   r   ru   rŠ   r¯   rÀ   rÔ   rÛ   Ú__name__r†   Údumpr„   r   r   r   r   Ú<module>   sF    3ò$ü