a
    ™ÑÚi7(  ã                   @   sÂ  d Z ddlZddlZddlZddlZddlZe d¡ e	dƒ g Z
ee d¡ƒZdZeevrfe e¡ eD ]\ZzJejedd�Zd	ejv r¶d
ejv r¶g d¢Ze
 edd„ eD ƒ  ¡ ¡ W qj   Y qj0 qjeje
dd�Zejed ddd�ed< ejg d¢d� ¡ Zejed	 dd�ed	< ejed
 dd�ed
< ejd	d
gd�Zejg d¢d�Ze	deeƒd›ded  ¡  ¡ › ded  ¡  ¡ › d�ƒ e d¡Ze ed ¡ed< eed dk   d¡j!dd �Ze	deeƒd›d!�ƒ d"d#„ Z"ed$  #e"¡ed%< ed&  #e"¡ed'< ed(  #e"¡ed%< ed)  #e"¡ed'< i Z$e %¡ D ]T\Z&Z'd*D ]DZ(e'd ej)e(d+� e'd% e'd' fZ*e+e'd	 ƒe+e'd
 ƒfe$e*< �q@�q4ej,ed,< ej,ed-< dZ-e %¡ D ]p\Z.Z'd*D ]`Z(e'd ej)e(d+� e'd% e'd' fZ*e*e$v �r¶e$e* \ej/e.d,f< ej/e.d-f< e-d.7 Z- �qª�q¶�qªeed,  0¡   ¡ Z1e1d- e1d,  e1d/< e	d0e-d›d1eeƒd›d2e-eeƒ d3 d4›d5�ƒ e	d6ƒ e	dd7d8›d9d:d;›dd<d=›dd>d?›dd@d?›�
ƒ dAD ]Ü\Z2Z3e2dBk�rÖe1e1d/ dBk Z4n,e2d.k�ròe1e1d/ d.k Z4ne1e1d/ e2k Z4ee4ƒdk�r�q²e4dC  5¡ d3 Z6e4dC e4dD d.  d.e4dC    5¡ d3 Z7e4dD  5¡ Z8e	de3d8›d9ee4ƒdE›de6dF›dGe7dH›dGe8dI›�
ƒ �q²dJZ9dKZ:d–dLdM„Z;dNdO„ Z<e	dPƒ e	dQƒ e<e1dƒZ=e	dRdSdT›d9dUd=›ddVd=›ddWdX›ddYd;›ddZd[›dd\dX›�ƒ e	d]ƒ e	dd^dT›d_e=d` da›ddbd=›de=dc dd›de�	ƒ dfdgdKdhdiœfdjdJdkdhdiœfdldmdndodiœfdpdqdrdodiœfdsdgdgdgdiœfdtdqdqdqdiœfdudKdKdKdiœfdvdgdhdwœfdxdKdhdwœfdydBdoifg
Z>e=d` Z?e>D ]°\Z3Z@e<e1e@ƒZAeAd` e=d`  ZBeAd` e?k�rdznd{ZCeAd` e?k�r(eAd` Z?e3ZDe@ZEe	de3dT›d_eAd` da›deBd|›deAdc dd›dGeAd} d;›deAd~ d[›deAd dX›eC› �ƒ �qÒe	dPƒ e	d€ƒ d—d‚dƒ„ZFd„dfdgdKdhdiœfdjdJdkdhdiœfd…dgdgdgdiœfd†dgdhdwœfgZGe	dRdSdT›d9d‡d?›d9dˆd?›d9d‰d=›d9dŠd=›d9d‹d[›�ƒ e	dŒƒ eGD ]–\Z3Z@e	d�e3› dŽ�ƒ eFe1e@ƒ\ZHZBe	de3dT›d_e IeH¡da›deHd�k 5¡ d3 d�›dGeHd‘k 5¡ d3 d’›dGe IeB¡d3 d’›dGeHd“k  5¡ d3 d”›de�ƒ �qe	d•ƒ dS )˜z˜
Simulate halftime cash-out strategy.
If away team is losing at HT, cash out at a discount based on goal deficit.
Compare vs hold-to-fulltime baseline.
é    NÚignorezLoading HT scores...z=C:\Users\lirse\OneDrive\Desktop\soccer\soccer\odds_data\*.csvzIC:\Users\lirse\OneDrive\Desktop\soccer\soccer\odds_data\extra_leagues.csvF)Z
low_memoryÚHTHGÚHTAG)ÚDateÚHomeTeamÚAwayTeamr   r   ZFTHGZFTAGZFTRc                 C   s   g | ]}|t jv r|‘qS © )ÚdfÚcolumns)Ú.0Úcr   r   ú%E:\soccer\misc\archive\cashout_sim.pyÚ
<listcomp>   ó    r   T)Zignore_indexr   Zcoerce)ZdayfirstÚerrors)r   r   r   )Zsubset)r   )r   r   r   z  ú,z matches with HT scores (z to ú)zCC:\Users\lirse\OneDrive\Desktop\soccer\soccer\fbref\bets_export.csvÚdateZleague_codeZT1)Zdropz bets (excl. Turkey)c                 C   s<   t  ddt| ƒ ¡  ¡ ¡} dD ]\}}|  ||¡} q|  ¡ S )Nz
[^a-z0-9 ]Ú ))zmanchester unitedzman utd)zmanchester cityzman city)zparis saint germainZpsg)ztottenham hotspurZ	tottenham)zatletico madridz
atl madrid)zinter milanZinter)zac milanZmilan)znewcastle unitedZ	newcastle)zwolverhampton wanderersZwolves)zwest bromwich albionz	west brom)zqueens park rangersZqpr)zsheffield wednesdayz	sheff wed)zsheffield unitedz	sheff utd)znottingham forestznottm forest)zbrighton & hove albionÚbrighton)zbrighton hove albionr   )zafc bournemouthZbournemouth)zwest ham unitedzwest ham)zleicester cityZ	leicester)zleeds unitedZleeds)ÚreÚsubÚstrÚlowerÚstripÚreplace)ÚsÚoldÚnewr   r   r   Únorm)   s    r   r   Zht_nr   Zat_nZ	home_teamZ	away_team)r   é   éÿÿÿÿ)ZdaysZht_homeZht_awayr    Ú
ht_deficitz
Matched HT scores: z / z (éd   z.1fz%)z)
HT situation breakdown (comeback rates):Z	Situationz<12ú Únz>5zFT_win%z>8ZFlat_ROIz>9Zavg_odds))éýÿÿÿzdown 3+)éþÿÿÿzdown 2)r!   zdown 1)r   Úlevel)r    Zwinningr&   ÚwonÚb365_AZ5dz7.1fz%  z+8.1fz9.2fç      à?çš™™™™™É?c                 C   s0   |d }| | d|   | }t t|dƒ| |ƒS )Nr    r   )ÚminÚmax)ÚpÚoddsZfracZmxÚbÚkr   r   r   Úkelly_stakef   s    r3   c                 C   sú   d}d}d}d } }}|   ¡ D ]Ä\}}	|t|	d |	d ttƒ }
t|	d ƒ}t|dƒ}|r¢|dk r¢||v r¢|
 d||   }|d7 }|	d	 r˜|d7 }qÀ|d7 }n|	d	 rº|
|	d d  n|
 }||7 }t||ƒ}t||| | ƒ}q ||d
 |||dœS )Nç     @�@ç        r   Úmodel_pAr*   r"   r&   r    r)   r#   )ÚfinalÚddÚn_coÚsavedÚmissed)Úiterrowsr3   Ú
KELLY_FRACÚ	MAX_STAKEÚintr.   r-   )Úbets_dfÚrulesÚbkÚpeakÚmax_ddr9   r:   r;   Ú_Úrowr   ÚdZco_keyÚplr   r   r   Úrun_strategyj   s    

rI   z[
==========================================================================================z;STRATEGY SWEEP  (actual backtest, excl. Turkey, Half Kelly)z
  ZStrategyz<40zFinal$zvs BaseZMaxDDz>7ZCOdZSavedz>6ZMissedzZ  ----------------------------------------------------------------------------------------zBaseline (hold all)z $r7   z>7,.0fz---r8   z>6.1fú%zScaled: -1=40% -2=20% -3=5%gš™™™™™Ù?gš™™™™™©?)r!   r'   r&   zScaled: -1=50% -2=25% -3=5%g      Ð?zScaled: -1=35% -2=15% -3=0%gffffffÖ?g333333Ã?r5   zScaled: -1=30% -2=10% -3=0%g333333Ó?gš™™™™™¹?zFlat 40% all deficitszFlat 30% all deficitszFlat 20% all deficitszOnly cash -2+ (40/20/5%))r'   r&   zOnly cash -2+ (20/5%)zOnly cash -3 (0%)u	    â—„ BESTr   z>+8,.0fr9   r:   r;   zMONTE CARLO (10,000 sims)é'  c                    s   t ˆ ƒ}ˆ d j}ˆ d j}ˆ d  d¡ dd„ ¡j}ˆ d j}t dd	„ t||ƒD ƒ¡}i ‰d
D ]4}	||	k}
|
 ¡ dkr†||
  ¡ n
ˆ d  ¡ ˆ|	< qbt ‡ ‡fdd	„|D ƒ¡}t 	|¡}t 	|¡}t
|ƒD ]È}tj |¡|k }d}d}d}t
|ƒD ]Ž}|||  }|�r@|| dk �r@|| |v �r@| d|||    }n || �rZ||| d  n| }||7 }t||ƒ}t||| | ƒ}qö|||< |||< qÎ||fS )Nr*   r6   r"   r   c                 S   s   t t| ƒdƒS )Nr&   )r.   r?   )Úxr   r   r   Ú<lambda>¢   r   zmc_run.<locals>.<lambda>r)   c                 S   s   g | ]\}}t ||ttƒ‘qS r   )r3   r=   r>   )r   r/   Úor   r   r   r   ¤   r   zmc_run.<locals>.<listcomp>)r&   r'   r!   r   r    é   é   c                    s    g | ]}ˆ  |ˆ d   ¡ ¡‘qS )r)   )ÚgetÚmean)r   rG   ©r@   Zwr_by_deficitr   r   r   ª   r   r4   r5   r    )ÚlenÚvaluesZfillnaÚapplyÚnpZarrayÚzipÚsumrR   ZzerosÚrangeZrandomr.   r-   )r@   rA   Zn_simsÚNr0   ZpAZdeficitsr)   ZstakesrG   ÚmaskZwr_arrZterminalZmax_ddsZsimZoutcomesrB   rC   rD   Úir   rH   r   rS   r   Úmc_runž   s0    


*" r^   )ZBaselineNzFlat 40% allzOnly cash -2+ (40/5%)ZMedianzP(prof)zP(>5k)ZMedDDZRuinzT  ----------------------------------------------------------------------------------z  Running: z...iè  z>8.1fiˆ  z>7.1fiô  z>5.1fz
Done.)r+   r,   )rK   )JÚ__doc__ZpandasZpdZnumpyrW   ZglobÚwarningsr   ÚfilterwarningsÚprintZdfsÚlistZ
ht_sourcesZextraÚappendÚfZread_csvr	   r
   ZneededÚcopyÚconcatZht_allZto_datetimeZdropnaZ
to_numericZdrop_duplicatesrT   r-   r   r.   ZbetsZsort_valuesZreset_indexr   rV   Z	ht_lookupr<   rE   rF   ZdeltaZ	TimedeltaÚkeyr?   ÚnanZmatchedÚidxZatZnotnaZbets_htZdeficitZlabelr   rR   ÚwrZroiZavgr=   r>   r3   rI   ÚbaseZ	scenariosZ
best_finalrA   ÚrrG   ZmkZ
best_labelZ
best_rulesr^   Z
mc_configsÚtZmedianr   r   r   r   Ú<module>   sð   (

 :
"$"
 20

(8

@2
ö
,ÿÿÿÿ
û8ÿþýü