a
    gÑ?j«  ã                   @   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  
Per-league market-quality + outcome table for EVERY Kalshi league in poly_backfill.

Goal: see the full distribution of the two pre-bet quality signals (Pinnacle
overround vig, Kalshi ask-bid spread) against realized outcome, so we can judge
whether a CONTINUOUS quality gate (skip high-vig / wide-spread) is sensible --
WITHOUT cutting on which league happened to lose. Read-only.

For the [0.05,0.12) mult-de-vig Kalshi strategy (bet at ask), per league:
  n, WR%, implied%, ROIturn%, z, pinVig% (overround-1), kSprd% (ask-bid),
  entry ask, npre (snaps/fixture), poly-covered flag.
Sorted by pinVig so the quality gradient is visible.
é    N)Údatetime)ÚdefaultdictzE:\soccer\poly_backfill)çš™™™™™©?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_league_quality.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 )ç      ð?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 ]‚\\}}}}}	|s°qštd	d
„ |	D ƒdd„ d�}
|
sÐqšt|	ƒ}|d u râqštdd„ |
D ƒƒ}| t|||dd
„ |
D ƒt|
ƒ|d�¡ qš|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.   | ]&\}}t | d ¡ƒp$t | d¡ƒV  qdS )Zpoly_home_priceZpoly_away_priceN)r   r   ©r!   Ú_r   r   r   r   Ú	<genexpr>5   s   ÿzload.<locals>.<genexpr>c                 S   s   g | ]\}}|‘qS r   r   r1   r   r   r   r"   8   r#   )Úgdr*   r   ÚpreÚnpreÚhas_poly)r   ÚlistÚglobÚosÚpathÚjoinÚDIRÚopenÚcsvZ
DictReaderr   ÚappendÚitemsÚsortedr   ÚanyÚdictÚlen)Zfixturesr;   Zfhr   Úfxr4   r*   r+   r,   r   r5   r   r7   r   r   r   Úload%   s2    ÿÿ&þ
ÿÿ
rG   c                 C   sð  g }dD �]Ê\}}| d D �]¶}t | d¡ƒt | d¡ƒt | d¡ƒ  }}}d |||fv s|dkr|dkr|dksvqt | d|› d�¡ƒ}t | d|› d	�¡ƒ}	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t|||fƒ| }|�r|| | nd }|d u std |  k�rHtd k �sLq q| d dk�rd|dk�px| d dk�ox|dk}d| d|  d|  d }|
d u�r²|
dk�r²|	|
 nd }| t||	|||d�¡  qqq|�sàd S t|dd„ d�S )N))r+   r   )r,   é   r5   Zpin_homeZpin_drawZpin_awayé   Zkalshi_Z_midZ_askZ_bidr   r   r   r+   r   r,   )ÚclvÚaskÚwonÚvigÚspreadc                 S   s   | d S )NrJ   r   ©Údr   r   r   r.   L   r#   zkalshi_bet.<locals>.<lambda>r/   )r   r   r'   ÚBANDr@   rD   Úmax)rF   ZcandsZsideZsidxr   ZphZpd_ZpaZmidrK   ZbidZpfrJ   rL   rM   rN   r   r   r   Ú
kalshi_bet;   s"    .(,@,.  
rS   c           	      C   s
  t | ƒ}tdd„ | D ƒƒ}tdd„ | D ƒƒ}tdd„ | D ƒƒ}tdd„ | D ƒƒ}|dkrj|| t |¡ nd}dd	„ | D ƒ}t||| d
 || d
 || d
 |tdd„ | D ƒƒ| d
 |rÐt|ƒt |ƒ d
 ntdƒtdd„ | D ƒƒ| tdd„ | D ƒƒ| d
 |d�
S )Nc                 s   s   | ]}|d  V  qdS )rL   Nr   ©r!   Úbr   r   r   r3   P   r#   zagg.<locals>.<genexpr>c                 s   s.   | ]&}|d  r"d|d  |d  ndV  qdS )rL   rI   rK   g      ð¿Nr   rT   r   r   r   r3   Q   r#   c                 s   s   | ]}|d  V  qdS ©rK   Nr   rT   r   r   r   r3   R   r#   c                 s   s"   | ]}|d  d|d    V  qdS )rK   rI   Nr   rT   r   r   r   r3   R   r#   r   g        c                 S   s    g | ]}|d  dur|d  ‘qS ©rN   Nr   rT   r   r   r   r"   T   r#   zagg.<locals>.<listcomp>éd   c                 s   s   | ]}|d  V  qdS )rM   Nr   rT   r   r   r   r3   V   r#   Únanc                 s   s   | ]}|d  V  qdS rV   r   rT   r   r   r   r3   X   r#   c                 s   s   | ]}|d  V  qdS )rJ   Nr   rT   r   r   r   r3   Y   r#   )
ÚnÚwrÚiwrÚroiÚzrM   rN   rK   rJ   r6   )rE   r%   ÚmathÚsqrtrD   r   )	Úbetsr6   rZ   ZwinsZnetZmuÚvarr^   Zspr   r   r   ÚaggN   s    $$ürc   c                     sÞ  t ƒ } ttƒ‰ ttƒ}i ‰| D ]X}t|ƒ}|rˆ |d   |¡ ||d   |d ¡ ˆ |d d¡pl|d ˆ|d < q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d›d	dd›d	dd›d	dd›�ƒ g }ˆ  ¡ D ]H\}}t|| ƒt	|| ƒ }t
||ƒ}||d< ˆ| |d< | |¡ qôt|dd„ d�D ]¬}|d �r`dn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+›d	|d d,›d	|d- d"›d	|d d"›�ƒ �qNd.d/„ }
d0d1„ |D ƒ}td2t	|ƒ› d3�ƒ td4|
d5d1„ |D ƒd6d1„ |D ƒƒd7›�ƒ d8d1„ |D ƒ}td9|
d:d1„ |D ƒd;d1„ |D ƒƒd7›�ƒ td<|
d=d1„ |D ƒd>d1„ |D ƒƒd7›�ƒ ‡ ‡fd?d1„ˆ D ƒ}‡ fd@d1„ˆ D ƒ}tdAt	|ƒ› dB�ƒ tddCdD›d	dd›d	dd›d	dd›d	dd›d	dd›�ƒ g dE¢}|D ]¦\‰‰‡‡fdFd1„|D ƒ}|�svtdGˆdH›dIˆdH›dJdKd ›�ƒ �q0t
|dKƒ}tdGˆdH›dIˆdH›dJ|d d ›d	|d! d"›d	|d# d$›d	|d% d&›d	|d d'›�ƒ �q0tdLƒ tddMdD›d	dd›d	dd›d	dd›d	dd›d	dd›�ƒ g dN¢}dOd1„ |D ƒ}|D ]¦\‰‰‡‡fdPd1„|D ƒ}|�sxtdGˆdH›dIˆdH›dJdKd ›�ƒ �q2t
|dKƒ}tdGˆdH›dIˆdH›dJ|d d ›d	|d! d"›d	|d# d$›d	|d% d&›d	|d d'›�ƒ �q2d S )QNr*   r6   Fr7   zNPer-league Kalshi [0.05,0.12) at ask, sorted by Pinnacle vig (market quality):z  ÚlgZ6sú zP?z>2rZ   z>4zWR%z>5zimpl%z>6zROI%z>7r^   zpinVig%z>8zkSprd%rK   zCLV%Zpolyc                 S   s   | d S )NrM   r   rO   r   r   r   r.   m   r#   zmain.<locals>.<lambda>r/   ÚYÚ.Z4dr[   z5.1fr\   z6.1fr]   z+7.1fz+6.2frM   z8.2frN   z7.2fz5.2frJ   c                    sœ   t | ƒ}t| ƒ| t|ƒ|  ‰ ‰t‡ ‡fdd„t| |ƒD ƒƒ}t t‡ fdd„| D ƒƒ¡}t t‡fdd„|D ƒƒ¡}|dkr”|dkr”|||  S tdƒS )Nc                 3   s"   | ]\}}|ˆ  |ˆ  V  qd S r   r   )r!   r   Úy©ÚmxÚmyr   r   r3   w   r#   z%main.<locals>.corr.<locals>.<genexpr>c                 3   s   | ]}|ˆ  d  V  qdS ©rH   Nr   r    )rj   r   r   r3   x   r#   c                 3   s   | ]}|ˆ  d  V  qdS rl   r   )r!   rh   )rk   r   r   r3   x   r#   r   rY   )rE   r%   Úzipr_   r`   r   )ZxsZysrZ   ZcovZsxZsyr   ri   r   Úcorrt   s
    8zmain.<locals>.corrc                 S   s   g | ]}|d  dkr|‘qS )rZ   é
   r   ©r!   Úar   r   r   r"   z   r#   zmain.<locals>.<listcomp>z
Across leagues with n>=10 (z# leagues), per-league correlations:z  corr(pinVig, ROI)  = c                 S   s   g | ]}|d  ‘qS ©rM   r   rp   r   r   r   r"   |   r#   c                 S   s   g | ]}|d  ‘qS ©r]   r   rp   r   r   r   r"   |   r#   z+.2fc                 S   s   g | ]}t  |d  ¡s|‘qS ©rN   )r_   Zisnanrp   r   r   r   r"   }   r#   z  corr(kSprd,  ROI)  = c                 S   s   g | ]}|d  ‘qS rt   r   rp   r   r   r   r"   ~   r#   c                 S   s   g | ]}|d  ‘qS rs   r   rp   r   r   r   r"   ~   r#   z  corr(pinVig, WR-impl gap) = c                 S   s   g | ]}|d  ‘qS rr   r   rp   r   r   r   r"   €   r#   c                 S   s   g | ]}|d  |d  ‘qS )r[   r\   r   rp   r   r   r   r"   €   r#   c                    s"   g | ]}ˆ | D ]}|ˆf‘qqS r   r   ©r!   rd   rU   )Ú
bets_by_lgÚpoly_lgr   r   r"   ƒ   r#   c                    s   g | ]}ˆ | D ]}|‘qqS r   r   ru   )rv   r   r   r"   „   r#   z*
Bet-weighted by Pinnacle vig bucket (all z  bets, continuous-gate preview):z
vig bucketZ16s))r   ç{®Gáz¤?)rx   r   )r   ç¸…ëQ¸®?)ry   ç{®Gáz´?)rz   r   c                    s,   g | ]$}ˆ|d    kr ˆ k rn q|‘qS rr   r   rT   ©ÚhiÚlor   r   r"   ‰   r#   z  [z.2fú,z)      r   z&
Bet-weighted by Kalshi spread bucket:zspread bucket))r   ç{®Gáz„?)r   ç{®Gáz”?)r€   ç¸…ëQ¸ž?)r�   r   )r   r   c                 S   s   g | ]}|d  dur|‘qS rW   r   rT   r   r   r   r"   ’   r#   c                    s,   g | ]$}ˆ|d    kr ˆ k rn q|‘qS rt   r   rT   r{   r   r   r"   ”   r#   )rG   r   r8   rS   r@   r   ÚprintrA   r%   rE   rc   rB   )rF   Z
npre_by_lgr   rU   r   rd   ra   r6   rq   Zpflagrn   ZbigZsp_okZallbZflatZbucketsZselZsbucketsZsflatr   )rv   r|   r}   rw   r   Úmain[   s     "<ÿÿÿÿÿ<ÿÿÿÿþþþ**ÿ8$
8ÿÿ8$
8ÿÿrƒ   Ú__main__)Ú__doc__r?   r9   r:   r_   r   Úcollectionsr   r=   rQ   r   r   r   r   r'   rG   rS   rc   rƒ   Ú__name__r   r   r   r   Ú<module>   s     @