o
    –M¾jv  ã                   @   sB  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dƒZej deeƒ¡ ej deeƒ¡ ddlZddlZe	dƒZed d	 d
 Zed d d ZdZdZdd„ Zd$dd„Zdd„ Zdd„ Zdd„ Zd%dd„Z e!dkrŸed  j"d!d"� e d#ej#v rše$ej#ej# %d#¡d  ƒndƒ dS dS )&aM  
label_days.py -- [2026-10-01] The user: the library's reference days must have their best
entry and exit spots marked, like the BB chart. Marks every stock-day in the library
(reports/open_window/bars/, ~2 years of 9:28/9:30 lists) automatically, on 1-min closes:

  best_any      the biggest buy -> later sell gain of the day (hindsight, no limits)
  best_held     the biggest gain a bot could actually have held: never more than max_dd%
                (1%) under the buy price between the buy and the sell, held >= 5 minutes
  leg2          a second held trade after the first one's sell (two-move days like AGEN)
  no_trade      best_held gain < 1%: the right decision that day was not to trade
Each mark keeps the measured signals at the buy and the sell (analyze_trades.entry_signals /
exit_signals: vs open, vs VWAP, minutes since the low, volume vs normal, tags ...).
Buys are allowed 9:31-15:15, sells until 15:55.

Output: data/playbook/day_labels.jsonl (one line per stock-day) + a few sample charts.
    python3 label_days.py              (all days)     python3 label_days.py --charts 12
é    N)Údatetime)ÚPath)ÚZoneInfoz/var/www/screener/tradezAmerica/New_YorkÚreportsÚopen_windowÚbarsÚdataÚplaybookzday_labels.jsonlç      ð?é   c           	   	   C   sú   g dd}}}| D ]p}t  |d t¡}|jd d |j d }d|  kr*dk s,n q
|||d |d |d	 |d
 |d dœ}||d |d  |d  d	 |d  7 }||d 7 }|r`|| n|d |d< |d t|d | dƒ |d< | |¡ q
|S )Ng        r   é	   é<   é   i†  é   é   é   é   r   )ÚtÚmÚoÚhÚlÚcÚvr   r   r   r   ÚvwapÚvol_per_minÚvolx)r   ÚfromtimestampÚETÚhourÚminuteÚmaxÚappend)	ÚrowsÚrefÚBÚpvr   Úbr   r   Úx© r)   ú6/var/www/screener/trade/reports/playbook/label_days.pyÚbuild(   s   ((r+   r   éY  é�  c                 C   s  d}t | ƒ}t||ƒD ]t}|| | d   kr|ksn q| | d }|dtd   }	d\}
}t|d |ƒD ]/}| | d |ksH| | d |	k rJ n||t kre|
du s\| | d |
kre| | d |}
}q6|dur|
| d }|du sz||d kr|||f}q|S )	zUBest buy i / sell j (closes), j >= i + MIN_HOLD, low between never < buy*(1-MAX_DD%).Nr   r   r   éd   )NNr   r   )ÚlenÚrangeÚMAX_DDÚMIN_HOLD)r%   ÚstartÚlo_mÚhi_mÚexit_byÚbestÚnÚiÚeÚfloorÚhi_cÚhi_jÚjÚgr)   r)   r*   Ú	best_held8   s(    $€
€r@   c                 C   sX   |sd S |\}}}t  | || d d ¡t  | ||¡t|d dƒ| | d | | d dœS )Nr   r   r.   r   r   )ÚentryÚexitÚgain_pctÚentry_mÚexit_m)ÚAÚentry_signalsÚexit_signalsÚround)r%   Útrr9   r>   r?   r)   r)   r*   ÚmarkN   s   
  ÿrK   c              
   C   sÂ   t  |dd¡}t|ƒ}|rt||d d d�nd }| ||d d |d d t|d d |d d  d d d	ƒt||ƒt||ƒ|rN|d	 d dkrNt||ƒnd d
œ}| p\|d	 d dk |d< |S )Nr   r,   )r3   r   r   éÿÿÿÿr   r.   r   )ÚdateÚsymbolÚopenÚcloseÚopen_to_close_pctÚbest_anyr@   Úleg2r
   Úno_trade)rF   Ú
best_trader@   rI   rK   )ÚdayÚsr%   ÚbaÚbhrS   Úlabr)   r)   r*   ÚlabelV   s   $ ýr[   c              
      s¢  dd l }| d¡ dd lm} dd lm} dd„ |D ƒ}|jddddd	dgid
d�\}\}}	|j|dd„ |D ƒddd� |j|dd„ |D ƒddd� |j|d d dddd� dD ]ž\}
}|  	|
¡‰ ˆ seqYt
‡ fdd„|D ƒƒ}t
‡ fdd„|D ƒƒ}|j|d jd d�g|d gdd|d d!d"� |j|d jd d�g|d gddd#d d!d"� |jd$|d d%›d&�d' ˆ d( d) ¡ |d jd d�|d fd*d+d,|d-� |jd.|d d%›d/ˆ d0 d1›d2�d' ˆ d3 d) ¡ |d jd d�|d fd4d+d,d#d-� qY|j| d5 › d6| d7 › d8| d9 d:›d;�| d< �rd=nd> d?d@� |jdAdB� |	j|dCd„ |D ƒdDdEd„ |D ƒdF� |	j | dG¡¡ |	jdAdB� | ¡  |j|dHdI� | ¡  d S )JNr   ÚAggc                 S   s   g | ]
}|d  j dd�‘qS )r   N©Útzinfo)Úreplace©Ú.0r(   r)   r)   r*   Ú
<listcomp>g   s    zchart.<locals>.<listcomp>r   r   )é   gš™™™™™@Úheight_ratiosr   T)ÚfigsizeÚgridspec_kwÚsharexc                 S   ó   g | ]}|d  ‘qS )r   r)   r`   r)   r)   r*   rb   i   ó    ú#1f3a5f)ÚcolorÚlwc                 S   rh   )r   r)   r`   r)   r)   r*   rb   j   ri   z#c0392bgš™™™™™ñ?r   Úgreyú:gš™™™™™é?)rk   Úlsrl   ))r@   z#16a085)rS   z#2980b9c                 3   ó$   � | ]}|d  ˆ d kr|V  qdS )r   rD   Nr)   r`   ©Úmkr)   r*   Ú	<genexpr>p   ó   €" zchart.<locals>.<genexpr>c                 3   rp   )r   rE   Nr)   r`   rq   r)   r*   rs   q   rt   r   r]   r   Ú*éª   Úblackr   )ÚmarkerrW   rk   Ú	edgecolorÚzorderú#8e44adzbuy ú.2fÚ
z, rA   Útags)é   iæÿÿÿzoffset pointsé   )ÚxytextÚ
textcoordsÚfontsizerk   zsell z (+rC   z.1fz%)
rB   )r   é   rN   ú rM   z  open->close rQ   z+.1fz%  rT   zNO GOOD TRADE (best held < 1%)z/marked best trade(s) a bot could hold (stop 1%)r   )rƒ   g333333Ó?)Úalphac                 S   rh   )r   r)   r`   r)   r)   r*   rb   }   ri   glÁlÁF?c                 S   s    g | ]}|d  dkrdnd‘qS )r   é
   r{   rj   r)   r`   r)   r)   r*   rb   }   s     )Úwidthrk   z%H:%Méi   )Údpi)Ú
matplotlibÚuseÚmatplotlib.pyplotÚpyplotÚmatplotlib.datesÚdatesÚsubplotsÚplotÚaxhlineÚgetÚnextÚscatterr_   ÚannotateÚjoinÚ	set_titleÚgridÚbarÚxaxisÚset_major_formatterÚDateFormatterÚtight_layoutÚsavefigrP   )rZ   r%   Úpathr‹   ÚpltÚmdÚtsÚfigÚaxÚaxvÚkeyÚcolÚbiÚbjr)   rq   r*   Úchartb   sH   
$
,,<ÿ2þ&ÿþ&r¬   c                 C   s‚  g g }}t t d¡ƒ}|D ]e}t t |d¡¡}|d }|d D ]L}t ||¡}|d  |i ¡ dg ¡}	|r=t	|	ƒdk r>q!t
|	|ƒ}
t	|
ƒdk rJq!t|||
ƒ}| |¡ | rm| t	|ƒdk rc||
fn|t t	|ƒ¡ ¡ q!tj ¡  qtjjd	d	d
� ttdƒ�}|D ]}| tj|td�d ¡ q„W d   ƒ n1 s�w   Y  tdd„ |D ƒƒ}t dd„ |D ƒƒ}tt	|ƒ› d|d jdd… › d|d jdd… › dt› �ƒ td|› d|t	|ƒ d d›d|t	|ƒd  d›d|t	|ƒd  d!  d›d"|t	|ƒd# d$  d›d%td&d„ |D ƒƒ› �ƒ | �r=t d'¡ t |t| t	|ƒƒ¡D ]\}}
t||
td( |d › d)|d* › d+� ƒ �q#d S d S ),Nzbars_20*.json.gzÚrtrM   Útop30_currentÚsymbolsr   éÈ   i�  T)ÚparentsÚexist_okÚw)Údefaultr}   c                 s   s   � | ]}|d  V  qdS )rT   Nr)   ©ra   r   r)   r)   r*   rs   œ   s   € zmain.<locals>.<genexpr>c                 s   s$   � | ]}|d  r|d  d V  qdS )r@   rC   Nr)   rµ   r)   r)   r*   rs   �   rt   z stock-days labeled (r   r   é   z..rL   z) -> z no good trade (best held < 1%): z (r.   z.0fz%); best held gain median r   r|   z%, 75th pct r   r   z%, 90th r   r‡   z%; two-move days c                 s   s   � | ]	}|d  rdV  qdS )rS   r   Nr)   rµ   r)   r)   r*   rs       s   € r   ÚlabelsÚ_rN   z.png)ÚsortedÚBARSÚglobÚjsonÚloadÚgziprO   ÚREFr”   r/   r+   r[   r"   ÚrandomÚ	randrangeÚ_CACHEÚclearÚOUTÚparentÚmkdirÚwriteÚdumpsÚstrÚsumÚprintÚnameÚseedÚsampleÚminr¬   ÚHERE)Ún_chartsÚlabsrÎ   ÚfilesÚpÚdrV   rW   r$   r#   r%   rZ   ÚfÚntr?   r)   r)   r*   Úmain…   sR   


,€ÿÿ>2ÿÿÿ
,ýrØ   Ú__main__r·   T)r²   z--charts)r   r   r,   r-   )r   )&Ú__doc__r¾   r¼   rÀ   Úsysr   Úpathlibr   Úzoneinfor   Ú__file__ÚresolverÅ   rÐ   ÚTRADEr¡   ÚinsertrÉ   Ú	referencer¿   Úanalyze_tradesrF   r   rº   rÄ   r1   r2   r+   r@   rK   r[   r¬   rØ   Ú__name__rÆ   ÚargvÚintÚindexr)   r)   r)   r*   Ú<module>   s:    

#"0þ