a
    O
Cj$%  ã                   @   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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edkr°eƒ  dS )a
	  
Does PURE Kalshi-vs-Poly deviation make money, with NO Pinnacle anchor?  NO.

Question (2026-06-29): the unique/overlap edge is always selected by CLV-vs-pin_fair.
Can you instead drop Pinnacle entirely and just trade the two books against EACH OTHER
-- when Kalshi and Poly disagree, bet the cheaper one? Tested here. Answer: it needs
pin_fair. The two-book midpoint is a worse fair than Pinnacle and carries no edge.

Strategy A (PURE X-BOOK): fair := mean(kalshi_mid, poly_price) per side. Bet the
CHEAPER book's side when its x-book CLV (vs that two-book avg) is in [lo,hi). Settle
at the cheaper book's ask (Kalshi ask; Poly est-ask via near-term half-spread). One
bet/fixture (max x-book CLV, first qualifying pre-KO snapshot, non-look-ahead).

RESULTS on poly_backfill (975 resolved fixtures, 2026-06-29):
  A) PURE x-book deviation, NO Pinnacle (bet cheaper book):
       [3,12)% n=180 +1.4% z+0.54  |  >=5% n=67 -23.1% z-0.60  |  >=10% n=21 -52.4% z-1.16
       -> flat-to-negative, and gets MONOTONICALLY WORSE as the deviation widens
          (opposite of a real edge).
  B) FALSIFICATION (bet the DEARER book): also loses (-29% to -42%). Deviation is
     non-directional noise -- neither leg is profitable.
  C) Crux: of 67 pure-dev bets, 57 are ones where Pinnacle ALSO says cheap=cheap, and
     even those lose (-9.6%). The two-book avg is contaminated: when both books are
     cheap vs Pinnacle, their midpoint is cheap too, so dev-from-midpoint never catches
     the real mispricing.
  D) Reference -- the live pin_fair signal on the SAME 975 fixtures: +11.0% ROI,
     25.2% WR, n=421, z+1.26. Positive, on 6x the sample.

VERDICT: Pinnacle (a SHARP book) is the truth anchor doing all the discriminating.
Kalshi & Poly are both soft venues; their mutual disagreement says nothing about which
is right. Pure cross-book deviation is NOT a standalone strategy. Don't reopen unless a
genuinely sharp third reference (not two soft books) is available. Consistent with the
unique/overlap mechanism finding (edge needs the 2nd book to CONFIRM Pinnacle).
Caveat: pure-dev n is small (~63-67 in-band) because the two books usually price within
~1-2c; big divergences are rare and noisy -- itself part of the point.

Read-only, trades nothing. Multiplicative de-vig. Mirrors kalshi_poly_unique_*.py.
é    N)Údatetime)ÚdefaultdictzE:\soccer\poly_backfill)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   ú0E:\soccer\research\kalshi_poly_pure_deviation.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   Ú_f1   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   Ú_result4   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_mult9   s    r%   c                 C   s(   | dk rdS | dk rdS | dk r$dS dS )Nçš™™™™™©?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 ]f\}}|d	 }|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_dateZleagueÚhomeÚawayr   c                 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    L   s   "ÿzload.<locals>.<listcomp>c                 S   s   | d S )Nr   r   )Útr   r   r   Ú<lambda>N   r!   zload.<locals>.<lambda>©Úkeyc                 S   s   g | ]\}}|‘qS r   r   )r   Ú_r   r   r   r   r    R   r!   )Úgdr   Úprec                 S   s   | d S )Nr2   r   )r
   r   r   r   r.   S   r!   )r   ÚlistÚglobÚosÚpathÚjoinÚDIRÚopenÚcsvZ
DictReaderr   ÚappendÚitemsÚsortedr   ÚdictÚsort)
Zfixturesr7   Zfhr   Úfxr0   r   r2   r3   r   r   r   r   ÚloadA   s,    ÿÿ&þ
 rB   é   )r+   r,   c                 C   s<  | d D �],}t | d¡ƒt | d¡ƒt | d¡ƒ  }}}d|||fvo`|dko`|dko`|dk}|rtt|||fƒnd}g }	t ¡ D �]–\}
}t | d|
› d�¡ƒ}t | d|
› d	�¡ƒ}t | d
|
› d�¡ƒ}|du s„|du râq„d|  k rödk r„n q„d|  k �rdk �sq„ q„|| d }||k�rdd||�rVd|  k �rNdk �rVn n|n|  }}}nd||t|ƒ   }}}|�rŽ|| | nd}|du s„||  k�r²|k �s¶q„ q„| d dk�rÎ|
dk�pâ| d dk�oâ|
dk}|�rþ|| | ||  nd}|	 t||
||||d�¡ q„|	rt|	dd„ d�  S qdS )zeFirst pre-KO snapshot with a qualifying x-book deviation. Bet cheaper book.
    Returns dict or None.r3   Úpin_homeÚpin_drawÚpin_awayNé   Úkalshi_Ú_midÚ_askÚpoly_Ú_pricer   g       @ZkalshiZpolyr   r   r+   r   r,   )ÚxclvÚsideÚbookÚpxÚwonÚpin_clvc                 S   s   | d S ©NrM   r   ©Údr   r   r   r.   q   r!   zpure_dev_bet.<locals>.<lambda>r/   )	r   r   r%   ÚSIDXr=   r(   r<   r?   Úmax)rA   ÚloÚhir   ÚphÚpd_ÚpaZpin_okZpf_allÚcandsrN   ÚsidxÚk_midÚk_askÚp_pxÚxfairrO   r'   rP   rM   rQ   rR   r   r   r   Úpure_dev_betX   s,    .&,4
8$.rc   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t |t d	¡ ¡ }t||| d
 || d
 ||d�S )Nc                 s   s   | ]}|d  V  qdS )rQ   Nr   ©r   Úbr   r   r   Ú	<genexpr>w   r!   zstat.<locals>.<genexpr>c                 s   s.   | ]&}|d  r"d|d  |d  ndV  qdS )rQ   rG   rP   g      ð¿Nr   rd   r   r   r   rf   x   r!   c                 s   s   | ]}|d  V  qdS )rP   Nr   rd   r   r   r   rf   y   r!   c                 s   s"   | ]}|d  d|d    V  qdS )rP   rG   Nr   rd   r   r   r   rf   y   r!   r   g        g      à?rC   éd   )ÚnÚwrÚroiÚzÚp)Úlenr#   ÚmathZsqrtZerfcr?   )Úbetsrh   ZwinsZnetZmuÚvarrk   rl   r   r   r   Ústatt   s    $rq   c                 C   sj   |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 S )Nz  Z40sz
 (no bets)z n=rh   Z3dz  WR=ri   z4.1fz%  ROIturn=rj   z+6.1fz%  z=rk   z+.2fz  p=rl   z.3f)Úprint)Útagr	   r   r   r   Úline~   s    0ÿÿrt   c                     s„  t ƒ } tdt| ƒ› d�ƒ tdƒ tdƒ dD ]F\‰‰dd„ ‡‡fdd	„| D ƒD ƒ}td
ˆd›dˆd›d�t|ƒƒ q.tdƒ dd„ ‰ dD ]H\‰‰dd„ ‡ ‡‡fdd	„| D ƒD ƒ}tdˆd›dˆd›d�t|ƒƒ qŠtdƒ dd„ dd	„ | D ƒD ƒ}dd„ |D ƒ}dd„ |D ƒ}dd„ |D ƒ}tdt|ƒƒ tdt|ƒƒ tdt|ƒƒ tdƒ d&d!d"„‰td#td$d„ ‡fd%d	„| D ƒD ƒƒƒ d S )'Nz&resolved fixtures with PRE snapshots: Ú
zL=== A) PURE X-BOOK DEVIATION (fair = mean of the two books, NO Pinnacle) ===z:    band sweep on x-book CLV (bet cheaper book @ its ask):))g¸…ëQ¸ž?ç¸…ëQ¸¾?©r&   rv   )r&   gš™™™™™É?©r&   r   )g{®Gáz´?r   )gš™™™™™¹?r   c                 S   s   g | ]}|r|‘qS r   r   rd   r   r   r   r    Š   r!   zmain.<locals>.<listcomp>c                 3   s   | ]}t |ˆˆ ƒV  qd S r   ©rc   ©r   r
   )rY   rX   r   r   rf   Š   r!   zmain.<locals>.<genexpr>zx-book CLV in [z.2fú,ú)zE
=== B) FALSIFICATION: same fixtures, bet the DEARER book instead ===c              	   S   sV  | d D �]F}g }t D �]}t| d|› d�¡ƒ}t| d|› d�¡ƒ}|d u s|d u sd|  k rldk rn qd|  k r„dk sˆq q|| d }||kr¾|t| d|› d	�¡ƒp¶| }	}
n||t|ƒ  }	}
|	| | }||  krð|k sôq q| d
 dk�r|dk�p | d
 dk�o |dk}| t||
|d�¡ q|rt|dd„ d�  S qd S )Nr3   rH   rI   rK   rL   r   rG   rC   rJ   r   r   r+   r   r,   )rM   rP   rQ   c                 S   s   | d S rS   r   rT   r   r   r   r.   �   r!   z*main.<locals>.dearer_bet.<locals>.<lambda>r/   )rV   r   r   r(   r<   r?   rW   )rA   rX   rY   r   r]   rN   r_   ra   rb   r'   rP   rM   rQ   r   r   r   Ú
dearer_betŽ   s    
,@".zmain.<locals>.dearer_bet)rw   rx   c                 S   s   g | ]}|r|‘qS r   r   rd   r   r   r   r        r!   c                 3   s   | ]}ˆ |ˆˆƒV  qd S r   r   rz   )r}   rY   rX   r   r   rf       r!   zbet DEARER book, dev in [zL
=== C) DOES IT NEED PINNACLE? split pure-dev bets by pin_fair agreement ===c                 S   s   g | ]}|r|‘qS r   r   rd   r   r   r   r    ¤   r!   c                 s   s   | ]}t |d dƒV  qdS )r&   r   Nry   rz   r   r   r   rf   ¤   r!   c                 S   s   g | ]}|d  dur|‘qS )rR   Nr   rd   r   r   r   r    ¥   r!   c                 S   s   g | ]}|d  dkr|‘qS ©rR   r   r   rd   r   r   r   r    ¦   r!   c                 S   s   g | ]}|d  dkr|‘qS r~   r   rd   r   r   r   r    §   r!   zALL pure-dev (x-book CLV>=5%)z  + Pinnacle AGREES (pin_clv>0)z#  + Pinnacle DISAGREES (pin_clv<=0)zK
=== D) reference: PIN_FAIR signal on same fixtures (the live strategy) ===r&   rv   c              	   S   s†  | d D �]v}t | d¡ƒt | d¡ƒt | d¡ƒ  }}}d |||fv s|dkr|dkr|dksdqt|||fƒ}g }t ¡ D ]è\}	}
t | d|	› d�¡ƒ}t | d|	› d�¡ƒ}|d u s~d	|  k rÎdk sÒq~ q~||
 | ||
  }||  krú|k sþq~ q~| d
 dk�r|	dk�p*| d
 dk�o*|	dk}| t||�rZd	|  k �rRdk �rZn n|n||d�¡ q~|rt|dd„ d�  S qd S )Nr3   rD   rE   rF   rG   rH   rI   rJ   r   r   r   r+   r   r,   )ÚclvrP   rQ   c                 S   s   | d S )Nr   r   rT   r   r   r   r.   º   r!   z'main.<locals>.pin_bet.<locals>.<lambda>r/   )r   r   r%   rV   r=   r<   r?   rW   )rA   rX   rY   r   rZ   r[   r\   Zpfr]   rN   r^   r_   r`   r   rQ   r   r   r   Úpin_bet­   s    .(, .<zmain.<locals>.pin_betz"Kalshi CLV vs pin_fair [5,12) @askc                 S   s   g | ]}|r|‘qS r   r   rd   r   r   r   r    ¼   r!   c                 3   s   | ]}ˆ |ƒV  qd S r   r   rz   )r€   r   r   rf   ¼   r!   )r&   rv   )rB   rr   rm   rt   rq   )rA   ro   Zhave_pinZ	pin_agreeZ	pin_disagr   )r}   rY   rX   r€   r   Úmainƒ   s.    " "
r�   Ú__main__)Ú__doc__r;   r5   r6   rn   r   Úcollectionsr   r9   r   r   r   r   r%   r(   rB   rV   rc   rq   rt   r�   Ú__name__r   r   r   r   Ú<module>   s$   % 

;