a
    ;<$j   ã                   @   s  d Z ddlZddlZddlZddlZejjddd� e 	d¡ e 
dd¡ d	\ZZd
dgZddgZg d¢ZdddœZdd„ e d¡D ƒZejedd�Zejed ddd�ed< eed  ¡  Zeed dked dk @   ¡ Zeed  e¡  Zg ZeD ]¬Zd e› �Zeee ekee ek @   ¡ Ze d¡jed!d"�Zeed#< ee ed$< ed%e› � ed&< ed'e› d(� ed)< ed'e› d*� ed+< ed,e› � ed-< e  e¡ qúejedd�Z!e!jd$d.d/�jed!d"�Z!e! d¡j"dd0�Z!e #e!d+ dkd1e!d+  ej$¡e!d2< e!d3 e!d#  %e¡k &e'¡e!d4< e!j(g d5¢d6�j"dd0�Z!e #e!d4 d7ke!d2 d7 d8¡e!d9< e!d+ e!d)  e!d:< d;d<„ Z)e*d=e+e!ƒ› d>e!j, -¡ d?›d@e!j. -¡ dA›dBe!j. /¡ dC›dD�	ƒ e*dEƒ e*dFƒ e*dGƒ dHD ]:\Z0Z1e)dIe0dJ›dKe1dJ›dL�e!e!j2e0ke!j2e1k @  ƒ �qÔe*dMƒ e)dNe!e!j2dOke!j2dPk @  ƒ e)dQe!e!j2dPke!j2dRk @  ƒ e*dSƒ e*dTƒ dUD ]*\Z0Z1Z3e)e3e!e!j4e0ke!j4e1k @  ƒ �qhe*dVƒ dWD ]*\Z0Z1Z3e)e3e!e!j5e0ke!j5e1k @  ƒ �q e*dSƒ e*dXƒ e!e!j6eke!j6ek @  Z7e!e!j6dk Z8e!e!j6dk Z9e)dYe!ƒ e)dZe7ƒ e)d[e8ƒ e)d\e9ƒ e*d]e!j6 ¡  /¡ › d^e+e!ƒ› d_�ƒ e*dSƒ e*d`ƒ e!j(d:gd6�Z:e*dae:j; <¡ db dc›dde:j; -¡ db dc›dee:j; =df¡db dc›dge+e:ƒ› dL�	ƒ dhD ]0\Z0Z1Z3e)die3› �e:e:j;e0ke:j;e1k @  ƒ �qÊe*djƒ dkD ](Z>e)dle>db dm›dn�e:e:j;e>k ƒ �qe*dSƒ e*doƒ dp\Z?Z@ZAdqdr„ ZBd�dtdu„ZCdveDdwdx�fdyeDdzdx�fd{eDdwd|d}�fd~eDdwdd}�fd€eDdd�d‚�fdƒeDdd„d‚�ffD ]L\Z3ZEeCf i eE¤Ž\ZFZGe*d…e3d†›d‡eFdˆ›d‰eFe? d7 dŠ›d‹eGdŒ›�ƒ �q²dS )Ža=  
Five strategy-improvement probes on the live Kalshi CLV strategy (BOOK=kalshi,
band [5%,12%), home/away, both-sides dedupe). Reconstructs the signal set from
live_data keeping extra columns (b365 CLV, kalshi bid) so cross-book + spread
analyses are possible. Pure analysis -- nothing here changes the live pipeline.
é    Nzutf-8Úreplace)ÚencodingÚerrorsz	E:\soccerzdisplay.widthéŒ   )çš™™™™™©?ç¸…ëQ¸¾?ÚhomeÚawayZUSLZBSA)Z	game_dater   r	   ÚHÚA)r   r	   c                 C   s,   g | ]$}|  d ¡r|dkrt d| ¡‘qS )z.csvztest.csvz
live_data/)ÚendswithÚpdZread_csv)Ú.0Úf© r   ú+E:\soccer\research\analysis\_ideas_study.pyÚ
<listcomp>   s   ÿr   Z	live_dataT)Zignore_indexZ	timestampZmixedZcoerce)Úformatr   ZtsZstatusZPREÚelapsedZleagueZclv_kalshi_Úfirst)ZkeepÚsideÚclvZ	clv_b365_Úclv_b365Zkalshi_Z_bidZbidZ_askÚaskZ	pin_fair_Úp_winF)Z	ascending)Zdropç      ð?ÚoddsÚftrÚwon)r   r   r   )Zsubseté   g      ð¿ÚnetÚspreadc                 C   sn   t |ƒdkr"td| d›d�ƒ d S td| d›dt |ƒd›d|j ¡ d›d	|j ¡ d
›d|j ¡ d›d�ƒ d S )Nr   ú  z<22z n=  0z n=z>4z | WR ú>5.1%ú | flat ROI z>+7.1%ú | net z>+7.1fÚu)ÚlenÚprintr   Úmeanr    Úsum)ÚnameÚsr   r   r   Úline2   s    r-   zreconstructed z settled signals | WR z.1%r$   z+.1%r%   z+.1fr&   zL(should match the strategy.ipynb baseline of 365 / 26.3% / +18.6% / +67.8u)
zF======================================================================z9#1  CLV SUB-BAND  -- is the edge uniform across [5%,12%)?))r   ç¸…ëQ¸®?)r.   çìQ¸…ë±?)r/   ç{®Gáz´?)r0   çš™™™™™¹?)r1   r   ú[z.0%ú,ú)z  --- coarse halves ---z[5%,8%)r   r0   z[8%,12%)r   zG
======================================================================zH#4  FAVORITE vs LONGSHOT  -- where does the edge live? (by decimal odds)))r   ç       @zfav   (<2.0))r5   ç      @zmid   (2-4))r6   ç       @zlong  (4-8))r7   g    eÍÍAz
bomb  (>8)z"  --- by p_win (Pinnacle fair) ---))ç        ç333333Ã?zp<15%)r9   ç      Ð?z15-25%)r:   çš™™™™™Ù?z25-40%)r;   r   zp>=40%zN#2  CROSS-BOOK AGREEMENT  -- require B365 CLV to agree (currently Kalshi-only)zall (Kalshi signal)zB365 CLV also in bandzB365 CLV > 0 (soft)zB365 CLV <= 0z  (B365 CLV available on ú/z	 signals)zJ#3  SPREAD-QUALITY FILTER  -- skip wide Kalshi bid-ask (spread eats edge)?z  spread (prob pts): median éd   z.1fz | mean z | p90 gÍÌÌÌÌÌì?z  (n=))r   ç{®Gáz”?z<=2c)r>   ç{®Gáz¤?z2-4c)r?   r.   z4-6c)r.   r   z>6czspread z8  --- cumulative: keep only signals with spread <= X ---)r>   g¸…ëQ¸ž?r?   r.   z
spread <= z.0fÚczI#5  SIZING / SHRINKAGE  -- final $ and MAX DRAWDOWN (variance) from $1000)g     @�@r:   r   c                 C   s0   |d }t | | d|   | dƒ}t|| tƒS )Nr   r8   )ÚmaxÚminÚCAP)Úpr   ÚmultÚbr   r   r   r   Úkfrach   s    rG   r8   c           
      C   s¼   t }t }d}t ¡ D ]ž\}}|d ur4t|| dƒ}nD|jd| |j|j   }	tt|	|j| ƒ| dƒ}|dkrxt|t	ƒ}||j
rŽ||jd  n| 7 }t||ƒ}t||| | ƒ}q||fS )Nr8   é   r   r   )ÚBR0ÚsigZiterrowsÚroundr   r   rG   r   rA   ÚFLOORr   )
rE   ÚshrinkÚflatÚbrZpeakZmddÚ_ÚrZstakerD   r   r   r   Úsimj   s    rR   zquarter-Kelly (base)r:   )rE   zeighth-Kellyg      À?zqKelly, 50% edge-shrinkg      à?)rE   rM   zqKelly, 75% edge-shrinkg      è?zflat 1% of bankrollg{®Gáz„?)rE   rN   zflat 2% of bankrollr>   r"   z<26z final $z>8,.0fz  (z>+6.1%z)  | max drawdown r#   )r8   N)HÚ__doc__ÚosÚsysZnumpyZnpZpandasr   ÚstdoutÚreconfigureÚchdirZ
set_optionZEDGE_LOZEDGE_HIZSIDESZEXCLUDEZGAMEZSIDE_LETTERÚlistdirZdfsÚconcatZdfZto_datetimeZnotnaÚcopyZpreZisinZentriesr   r@   ÚqZsort_valuesZdrop_duplicatesÚappendrJ   Zreset_indexÚwhereÚnanÚmapZastypeÚintZdropnar-   r(   r'   r   r)   r    r*   ÚloÚhir   Znmr   r   r   Z	both_bandZb365_posZb365_negZspr!   ZmedianZquantileZthrrI   rC   rL   rG   rR   ÚdictÚkwr   Zddr   r   r   r   Ú<module>   s¬   

 
 $ ">4""



$L(&

û