a
    ³¨Ûi1  ã                   @   s  d dl Zd dlZg d¢ZdddddœZdd	„ Zg Ze ¡ D ]Z\Z	Z
eD ]LZz:ejd
e	› de› d�dd�Zeed< e
ed< e e¡ W qF   Y qF0 qFq:ejedd�Zejg d¢d�Ze ¡ Zejed dd�ed< e d¡jdd�Zeejdd„ dd�Ž \ZZZejeejd�ed< ded  ed< ed d ed < ed ed  d ed!< ed! ed   ed"< ed ed d# ked" d k@ ed$< eed$   ¡ Zed%eeƒ› �ƒ ed&ƒ eed"   ¡  !d'¡ƒ ed(ed"  "¡ d)›d*ed"  "¡ d+ d,›d-�ƒ ed.ed"  #¡ d)›d*ed"  #¡ d+ d,›d-�ƒ ed/ed"  $¡ d)›d*ed"  $¡ d+ d,›d-�ƒ ed j% &d0¡ed1< e ¡ Z'e'd j% &d0¡e'd1< e' (d1¡d"  )¡ Z*ed2ƒ ee*  ¡  !d'¡ƒ ed3e* "¡ d+ d4›d5�ƒ ed6e* #¡ d+ d4›d5�ƒ ed7e* $¡ d+ d4›d5�ƒ d‡d:d;„Z+e'd< d=ke'd>< ed?ƒ ed@ƒ edAƒ edBdC›dDdEdF›dDdGdH›dDdIdJ›dDdKdL›�	ƒ edMƒ dZ,dND �]Z-e+e'e-dO�Z.e.j/�ržedPe-d,›dQdRdF›�ƒ �qhe.dS j0dT Z1e.dS  2¡ Z3e3e.dS  e3 d+  $¡ Z4e1d8kZ5dPe-d,›dU�Z6e,du �re5�se1dVk�rdWndXZ7e,du �r,e5�s,e1dVk�r,e-e1e4fZ,ee6dC›dYe1dZ›dDe1dV d[›d\e4d[›d]e5�r\d^nd_dL›e7› �
ƒ �qhed`ƒ edaƒ edbƒ e+e'dcdO�Z.eddd1de›dDdfdg›dDdhdJ›dDdidj›dDdkdl›dDdSdl›dDdGdm›�ƒ edMƒ e. 8¡ D ]Œ\Z9Z:e;e:dn ƒ› doe;e:dp e:dn  ƒ› �Z<ee:d1 de›dDe;e:dp ƒdg›dDe:dq dr›dDe<dj›dDe:ds dt›dDe:dS du›dDe:dv dw›dG�ƒ �qäe.dS j0dT Z1e.dS  2¡ Z3e3e.dS  e3 d+  $¡ Z4e.dS  =¡ Z>edxe1dy›d*e1dV d4›dze3 $¡ dy›d{e>dy›d|e4d4›d5�ƒ ed`ƒ ed}ƒ edbƒ e+e'd~dO�Z?eddd1de›dDdfdg›dDdhdJ›dDdidj›dDdkdl›dDdSdl›dDdGdm›�ƒ edMƒ e? 8¡ D ]Œ\Z9Z:e;e:dn ƒ› doe;e:dp e:dn  ƒ› �Z<ee:d1 de›dDe;e:dp ƒdg›dDe:dq dr›dDe<dj›dDe:ds dt›dDe:dS du›dDe:dv dw›dG�ƒ �q^e?dS j0dT Z@e?dS  2¡ ZAeAe?dS  eA d+  $¡ ZBedxe@dy›d*e@dV d4›dzeA $¡ dy›d|eBd4›d5�	ƒ edƒ ed€ƒ ed�ƒ eD ]¤ZCe'e'd eCk ZDeDj/�rŒ�qle+eDdcdO�Z.e.j/�r¤�qle.dS j0dT Z1e.dS  2¡ Z3e3e.dS  e3 d+  $¡ Z4edPeC› d‚eeDƒdƒ›d„e1d…›dPe1dV dw›d†e4d4›d5�ƒ �qldS )ˆé    N)Z1920Z2021Z2122Z2223Z2324Z2425Z2526ZEPLZChampionshipzLigue 1zSerie A)ZE0ZE1ZF1ZI1c                 C   s:   d|  d|  d|  }d|  | d| | d| | fS )Né   © )ÚhÚdÚaZoverr   r   úE:\soccer\misc\archive\kelly.pyÚremove_margin   s    r   zE:/soccer/league_data/Ú_z.csvz	utf-8-sig)ÚencodingZSeasonZLeagueT)Zignore_index)ÚFTRÚDateÚB365AÚPSCHÚPSCDÚPSCA)Zsubsetr   )Zdayfirst)Zdropc                 C   s   t | d | d | d ƒS )Nr   r   r   )r   )Úrr   r   r   Ú<lambda>   ó    r   r   )Zaxis)ÚindexZp_awayZ
PSC_fair_Ar   ÚbZedgeÚkelly_fgÍÌÌÌÌÌð?Z	qualifieszQualifying bets: z$
=== Kelly fraction distribution ===é   z
Median Kelly:  z.4fz (éd   z.2fz%)zMean Kelly:    zMax Kelly:     ÚWÚWeekz.
=== Weekly total Kelly stake distribution ===zMedian weekly Kelly total: z.1fú%zMean weekly Kelly total:   zMax weekly Kelly total:    ç      ð?ç     @�@c                 C   s  |}g }|   ¡ } | d j d¡| d< t| d  ¡ ƒD ]Þ}| | d |k }|jrPq4d}d}d}	| ¡ D ]X\}
}|d | }t|dƒ}|| }|	|7 }	|d r´|||d  7 }|d	7 }qd||8 }qd||7 }| t	|ƒt
|ƒt|	d
ƒt|d
ƒt|d
ƒ|t|| dƒdœ¡ |dkr4 �qq4t |¡S )Nr   r   r   r   r   ç      Ð?Úwonr   r   é   é   )r   ÚNÚTotal_stakedÚWeek_PLÚBankrollÚWinsÚ
Bankroll_x)ÚcopyÚdtÚ	to_periodÚsortedÚuniqueÚemptyÚiterrowsÚminÚappendÚstrÚlenÚroundÚpdZ	DataFrame)ÚdataÚkelly_multiplierZstarting_bankrollZbankrollÚhistoryZweekZ	week_betsZweek_plZwinsZtotal_stakedr	   ZbetÚfZstaker   r   r   Úrun_kelly_sim?   sB    


ù
r9   r   ÚAr   zG
======================================================================u?   KELLY SIMULATION â€” vary Kelly fraction (with 25% per-bet cap)zF======================================================================zKelly fractionz<20ú u   Final Â£z>12Úxz>8zMax DD%z>9zBust?z>7zF----------------------------------------------------------------------)gš™™™™™¹?g333333Ã?gš™™™™™É?r   g333333Ó?gš™™™™™Ù?ç      à?g      è?r   g      ø?g       @)r6   z  zx Kelly        ZBUSTr%   éÿÿÿÿzx Kellyiè  z <-- optimal?Ú u    Â£z>11,.2fz>8.1fzx z% ZYESZnoz[
==========================================================================================u&   QUARTER KELLY (0.25x) â€” week by weekzZ==========================================================================================r   Ú
z<14ZBetsz>4ZStakedzW/Lz>5zWeek P&Lz>10z>6r&   ú/r"   r#   z>9.2fr$   z>+10.2fz>10.2fr'   z>6.2fu   
  Final: Â£z,.2fu   x) | Peak: Â£u    | Trough: Â£z | Max DD: u"   HALF KELLY (0.5x) â€” week by weekr=   zB
=================================================================u>   PER-SEASON â€” Quarter Kelly (0.25x), start Â£1000 each seasonzA=================================================================z  bets=z>3u     Â£z>9,.2fz
x  max_dd=)r   r   )EZpandasr4   ZnumpyZnpZseasonsZleaguesr   ZdfsÚitemsÚcodeÚnameÚsZread_csvr   r0   ÚconcatZdfZdropnar(   Zto_datetimeZsort_valuesZreset_indexÚzipZapplyZtHZtDZtAZSeriesr   Z
qualifyingÚprintr2   Zdescriber3   ZmedianZmeanÚmaxr)   r*   Zqualifying_wÚgroupbyÚsumZweekly_kellyr9   ZbestZkmr   r-   Zilocr8   ZcummaxZpkZddZbustZlabelZmarkerr.   r	   ÚrowÚintZwlr/   ZtroughZh2Úf2Zpk2Zdd2ZseasonÚsubr   r   r   r   Ú<module>   sÌ   $...
+.
"
D@&`:@&`2