a
    ³¨ÛiH*  ã                   @   sÒ  d dl Zd dlZd dlZd dl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e	dƒ eD ]˜Z
eD ]ŽZde
› de› d�Zej e¡snde› de
› d�Zz&ej ee¡ e	d e
› d!e› �ƒ W qn eyú Z zeed"ƒ ¡  W Y dZ[qndZ[0 0 qnqfe	d#ƒ g Zi 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 �spd'ejv�spd(ejv�rvW �q$ejg d)¢d*�Zeeƒd&k �ršW �q$eed+< e
ed,< eed-< e e¡ e ed ¡eeƒ ee< W n   Y n0 �q$�qej ed.d/�Z!ej"e!d0 d.d1d2�e!d0< e!jd0gd*�Z!e! #d0¡j$d.d3�Z!e	d4ee!ƒ› �ƒ e	d5ƒ e%e ¡ d6d7„ d8�D ]$\ZZ&e	d9ed:›d!e&d;›d<�ƒ �q`d=d>„ Z'd?d@„ Z(e)e!j*dAd7„ dBdC�Ž \Z+Z,Z-e! .¡ Z!dBej/e+e!j0dD� e!dE< dBej/e,e!j0dD� e!dF< dBej/e-e!j0dD� e!dG< e!d( e!dG  e!dG  e!dH< e!dI e!dE  e!dE  e!dJ< e!dK e!dF  e!dF  e!dL< e	dMƒ e	dNƒ e	dOƒ e	dPdQ›d!dRd;›d9dSdT›d9dUdV›d9dWdX›�	ƒ e	dYƒ g Z1e%e 2¡ ƒD ]´Ze!e!d- eke!dH dZk@  Z3d[d\„ e3 4¡ D ƒZ5e'e5ƒ\Z6Z7Z8Z9e6d]k�r´e8d^k�rd_ne8d k�rd`ndaZ:e	edQ›d!e6d;›d9e7db›d9e8dc›d9e9dd›e:› �
ƒ e1 ee6e7e8e9f¡ �q´e	dMƒ e	deƒ e	dOƒ dfD ]’Z;e!e!dH e;k Z3dgd\„ e3 4¡ D ƒZ5e'e5ƒ\Z6Z7Z8Z9e8d^k�rÊd_ne8d k�rØd`ndaZ:e	dhe;di dj›dke6d;›dle7dm›dne8do›dpe9dq›dre:› �ƒ �q†e	dMƒ e	dsƒ e	dOƒ e	dPdQ›d!dRd;›d9dSdT›d9dUdV›d9dWdX›�	ƒ e	dYƒ e%e 2¡ ƒD ] Ze!e!d- eke!dJ dZk@  Z3dtd\„ e3 4¡ D ƒZ5e'e5ƒ\Z6Z7Z8Z9e6d]k�rte8d^k�rÎd_ne8d k�rÜd`ndaZ:e	edQ›d!e6d;›d9e7db›d9e8dc›d9e9dd›e:› �
ƒ �qte	dMƒ e	duƒ e	dOƒ e	dPdQ›d!dRd;›d9dSdT›d9dUdV›d9dWdX›�	ƒ e	dYƒ e%e 2¡ ƒD ] Ze!e!d- eke!dL dZk@  Z3dvd\„ e3 4¡ D ƒZ5e'e5ƒ\Z6Z7Z8Z9e6d]k�rpe8d^k�rÊd_ne8d k�rØd`ndaZ:e	edQ›d!e6d;›d9e7db›d9e8dc›d9e9dd›e:› �
ƒ �qpe	dMƒ e	dwƒ e	dOƒ e	dPdQ›d!dxdy›d!dRd;›d9dSdT›d9dUdV›d9dWdX›�ƒ e	dYƒ g Z<e%e 2¡ ƒD �]ZdzZ=dZ>d{D ]z\Z?Z@ZAZBe!e!d- eke!e@ dZk@  Z3d|d\„ e3 4¡ D ƒZ5e'e5ƒ\Z6Z7Z8Z9e6d]k�rŠe8e=k�rŠe8Z=ee?e6e7e8e9e3eAeBf	Z>�qŠe>�rxe>\	ZZ?Z6Z7Z8Z9Z3ZAZBe8d^k�r0d_ne8d k�r>d`ndaZ:e	edQ›d!e?dy›d!e6d;›d9e7db›d9e8dc›d9e9dd›e:› �ƒ e< ee?e3eAeBf¡ �qxe	dMƒ e	d}ƒ e	dOƒ g ZCe<D ]Þ\ZZ?Z3ZAZBe3 4¡ D ]Ä\ZDZEe(eEd~ eEd eEd€ ƒ\ZFZGZHdBeF dBeG dBeH d�œeB ZIeEeA dB ZJeFeGeHd�œeB Z7eEeA e7 dB Z;eJd k�	rJe;eJ nd ZKeKd k�rÊeC eEd0 eeEd‚ eEdƒ e?eEeA eKeEd' eBkd„œ¡ �qÊ�q´e LeC¡ #d0¡j$d.d3�ZMeMd0 jN Od…¡eMd†< e	d‡eeMƒ› �ƒ e	dˆeMd0  P¡  Q¡ › d‰eMd0  R¡  Q¡ › �ƒ dŠZSd‹ZTg ZUeM Vd†¡D ]Ò\ZWZXd ZYd ZZd Z[eX 4¡ D ]\\ZDZ\ePe\dŒ eS dŠƒZ]eTe] Z^e[e^7 Z[e\d� �
r‚eYe^e\dŽ dB  7 ZYeZdB7 ZZneYe^8 ZY�
q0eTeY7 ZTeU e_eWƒeeXƒe`e[d�ƒe`eYd�ƒe`eTd�ƒeZe`eTd� d‘ƒd’œ¡ eTd k�
r �
qè�
qe LeU¡Zae	d“d†d”›d!dRd•›d!d–d—›d!d˜d;›d!dSd—›d!d™dš›d!d›dX›�ƒ e	dœƒ ea 4¡ D ]Œ\ZDZEebeEd� ƒ› debeEdR eEd�  ƒ› �Zce	eEd† d”›d!ebeEdR ƒd•›d!eEd– dž›d!ecd;›d!eEdŸ dm›d!eEd™ d ›d!eEd› d¡›d›�ƒ �qBead™ jdd¢ Zeead™  f¡ Zgegead™  eg di  R¡ Zhe	d£eed¤›d¥eed� dq›d¦eg R¡ d¤›d§ehdq›dr�	ƒ e	d¨ƒ e	d©ƒ e	dªƒ d«D �]zZid‹ZjeM Vd†¡D ]x\ZWZXd ZkeX 4¡ D ]H\ZDZ\ePe\dŒ ei dŠƒZ]eje] Z^eke\d� �r¶e^e\dŽ dB  ne^ 7 Zk�qxejek7 Zjejd k�rd �qÞ�qdd Zld‹Zmd ZneM Vd†¡D ]¦\ZWZXd ZkeX 4¡ D ]H\ZDZ\ePe\dŒ ei dŠƒZ]eme] Z^eke\d� �rFe^e\dŽ dB  ne^ 7 Zk�qemek7 ZmeRelemƒZleReneld k�r‚elem el di nd ƒZnemd k�rô �qœ�qôe	d9eid¬›d­emd®›d9emd� dd›d¯endq›dr�	ƒ �qPdS )°é    N)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SC3zDownloading data...zE:/soccer/league_data/Ú_z.csvz(https://www.football-data.co.uk/mmz4281/ú/z  Downloaded ú Úwz
Loading data...z	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
Total matches loaded: zLeagues with data:c                 C   s
   | d  S ©Né   © )Úxr   r   ú.E:\soccer\misc\archive\backtest_all_leagues.pyÚ<lambda>B   ó    r   )Úkeyz  z<20z>5z matchesc                 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Úor   r   r   r   Ú
<listcomp>H   r   zsimulate.<locals>.<listcomp>é   éd   c                 s   s   | ]\}}|V  qd S )Nr   )r   r   r   r   r   r   Ú	<genexpr>K   r   zsimulate.<locals>.<genexpr>r   )ÚlenÚsumÚround)ÚbetsZprofitsÚnÚtotalr   r   r   ÚsimulateF   s
    r%   c                 C   s:   d|  d|  d|  }d|  | d| | d| | fS r   r   )ÚhÚdÚaZoverr   r   r   Úremove_marginM   s    r)   c                 C   s   t | d | d | d ƒS )Nr
   r   r   )r)   )Úrr   r   r   r   R   r   r   )Zaxis)ÚindexZ
PSC_fair_HZ
PSC_fair_DZ
PSC_fair_AÚedge_AÚB365HÚedge_HÚB365DÚedge_DzV
=====================================================================================u6   PER-LEAGUE â€” Away CLV >5% (B365 vs Pinnacle closing)zU=====================================================================================ÚLeaguez<22ÚNzP&Lz>8zROI%z>7zWR%z>6zU-------------------------------------------------------------------------------------çš™™™™™©?c                 C   s$   g | ]\}}|d  |d dkf‘qS ©r	   r   ÚAr   ©r   r   r*   r   r   r   r   h   r   r   é   é   z <<z +Ú z>8.2fz>7.2fz>6.1fu3   COMBINED ALL LEAGUES â€” Away CLV by edge threshold)r   g{®Gáz”?r3   çš™™™™™¹?g333333Ã?c                 C   s$   g | ]\}}|d  |d dkf‘qS r4   r   r6   r   r   r   r   w   r   z  >r   z>4.0fz% edge  z bets  P&L=z>+9.2fz  ROI=z>+7.2fz%  WR=z.1fú%u   PER-LEAGUE â€” Home CLV >5%c                 C   s$   g | ]\}}|d  |d dkf‘qS )r-   r   ÚHr   r6   r   r   r   r   †   r   u   PER-LEAGUE â€” Draw CLV >5%c                 C   s$   g | ]\}}|d  |d dkf‘qS )r/   r   ÚDr   r6   r   r   r   r   –   r   z>BEST OUTCOME PER LEAGUE (highest ROI at >5% edge, min 20 bets)ÚOutcomez<8iüÿÿ))ZAwayr,   r	   r5   )ZHomer.   r-   r<   )ZDrawr0   r/   r=   c                 C   s$   g | ]\}}|t  |d  tkf‘qS )r   )Úodds_colÚresultr6   r   r   r   r   ®   r   uD   KELLY COMPOUNDING â€” best outcome per league, >5% edge, 0.25x Kellyr
   r   r   )r<   r=   r5   ÚHomeTeamÚAwayTeam)r   r1   rA   rB   r>   ÚOddsÚKellyÚWonÚWÚWeekz*Total qualifying bets across all leagues: zDate range: z to ç      Ð?g     @�@rD   rE   rC   r   iè  é   )rG   r2   ÚStakedÚPLÚBankrollÚWinsr   Ú
z<14z>4rJ   z>9zW/LrL   z>10r   zF----------------------------------------------------------------------rM   z>9.2frK   z>10.2fz>6.2fr   u
   
Final: Â£z,.2fz (u   x) | Peak: Â£z | Max DD: z=
============================================================u   SENSITIVITY â€” Kelly fractionz<============================================================)r:   rH   g      à?g      ð?z.2fu   x Kelly  Final=Â£z>10,.2fz	x  MaxDD=)oZpandasZpdZnumpyZnpZurllib.requestZurllibÚosZseasonsZleague_namesÚprintÚcodeÚsÚpathÚexistsZurlZrequestZurlretrieveÚ	ExceptionÚeÚopenÚcloseZall_dfsZleague_countsÚitemsÚnameZread_csvr'   r   ÚcolumnsZdropnaÚappendÚgetÚconcatZdfZto_datetimeZsort_valuesZreset_indexÚsortedÚcountr%   r)   ÚzipZapplyZtHZtDZtAÚcopyZSeriesr+   Zleague_resultsÚvaluesÚsubZiterrowsr"   r#   ÚpZroiÚwrZmarkerZedgeZ	best_betsZbest_roiZbest_rowZoutcomeZedge_colr?   r@   Zall_bet_rowsr   r*   ZtH2ZtD2ZtA2ZfairÚbZkelly_fZ	DataFrameZbets_dfZdtZ	to_periodÚminÚdateÚmaxZ
KELLY_MULTZbankrollÚhistoryÚgroupbyZweekZgrpZweek_plZwinsZtotal_stakedZbetÚfZstakeÚstrr!   ZhistÚintZwlZilocÚfinalZcummaxZpkZddZkmÚbrZwplZpk2Zbr2Zdd2r   r   r   r   Ú<module>   s¶  
õ(&
.
 2 >.
 6.
 66 :

ø,

þ


@&`2
((
$