o
    ‰9Àj½  ã                   @   s¾   d Z ddlZddlZddlZddlmZ ddlZeeƒ 	¡ j
Zej deeƒ¡ ej dd¡ ddlZddlZddlZd\ZZZZZZddd„Zdd	„ Zd
d„ Zedkr]eejd ƒ dS dS )aÃ  
sf4_batch.py -- [2026-10-02] STAR FOLLOW, WINNERS vs LOSERS (the user's design): winners and losers
stay separate; every minute the stock is compared with the closest days of BOTH:
  share    = % winners among the 150 closest days of the whole playbook (winners + losers)
  BUY      when the WINNERS' buy signal shows (reference buys among the 150 closest winners in the
           last 5 min >= max(6, 2 x normal)) AND the stock looks more like winners -> buy;
           otherwise wait and check again the next minute
  SELL     as soon as it looks more like losers (2 minutes in a row), or the winners' sell signal,
           or 15:55
  variants: "majority"  more like winners = share >= 50%
            "normal"    more like winners = share >= the playbook's normal winner share (~28%)
Features: lib_v2 (price, VWAP, volume, SPY, IWM, gap). Only days before the traded day. 0.1% cost.
    python3 sf4_batch.py 2026-08-27..2026-10-01          (all variants)
é    N)ÚPathz/var/www/screener/trade)é–   é   é   g       @gš™™™™™¹?é   c
                     sv  t  ˆ j|k ¡d }
ˆ j|
 }||
 }t  |¡d }‡ fdd„|
D ƒ}t  t|
ƒ¡}|dkr0dn|}d g d}}}tddƒD �],}||d d …|d d …f |d d |d d …f  d  d	¡7 }|d
k rdq?t  |t	¡d t	… }t
||  ¡ ƒ}|t  || t	¡d t	…  }|t d	 }d }}|D ]3}| || d¡D ](\}}||  kr¨|kr®n n|d	7 }||k rÂ||  kr¼|krÂn qš|d	7 }qšq�|d u �r|dk�r
|	d u s×|	|ƒ�r
|ttt||  ƒk�r
||k�r|d	 t
|d |d	  ƒt
|d |d	  ƒ|d|dœ}d}n|d	7 }q?t|d t
|d | ƒƒ|d< ||k �r%|d d	 nd|d< d }|d tk�r:d|d›d�}n|ttt||  ƒk�rHd}|�rl| |d |d |d	 t
|d |d	  ƒ||d |d dœ¡ d }q?|�r‹| |d |d dt
|d d ƒd|d |d dœ¡ |D ]+}|d |d  d	 d t |d< |d |d  d	 d |d< |d  |d  |d!< �q�|S )"Nr   c                    s   g | ]}ˆ j | ‘qS © )Úkeys)Ú.0Úi©Úlibr   ú5/var/www/screener/trade/reports/playbook/sf4_batch.pyÚ
<listcomp>#   s    zrun_day.<locals>.<listcomp>Úmajorityg      à?i�  ÚFr   é   r   r   iY  ÚO)Úbuy_mÚbuyÚlowÚ	share_buyÚoutÚwaitedr   ÚLr   zlooks more like losers (ú.0%z	 winners)zwinners' sell signalr   r   r   )r   r   Úsell_mÚsellÚwhyr   r   ÚCz15:55r   éd   ÚplÚddr   Úheld)ÚnpÚwhereÚdatesr   ÚzerosÚlenÚrangeÚsumÚargpartitionÚKÚfloatÚmeanÚWINÚgetÚmaxÚMIN_NÚRATIOÚminÚOUT_MINÚappendÚCOST) r   ÚwmaskÚmarksÚnbÚnsÚdayÚaÚruleÚbaseÚcan_buyÚokÚsubÚiswÚwidxr   ÚDÚneedÚposÚtradesÚwaitÚmÚallkÚshareÚwkÚw0ÚbuysÚsellsr
   ÚbmÚsmr   Útr   r   r   Úrun_day   sn   : €ü
4
*ÿ(ÿ€ ÿ rS   c                    sÂ  |st d| › d�ƒ d S t dd„ |D ƒ¡}|r |t|ƒd  nd‰ t ‡ fdd„|D ƒ¡}i }|D ]}| | dd¡d	¡|d
  || dd¡< q2t d| › dt|ƒ› d|d	k ¡ d›d| ¡ d›dt |¡d›d| ¡ d›d||  ¡ d›d||   ¡ d›dtdd„ | ¡ D ƒƒ› dt|ƒ› d| 	¡ d›dt
t dd„ |D ƒ¡ƒ› d�ƒ tdd„ |D ƒƒD ]/‰t ‡fdd„|D ƒ¡}t d ˆ› d!t|ƒ› d|d	k ¡ d›d| ¡ d›d| ¡ d›d"�ƒ q¯d S )#Nz
== z
: 0 tradesc                 S   ó   g | ]}|d  ‘qS )r    r   ©r	   rR   r   r   r   r   W   ó    zreport.<locals>.<listcomp>r   Ú c                    s   g | ]
}|  d d¡ˆ k ‘qS )r;   rW   )r/   rU   )Úhalfr   r   r   X   s    r;   r   r    z: z trades, win r   z, avg z+.2fz
%, median z%, sum z+.1fz
% (halves z% / z%), positive days c                 s   s   � | ]}|d kV  qdS )r   Nr   )r	   Úvr   r   r   Ú	<genexpr>]   s   € zreport.<locals>.<genexpr>ú/z, worst z%, median held c                 S   rT   )r"   r   rU   r   r   r   r   ^   rV   z minc                 S   s   h | ]}|d    d¡d ’qS )r   ú (r   ©ÚsplitrU   r   r   r   Ú	<setcomp>_   s    zreport.<locals>.<setcomp>c                    s*   g | ]}|d    d¡d ˆ kr|d ‘qS )r   r\   r   r    r]   rU   )Úwr   r   r   `   s   * z	   exit 'z': ú%)Úprintr#   Úarrayr'   r/   r-   Úmedianr)   Úvaluesr3   ÚintÚsorted)ÚnameÚTÚdaysÚpÚhÚbydrR   Úqr   )rX   r`   r   ÚreportT   s4   ,*>ÿÿÿÿÿþ
þDþro   c                    sì  |   d¡\‰ ‰t ¡ }t ¡ ‰t ‡fdd„|jD ƒ¡}t| 	¡ ƒ}t 
ˆ¡\}}tdt|jƒ› dt| ¡ ƒ› d|d›d�d	d
� t‡ ‡fdd„|jD ƒƒ}g g dœ}|D ]h‰t t tjdˆ› d� d¡¡}|d D ]=‰tj ˆˆ¡}	|	swqkt |d ˆ d |	ˆ¡}
|
d u r‰qk|D ]}||  ‡‡fdd„t||ˆ||ˆ|
||ƒ	D ƒ7  < q‹qktjj ¡  tˆdd„ | ¡ D ƒd	d
� qUtj|ttdˆ › dˆ› d� dƒtd� | ¡ D ]\}}t| ¡ › d|dkrædnd|d›d�› d �||ƒ qÖd S )!Nz..c                    s   g | ]}|ˆ v ‘qS r   r   ©r	   Úk)r8   r   r   r   h   rV   zmain.<locals>.<listcomp>z
playbook: z days, winners r\   r   z = normal winner share)T)Úflushc                    s<   h | ]}ˆ |  d ¡d   krˆkrn n|  d ¡d ’qS )ú|r   r]   rp   )Úa_Úb_r   r   r_   l   s   < zmain.<locals>.<setcomp>)r   ÚnormalÚbars_z.json.gzÚrtÚtop30_currentÚsymbolsÚbarsc                    s   g | ]	}ˆ ˆd œ|¥‘qS ))r;   Úsymr   rU   )r;   Úsr   r   r   x   ó    c                 S   s   i | ]	\}}|t |ƒ“qS r   )r'   )r	   ÚrrY   r   r   r   Ú
<dictcomp>z   r~   zmain.<locals>.<dictcomp>Ú
sf4_batch_Ú_z.jsonr`   )Údefaultr   z>= 50% winnersz
>= normal z winnersú))r^   ÚL2ÚLibÚS3Úloadr#   rc   r   r,   r-   Únormal_ratesrb   r'   rf   r)   rg   ÚjsonÚgzipÚopenÚRTÚBARSÚREFÚ
day_arraysrS   Ú_CACHEÚclearÚitemsÚdumpÚHEREro   Úupper)Úrngr   r7   r>   r9   r:   rj   ÚresÚdÚrefr<   r=   ri   r   )rt   ru   r;   r8   r}   r   Úmaind   s6   0
 6ÿ(4ÿr›   Ú__main__r   )N) Ú__doc__r‹   rŠ   ÚsysÚpathlibr   Únumpyr#   Ú__file__ÚresolveÚparentr•   ÚpathÚinsertÚstrÚlib_v2r…   Ú	sf3_batchr‡   Úreference_traderr�   r+   r.   r1   r2   r6   r4   rS   ro   r›   Ú__name__Úargvr   r   r   r   Ú<module>   s$     
5ÿ