a
    àÇAje  ã                   @   sž   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ZdZ	g d¢Z
dd	„ Zd
d„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zedkršeƒ  dS )a¢  
Pressure-test the surviving "unique-bet" OOS result before trusting it:
  1. Split-point robustness: re-run the train/test at split = 0.4,0.5,0.6,0.7 and
     also a LAST-40%-only test, to see if the held-out edge depends on where we cut.
  2. Concentration: in the TEST half, how many distinct game-DATES and LEAGUES do the
     unique WINS come from? (a +81% driven by 3 wins on one day = noise, per prior
     round-robin/BSA lessons.)
  3. Leave-one-day-out on the full unique set: drop each game-date, recompute z, report
     the biggest single-day swing (fragility check).
Multiplicative de-vig, [0.05,0.12), shared-price fixtures, Kalshi@ask / Poly@mid.
Read-only.
é    N)Údatetime)ÚdefaultdictzE:\soccer\poly_backfill)gš™™™™™©?g¸…ëQ¸¾?)z%Y-%m-%d %H:%M:%Sz%m/%d/%Y %H:%Mz%m/%d/%Y %H:%M:%Sz%Y-%m-%d %H:%Mc              
   C   s8   t D ].}zt | |¡W   S  ttfy0   Y q0 qd S ©N)Ú_FMTSr   ÚstrptimeÚ
ValueErrorÚ	TypeError)ÚsÚf© r   ú/E:\soccer\research\kalshi_poly_unique_robust.pyÚ_pts   s    r   c              	   C   s(   z
t | ƒW S  ttfy"   Y d S 0 d S r   )Úfloatr   r   )Úxr   r   r   Ú_f   s    r   c                 C   s8   t | ƒD ]*}| d¡pd ¡  ¡ }|dv r|  S qd S )NÚftrÚ )ÚHÚDÚA)ÚreversedÚgetÚupperÚstrip)ÚrowsÚrÚvr   r   r   Ú_result   s    r   c                    s(   dd„ | D ƒ}t |ƒ‰ ‡ fdd„|D ƒS )Nc                 S   s   g | ]}d | ‘qS )g      ð?r   )Ú.0r   r   r   r   Ú
<listcomp>"   ó    zfair_mult.<locals>.<listcomp>c                    s   g | ]}|ˆ  ‘qS r   r   )r   Zri©r	   r   r   r   "   r    )Úsum)Úor   r   r!   r   Ú	fair_mult!   s    r$   c               
   C   s  t tƒ} t tj td¡¡D ]p}t|ddd��N}t 	|¡D ]2}| | 
d¡| 
d¡| 
d¡| 
d¡f  |¡ q:W d   ƒ q1 s‚0    Y  qg }|  ¡ D ]l\}}|\}}}	}
|s´qštd	d
„ |D ƒdd„ d�}|sÔqšt|ƒ}|d u ræqš| t|||dd
„ |D ƒd�¡ qš|jdd„ d� |S )Nz*_polybackfill.csvr   zutf-8)ÚnewlineÚencodingZ	game_dateÚleagueÚhomeÚawayc                 S   s>   g | ]6}|  d ¡pd ¡ dkrt|d ƒrt|d ƒ|f‘qS )Zstatusr   ZPREZ	timestamp)r   r   r   )r   r   r   r   r   r   /   s   "ÿzload.<locals>.<listcomp>c                 S   s   | d S ©Nr   r   ©Útr   r   r   Ú<lambda>1   r    zload.<locals>.<lambda>©Úkeyc                 S   s   g | ]\}}|‘qS r   r   )r   Ú_r   r   r   r   r   5   r    )Úgdr'   r   Úprec                 S   s   | d S ©Nr1   r   )r
   r   r   r   r-   6   r    )r   ÚlistÚglobÚosÚpathÚjoinÚDIRÚopenÚcsvZ
DictReaderr   ÚappendÚitemsÚsortedr   ÚdictÚsort)Zfixturesr7   Zfhr   Úfxr/   r   r1   r'   r(   r)   r2   r   r   r   r   Úload$   s,    ÿÿ&þ
"rB   c                 C   sè  g }d}dD �]ž\}}| d D �]Š}t | d¡ƒt | d¡ƒt | d¡ƒ  }}}	d |||	fv s|dkr|dkr|	dkszq|dkr°t | d	|› d
�¡ƒ}
t | d	|› d�¡ƒ}nt | d|› d�¡ƒ}
|
}|
d u s|d u sd|
  k rîdk rn qd|  k �r
dk �sq qd}t|||	fƒ| }|�r6||
 | nd }|d u std |  k�rbtd k �sfq q| d dk�r~|dk�p’| d dk�o’|dk}| ||||f¡  qqq|�s¼d |fS t|dd„ d�\}}}}t||||d�|fS )NF))r(   r   )r)   é   r2   Zpin_homeZpin_drawZpin_awayé   ÚkalshiZkalshi_Z_midZ_askZpoly_Z_pricer   Tr   r   r(   r   r)   c                 S   s   | d S r*   r   r+   r   r   r   r-   K   r    zfire.<locals>.<lambda>r.   )ÚsideÚpxÚwonÚclv)r   r   r$   ÚBANDr<   Úmaxr?   )rA   ÚbookZcandsZhaverF   Zsidxr   ÚphZpd_ZpaZmidrG   ZpfrI   rH   r   r   r   Úfire9   s$    .(.D,.rN   c                 C   s¬   t | ƒ}|sd S tdd„ | D ƒƒ}tdd„ | D ƒƒ}tdd„ | D ƒƒ}tdd„ | D ƒƒ}|dkrr|| t |¡ nd}t||| d || d |d	t |t d
¡ ¡ d�S )Nc                 s   s   | ]}|d  V  qdS )rH   Nr   ©r   Úbr   r   r   Ú	<genexpr>Q   r    zstat.<locals>.<genexpr>c                 s   s.   | ]&}|d  r"d|d  |d  ndV  qdS )rH   rD   rG   g      ð¿Nr   rO   r   r   r   rQ   R   r    c                 s   s   | ]}|d  V  qdS )rG   Nr   rO   r   r   r   rQ   S   r    c                 s   s"   | ]}|d  d|d    V  qdS )rG   rD   Nr   rO   r   r   r   rQ   S   r    r   g        éd   ç      à?rC   )ÚnÚwrÚroiÚzÚp)Úlenr"   ÚmathZsqrtr?   Zerfc)ZbetsrT   ÚwinsZnetZmuÚvarrW   r   r   r   ÚstatN   s    $r]   c                     sP  t ƒ } g }| D ]„}t|dƒ\}}t|dƒ\}}|r|s8q|rf|sf| tf |d |d ddœ|¤Ž¡ q|r|s| tf |d |d ddœ|¤Ž¡ q|jdd	„ d
� tdt|ƒ› d�ƒ tdƒ tddd›ddd›ddd›ddd›ddd›ddd›ddd›ddd›�ƒ dD ]¦}tt|ƒ| ƒ}|d |… ||d …  }	}
t|	ƒt|
ƒ }}td|d›d|d d›d|d  d!›d|d" d#›d|d d›d|d  d!›d|d" d#›d|d$ d%›�ƒ �qtt|ƒd& ƒ}||d … }
td't|
ƒ› d(�ƒ t	t
ƒ}t	t
ƒ}|
D ]*}||d   |¡ ||d   |¡ �qød)d*„ |
D ƒ}t	tƒ}|D ]}||d   d+7  < �q>td,t|ƒ› d-t|ƒ› d.t|ƒ› d/t|ƒ› d0�	ƒ t| ¡ d1d	„ d
�d d2… }td3|› �ƒ td4ƒ |d d+… D ]`\‰ }‡ fd5d*„|
D ƒ}t|ƒ}td6ˆ › d7|d › d8|d  d9›d:|d" d;›d<|d$ d=›�
ƒ �qÊtd>t|ƒ› d(�ƒ t|ƒ}td?d@„ |D ƒƒ}g }|D ]B‰ t‡ fdAd*„|D ƒƒ}| |d" |d"  ˆ |d" |d f¡ �qb| ¡  tdB|d › d8|d  d9›d:|d" d;›d<|d$ d=›�ƒ |dC }tdD|dC d;›dE|d+ › dF|dG d;›dH|dI › dJ�	ƒ tdKdL„ |D ƒƒ}tdM|› dNt|ƒ› �ƒ d S )ONrE   Zpolyr1   r'   ÚK)r1   r'   rL   ÚPc                 S   s   | d S r3   r   )rP   r   r   r   r-   _   r    zmain.<locals>.<lambda>r.   z$total unique (one-book-only) bets = Ú
z11) Split-point robustness (TEST = held-out tail):z   Úsplitz>6ú ZtrNz>4ZtrROIz>7Ztrzz | ZteNZteROIZtezZtep)gš™™™™™Ù?rS   ç333333ã?gffffffæ?z6.0%rT   Z4drV   z+7.1frW   z+6.2frX   z6.3frc   z,
2) Concentration of the 60/40 TEST half (n=z):c                 S   s   g | ]}|d  r|‘qS )rH   r   rO   r   r   r   r   p   r    zmain.<locals>.<listcomp>rD   z   wins=z across z distinct dates; bets across z dates, z leaguesc                 S   s
   | d  S )NrD   r   )Zkvr   r   r   r-   u   r    é   z   top win-dates: z,   net ROIturn if drop single best win-date:c                    s   g | ]}|d  ˆ kr|‘qS ©r1   r   rO   ©Údr   r   r   y   r    z
     drop z: n=z	 ROIturn=z+.1fz% z=z+.2fz p=z.3fz4
3) Leave-one-DAY-out fragility (full unique set, n=c                 S   s   h | ]}|d  ’qS re   r   rO   r   r   r   Ú	<setcomp>€   r    zmain.<locals>.<setcomp>c                    s   g | ]}|d  ˆ kr|‘qS re   r   rO   rf   r   r   r   ƒ   r    z   full-set: n=r   z,   biggest DROP in z from removing one day: z	 (remove z -> z rC   z, n=é   ú)c                 s   s   | ]}|d  dkrdV  qdS )rC   g=
×£p=ú?rD   Nr   )r   r	   r   r   r   rQ   Š   r    zmain.<locals>.<genexpr>z,   days where z stays > 1.64 after removal: ú/)rB   rN   r<   r?   r@   ÚprintrY   Úintr]   r   r4   r>   r=   r"   )rA   Zuniqr
   ÚkZkhrX   rM   ZspZcutZtrZteÚstZseZbydateZbylgrP   r[   ZwdatesÚtopr0   Úrestr	   ÚbaseZdatesZswingsZworstZn_posr   rf   r   ÚmainW   sz    
..H*0ÿÿÿÿ0 ÿÿ
@*6ÿÿÿ
rs   Ú__main__)Ú__doc__r;   r5   r6   rZ   r   Úcollectionsr   r9   rJ   r   r   r   r   r$   rB   rN   r]   rs   Ú__name__r   r   r   r   Ú<module>   s     	6