o
    Ö™¹jL  ã                   @   sŒ   d Z ddlZddlZddlZej de dd¡d ¡ ddl	Z
dd„ e edƒ¡D ƒZg d¢Zd	d
„ Zdd„ Zdd„ ZedkrDeƒ  dS dS )aâ  
separation.py -- [2026-09-27] Which values, at the moment of a pick,
separate picks that went on to rise (to 15:55) from picks that fell?
Pick-time indicators (entry_rules snapshot) + what was known at 9:28.
AUC = chance a random winning pick has a HIGHER value than a random losing
pick (0.50 = no separation; 0.60+ / 0.40- worth a look). Checked on both
halves of the days so a one-period fluke doesn't pass.
Usage: python3 sim/analysis/separation.py data/simulations/<run>.json
é    Nú/é   c                 C   s   i | ]}|d  |d f|“qS )ÚdateÚsymbol© )Ú.0Úrr   r   ú3/var/www/screener/trade1/sim/analysis/separation.pyÚ
<dictcomp>   s    r
   z@/var/www/screener/trade/reports/open_window/winner_features.json)ÚpriceÚscoreÚrvolÚ	pm_volumeÚgap_pctÚpm_strength_pctÚdist_to_resistance_pctÚdaily_atr_pctÚopen_vs_20d_high_pctÚopen_vs_prev_high_pctÚpos_in_5d_rangeÚprev_day_chg_pctÚ
chg_5d_pctÚdays_on_list_beforec              
   C   s  | d d }t  | |¡}| d¡pi }| dd„ | ¡ D ƒ¡ |j| d¡| d¡| d¡| d	¡| d
¡d u r:d nt|d
 ƒt| d¡dkƒd� t || d fi ¡}tD ]}| |¡|d| < qVdD ]}| |¡d u rod nt|| ƒ|d| < qd| dd ¡ |S )NÚplanÚ
indicatorsÚ	vas_partsc                 S   s   i | ]	\}}d | |“qS )Úvas_r   )r   ÚkÚvr   r   r	   r
      s    zfeatures.<locals>.<dictcomp>Úvolume_pressureÚprojected_rvolÚaccel_momentumÚ
trades_30sÚ	ema_stackÚ
trend_3barÚACCELERATING)r   r    r!   r"   r#   Útrend_acceleratingr   Ú928_)Úbig_winner_beforeÚon_list_prev_day)	ÚPÚflatÚgetÚupdateÚitemsÚfloatÚWFÚMORNINGÚpop)ÚtÚdayÚiÚfÚpartsÚwr   r   r   r	   Úfeatures   s    ý(r9   c                    s,  | r|sd S t dd„ | D ƒdd„ |D ƒ ƒ‰ ddg }}}|tˆ ƒk rw|}|tˆ ƒk rNˆ | d ˆ | d krN|d7 }|tˆ ƒk rNˆ | d ˆ | d ks8|| ||  d d ‰|‡ ‡fdd„t||ƒD ƒ7 }||| 7 }|}|tˆ ƒk s$tdd	„ |D ƒƒ}|t| ƒt| ƒd  d  t| ƒt|ƒ  S )
Nc                 S   ó   g | ]}|d f‘qS ©r   r   ©r   Úxr   r   r	   Ú
<listcomp>-   ó    zauc.<locals>.<listcomp>c                 S   r:   )r   r   r<   r   r   r	   r>   -   r?   r   r   é   c                    s   g | ]
}ˆˆ | d  f‘qS r;   r   )r   r   ©Úallvr   r   r	   r>   4   s    c                 s   s   � | ]	\}}|r|V  qd S ©Nr   )r   r   Úlabr   r   r	   Ú	<genexpr>7   ó   € zauc.<locals>.<genexpr>)ÚsortedÚlenÚrangeÚsum)ÚaÚbÚrankr5   ÚranksÚjÚsar   rA   r	   Úauc*   s     $$ÿù,rQ   c                     s˜  t  ttjd ƒ¡} t| d ƒ}t|d t|ƒd … ƒ‰ g ‰|D ]}| d | d D ]}ˆ ||d dk|d t	||ƒf¡ q*q tdd	„ ˆD ƒƒ}g }|D ]X‰‡‡fd
d„}|dd„ ƒ\}}|‡ fdd„ƒ\}	}
|‡ fdd„ƒ\}}t
||ƒt
|	|
ƒt
||ƒ}}}|d u rˆqM| t|d ƒˆ|||t |¡t |¡t|ƒt|ƒ f¡ qM|jdd� ttˆƒ› dtdd„ ˆD ƒƒ› dtdd„ ˆD ƒƒ› d�ƒ tdd›dd›dd›dd›d d!›d"d!›d#d$›�ƒ |D ]P\}‰}}}}}}|�r|�r|d |d  dk�rtt|d ƒt|d ƒƒd%k�rd&nd'}tˆd›|d(›|�pdd)›|�p$dd)›|d*›|d*›|d+›|› �ƒ qät  d,d-„ ˆD ƒttjd  d.d/¡d0ƒ¡ d S )1Nr   Údaysr@   ÚtradesÚ
pl_dollarsr   Úpl_pctc                 S   s    h | ]�^ }}|D ]}|’q	qS r   r   )r   Ú_r6   r   r   r   r	   Ú	<setcomp>C   ó     zmain.<locals>.<setcomp>c                    s0   ‡‡ fdd„ˆD ƒ}‡‡ fdd„ˆD ƒ}||fS )Nc                    s<   g | ]\}}}}|rˆ|ƒrt | ˆ ¡ttfƒr|ˆ  ‘qS r   ©Ú
isinstancer,   Úintr/   ©r   ÚdÚokr   r6   ©r   Úselr   r	   r>   G   ó   < z'main.<locals>.split.<locals>.<listcomp>c                    s<   g | ]\}}}}|sˆ|ƒrt | ˆ ¡ttfƒr|ˆ  ‘qS r   rY   r\   r_   r   r	   r>   H   ra   r   )r`   rK   rL   )r   Úrows)r`   r	   ÚsplitF   s   zmain.<locals>.splitc                 S   s   dS )NTr   ©r]   r   r   r	   Ú<lambda>J   s    zmain.<locals>.<lambda>c                    s   | ˆ v S rC   r   rd   ©Úhalfr   r	   re   K   ó    c                    s   | ˆ vS rC   r   rd   rf   r   r	   re   L   rh   g      à?T)Úreversez picks (c                 s   s   � | ]^}}}|V  qd S rC   r   ©r   rV   r^   r   r   r	   rE   R   s   € zmain.<locals>.<genexpr>z rose, c                 s   s   � | ]	^}}}| V  qd S rC   r   rj   r   r   r	   rE   R   rF   z fell)
ÚvalueÚ30ÚAUCz>6z1st halfz>9z2nd halfzmedian rosez>13zmedian fellÚnz>5gš™™™™™©?z  <- consistentÚ z6.2fz9.2fz13.3fÚ5c                 S   s    g | ]\}}}}||||f‘qS r   r   r\   r   r   r	   r>   W   rX   zmain.<locals>.<listcomp>z.jsonz_features.jsonr8   )ÚjsonÚloadÚopenÚsysÚargvrG   ÚsetrH   Úappendr9   rQ   ÚabsÚstÚmedianÚsortÚprintrJ   ÚminÚdumpÚreplace)ÚresrR   r]   r3   ÚkeysÚoutrc   rK   rL   Úa1Úb1Úa2Úb2ÚAÚA1ÚA2rV   ÚmaÚmbrn   Úflagr   )rg   r   rb   r	   Úmain;   s4   &ÿ"<:2JD.r�   Ú__main__)Ú__doc__rq   Ú
statisticsry   rt   ÚpathÚinsertÚ__file__ÚrsplitÚpick_reportr*   rr   rs   r0   r1   r9   rQ   r�   Ú__name__r   r   r   r	   Ú<module>   s     	
ÿ
ÿ