a
    í°Ûi„+  ã                   @   s¶  d Z ddlZddlZddlZe d¡ ddlmZ	 ddl
mZ ej d¡ dZdZg d¢Zd	Zg d
¢ZdZg d¢Zdddddddddddddddddddd d!d"d#œZd$d%„ Zed&ƒ g Ze ¡ D ]²\ZZeD ]¤Zd'e› d(e› d)�Zz€ejed*d+�Ze eƒd,k �sd-ej!v�sd.ej!v�rW qÌej"g d/¢d0�Ze eƒd,k �r>W qÌeed1< eed2< eed3< e #e¡ W qÌ   Y qÌ0 qÌqÀej$ed4d5�Z%ej&e%d6 d4d7d8�e%d6< e%j"d6gd0� 'd6¡j(d4d9�Z%ed:e e%ƒd;›d<e%d3  )¡ › d=�ƒ e*e%j+d>d?„ d@dA�Ž \Z,Z-Z.e% /¡ Z%ej0e.e%j1dB�e%dC< d@e%dC  e%dD< e%d. e%dD  e%dD  e%dE< e%e%d1  2e¡e%dE ek@   /¡ Z3g Z4e3 5¡ D ]‚\Z6Z7e7d. d@ Z8e7dC Z9e8dk�r¬e:e9e8 d@e9  e8 dƒndZ;e;dk�rle4 #e7d6 e7d1 e7d3 e7d. e;e9e7d- dFkdGœ¡ �qle <e4¡ 'd6¡j(d4d9�Z=ed:e e=ƒd;›dHe=d6  >¡  ?¡ › dIe=d6  :¡  ?¡ › dJ�ƒ edKe=dL  @¡ dM dN›dO�ƒ edPe=dQ  @¡ dM dN›dO�ƒ dRdS„ e= 5¡ D ƒZAedTeBeAƒe eAƒ dM dU›dO�ƒ edVƒ eD ]‚Ze=e=d1 ek ZCe eCƒdk�rä�q¾dWdS„ eC 5¡ D ƒZDedXe› dYe eCƒdZ›d[eCdL  @¡ dM dN›d\eBeDƒe eDƒ dM d]›dO�	ƒ �q¾ed^d_› �ƒ ed`ƒ ed_› ƒ ed:dadb›dcddde›d:dfdg›d:dhdg›�ƒ ediƒ edjg D ]²ZEeZFeZGdkZHe= 5¡ D ]d\Z6ZIe>eIdl eE dmƒZJeFeJ ZKeFeIdL �ròeKeIdn d@  neK 7 ZFe:eGeFƒZGe:eHeGeF eG ƒZH�q´ed:eEdo›dpeFdq›d:eFe dr›dseHdM dt›dO�	ƒ �qœed^d_› �ƒ edued;›dv�ƒ ed_› ƒ e e=ƒZLe=dn jMZNe=dQ jMZOe=dl jMZPi ZQdwZReD �]ÈZEe SePeE dm¡ZTe Ue¡ZVe Ue¡ZWe UeReLd@ f¡ZXeeXdd…df< eYeƒD ]ðZZej eL¡eOk Z[eZFeZGdkZHeLd@ Z\eYeLƒD ]„Z]eFeTe]  ZeFe[e] �r\eeNe] d@  ne 7 ZFeFdk�r|dZFe]Z\ �q¶e:eGeFƒZGe:eHeGeF eG ƒZHeZeRk �r0eFeXeZe]d@ f< �q0eFeVeZ< eHeWeZ< eZeRk �r eFdk�r deXeZe\d@ d…f< �q eVeWeXdxœeQeE< edyeEdo›dz�ƒ ed{e ^eV¡e d|›d}e ^eV¡d~›dJ�ƒ ede _eVd,¡e d|›df�ƒ ed€e _eVd�¡e d|›df�ƒ ed‚e _eVdƒ¡e d|›df�ƒ ed„e _eVd…¡e d|›df�ƒ ed†eVek @¡ dM dr›dO�ƒ ed‡eVedˆ k @¡ dM dr›dO�ƒ ed‰eVed, k @¡ dM dr›dO�ƒ edŠeVed‹ k  @¡ dM dr›dO�ƒ edŒe ^eW¡dM dr›dO�ƒ ed�e _eWdŽ¡dM dr›dO�ƒ �q¬ed^d�› �ƒ ed:d�d‘›�d’d“� eD ]ZEed:eEdo›d”�d’d“� �qžeƒ  ed•ƒ d–d—d?„ fd˜d™d?„ fdšd›d?„ fdœd�d?„ fdždŸd?„ fd d¡d?„ fd¢d£d?„ fd¤d¥d?„ fd¦d§d?„ fd¨d©d?„ fg
Z`e`D ]†\ZaZbed:ead‘›�d’d“� eD ]\ZEeQeE dª Zcead¨k�	ršed:e ^eQeE d« ¡dM d¬›dO�d’d“� ned:ebecƒ› �d’d“� �	qVeƒ  �	q6d­d®d¯dœZde	jed@d°d±d²�\ZfZgefjhd³ed;›d´eLd;›dµe=d6  >¡  ?¡ › dIe=d6  :¡  ?¡ › d¶�	d,d·d¸� egd ZieD ]vZEeQeE dª Zce _ecdŽ¡Zjeijke Secej¡dMd¹edeE eEdo›dºe ^ec¡e dN›df�d»d¼� eijle ^ec¡edeE d½d¾d¿� �
q0eijledÀd@dÁdÂdÃ� ei mdÄ¡ ei ndÅ¡ ei odÆ¡ eijpdÇdÈ� eijq redÉd?„ ƒ¡ egd@ Zie seLd@ ¡ZteD ]zZEeQeE dÊ Zuej_eudˆddA�Zvej_eudËddA�Zwej_eudŽddA�ZxeijyetevexdÌedeE dÍ� eijzetewedeE d½eEdo›dÎ�dÏ� �qeij{edÀdÐdÁd¿� ei mdÑ¡ ei ndÒ¡ ei odÓ¡ eijpdÇdÈ� ei |dÔ¡ eij} redÕd?„ ƒ¡ egd½ ZieD ]bZEeQeE d« dM Z~eijke~dÖd¹edeE eEdo›dºe ^e~¡d×›dO�d»d¼� eijle ^e~¡edeE d½d¾d¿� �qöei mdØ¡ ei ndÅ¡ ei odÙ¡ eijpdÇdÈ� e	 ¡  e	j€edÚdÛdÜ� edÝe› �ƒ edÞƒ dS )ßzÖ
Monte Carlo on pure Away CLV, OOS-only seasons (2122-2526).
No outcome selection -- just Away bets where B365A > Pinnacle fair by >5%.
Seasons 1920+2021 treated as the "identification" period; 2122 onward is OOS.
é    NZAgg)ÚFuncFormatteré*   i'  g     @�@)gš™™™™™¹?ç      Ð?ç      à?gš™™™™™©?)Ú2122Ú2223Ú2324Ú2425Ú2526zE:\soccer\mc_oos_away_clv.png)Z1920Z2021r   r   r   r	   r
   ZEPLZChampionshipz
League Onez
League TwoZ
ConferencezLa LigaZSegundazSerie AzSerie BZ
Bundesligaz2.BundesligazLigue 1zLigue 2Z
EredivisiezBelgian Pro LeaguezPrimeira Ligaz	Super LigzGreek SLzScottish PremzScottish ChampzScottish L1zScottish L2)ZE0ZE1ZE2ZE3ZECZSP1ZSP2ZI1ZI2ZD1ZD2ZF1ZF2ZN1ZB1ZP1ZT1ZG1ZSC0ZSC1ZSC2ZSC3c                 C   s:   d|  d|  d|  }d|  | d| | d| | fS )Né   © )ÚhÚdÚaZoverr   r   ú)E:\soccer\misc\archive\mc_oos_away_clv.pyÚremove_margin%   s    r   zLoading data...zE:/soccer/league_data/Ú_z.csvz	utf-8-sig)Úencodingé
   ÚFTRÚB365A)r   r   ZB365HZB365DÚPSCHÚPSCDÚPSCA)ZsubsetÚSeasonZ
LeagueCodeZ
LeagueNameT)Zignore_indexÚDateZcoerce)ZdayfirstÚerrors)Zdropz  ú,z matches across z leaguesc                 C   s   t | d | d | d ƒS )Nr   r   r   )r   )Úrr   r   r   Ú<lambda>B   ó    r   r   )Zaxis)ÚindexZp_AZ
PSC_fair_AZedge_AÚA)r   r   ZLeagueÚOddsÚKellyÚp_winÚWonz OOS Away CLV bets  (z to ú)z  Overall win rate: r&   éd   z.1fú%z  Avg Pinnacle fair prob: r%   c                 C   s(   g | ] \}}|d  r |d d nd‘qS ©r&   r#   r   éÿÿÿÿr   ©Ú.0r   r   r   r   r   Ú
<listcomp>b   r    r.   z  Flat ROI: z+.2fz
  By season (flat stake):c                 C   s(   g | ] \}}|d  r |d d nd‘qS r*   r   r,   r   r   r   r.   i   r    z    z  n=z>4z  WR=z%  ROI=z+.1fÚ
zA=================================================================z*DETERMINISTIC KELLY COMPOUNDING (OOS only)z
Kelly multz<16ú ÚFinalz>12Úxz>7ZMaxDDz4  --------------------------------------------------g      ð?g        r$   r   r#   z.2fzx Kelly      z>12,.2fz>7.1fzx  z>6.1fzMONTE CARLO (z simulations, OOS bets only)iô  )ÚterminalÚmax_ddsÚpathsz
  zx Kelly:z    Median:          ú>8.1fu   x  (Â£z>10,.0fz    P10:             z    P25:             é   z    P75:             éK   z    P90:             éZ   z    P(profit):       z    P(> 5x):         é   z    P(> 10x):        z    P(ruin <50%):    r   z    Median MaxDD:    z    95th pct DD:     é_   zF======================================================================ZMetricz<22Ú )Úendzx Kellyz>  ------------------------------------------------------------ZMedianc                 C   s   t  | ¡t d›d�S )Nú>10.1fr2   )ÚnpÚmedianÚSTART©Útr   r   r   r   »   r    ZP10c                 C   s   t  | d¡t d›d�S )Nr   r>   r2   ©r?   Ú
percentilerA   rB   r   r   r   r   ¼   r    ZP25c                 C   s   t  | d¡t d›d�S )Nr7   r>   r2   rD   rB   r   r   r   r   ½   r    ZP75c                 C   s   t  | d¡t d›d�S )Nr8   r>   r2   rD   rB   r   r   r   r   ¾   r    ZP90c                 C   s   t  | d¡t d›d�S )Nr9   r>   r2   rD   rB   r   r   r   r   ¿   r    z	P(profit)c                 C   s   | t k ¡ d d›d�S )Nr(   ú>9.1fr)   ©rA   ÚmeanrB   r   r   r   r   À   r    zP(> 5x)c                 C   s   | t d k ¡ d d›d�S )Nr:   r(   rF   r)   rG   rB   r   r   r   r   Á   r    zP(> 10x)c                 C   s   | t d k ¡ d d›d�S )Nr   r(   rF   r)   rG   rB   r   r   r   r   Â   r    zP(ruin)c                 C   s   | t d k  ¡ d d›d�S )Nr   r(   rF   r)   rG   rB   r   r   r   r   Ã   r    z	Med MaxDDc                 C   s   t  tt d ¡d d›d�S )Nr4   r(   r6   r)   )r?   r@   Ú
mc_resultsÚkmrB   r   r   r   r   Ä   r    r3   r4   rF   Z	steelblueZseagreenZ
darkorangeé   )é   é   )ZfigsizeuL   Monte Carlo: Pure Away CLV (>5% edge vs Pinnacle) â€” OOS Seasons 2122-2526
z simulations, z bets, zV
All leagues, no outcome selection. Outcomes sampled from Pinnacle fair probabilities.Zbold)ÚfontsizeZ
fontweightgÍÌÌÌÌÌÜ?zx Kelly  median=Znone)ZbinsÚalphaÚcolorÚlabelZ	edgecoloré   z--)rP   Ú	linewidthÚ	linestyleZgrayú:u   Start Â£1,000)rP   rS   rT   rQ   u   Terminal bankroll (Â£)Z	Frequencyz*Terminal distribution (capped at 95th pct)é   )rN   c                 C   s   d| d›�S ©Nõ   Â£z,.0fr   ©r2   r   r   r   r   r   ç   r    r5   é2   g¸…ëQ¸¾?)rO   rP   zx Kelly median)rP   rS   rQ   gš™™™™™é?z
Bet numberu   Bankroll (Â£)z#Median path +/- 5th-95th percentileÚlogc                 C   s   d| d›�S rW   r   rY   r   r   r   r   ø   r    éP   z.0fzMax drawdown (%)zMax drawdown distributioné–   Ztight)ZdpiZbbox_inchesz
Chart saved to zDone.)�Ú__doc__ZpandasZpdZnumpyr?   Z
matplotlibZuseZmatplotlib.pyplotZpyplotZpltZmatplotlib.tickerr   ZrandomZseedZN_SIMSrA   ZKELLY_MULTSZEDGE_THRESHZOOS_SEASONSZPLOT_OUTZseasonsZleague_namesr   ÚprintZall_dfsÚitemsÚcodeÚnameÚsÚpathZread_csvr   ÚlenÚcolumnsZdropnaÚappendÚconcatZdfZto_datetimeZsort_valuesZreset_indexZnuniqueÚzipZapplyZtHZtDZtAÚcopyZSeriesr!   ZisinÚsubZrowsZiterrowsr   r   ÚbÚpÚmaxZkelly_fZ	DataFrameZbetsÚminÚdaterH   Zflat_plÚsumZsgÚfprJ   ZbkZpeakZmax_ddZbetÚfZstakeÚNÚvaluesZoddsr%   ZkellyrI   ZN_PLOTZminimumZstakesZzerosr3   r4   r5   ÚrangeZsimZoutcomesZlast_iÚir@   rE   Z
rows_tablerQ   ÚfnrC   ZcolorsZsubplotsZfigZaxesZsuptitleZaxZcapZhistZaxvlineZ
set_xlabelZ
set_ylabelZ	set_titleZlegendZxaxisZset_major_formatterZaranger2   ZpthsZp5Zp50Zp95Zfill_betweenZplotZaxhlineZ
set_yscaleZyaxisZddZtight_layoutZsavefigr   r   r   r   Ú<module>   sÀ  

õ&
$"(

ù
:"L
($
6






$


*""""









ö
*
ÿÿÿÿüÿ 


$



ÿ 


