o
    EÇ·j¨  ã                	   @   sø   d Z ddlZddlZddlZddlmZ ddlmZmZ ddlm	Z	 e	e
ƒ ¡ jZej deejd ƒ¡ ddlZejZe	dƒZdd	„ Zd
d„ Zddd„Zdd„ dd„ dd„ dd„ dd„ dd„ dd„ dd„ dœZddd„Zdd„ Zedkrzeƒ  dS dS ) a¨  
shadow_analysis.py

[2026-09-26] Labels the shadow snapshots from the bar and tick simulations
with outcomes (shadow_outcomes.label_file) and checks whether the proposed
entry_rules features separate good entries from bad ones:

  A. ENTRY snapshots joined to the simulated trade's real P/L
  B. every decision-change snapshot with a plan stop/target: target-before-
     stop rate and 30/60-minute return, by feature band
é    N)Údefaultdict)ÚdatetimeÚtimezone)ÚPathé   zU/tmp/claude-0/-var-www-screener-trade/5844eef7-c648-46de-a03c-fe0b1434b640/scratchpadc                     s   i ‰ ‡ fdd„} | S )Nc                    sp   |  ¡ }|ˆ vr%td d|› d� }| ¡ r!t t |d¡¡d ni ˆ |< ˆ |  | i ¡ dg ¡}dd„ |D ƒS )NÚbarsÚbars_z.json.gzÚrtÚsymbolsc              	   S   s>   g | ]}t  |d  t¡|d |d |d |d |d dœ‘qS )r   r   é   é   é   é   )ÚtÚoÚhÚlÚcÚv)r   ÚfromtimestampÚUTC)Ú.0Úb© r   ú>/var/www/screener/trade/reports/open_window/shadow_analysis.pyÚ
<listcomp>$   s    6ÿz0bar_source.<locals>.bars_for.<locals>.<listcomp>)Ú	isoformatÚHEREÚexistsÚjsonÚloadÚgzipÚopenÚget)ÚsymbolÚdÚkeyÚpÚbl©Úcacher   r   Úbars_for   s   &ÿzbar_source.<locals>.bars_forr   )r+   r   r)   r   Ú
bar_source   s   r,   c           	      C   s´   i i }}t t| ƒ d¡ƒD ]G}|j d¡rq| d¡}| ¡ s&t ||¡ t	|ƒD ]}t
 |¡}| d¡dkrBd|v rB|||d < q*t	|ƒD ]}t
 |¡}|||d < qGq||fS )Nzshadow_entry_*.jsonlz.outcomes.jsonlÚtypeÚsnapshotÚvasÚid)Úsortedr   ÚglobÚnameÚendswithÚwith_suffixr   ÚsoÚ
label_filer"   r   Úloadsr#   )	Údirpathr+   ÚsnapsÚoutsÚfÚofr   Úrr   r   r   r   r    )   s"   


€
þr    ú{:g}c                 C   sr   | d u rdS t ||dd … ƒD ]\}}||   kr|k r.n q| |¡› d| |¡› �  S qd| |d ¡› �S )Nzn/ar   z..z>=éÿÿÿÿ)ÚzipÚformat)r   ÚedgesÚfmtÚar   r   r   r   Úband;   s   ÿrF   c                 C   ó   t | d d g d¢ƒS )Nr/   Úscore)r   r   é   é   g…ëQ¸$@©rF   ©Úsr   r   r   Ú<lambda>E   ó    rN   c                 C   ó   | d d S )NÚshadowÚdecisionr   rL   r   r   r   rN   F   ó    c                 C   sD   dd„ | d d   ¡ D ƒsd S ttdd„ | d d   ¡ D ƒƒdkƒS )Nc                 S   s   g | ]}|d ur|‘qS ©Nr   ©r   Úxr   r   r   r   G   s    z<lambda>.<locals>.<listcomp>ÚcontextÚrel_strength_pctc                 s   s   � | ]	}|d ur|V  qd S rT   r   rU   r   r   r   Ú	<genexpr>H   s   € ÿÿz<lambda>.<locals>.<genexpr>r   )ÚvaluesÚstrÚminrL   r   r   r   rN   G   s    ÿc                 C   rP   )NÚvolumeÚ
trend_3barr   rL   r   r   r   rN   J   rS   c                 C   rG   )Nr]   Úbar_rvol)r   g      è?r   g      ø?r   rK   rL   r   r   r   rN   K   rO   c                 C   rG   )NrW   Úprice_vs_vwap_pct)i�ÿÿÿr   r   r   r   rK   rL   r   r   r   rN   L   rO   c                 C   rG   )NÚflowÚ	imbalance)g)\�Âõ(ð¿gš™™™™™¹¿gš™™™™™¹?g333333Ó?g333333ã?rK   rL   r   r   r   rN   M   rO   c                 C   rG   )Nra   Ú
spread_pct)r   gš™™™™™É?g      à?r   rK   rL   r   r   r   rN   N   rO   )z	VAS scorezshadow verdictzbeats SPY & IWMz3-bar volume trendzbar RVOLzprice vs VWAP %zimbalance (ticks)zspread % (ticks)c                    sr  t d| › dt|ƒ› d�ƒ |d ur‘dd„ | ¡ D ƒ}g }|D ]!‰t ˆd ¡‰t‡‡fdd„|D ƒd ƒ}|r?| ˆ|d	 f¡ qt d
t|ƒ› dtdd„ |D ƒƒd›d�ƒ t 	¡ D ]7\}}t
tƒ}	|D ]\‰}
|	|ˆƒ  |
¡ qct|	ƒdkr�t d|d›d�d dd„ t|	 	¡ td�D ƒ¡ ƒ qY‡ fdd„| 	¡ D ƒ}t dt|ƒ› d�ƒ t 	¡ D ]Œ\}}t
tƒ}	|D ]\‰}|	|ˆƒ  |¡ q´t|	ƒdk�r6g }t|	 	¡ td�D ]T\}}tdd„ |D ƒƒ}tdd„ |D ƒƒ}dd„ |D ƒ}| |�r|› dt|ƒ› d|t|ƒ d d›d |t|ƒ d d›d!t|ƒt|ƒ d›d"�
n|› dt|ƒ› �¡ qÓt d|d›d�d |¡ ƒ qªd S )#Nz
==== z: z
 snapshotsc                 S   s   g | ]
}|d  dkr|‘qS )ÚeventÚENTRYr   )r   rM   r   r   r   r   V   s    zreport.<locals>.<listcomp>Útsc                 3   sB   � | ]}|d  ˆ d  krt t |d ¡ˆ  ¡ ƒdkr|V  qdS )r$   Ú
entry_timeé–   N)Úabsr   ÚfromisoformatÚtotal_seconds)r   r   )rM   Út0r   r   rY   Z   s   € ÿÿzreport.<locals>.<genexpr>Úplz-- A. z% entries joined to trade P/L (total $c                 s   s   � | ]\}}|V  qd S rT   r   )r   Ú_r'   r   r   r   rY   ^   ó   € z+.2fú)r   z   Ú20ú z | c              	   s   sT   � | ]%\}}|› d t |ƒ› dtdd„ |D ƒƒt |ƒ d d›dt|ƒd›�V  qdS )	ú: n=z win c                 s   s   � | ]}|d kV  qdS )r   Nr   rU   r   r   r   rY   d   ro   z#report.<locals>.<genexpr>.<genexpr>éd   ú.0fz% $z+.0fN)ÚlenÚsum)r   Úkr   r   r   r   rY   d   s   € 2ÿÿ)r&   c                    s2   g | ]\}}|ˆ v rˆ |   d ¡r|ˆ | f‘qS )Úplan_result©r#   )r   ÚirM   )r;   r   r   r   g   s   2 z-- B. z" snapshots with a plan stop/targetc                 s   ó   � | ]	}|d  dkV  qdS )ry   ÚtargetNr   ©r   r   r   r   r   rY   p   ó   € c                 s   r|   )ry   ÚstopNr   r~   r   r   r   rY   p   r   c                 S   s,   g | ]}|d    d¡dur|d    d¡‘qS )Úreturns_pctÚ3600Nrz   r~   r   r   r   r   q   s   , rs   z target rt   ru   z% stop z% 60m ú%)Úprintrv   rZ   r   rj   ÚnextÚappendrw   ÚFEATURESÚitemsr   ÚlistÚjoinr1   r[   )Útitler:   r;   ÚtradesÚentÚrowsÚtrr3   r<   Úgr'   r   Úpartsrx   r   ÚhitÚstpÚr60r   )r;   rM   rl   r   ÚreportR   sV   ÿ€*ÿ€$<ÿÿÿ€õr•   c            	      C   s  t ƒ } dD ];}td d|› d� }| ¡ sqt|| ƒ\}}t ttd |› d� ƒ¡}dd„ |d  ¡ D ƒ}td	|› �|||ƒ qtd
 }| ¡ rt|t	j
ƒ\}}g }ttdƒ d¡ƒD ]}t t|ƒ¡d D ]}|d |d< | |¡ qgq\td|||ƒ d S d S )N)ÚJÚAÚHÚresultsÚshadow_Ú_currentz_current.jsonc                 S   s   g | ]	}|D ]}|‘qqS r   r   )r   r�   r   r   r   r   r      s    zmain.<locals>.<listcomp>Údaysz20-day bars, setup Úshadow_tickz(/var/www/screener/trade/data/simulationsz.2026-09-*_sim_maxpos5_*_rr20_*_ext_msk25*.jsonrŒ   Ú
pl_dollarsrm   z9Tick replay 9/18-9/25, setup J (full order-flow features))r,   r   r   r    r   r"   rZ   r•   ÚSCRATCHr6   Úalpaca_bars_forr1   r   r2   r†   )	Úbfr   r%   r:   r;   ÚresrŒ   r<   r   r   r   r   Úmainw   s&   ÿúr£   Ú__main__)r?   rT   )Ú__doc__r!   r   ÚsysÚcollectionsr   r   r   Úpathlibr   Ú__file__ÚresolveÚparentr   ÚpathÚinsertr[   ÚparentsÚshadow_outcomesr6   Úutcr   rŸ   r,   r    rF   r‡   r•   r£   Ú__name__r   r   r   r   Ú<module>   s:    

ö
%
ÿ