a
    ßûÛi€0  ã                   @   sD  d Z ddl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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-¢d.�Zeeƒd*k �r:W qÈeed/< eed0< eed1< e "e¡ W qÈ   Y qÈ0 qÈq¼ej#ed2d3�Z$ej%e$d4 d2d5d6�e$d4< e$j!d4gd.� &d4¡j'd2d7�Z$ed8ee$ƒd9›d:�ƒ e(e$j)d;d<„ d=d>�Ž \Z*Z+Z,e$ -¡ Z$ej.e*e$j/d?�e$d@< ej.e+e$j/d?�e$dA< ej.e,e$j/d?�e$dB< d=e$d@  e$dC< d=e$dA  e$dD< d=e$dB  e$dE< e$d, e$dE  e$dE  e$dF< e$dG e$dC  e$dC  e$dH< e$dI e$dD  e$dD  e$dJ< dKdL„ Z0g Z1e2e 3¡ ƒD ]–ZdMZ4dZ5dND ]r\Z6Z7Z8Z9e$e$d1 eke$e7 dOk@  Z:dPdQ„ e: ;¡ D ƒZ<e0e<ƒ\Z=Z>Z?Z@e=dRk�rÔe?e4k�rÔe?Z4ee6e:e8e9fZ5�qÔe5�rÄe1 "e5¡ �qÄg ZAe1D ]¤\ZZ6Z:Z8Z9dBd@dAdSœe9 ZBe: ;¡ D ]z\ZCZDeDe8 d= ZEeDeB Z>eEdk�rÊeFe>eE d=e>  eE dƒndZGeGdk�rŠeA "eDd4 ee6eDe8 eGe>eDd+ e9kdTœ¡ �qŠ�qde HeA¡ &d4¡j'd2d7�ZIeId4 jJ KdU¡eIdV< ed8eeIƒd9›dWeId4  L¡  M¡ › dXeId4  F¡  M¡ › dY�ƒ edZeId[  N¡ d\ d]›d^�ƒ ed_eId`  N¡ d\ d]›d^�ƒ eIjOdadbd?� edcƒ eddƒ edeƒ edfƒ edgdh›didjdk›d8dldm›d8dndm›�ƒ edoƒ edpg D ]ÈZPeZQeZRdqZSeI TdV¡D ]x\ZUZVeV ;¡ D ]d\ZCZWeLeWdr eP dsƒZXeQeX ZYeQeWd[ �rzeYeWdt d=  neY 7 ZQeFeReQƒZReFeSeReQ eR ƒZS�q<�q,ed8ePdu›dveQdw›d8eQe dx›dyeSd\ dz›d^�	ƒ �qeddƒ ed{ed9›d|�ƒ edfƒ eeIƒZZeIdt j3Z[eId` j3Z\eIdr j3Z]i Z^d}Z_eD �]ÎZPe `e]eP ds¡Zae be¡Zce be¡Zde be_eZd= f¡Zeeeedd…df< efeƒD ]äZgej eZ¡e\k ZheZQeZRdqZSefeZƒD ]€ZieQeaei  ZeQehei �rØee[ei d=  ne 7 ZQeQdk�rôdZQ �q.eFeReQƒZReFeSeReQ eR ƒZSege_k �r¬eQeeegeid= f< �q¬eQeceg< eSedeg< ege_k �r„eQdk�r„deeegeid= d…f< �q„ecedeed~œe^eP< edePdu›d€�ƒ ed�e jec¡d‚›dƒe jec¡e d]›d„�ƒ ed…e Nec¡d‚›dƒe Nec¡e d]›d„�ƒ ed†e kecd*¡d‚›�ƒ ed‡e kecdˆ¡d‚›�ƒ ed‰e kecdŠ¡d‚›�ƒ ed‹e kecdŒ¡d‚›�ƒ ed�ecek N¡ d\ d]›d^�ƒ edŽeced* k N¡ d\ d]›d^�ƒ ed�eced� k N¡ d\ d]›d^�ƒ ed‘eced’ k  N¡ d\ d]›d^�ƒ ed“e jed¡d\ d]›d^�ƒ ed”e kedd•¡d\ d]›d^�ƒ �q0ed–ƒ ed—d˜›d™dš� eD ]ZPed8ePdu›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
ZlelD ]†\ZmZned8emd±›�d™dš� eD ]\ZPe^eP d² Zoemd¯k�
red8e je^eP d³ ¡d\ d´›d^�d™dš� ned8eneoƒ› �d™dš� �	qÖeƒ  �	q¶dµd¶d·dœZpe
jqd=d¸d¹dº�\ZrZserjtd»ed9›d¼eZd9›d½eId4  L¡  M¡ › dXeId4  F¡  M¡ › d¾�	d¿dÀdÁ� esd ZueD ]pZPe^eP d² Zoe keod•¡Zveujwe `eoev¡d\dÂepeP ePdu›dÃe jeo¡dÄ›�dÅdÆ� eujxe jeo¡epeP dÇdÈdÉ� �
q°eujxedÊd=dËdÌdÍ� eu ydÎ¡ eu zdÏ¡ eu {dÐ¡ euj|dÑdÒ� euj} ~edÓd<„ ƒ¡ esd= Zue eZd= ¡Z€eD ]zZPe^eP dÔ Z�ejke�dÕdd>�Z‚ejke�d�dd>�Zƒejke�d•dd>�Z„euj…e€e‚e„dÖepeP d×� euj†e€eƒepeP dÇePdu›dØ�dÙ� �qŽeuj‡edÊdÚdËdÉ� eu ydÛ¡ eu zdÜ¡ eu {dÝ¡ euj|dÑdÒ� eu ˆdÞ¡ euj‰ ~edßd<„ ƒ¡ esdÇ ZueD ]bZPe^eP d³ d\ ZŠeujweŠdàdÂepeP ePdu›dáe jeŠ¡dâ›d^�dÅdÆ� eujxe jeŠ¡epeP dÇdÈdÉ� �qpeu ydã¡ eu zdÏ¡ eu {dä¡ euj|dÑdÒ� euj} ~edåd<„ ƒ¡ e
 ‹¡  e
jŒedædçdè� edée› �ƒ edêƒ dS )ëzÉ
Monte Carlo simulation on the full CLV Kelly backtest.
Builds the same qualifying bets as backtest_all_leagues.py, then runs
10,000 simulations randomising outcomes using Pinnacle fair probabilities.
é    NZAgg)ÚFuncFormatteré*   i'  g     @�@)gš™™™™™¹?ç      Ð?ç      à?zE:\soccer\mc_kelly_backtest.png)Z1920Z2021Z2122Z2223Z2324Z2425Z2526Z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_kelly_backtest.pyÚremove_margin$   s    r   zLoading data...zE:/soccer/league_data/Ú_z.csvz	utf-8-sig)Úencodingé
   ÚFTRÚB365A)r   r   ÚPSCHÚPSCDÚPSCA)ZsubsetZSeasonZ
LeagueCodeZ
LeagueNameT)Zignore_indexÚDateZcoerce)ZdayfirstÚerrors)Zdropz  ú,z matches loadedc                 C   s   t | d | d | d ƒS )Nr   r   r   )r   )Úrr   r   r   Ú<lambda>A   ó    r   r   )Zaxis)ÚindexZp_HZp_DZp_AZ
PSC_fair_HZ
PSC_fair_DZ
PSC_fair_AÚedge_AÚB365HÚedge_HÚB365DÚedge_Dc                 C   sb   | sdS dd„ | D ƒ}t |ƒ}t|ƒ}|t|dƒt|| d dƒttdd„ | D ƒƒ| d dƒfS )	N)r   ç        r!   r!   c                 S   s    g | ]\}}|r|d  nd‘qS )r   éÿÿÿÿr   )Ú.0ÚoÚwr   r   r   Ú
<listcomp>P   r   z!simulate_flat.<locals>.<listcomp>é   éd   c                 s   s   | ]\}}|V  qd S )Nr   )r#   r   r%   r   r   r   Ú	<genexpr>S   r   z simulate_flat.<locals>.<genexpr>r   )ÚlenÚsumÚround)ÚbetsZprofitsÚnÚtotalr   r   r   Úsimulate_flatN   s
    r0   iüÿÿ))ZAwayr   r   ÚA)ZHomer   r   ÚH)ZDrawr    r   ÚDgš™™™™™©?c                 C   s$   g | ]\}}|t  |d  tkf‘qS )r   )Úodds_colÚresult)r#   r   r   r   r   r   r&   _   r   r&   é   )r1   r2   r3   )r   ZLeagueZOutcomeÚOddsÚKellyÚp_winÚWonÚWZWeekz qualifying bets  (z to ú)z  Overall historical win rate: r:   r(   z.1fú%z  Avg Pinnacle fair win prob:  r9   zE:\soccer\mc_bets.csvFz%  Bets saved to E:\soccer\mc_bets.csvzB
=================================================================z'DETERMINISTIC BACKTEST (actual history)zA=================================================================z
Kelly multz<15ú u   Final Â£z>12Úxz>7ZMaxDDz2--------------------------------------------------g      ð?r!   r8   r   r7   z.2fu   x Kelly    Â£z>11,.2fz>7.1fzx  z>6.1fzMONTE CARLO (z simulations)iô  )ÚterminalÚmax_ddsÚpathsz
  zx Kelly:u       Median:        Â£z>10,.0fz  (zx)u       Mean:          Â£u       P10:           Â£u       P25:           Â£é   u       P75:           Â£éK   u       P90:           Â£éZ   z    P(profit):      z    P(> 10x):       z    P(> 50x):       é2   z    P(ruin <50%):   r   z    Median MaxDD:   z    95th pct DD:    é_   zL
===========================================================================ZMetricz<22Ú )Úendzx KellyzK---------------------------------------------------------------------------ZMedianc                 C   s   dt  | ¡d›�S )Nõ   Â£ú>9,.0f)ÚnpÚmedian©Útr   r   r   r   Ô   r   ZP10c                 C   s   dt  | d¡d›�S )NrJ   r   rK   ©rL   Ú
percentilerN   r   r   r   r   Õ   r   ZP25c                 C   s   dt  | d¡d›�S )NrJ   rC   rK   rP   rN   r   r   r   r   Ö   r   ZP75c                 C   s   dt  | d¡d›�S )NrJ   rD   rK   rP   rN   r   r   r   r   ×   r   ZP90c                 C   s   dt  | d¡d›�S )NrJ   rE   rK   rP   rN   r   r   r   r   Ø   r   z	P(profit)c                 C   s   | t k ¡ d d›d�S )Nr(   ú>9.1fr=   ©ÚSTARTÚmeanrN   r   r   r   r   Ù   r   zP(> 10x)c                 C   s   | t d k ¡ d d›d�S )Nr   r(   rR   r=   rS   rN   r   r   r   r   Ú   r   zP(> 50x)c                 C   s   | t d k ¡ d d›d�S )NrF   r(   rR   r=   rS   rN   r   r   r   r   Û   r   zP(ruin)c                 C   s   | t d k  ¡ d d›d�S )Nr   r(   rR   r=   rS   rN   r   r   r   r   Ü   r   z	Med MaxDDc                 C   s"   t  ttd  d ¡d d›d�S )Nr   rA   r(   z>8.1fr=   )rL   rM   Ú
mc_resultsÚKELLY_MULTSrN   r   r   r   r   Ý   r   z<20r@   rA   rR   Z	steelblueZseagreenZ
darkorangeé   )é   é   )ZfigsizeuF   Monte Carlo: CLV Kelly Strategy â€” Best Outcome Per League, >5% Edge
z simulations, z bets, z2
Outcomes sampled from Pinnacle fair probabilitiesé   Zbold)ÚfontsizeZ
fontweightgÍÌÌÌÌÌÜ?u   x Kelly  median=Â£ú,.0fZnone)ZbinsÚalphaÚcolorÚlabelZ	edgecolorr'   z--)r_   Ú	linewidthÚ	linestyleZgrayú:u   Start Â£1,000)r_   ra   rb   r`   u   Terminal bankroll (Â£)Z	FrequencyzCTerminal bankroll distribution
(capped at 95th pct for readability)é   )r\   c                 C   s   d| d›�S ©NrJ   r]   r   ©r?   r   r   r   r   r     r   rB   é   g¸…ëQ¸¾?)r^   r_   zx Kelly median)r_   ra   r`   gš™™™™™é?z
Bet numberu   Bankroll (Â£)u$   Median path Â± 5thâ€“95th percentileÚlogc                 C   s   d| d›�S re   r   rf   r   r   r   r     r   éP   zx Kelly  median=ú.0fzMax drawdown (%)zMax drawdown distributionc                 C   s   | d›d�S )Nrj   r=   r   rf   r   r   r   r      r   é–   Ztight)ZdpiZbbox_inchesz
Chart saved to zDone.)�Ú__doc__ZpandasZpdZnumpyrL   ÚosZ
matplotlibZuseZmatplotlib.pyplotZpyplotZpltZmatplotlib.tickerr   ZrandomZseedZN_SIMSrT   rW   ZPLOT_OUTZseasonsZleague_namesr   ÚprintZall_dfsÚitemsÚcodeÚnameÚsÚpathZread_csvr	   r*   ÚcolumnsZdropnaÚappendÚconcatZdfZto_datetimeZsort_valuesZreset_indexÚzipZapplyZtHZtDZtAÚcopyZSeriesr   r0   Z	best_betsÚsortedÚvaluesZbest_roiZbest_rowZoutcomeZedge_colr4   r5   ÚsubZiterrowsr-   r.   ÚpZroiÚwrZall_rowsZp_colr   r   ÚbÚmaxZkelly_fZ	DataFrameZbets_dfZdtZ	to_periodÚminÚdaterU   Zto_csvZkmZbkZpeakZmax_ddÚgroupbyZweekZgrpZbetÚfZstakeÚNZoddsr9   ZkellyrV   ZN_PLOTZminimumZstakesZzerosr@   rA   rB   ÚrangeZsimZoutcomesÚirM   rQ   Zmetricsr`   ÚfnrO   ZcolorsZsubplotsZfigZaxesZsuptitleZaxZcapZhistZaxvlineZ
set_xlabelZ
set_ylabelZ	set_titleZlegendZxaxisZset_major_formatterZaranger?   ZpthsZp5Zp50Zp95Zfill_betweenZplotZaxhlineZ
set_yscaleZyaxisZddZtight_layoutZsavefigr   r   r   r   Ú<module>   sâ  

õ&
(

ù
:&$
6





$



**""""









ö
*
ÿÿÿÿüÿ 


$



ÿ 


