a
    ìàjc  ã                	   @   s>  d Z ddl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dl
Z
e
 d¡ ddlmZ ejjddd� ee d	¡ƒZd
d„ ZeeƒZeD �]Zeedddd��âZe e¡D ]ÆZe d¡dkrÊq¶eedƒZedu s¶edkræq¶e ZdD ]ŠZeede› �ƒZeede› d�ƒZ erðe rðde  k �r4dk rðn qðde   k �rNdk rðn qðeed ed ed ef  !eee f¡ qðq¶W d  ƒ q”1 �s”0    Y  q”e "¡ D ]Z#e# $¡  �q¨g d¢Z%g d¢Z&dd„ e%D ƒZ'e "¡ D ]’Z#e#D ]†\ZZZ e%D ]tZ(e(d e  k�re(d k �rôn nJe'e( Z)e)d  d7  < e)d  e*ee  ƒ7  < e)d  ee  7  <  �qæ�qô�qæ�qÞe+d ƒ e+d!d"›d#d"›d$d%›d&d%›d'�ƒ e,e%e&ƒD ]d\Z(Z-e'e( Z)e)d �r¦e+e-d"›e)d d"›d(e)d  e)d  d)›d*d(e)d  e)d  d+›d*�ƒ �q¦dZ.dZ/dZ0d, Z1 Z2 Z3Z4dZ5dZ6e "¡ D ]üZ#e7e#ƒd-k �rN�q8e#d. \Z8Z9Z:e#d \Z;Z<Z=e8e;k�rx�q8e.d7 Z.e*e9e: ƒZ>e*e<e= ƒZ?e1e>7 Z1e2e?7 Z2e?e>k �r¼e/d7 Z/ne?e>k�rÎe0d7 Z0e3e*e<e9 ƒ7 Z3e4e*e=e: ƒ7 Z4e*e=e9 ƒe*e:e9 ƒk �re5d7 Z5e*e<e: ƒe*e9e: ƒk �r8e6d7 Z6�q8e+d/e.› d0�ƒ e+d1d(e1 e. d2›d*�ƒ e+d3d(e2 e. d2›d4d(de2e1   d5›d6�ƒ e+d7d(e/ e. d8›d9d(e0 e. d8›d:�ƒ e+d;d(e4 e. d2›d*�ƒ e+d<d(e3 e. d2›d*�ƒ e+d=d(e5 e. d8›d>�ƒ e+d?d(e6 e. d8›d>�ƒ g Z@g ZAe,e%e&ƒD ]j\Z(Z-e'e( Z)e)d �r2e(d d@k �rre(d e(d  d- dA ndBZBe@ !eB¡ eA !d(e)d  e)d  ¡ �q2ejCdCdD�\ZDZEeEjFe@eAdEdFd-dG� eE G¡  eE HdH¡ eE IdI¡ eE JdJ¡ eEjKdKdLdM� eD L¡  e M¡ ZNeDjOeNdNdOdP� e PeD¡ e	dQƒ QeN R¡ ¡ e+dRƒ dS )Saø  
Do Kalshi markets converge to Pinnacle's (margin-removed) fair price as kickoff
nears, and how fast? Uses live_data/*.csv PRE snapshots. 'elapsed' (negative) =
minutes to kickoff. gap = pin_fair - kalshi_mid (signed prob); |gap| = mispricing.

Outputs:
 1) mean |gap| and mean signed gap bucketed by time-to-kickoff -> convergence curve
 2) attribution: from each fixture/side's EARLIEST PRE snapshot to its LATEST,
    does Kalshi move toward early-Pinnacle (catch-up) and how much does Pinnacle move?
é    N)Údefaultdict)ÚPathZAggzutf-8Úreplace)ÚencodingÚerrorszE:\soccer\live_data\*.csvc              	   C   s0   zt |  |d¡ƒW S  ttfy*   Y d S 0 d S )NÚ )ÚfloatÚgetÚ	TypeErrorÚ
ValueError)ÚrÚk© r   ú2E:\soccer\research\analysis\_kalshi_convergence.pyÚfval   s    r   r   )Únewliner   r   ZstatusZPREÚelapsed)ÚhomeÚawayZ	pin_fair_Zkalshi_Z_midé   Z	game_dater   r   ))r   é<   )r   éx   )r   é´   )r   éh  )r   éÐ  )r   é   )r   éŸ† )z<1hz1-2hz2-3hz3-6hz6-12hz12-24hz>24hc                 C   s   i | ]}|d dddœ“qS )r   ç        )ÚnÚabsgapÚsgapr   )Ú.0Úbr   r   r   Ú
<dictcomp>0   ó    r#   r   r   r    z6=== Mean Kalshi-vs-Pinnacle gap by time to kickoff ===Zwindowz>8ÚNz	mean|gap|z>11zmean gapz'  (gap=pin_fair - kalshi_mid, prob pts)éd   z>10.2fÚcz>+10.2fr   é   éÿÿÿÿz3
=== Attribution (earliest vs latest PRE snapshot, z fixture-sides) ===zmean |gap| earliest : z.2fzmean |gap| latest   : zc   (z+.0fz	% change)zgap CLOSED in z.0fz% of fixtures, widened in ú%zmean Kalshi mid move : zmean Pinnacle fair move: z$Kalshi moved toward early-Pinnacle: z% of fixturesz$Pinnacle moved toward early-Kalshi: r   r   é   )é
   g      @)Zfigsizezo-z#d62728)ZcolorZlwz)Hours to kickoff (later -> right to left)zMean |gap| (cents)z3Kalshi vs Pinnacle mispricing as kickoff approachesTg333333Ó?)ZalphaZpngr   )ÚformatZdpiz!E:\soccer\_kalshi_convergence.pngz%
chart saved: _kalshi_convergence.png)SÚ__doc__ZcsvZglobÚioZsmtplibÚsysÚcollectionsr   Úpathlibr   Z
matplotlibZuseZmatplotlib.pyplotZpyplotZpltÚstdoutÚreconfigureÚsortedÚfilesr   ÚlistZseriesÚfpÚopenÚfZ
DictReaderr   r	   ZelZminsZsideZpfZkmÚappendÚvaluesÚvÚsortZbucketsZblabZaggr"   ÚaÚabsÚprintÚzipZlabZn_fixÚclosedZwidenedZabs0_sumZabs1_sumZpinmove_sumZkalmove_sumZ
kal_towardZ
pin_towardÚlenZm0Zpf0Zkm0Zm1Zpf1Zkm1Zgap0Zgap1ZxsZysZmidZsubplotsZfigZaxZplotZinvert_xaxisZ
set_xlabelZ
set_ylabelZ	set_titleZgridZtight_layoutÚBytesIOZbufZsavefigÚcloseZwrite_bytesÚgetvaluer   r   r   r   Ú<module>   s¨   
(


<N$,"
L"&ÿ
*
*(
"