a
    áÄj•  ã                   @   s4  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
Z
e
 d¡ ddlmZ ejjddd� e d¡ g Ze d	¡D ]*Ze d
¡r~edkr~e e de ¡¡ q~e e¡Zdd„ ZdD ]<Zejdd„ dd�ee› d�< ejdd„ dd�ee› d�< qÀed ed k e¡ed< ed ed k e¡ed< ejddgd�Z e e d dk Z e !e"ee d  #¡ ƒƒd  ¡Z$ej%e d e$d!�d Z&d"d#„ Z'e d  e'¡e d$< e(e j)d d% ƒZ*e  +e*¡Z,e,dd$g  -d$¡ .dd&d'gi¡ /¡ Z0e0d$  d(d„ ¡e0d)< e0j1d*d+d,�j2d Z3e4e3d) d-ƒ�r,ee3d) j2d ƒn
ee3d) ƒZ5e j2e*d…  6¡ Z7e7e7d. d/ke7d. d0k@  Z7e7d e5  "¡ e7d1< e7 1d1¡j8d2d3gd4d5�Z7e7d6  d7d„ ¡e7d6< e7 1d6¡j/d8d9�Z9e9jg d:¢d�Z9e:d;e5› �ƒ e:d<e;e9ƒ› d=�ƒ d>d?d@dAœZ<d•dCdD„Z=d–dFdG„Z>dHZ?e9e9dI e?k Z@dJdK„ ZAeAdLddMddNd„ dOd„ ƒeAdPddIddQd„ dRd„ ƒeAdSddMddTd„ dUd„ ƒgZBe:dVƒ e:dWdX›dYdZ›d[d\›d]d^›d_d`›dad\›dbd`›dcdd›�ƒ e:deƒ eBD ]~ZCeCdb dfk �rÖdgndhZDe:eCdi dX›eCdj dZ›dkeCdl  dm›dneCdo dp›eCdq dr›eCda ds›eCdb dt›eD› eCdu dv›�
ƒ �qÀe:dwƒ dxdydzd{œZEejFd|d}�\ZGZHeBD ]RZCeHjIeJe;eCd~ ƒƒeCd~ eEeCdi  deCdi › d€eCdu d�›d‚eCdj › dƒ�d„� �qheHjKd…d†d‡ddˆd‰� eH LdŠ¡ eH Md‹¡ eH NdŒ¡ eHjOd�dŽ� eHjPd8d�d�� eG Q¡  eGjRd‘d’d“� e SeG¡ e:d”ƒ dS )—aP  
Corrected re-run of research.ipynb (binned_df path). Faithfully reproduces the
notebook pipeline (cells 3-24: load live_data, highest-CLV pick, time-bin target
selection from first 20%, exclude USL/BSA, dedup one snapshot per game near
TARGET_MINS) then applies ONLY the EVALUATION fixes (core strategy untouched:
draws KEPT, original Kalshi-CLV floor >0.04, NO upper cap):

  1. NET returns: win = decimal_odds - 1 (not the gross decimal odds).
  2. Significance run on the NET returns (correct breakeven = 0).
  3. Kalshi Kelly uses pin_fair of the bet side as p_win (not the market ask).
é    N)ÚstatsZAggzutf-8Úreplace)ÚencodingÚerrorsz	E:\soccerZ	live_dataz.csvztest.csvz
live_data/c                 C   s>   | ||dœ}t  |d ¡r$d tjfS t||jd�}||| fS )N©ÚHÚDÚAr   )Úkey)ÚpdZisnaÚnpÚnanÚmaxÚget)ÚhÚdÚaZcdÚk© r   ú.E:\soccer\research\analysis\_research_fixed.pyÚhighest_clv   s
    
r   )Úb365Úkalshic                 C   s4   t | dt› d� | dt› d� | dt› d� ƒd S )NÚclv_Ú_homeÚ_drawÚ_awayr   ©r   Úbk©Úrr   r   r   Ú<lambda>&   ó    r!   é   ©ZaxisZ_highest_clvc                 C   s4   t | dt› d� | dt› d� | dt› d� ƒd S )Nr   r   r   r   r#   r   r   r   r   r   r!   (   r"   Z_highest_clv_valZftrÚb365_highest_clvZcorrect_b365Úkalshi_highest_clvÚcorrect_kalshi)ZsubsetZstatusZPREÚelapsedéð   )Úbinsc                 C   sF   t ttƒd ƒD ]0}t| |   kr4t|d  krn q|  S qd S ©Nr#   )ÚrangeÚlenr*   )ÚxÚir   r   r   Ú
assign_bin1   s    $r0   Úbingš™™™™™É?ÚmeanÚcountc                 C   s   t t|  t| d   d ƒS )Nr#   é   )Úroundr*   ©r.   r   r   r   r!   :   r"   Zbin_mid)r'   r2   F)Z	ascendingÚilocZleagueZUSLZBSAZdistÚhomeZawayÚfirst)ZkeepÚ	timestampc                 C   s   t  | ¡ ¡ S )N)r   Zto_datetimer:   r6   r   r   r   r!   B   r"   T)Zdrop)Zresult_homeZresult_awayZclv_kalshi_homeZclv_kalshi_drawZclv_kalshi_awayz'TARGET_MINS (best bin from first 20%): z#games after dedup/exclude USL+BSA: Ú
r   r   r   r   çš™™™™™™?c                 C   s0   |d }| | d|   | }t dt||ƒƒ| S )Nr#   g        )r   Úmin)ÚpÚoddsÚbrÚmfÚbÚfr   r   r   Ú
kelly_sizeK   s    rD   ç     @�@c                 C   sV   |}g }t | ||ƒD ]<\}}}	t||||ƒ}
||	r>|
|d  n|
 7 }| |¡ q|S r+   )ÚziprD   Úappend)r?   ZprobsZoutcomesZbr0rA   r@   ÚeqÚor>   ÚwZbetr   r   r   ÚcompoundP   s    rK   g{®Gáz¤?Zkalshi_highest_clv_valc                 C   s¼   t  ¡ }|j|dd�}|j|dd�}|| j}	t |	dk|d d¡}
t|j|j|	ƒ}|
 ¡ |
jdd�t 	t
|
ƒ¡  }dtj |¡ }|	 ¡ }t| t
|ƒ||
 ¡ d|
 ¡  |||d |d�	S )zLStrategy on its own pick side; original Kalshi-CLV gate (>0.04), draws kept.r#   r$   g      ð¿)Zddoféd   éÿÿÿÿ)	ÚnameÚnÚwrÚnet_sumÚroiÚzr>   ÚfinalrH   )ÚgateÚcopyÚapplyÚvaluesr   ÚwhererK   r2   ZstdZsqrtr-   r   ZnormZcdfÚdictÚsum)rN   Zpick_colZclv_val_colZcorrect_colZodds_fnZ
pinfair_fnÚsr?   ZpinZwonZnetrH   rS   r>   rP   r   r   r   Úevaluate[   s    
"ÿr]   ÚB365Zb365_highest_clv_valc                 C   s   | dt | d    S )Nr   r%   ©Úsider   r   r   r   r!   m   r"   c                 C   s   | dt | d    S ©NÚpin_fairr%   r_   r   r   r   r   r!   n   r"   ÚKalshic                 C   s   d| dt | d   d   S )Nç      ð?r   r&   Ú_askr_   r   r   r   r   r!   q   r"   c                 C   s   | dt | d    S )Nrb   r&   r_   r   r   r   r   r!   r   r"   úKalshi w/ B365c                 C   s   d| dt | d   d   S )Nrd   r   r%   re   r_   r   r   r   r   r!   u   r"   c                 C   s   | dt | d    S ra   r_   r   r   r   r   r!   v   r"   z`=== CORRECTED (net returns, pin_fair Kelly) | core unchanged: draws KEPT, floor>0.04, no cap ===Zstrategyz>16ÚNz>5zwin%z>7ZnetSumz>9zROI%z>8rS   r>   zKelly$z>10zG-----------------------------------------------------------------------gš™™™™™©?Ú*ú rN   rO   rL   rP   z>6.1fú%rQ   z>+9.1frR   z>+8.1fz>+7.2fz>8.4frT   z>9.0fzR
(Kelly$ = final compounded bankroll from $1000, real Kelly w/ pin_fair, 2.5% cap)z#2077b4z#d62728z#2ca02c)r^   rc   rf   )é   g      @)ZfigsizerH   r4   z ($z,.0fz, n=ú))ÚcolorÚlwZlabeliè  Zgrayz--g333333ã?)rm   Zlsrn   ÚalphaZBetszBankroll ($)zGCorrected compounded returns (net, pin_fair Kelly) - draws kept, no capÚbest)Zlocg333333Ó?)ro   ztest_fixed.pngéx   )Zdpiz
chart: test_fixed.png)r<   )rE   r<   )TÚ__doc__ÚosZmathÚsysZpandasr   Znumpyr   Zscipyr   Z
matplotlibZuseZmatplotlib.pyplotZpyplotZpltÚstdoutÚreconfigureÚchdirZdfsÚlistdirrC   ÚendswithrG   Zread_csvÚconcatZdfr   r   rW   ZastypeÚintZdropnaZddZceilÚabsr=   Znum_binsZ	histogramr*   r0   r5   ÚshapeZfirst_20ÚheadZdf_firstÚgroupbyZaggZreset_indexZbinnedZsort_valuesr7   rp   ÚhasattrZTARGET_MINSrV   Zdf_remZdrop_duplicatesÚgÚprintr-   r`   rD   rK   ZFLOORrU   r]   Zresultsr    ZsigZcolorsZsubplotsZfigZaxZplotr,   ZaxhlineZ
set_xlabelZ
set_ylabelZ	set_titleZlegendZgridZtight_layoutZsavefigÚcloser   r   r   r   Ú<module>   sÂ   


ÿÿ

ÿ.

ýýý÷80ÿÿÿÿÿ$"ÿ

"