a
    wÊ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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-bet edge SYMMETRIC across books, or only one direction?
Two directions of a "unique" (one-book-only [0.05,0.12)) bet:
  A. KALSHI-only fires -> bet KALSHI (cheap); POLY confirms Pinnacle's fair.
  B. POLY-only  fires -> bet POLY  (cheap); KALSHI confirms Pinnacle's fair.
If only A profits -> it's "Poly/Pinnacle agreement flags a mispriced Kalshi".
If only B profits -> it's "Kalshi/Pinnacle agreement flags a mispriced Poly".
If BOTH profit -> the mechanism (2nd book validates the fair) is genuinely symmetric.

Executable pricing: Kalshi @ ask; Poly @ est-ask (mid + near-term half-spread). Also
shown restricted to the clean mechanism bucket (other book ~efficient, its CLV<0.05).
Multiplicative de-vig, shared-price fixtures. Read-only.
é    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   ú2E:\soccer\research\kalshi_poly_unique_direction.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(   | dk rdS | dk rdS | dk r$dS dS )Nr   gú~j¼t“h?g      Ð?g{®Gázt?gffffffÖ?gš™™™™™™?g{®Gáz”?r   )Úmidr   r   r   Úhalf_spread$   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    5   s   "ÿzload.<locals>.<listcomp>c                 S   s   | d S )Nr   r   )Útr   r   r   Ú<lambda>7   r!   zload.<locals>.<lambda>©Úkeyc                 S   s   g | ]\}}|‘qS r   r   )r   Ú_r   r   r   r   r    ;   r!   )Úgdr*   r   Úpre)r   ÚlistÚglobÚosÚpathÚjoinÚDIRÚopenÚcsvZ
DictReaderr   ÚappendÚitemsÚsortedr   Údict)Zfixturesr7   Zfhr   Úfxr0   r   r2   r*   r+   r,   r3   r   r   r   r   Úload*   s*    ÿÿ&þ
"rA   é   )r+   r,   c                 C   s4   |dkrt |  d|› d�¡ƒS t |  d|› d�¡ƒS )NÚkalshiÚkalshi_Z_midÚpoly_Ú_price)r   r   )r   ÚbookÚsider   r   r   Úmid_of?   s    rI   c                 C   sL   |dkrt |  d|› d�¡ƒS t |  d|› d�¡ƒ}|d urH|t|ƒ S d S )NrC   rD   Z_askrE   rF   )r   r   r'   )r   rG   rH   Úmr   r   r   Úexec_pxB   s    rK   c                 C   sž  g }d}t  ¡ D �]h\}}| d D �]T}t| d¡ƒt| d¡ƒt| d¡ƒ  }}}	d |||	fv s"|dkr"|dkr"|	dks~q"t|||ƒ}
t|||ƒ}|
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ƒ| }|rü||
 | nd }|d u s"td |  k�r(td k �s,q" q"| d	 d
k�rD|dk�pX| d	 dk�oX|dk}| t	||||||d�¡  qq"q|�sŠd |fS t
|dd„ d�|fS )NFr3   Zpin_homeZpin_drawZpin_awayé   r   Tr   r   r+   r   r,   )ÚclvÚpxÚwonÚrowrH   Úpfc                 S   s   | d S )NrM   r   )Údr   r   r   r.   U   r!   zfire.<locals>.<lambda>r/   )ÚSIDXr=   r   r   rI   rK   r%   ÚBANDr<   r?   Úmax)r@   rG   ZcandsZhaverH   Zsidxr   ÚphZpd_Zpar&   rN   rQ   rM   rO   r   r   r   ÚfireF   s    .(@,."rW   c                 C   sT   t | d || d ƒ}|d u s<d|  k r0dk r<n n| d s@d S | d | | d  S )NrP   rH   r   rL   rQ   )rI   )ZbetZ
other_bookr&   r   r   r   Ú	other_clvW   s    ,rX   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 |d	t |t d
¡ ¡ d�S )Nc                 s   s   | ]}|d  V  qdS )rO   Nr   ©r   Úbr   r   r   Ú	<genexpr>_   r!   zstat.<locals>.<genexpr>c                 s   s.   | ]&}|d  r"d|d  |d  ndV  qdS )rO   rL   rN   g      ð¿Nr   rY   r   r   r   r[   `   r!   c                 s   s   | ]}|d  V  qdS )rN   Nr   rY   r   r   r   r[   a   r!   c                 s   s"   | ]}|d  d|d    V  qdS )rN   rL   Nr   rY   r   r   r   r[   a   r!   r   g        éd   g      à?rB   )ÚnÚwrÚiwrÚroiÚzÚp)Úlenr#   ÚmathZsqrtr?   Zerfc)Zbetsr]   ZwinsZnetZmuÚvarra   r   r   r   Ústat\   s    $rf   c                 C   sv   |st d| d›d�ƒ d S t d| d›d|d d›d|d d	›d
|d d	›d|d d›d|d d›d|d d›�ƒ d S )Nz  Z46sz (none)z n=r]   Z3dz  WR=r^   z4.1fz%  impl=r_   z%  ROIturn=r`   z+6.1fz%  z=ra   z+.2fz  p=rb   z.3f)Úprint)Útagr
   r   r   r   Úlinee   s    0ÿÿÿri   c            
      C   s  t ƒ } g g  }}| D ]l}t|dƒ\}}t|dƒ\}}|r|s>q|r`|s`t|dƒ|d< | |¡ q|r|st|dƒ|d< | |¡ qtdt|ƒ› dt|ƒ› d�ƒ tdƒ tdt|ƒƒ td	t|ƒƒ d
d„ |D ƒ}dd„ |D ƒ}	tdƒ tdt|ƒƒ tdt|	ƒƒ d S )NrC   ZpolyÚoclvzKalshi-only=z  Poly-only=z!  (executable: K@ask, P@est-ask)
zALL unique bets, by direction:z'A. bet KALSHI  (Poly confirms Pinnacle)z)B. bet POLY    (Kalshi confirms Pinnacle)c                 S   s,   g | ]$}|d  dur|d  t d k r|‘qS ©rj   Nr   ©rT   rY   r   r   r   r    y   r!   zmain.<locals>.<listcomp>c                 S   s,   g | ]$}|d  dur|d  t d k r|‘qS rk   rl   rY   r   r   r   r    z   r!   zO
Restricted to clean mechanism (confirming book CLV<0.05 = agrees w/ Pinnacle):zA. bet KALSHI | Poly efficientz B. bet POLY   | Kalshi efficient)rA   rW   rX   r<   rg   rc   ri   rf   )
r@   ZkonlyZponlyr   ÚkZkhrb   rV   ZkeZper   r   r   Úmainj   s     

""rn   Ú__main__)Ú__doc__r;   r5   r6   rd   r   Úcollectionsr   r9   rT   r   r   r   r   r%   r'   rA   rS   rI   rK   rW   rX   rf   ri   rn   Ú__name__r   r   r   r   Ú<module>   s,    
	