a
    ³&Þiñ&  ã                   @   sf  d Z ddlZddlZdZg 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e	dƒ g Z
e ¡ D ]¸\ZZeD ]ªZde› de› d �Zz†ejed!d"�Zg d#¢Zed$d%„ eD ƒƒs¾W qzejd&d'gd(�Zejed) d*d+d,�ed)< ejd)gd(�Zeed-< e
 eed-g   ¡ ¡ W qz   Y qz0 qzqneje
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i Ze ¡ D ]P\ZZed)  ¡ ed0   ¡  !¡ ed1   ¡  !¡ fZ"e#ed& ƒe#ed' ƒfee"< �q~e	d2e$eƒd3›d4�ƒ e d5¡Z%e e%d6 ¡e%d7< e	d2e$e%ƒd3›d8�ƒ dZ&g g  Z'Z(e% ¡ D ]Ê\ZZed7  ¡ Z)e*ed9 ƒ  ¡  !¡ Z+e*ed: ƒ  ¡  !¡ Z,dZ-d;D ]>Z.dd<l/m0Z0 e)e0e.d=� e+e,fZ"e"ev �rree" Z- �q²�qre-�rÞe' e-d ¡ e( e-d> ¡ e&d>7 Z&ne' ej1¡ e( ej1¡ �q.e'e%d?< e(e%d@< e%e%d?  2¡   ¡ Z3e3d@ e3d?  e3dA< e	dBe&d3›dCe$e%ƒd3›dDe&e$e%ƒ dE dF›dG�ƒ e	dHƒ e	d2dIdJ›dKdLdM›d2dNdO›d2dPdQ›d2dRdQ›�
ƒ dSD ]Ä\Z4Z5e4dTk�rÄe3e3dA dTk Z6n,e4dUk�ràe3e3dA dUk Z6ne3e3dA e4k Z6e$e6ƒdk�r�q e6dV  7¡ dE Z8e6dW  7¡ dE Z9e6dX  7¡ Z:e	d2e5dJ›dKe$e6ƒdY›d2e8dZ›d[e9d\›d[e:d]›�
ƒ �q d^d_„ Z;d`dadbdcdddeœfdfdgdhdddeœfdidjdkdldeœfdmdgdgdgdeœfdndcdddoœfdpdgdddoœfgZ<eD ]øZ=e	dqdr› �ƒ e	d2e=ds›dte$e3ƒd3›du�ƒ e	dr› ƒ e	d2dvdw›dKdxdy›d2dzd{›d2d|d{›d2d}dQ›d2d~d›d2d€d{›�ƒ e	d�ƒ e<D ]n\Z5Z>e;e3e>e=ƒZ?e	d2e5dw›dKe?d‚ dƒ›d2e?dz d„›d…e?d† d„›d[e?d‡ dQ›d2e?dˆ d›d2e?d‰ d{›�ƒ �qN�qÈe	dqdr› �ƒ e	dŠƒ e	dr› ƒ d‹Z@e$e3ƒZAe3dX jBZCe3dŒ jBZDe3d� jBZEe3dA jB Fe#¡Z4e3dV jBZGi ZHeIe3dA  J¡ ƒD ]4ZKe#eKƒZLe4eLkZMeM N¡ dk�r:eGeM  7¡ eHeL< �q:e4dTkZOeO N¡ dk�r–eGeO  7¡ eHdT< e PdŽd�„ eQe4ƒD ƒ¡ZRe	d�ƒ eIeH S¡ ƒD ]PZKeKdTk�rÜe4eKk N¡ n
e4dTk N¡ ZTe	d‘eKd’›d“eHeK dE d”›d•eT› d–�ƒ �qÂd—d˜„ ZUd`dadbdcdddeœfdfdgdhdddeœfdmdgdgdgdeœfdndcdddoœfdpdgdddoœfgZVeD ]ðZ=e	d™e=ds›dš�ƒ e	d2dvdw›dKd›dQ›dKdœdQ›dKd�dQ›dKdždO›dKdŸd›�ƒ e	d ƒ eVD ]’\Z5Z>eUe>e=ƒ\ZWZe	d2e5dw›dKe XeW¡e d¡›d…eWek 7¡ dE d¡›d[eWed¢ k 7¡ dE d¡›d[e Xe¡dE d£›d[eWedb k  7¡ dE d¤›d¥�ƒ �qÂ�qhe	d¦ƒ dS )§z²
Cashout simulation for pure Away CLV strategy.
Loads OOS bets from bets_full_breakdown.csv, matches HT scores from league CSVs,
then compares hold-all vs various cashout rules.
é    Ng     @�@)gš™™™™™¹?ç      Ð?ç      à?)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%Loading HT scores from league data...zE:/soccer/league_data/Ú_z.csvz	utf-8-sig)Úencoding)ÚDateÚHomeTeamÚAwayTeamÚHTHGÚHTAGc                 c   s   | ]}|t jv V  qd S )N)ÚdÚcolumns)Ú.0Úc© r   ú%E:\soccer\misc\archive\cashout_clv.pyÚ	<genexpr>$   ó    r   r	   r
   )Zsubsetr   TZcoerce)ZdayfirstÚerrorsZ
LeagueCode)Zignore_index)r   r   r   z  ú,z matches with HT scoresz!E:\soccer\bets_full_breakdown.csvÚdateZdate_dtz OOS Away CLV betsZ	home_teamZ	away_team)r   é   éÿÿÿÿ)Ú	timedelta)Zdaysr   Zht_homeZht_awayÚ
ht_deficitz  Matched HT scores: z / z (éd   z.1fz%)z0
HT situation breakdown (away team perspective):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ahead 1)é   zahead 2+r   r    ÚwonZflat_plÚoddsZ5dz7.1fz%  z+8.1fz9.2fc                 C   s  t }t }d}d } }}|  ¡ D ]Ê\}	}
t|
d | dƒ}|| }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| }t|| dƒ}t||ƒ}t||| | ƒ}q ||t  |d
 |||dœS )z¼Run Kelly compounding with optional cashout rules.
    rules: dict of deficit -> recovery fraction (e.g. {-1: 0.50} = recover 50% of stake when down 1)
    If rules is None, hold all bets.ç        r   Úkelly_fractionr   r   r   r   r!   r"   r   )ÚfinalÚxÚddÚn_coÚsavedÚmissed)ÚSTARTÚiterrowsÚminÚintÚmax)Zbets_dfÚrulesÚkmÚbkÚpeakÚmax_ddr(   r)   r*   r   ÚrowÚfZstaker   Zco_keyÚplr   r   r   Úrun_strategyn   s"    


r8   )zBaseline (hold all)NzScaled: -1=50% -2=25% -3=5%r   r   gš™™™™™©?)r   r   r   zScaled: -1=40% -2=20% -3=5%gš™™™™™Ù?gš™™™™™É?zScaled: -1=35% -2=15% -3=0%gffffffÖ?g333333Ã?r#   zFlat 40% all deficitszOnly cash -2+ (25/5%))r   r   zOnly cash -2+ (40/5%)Ú
zZ==========================================================================================z.2fz
x Kelly  (z bets with HT scores)ZStrategyz<38ÚFinalz>10r&   z>7ZMaxDDZCashOutsZSavedz>6ZMissedzX  --------------------------------------------------------------------------------------r%   z>10,.0fz>6.1fzx  r'   r(   r)   r*   z&MONTE CARLO (10,000 sims, 0.25x Kelly)i'  Zp_win_pinnacler$   c                 C   s&   g | ]\}}t  t|d ƒt| ¡‘qS )r   )Úwr_by_deficitÚgetr/   Úp_win)r   Úir   r   r   r   Ú
<listcomp>´   s   r?   z'
  Conditional win rates by HT deficit:z    deficit z>2z: z5.1fz%  (n=ú)c                 C   s  t  t| d¡}t  t¡}t  t¡}ttƒD ]Ì}t j t¡tk }t	}t	}d}	ttƒD ]’}
|||
  }t
t|
 dƒ}| ržt|
 dk rž|| v rž| d| |   }n||
 r¶|t|
 d  n| }t
|| dƒ}t
||ƒ}t
|	|| | ƒ}	qT|||< |	||< q,||fS )Nr   r#   r   r   r   )ÚnpZminimumÚkellyZzerosÚN_SIMSÚrangeZrandomÚNÚp_win_conditionalr+   r/   Údeficitr"   )r0   r1   ZstakesZterminalZmax_ddsZsimZoutcomesr2   r3   r4   r>   Úsr   r7   r   r   r   Úmc_run½   s$    



rI   z
  --- zx Kelly ---ZMedianzP(prof)zP(>10x)ZMedDDZRuinzT  ----------------------------------------------------------------------------------z>8.1fé
   z>7.1fz>5.1fú%z
Done.)YÚ__doc__ZpandasZpdZnumpyrA   r+   ZKELLY_MULTSZseasonsZleague_namesÚprintZall_dfsÚitemsÚcodeÚnamerH   ÚpathZread_csvr   ZneededÚallZdropnaZto_datetimeÚappendÚcopyÚconcatZht_dfZ
to_numericZ	ht_lookupr,   r   r5   r   ÚlowerÚstripÚkeyr.   ÚlenZbetsZmatchedZht_home_listZht_away_listZdtÚstrÚhÚaÚfoundZdeltaZdatetimer   ÚnanZnotnaZbets_htrG   ZlabelÚsubZmeanÚwrZroiZavgr8   Z	scenariosr1   r0   ÚrrC   rE   Úvaluesr"   r=   rB   ZastypeZwon_arrr;   ÚsortedÚuniqueZd_valZd_intÚmaskÚsumZmask_3ZarrayÚ	enumeraterF   Úkeysr   rI   Zmc_scenariosÚtZmedianr   r   r   r   Ú<module>   s.  
õ
* 




20

8ù

@`





ÿ",ú	8ÿþýü