a
    ·ÉAj=  ã                   @   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Å  
Is the unique-vs-overlap edge a LEAGUE-MIX artifact (like the earlier Poly-vs-Kalshi
headline was)?  Both buckets live ONLY on shared-price fixtures (both books quoted),
so they're already inside the Poly-covered universe. But do UNIQUE bets come from
DIFFERENT leagues than OVERLAP bets?  If unique is concentrated in a few leagues, the
+62% could be those leagues, not cross-book disagreement.

Test: per league, count unique vs overlap bets and each bucket's ROI. The signal is
REAL (not league-mix) only if unique beats overlap WITHIN the same leagues -- i.e. the
two buckets co-occur in the same leagues and unique still wins there.
Multiplicative de-vig, [0.05,0.12), 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   ú1E:\soccer\research\kalshi_poly_unique_byleague.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š|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   Úpre)r   ÚlistÚglobÚosÚpathÚjoinÚDIRÚopenÚcsvZ
DictReaderr   ÚappendÚitemsÚsortedr   Údict)Zfixturesr4   Zfhr   Úfxr-   r   r/   r'   r(   r)   r0   r   r   r   r   Úload$   s*    ÿÿ&þ
"r>   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}| t|||d�¡  qqq|�s¾d |fS t|dd„ d�|fS )NF))r(   r   )r)   é   r0   Zpin_homeZpin_drawZpin_awayé   ÚkalshiZkalshi_Z_midZ_askZpoly_Z_pricer   Tr   r   r(   r   r)   )ÚclvÚpxÚwonc                 S   s   | d S )NrB   r   )Údr   r   r   r+   J   r    zfire.<locals>.<lambda>r,   )r   r   r$   ÚBANDr9   r<   Úmax)r=   ZbookZcandsZhaveZsideZsidxr   ÚphZpd_ZpaZmidrC   ZpfrB   rD   r   r   r   Úfire8   s"    .(.D,.rI   c                 C   sR   t | ƒ}|sd S tdd„ | D ƒƒ}tdd„ | D ƒƒ}t||| d || d d�S )Nc                 s   s   | ]}|d  V  qdS )rD   Nr   ©r   Úbr   r   r   Ú	<genexpr>O   r    zroi.<locals>.<genexpr>c                 s   s.   | ]&}|d  r"d|d  |d  ndV  qdS )rD   r@   rC   g      ð¿Nr   rJ   r   r   r   rL   P   r    éd   )ÚnÚwrÚroi)Úlenr"   r<   )ZbetsrN   ZwinsZnetr   r   r   rP   L   s
    rP   c                     s>  t ƒ } ttƒ‰ttƒ‰ | D ]|}t|dƒ\}}t|dƒ\}}|r|sDq|r`|r`ˆ |d   |¡ q|r||s|ˆ|d   |¡ q|r|sˆ|d   |¡ qttˆƒtˆ ƒB ƒ}tdt|ƒ› 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 �]}
t	ˆ 
|
g ¡ƒ}t	ˆ  
|
g ¡ƒ}|�rZ|d nd}|�rl|d nd}||7 }||7 }|�r�|�r�dnd}|�r¨|�r¨|	d7 }	|�rº|d d›nd}|�rÐ|d d ›nd!}|�ræ|d d›nd}|�rü|d d ›nd!}td|
d
›d|d"›d|› d|› d|d"›d|› d|› d|d›�ƒ �q&td#|› d$|› �ƒ td%|	› d&t|ƒ› �ƒ ‡ ‡fd'd(„|D ƒ}‡fd)d(„|D ƒ}‡ fd*d(„|D ƒ}td+|› d,�ƒ t	|ƒt	|ƒ }}|�rþtd-|d d"›d.|d d/›d0|d d1›d2�ƒ |�r2td3|d d"›d.|d d/›d0|d d1›d2�ƒ td4ƒ d S )5NrA   Zpolyr'   zshared-price leagues: z  -> Ú
zUPer league: UNIQUE vs OVERLAP bets (do they co-occur? does unique win within-league?)z  ÚlgZ6sz | ZuNz>3ú zuWR%z>5zuROI%z>7ZoNzoWR%zoROI%zboth?r   rN   ZYESr   r@   rO   z5.1fz    -rP   z+7.1fz      -Z3dz
  totals: unique=z
  overlap=z-  leagues with BOTH unique AND overlap bets: ú/c                    s8   g | ]0}t ˆ |g ¡ƒd krt ˆ  |g ¡ƒd kr|‘qS )é   )rQ   r   )r   rS   ©Úover_byÚuniq_byr   r   r   p   r    zmain.<locals>.<listcomp>c                    s   g | ]}ˆ | D ]}|‘qqS r   r   ©r   rS   rK   )rY   r   r   r   q   r    c                    s   g | ]}ˆ | D ]}|‘qqS r   r   rZ   )rX   r   r   r   r   r    z7
  WITHIN-LEAGUE pooled over leagues with >=5 of each (z):z    UNIQUE   n=z  WR=z4.1fz%  ROIturn=z+6.1fú%z    OVERLAP  n=zX  (unique still >> overlap here => NOT a league-mix artifact; same leagues, unique wins))r>   r   r1   rI   r9   r;   ÚsetÚprintrQ   rP   r   )r=   r
   ÚkZkhÚprH   ZleaguesZu_totZo_totZboth_lgrS   Úur#   ZunZonÚcoZuwZurZowZorrZco_lgsZpuZpoZsuZsor   rW   r   ÚmainS   s@    
H
 $,,D44rb   Ú__main__)Ú__doc__r8   r2   r3   Zmathr   Úcollectionsr   r6   rF   r   r   r   r   r$   r>   rI   rP   rb   Ú__name__r   r   r   r   Ú<module>   s     &