a
    Gÿj  ã                   @   s  d Z ddlZddlZddlZddlmZ d\ZZdd„ Zee	ƒZ
ee d¡ƒD ]FZe eedd	�¡D ].Zed
 ed ed ed fZe
e  e¡ qdqNdd„ Zdd„ Zg Zg ZdZdZe
 ¡ D �]ø\ZZeeƒZesÖq¾e\ZZe dd¡Zedvrôq¾edk�r4eed ƒZeed ƒZ edkZ!edkZ"eed ƒZ#n4eed ƒZeed ƒZ edkZ!edkZ"eed ƒZ#e�r‚edk�s‚edk�rŒed7 Znbde e Z$e#�r¸e%e#e$ de#  e$ dƒndZ&e'e'd e& d ƒd! d"ƒZ(e(d#k�rîe e(ee!f¡ e du �se dk�red7 Zq¾de  Z)e)dk�s(e)dk�r2ed7 Zq¾dedk�rJeed ƒn
eed ƒ Z*de) e) Z+e*�r„e%e*e+ de*  e+ dƒndZ,e'e'd e, d ƒd! d"ƒZ-e-d#kr¾e e-e)e"f¡ q¾d$d%„ Z.e/d&ƒ e/d'e0eƒ› d(e0eƒ› �ƒ e/d)e› d*e› �ƒ e.d+eƒ e.d,eƒ dS )-u8  
Reconstruct, at SIGNAL-TIME (entry) prices from live_data snapshots:
  (A) Original strategy: YES on the signal side (the team B365 CLV favors).
  (B) NO-opponent: NO on the team we did NOT pick (the favorite).
Both priced at the FIRST PRE snapshot where the B365 CLV signal crossed
threshold (the moment the original bet would have fired) â€” not closing prices.

Signal definition mirrors daily_signals.scan_fixtures:
  away fires if 0.05 <= clv_b365_away < 0.12
  home fires if 0.05 <= clv_b365_home < 0.12
  if both fire on same snapshot -> keep higher-CLV side.
é    N)Údefaultdict)gš™™™™™©?g¸…ëQ¸¾?c                 C   s   z
t | ƒW S    Y d S 0 d S ©N)Úfloat©Úx© r   ú/E:\soccer\misc\archive\no_fav_entry_backtest.pyÚf   s    r	   zlive_data/*.csvzutf-8)ÚencodingZ	game_dateZleagueÚhomeZawayc                 C   s    | d uot |   kotk S   S r   )ÚEDGE_LOÚEDGE_HIr   r   r   r   Úin_band   s    r   c                 C   sÜ   dd„ | D ƒ} | j dd„ d� | D ]´}t|d ƒ}t|d ƒ}t|d ƒ}t|d	 ƒ}g }t|ƒsjt|ƒr†| d
t|pxd|p~dƒf¡ t|ƒs–t|ƒr²| dt|p¤d|pªdƒf¡ |s¸q"t|dd„ d�d }||f  S dS )zØReturn (side, entry_row) for first PRE snapshot where signal fires, else None.
    Fires on EITHER B365 or Kalshi CLV in [0.05,0.12). Dedupe both-sides to higher CLV
    (max of the two books, matching live_monitor).c                 S   s   g | ]}|d  dkr|‘qS )ZstatusZPREr   )Ú.0Úrr   r   r   Ú
<listcomp>$   ó    zfind_entry.<locals>.<listcomp>c                 S   s   | d S )NZ	timestampr   )r   r   r   r   Ú<lambda>%   r   zfind_entry.<locals>.<lambda>)ÚkeyZclv_b365_awayZclv_kalshi_awayZclv_b365_homeZclv_kalshi_homeÚAwayi÷ÿÿÿZHomec                 S   s   | d S )Né   r   r   r   r   r   r   0   r   r   N)Úsortr	   r   ÚappendÚmax)Úrowsr   ZbaZkaZbhZkhZfiresÚsider   r   r   Ú
find_entry    s    r   ÚftrÚ )ÚHÚDÚAr   Zkalshi_away_askZkalshi_home_bidr!   r   Zpin_fair_awayZkalshi_home_askZkalshi_away_bidZpin_fair_homeg®Gáz®ï?r   g      Ð?g     @�@g      @g      ð?c                 C   s2  t |ƒ}tdd„ |D ƒƒ}d}d}d}|D ]L\}}}	||7 }|	rV||d|  | 7 }n||8 }||| d|  | 7 }q*|dkrŽ|t |¡ nd}
|r¢|| d nd}|rÀtdd„ |D ƒƒ| nd}td| › �ƒ td	|› d
|| d d›d|d›�ƒ td|d›d|d›d|d›�ƒ td|
d›�ƒ |
||fS )Nc                 s   s   | ]\}}}|rd V  qdS )r   Nr   ©r   ÚsÚpÚwr   r   r   Ú	<genexpr>m   r   zsummarize.<locals>.<genexpr>g        r   r   éd   c                 s   s   | ]\}}}|V  qd S r   r   r"   r   r   r   r&   v   r   Ú
z  n=z  WR=z.1fz%  staked=$z.0fz  P&L=$z+.2fz  ROI=z+.1fz%  avg entry price=z.3fz  Z (ask-as-fair H0) = z.2f)ÚlenÚsumÚmathZsqrtÚprint)ÚnameZbetsÚnZwinsZpnlÚvarZstakedr#   r$   r%   ÚzZroiZ	avg_pricer   r   r   Ú	summarizek   s     & r1   z@================================================================z-Signal games with valid entry snapshot: orig=z nofav=zSkipped (no YES price): z   (no NO price): u/   (A) ORIGINAL â€” YES on signal side @ entry asku2   (B) NO-OPPONENT â€” NO on favorite @ entry (1-bid))1Ú__doc__ZcsvZglobr+   Úcollectionsr   r   r   r	   ÚlistZgamesÚsortedÚfnZ
DictReaderÚopenÚrowr   r   r   r   ZorigZnofavZskipped_nopriceZskipped_nofav_priceÚitemsr   Úresr   r   Úgetr   Zyes_askZopp_bidZyes_wonZno_wonZp_winÚbr   ZkfÚminZstakeZno_askZp_noZbnZkfnZstake_nr1   r,   r)   r   r   r   r   Ú<module>   st   

$


&$
