a
    ïÏ?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Ô  
WHY are Kalshi's non-Poly leagues so weak (-42% ROI, z-2.07, n=75)?  Diagnostic.

For the [0.05,0.12) mult-de-vig Kalshi strategy (bet at ask) on the poly_backfill set,
break out per league and compare market-quality signals between the PROFITABLE
Poly-covered leagues and the losing non-Poly ones:
  - WR vs implied(ask): is the loss a wrong-side / bad-fair problem (WR << implied) or
    just unlucky variance (WR ~ implied)?
  - pin vig (overround-1): is Pinnacle's fair noisier/wider in these leagues?
  - kalshi spread (ask-bid) and entry ask: worse execution / thinner books?
  - snapshots/fixture & distinct fixtures: data-density / staleness?
  - concentration: is the -42% one or two leagues, or broad?
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_weak_league_diag.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 ]†\\}}}}}	|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   0   s   "ÿzload.<locals>.<listcomp>c                 S   s   | d S )Nr   r   )Útr   r   r   Ú<lambda>2   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>6   s   ÿzload.<locals>.<genexpr>c                 S   s   g | ]\}}|‘qS r   r   r.   r   r   r   r   9   r    )Úgdr'   r(   r)   r   ÚpreÚnpreÚhas_poly)r   ÚlistÚglobÚosÚpathÚjoinÚDIRÚopenÚcsvZ
DictReaderr   ÚappendÚitemsÚsortedr   ÚanyÚdictÚlen)Zfixturesr8   Zfhr   Úfxr1   r'   r(   r)   r   r2   r   r4   r   r   r   Úload&   s2    ÿÿ&þ
ÿÿ
rD   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 )zrFirst in-band [0.05,0.12) Kalshi bet, both-sides dedupe to higher CLV.
       Returns dict w/ diagnostics or None.))r(   r   )r)   é   r2   Zpin_homeZpin_drawZpin_awayNé   Zkalshi_Z_midZ_askZ_bidr   r   r   r(   r   r)   )ÚclvÚaskÚwonÚvigÚspreadÚsideÚpfÚmidc                 S   s   | d S )NrG   r   )Údr   r   r   r+   P   r    zkalshi_bet.<locals>.<lambda>r,   )r   r   r$   ÚBANDr=   rA   Úmax)rC   ZcandsrL   Zsidxr   ZphZpd_ZparN   rH   ZbidrM   rG   rI   rJ   rK   Úbr   r   r   Ú
kalshi_bet<   s*    .(,@,. ÿ
rS   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}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
tdd„ | D ƒƒ | d�
S )Nc                 s   s   | ]}|d  V  qdS )rI   Nr   ©r   rR   r   r   r   r0   V   r    zagg.<locals>.<genexpr>c                 s   s.   | ]&}|d  r"d|d  |d  ndV  qdS )rI   rF   rH   g      ð¿Nr   rT   r   r   r   r0   W   r    c                 s   s   | ]}|d  V  qdS ©rH   Nr   rT   r   r   r   r0   X   r    c                 s   s"   | ]}|d  d|d    V  qdS )rH   rF   Nr   rT   r   r   r   r0   X   r    r   g        c                 S   s    g | ]}|d  dur|d  ‘qS )rK   Nr   rT   r   r   r   r   Z   r    zagg.<locals>.<listcomp>éd   c                 s   s   | ]}|d  V  qdS )rJ   Nr   rT   r   r   r   r0   \   r    Únanc                 s   s   | ]}|d  V  qdS rU   r   rT   r   r   r   r0   ^   r    c                 s   s   | ]}|d  V  qdS )rG   Nr   rT   r   r   r   r0   _   r    c                 s   s   | ]}|d  du rdV  qdS )rK   NrF   r   rT   r   r   r   r0   `   r    )
ÚnÚwrÚiwrÚroiÚzrJ   rK   rH   rG   Únobid)rB   r"   ÚmathZsqrtrA   r   )ÚbetsrX   ZwinsZnetZmuÚvarr\   Zspr   r   r   ÚaggS   s    $$ûra   c                     s  t ƒ } g }| D ]>}t|ƒ}|r|d |d< |d |d< |d |d< | |¡ qdd„ | D ƒ}dd„ | D ƒ‰‡fdd„|D ƒ}‡fd	d„|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d›ddd›ddd›�ƒ d|fd|ffD ]º\}}t|ƒ}	|�r6tdd „ |D ƒƒt|ƒ 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$›�ƒ �qtd0ƒ tdd1d2›ddd3›ddd›ddd›ddd›ddd›ddd›ddd›ddd›dd4d›�ƒ ttƒ‰ |D ]}ˆ |d   |¡ �q.t	ˆ ‡ fd5d6„d7�D ]Ž}tˆ | ƒ}	td|d2›d|	d d8›d|	d# d$›d|	d% d&›d|	d' d(›d|	d d)›d|	d* d+›d|	d, d-›d|	d d.›d|	d9 d&›�ƒ �q\td:t	ˆ ƒ› �ƒ td;t	ˆƒ› �ƒ d S )<Nr'   r4   r3   c                 S   s"   h | ]}d D ]}dr|d ’qqS )r   Fr'   r   )r   r
   rR   r   r   r   Ú	<setcomp>j   r    zmain.<locals>.<setcomp>c                 S   s   h | ]}|d  r|d ’qS )r4   r'   r   )r   r
   r   r   r   rb   l   r    c                    s   g | ]}|d  ˆ vr|‘qS ©r'   r   rT   ©Úpoly_leaguesr   r   r   n   r    zmain.<locals>.<listcomp>c                    s   g | ]}|d  ˆ v r|‘qS rc   r   rT   rd   r   r   r   o   r    z1AGGREGATE comparison (Kalshi [0.05,0.12) at ask):z  ÚgroupZ22sú rX   z>4zWR%z>5zimpl%z>6zROI%z>7r\   zpinVig%z>8zkSprd%rH   zCLV%zPoly-covered leagueszNON-Poly leaguesc                 s   s   | ]}|d  V  qdS )r3   Nr   rT   r   r   r   r0   v   r    zmain.<locals>.<genexpr>r   Z4drY   z5.1frZ   z6.1fr[   z+7.1fz+6.2frJ   z8.2frK   z7.2fz5.2frG   z
Per NON-Poly league:ÚlgZ6sz>3znobid%c                    s   t ˆ |  ƒd S )Nr[   )ra   )Úl)Úbylr   r   r+   €   r    zmain.<locals>.<lambda>r,   Z3dr]   z
  non-Poly leagues present: z  Poly-covered leagues:     )
rD   rS   r=   Úprintra   r"   rB   r   r5   r?   )rC   r_   r
   rR   Zpoly_lgZnonpolyZinpolyÚtagZgrpÚar3   rh   r   )rj   re   r   Úmainb   s„    4ÿÿÿÿÿ$<ÿÿÿÿþþ4ÿÿÿÿ<ÿÿÿÿÿrn   Ú__main__)Ú__doc__r<   r6   r7   r^   r   Úcollectionsr   r:   rP   r   r   r   r   r$   rD   rS   ra   rn   Ú__name__r   r   r   r   Ú<module>   s     %