a
    ­¤jØ  ã                
   @   sÄ  d Z ddlZddlZddlmZ ddlmZ e edƒ ¡ ¡Z	dd„ e	D ƒZ
e
jdd	„ d
� dZdd„ Zdd„ Zdd„ Zdd„ e
D ƒZdd„ e
D ƒZeedƒZeedƒZedƒ edee
ƒ› d�ƒ edƒ edd›ddd›ddd›�ƒ edƒ dD ] \ZZZee Zee Zeeeƒ�r:e e¡�s4e e¡�r:dZn
e  e¡Zeeeƒ�rne e¡�she e¡�rndZ!n
e  e¡Z!eed›ded›de!d›�ƒ qöeƒ  ed ed! d"›d#ed$ d"›�ƒ ed%ed! d"›d#ed$ d"›�ƒ d&d'„ Z"e"eƒ\Z#Z$e"eƒ\Z%Z&eƒ  ed(e#› d)e$› d*e$e# › d+�ƒ ed,e
e#  'd-¡�pBe
e# d. › d/e
e$  'd-¡�p`e
e$ d. › �ƒ ed0e%› d)e&› d*e&e% › d+�ƒ ed,e
e%  'd-¡�p¦e
e% d. › d/e
e&  'd-¡�pÄe
e& d. › �ƒ d1d2„ Z(e(eƒZ)e(eƒZ*d3d4„ Z+eƒ  ed5d›ddd›ddd›�ƒ edƒ ed6d›dee)ƒd›dee*ƒd›�ƒ ed7d›dd8e e,e)ƒd9ƒ d›dd8e e,e*ƒd9ƒ d›�ƒ ed:d›dd8e e-e)ƒd9ƒ d›dd8e e-e*ƒd9ƒ d›�ƒ ed;d›dd8e e+e)d<ƒd9ƒ d›dd8e e+e*d<ƒd9ƒ d›�ƒ ed=d›dd8e e+e)d>ƒd9ƒ d›dd8e e+e*d>ƒd9ƒ d›�ƒ ed?d›dd8e e+e)d@ƒd9ƒ d›dd8e e+e*d@ƒd9ƒ d›�ƒ edAd›de.dBdC„ e)D ƒƒee)ƒ dD dE›dFe.dBdC„ e*D ƒƒee*ƒ dD dE›dG�ƒ dS )Hz¦
Drawdown comparison: YES-underdog vs NO-favorite using the SAME signal selection.
Computes max drawdown, daily volatility, Sharpe-like ratio, longest losing streak.
é    N)ÚPath)ÚdefaultdictzE:/soccer/bet_history.jsonc                 C   s<   g | ]4}|  d ¡r|  d¡r|  d¡dur|  d¡r|‘qS )Ú
kalshi_askÚkalshi_stakeÚwonNÚftr©Úget©Ú.0Úb© r   ú*E:\soccer\misc\archive\drawdown_compare.pyÚ
<listcomp>   s   ,ÿr   c                 C   s   |   d¡p| d | d fS ©NÚresolved_atÚdater   )r   r   r   r   Ú<lambda>   ó    r   )Úkeyg      Ð?c                 C   s2   | d }|r(| d d| d   | d  S | d  S )Nr   r   é   r   r   )r   Zyes_winr   r   r   Úper_bet_pnl_yes   s    r   c                 C   sp   | d }d|  ¡ v }| d }| d t }|dkr4dS |r@|dkpL| oL|dk}|rf| d	 d
|  | S | d	  S )NZbetZHOMEr   r   g®Gáz®ï?ç        ÚAÚHr   r   )ÚupperÚ
DRAW_PRICE)r   ZsideZis_home_betr   Zno_priceZno_winr   r   r   Úper_bet_pnl_no   s    r   c                    sH  g }d}| D ]}||7 }|  |¡ q|d }d}|}|}|d }	|D ],}
|
|	krT|
}	|	|
 }||krD|}|	}|
}qD|d }t| ƒt| ƒ ‰ t‡ fdd„| D ƒƒt| ƒ }t |¡}|r¾ˆ | nd}d}d}| D ]$}|dk rî|d7 }t||ƒ}qÎd}qÎ|t| ƒ|||dk�r|| d ntdƒ||ˆ |||t d	t| ƒd
  ¡ ||dœS )Nr   r   éÿÿÿÿc                 3   s   | ]}|ˆ  d  V  qdS )é   Nr   )r   Úp©Zmean_pnlr   r   Ú	<genexpr>?   r   z!drawdown_stats.<locals>.<genexpr>r   éd   Únanéü   é#   )ÚlabelÚnÚ	final_pnlÚmax_ddÚmax_dd_pct_of_finalÚmax_dd_peakÚmax_dd_troughÚmeanÚstdÚsharpe_per_betZsharpe_annualÚlongest_loss_streakÚcum)ÚappendÚsumÚlenÚmathZsqrtÚmaxÚfloat)Úpnlsr'   r2   Úsr    ÚpeakZ
max_dd_absr,   r-   Zcurrent_peakÚvZddÚfinalZvar_pnlZstd_pnlr0   r1   Z
cur_streakr   r!   r   Údrawdown_stats'   sX    
ór>   c                 C   s   g | ]}t |ƒ‘qS r   )r   r
   r   r   r   r   ^   r   c                 C   s   g | ]}t |ƒ‘qS r   )r   r
   r   r   r   r   _   r   zYES underdogzNO favoritezN==============================================================================zDRAWDOWN COMPARISON (z bets, chronological)ZMetricz<32ú z>16zN------------------------------------------------------------------------------))r(   zSample sizeú{:>16d})r)   z	Final P&Lz${:>+15.2f})r.   zAvg P&L per betz${:>+15.4f})r/   zStdev per betú
${:>15.2f})r0   zSharpe per betz	{:>16.3f})r*   zMax drawdown ($)rA   )r+   zMax DD as % of final P&Lz
{:>15.1f}%)r1   zLongest losing streakr@   zn/azYES underdog DD: peak $r,   z.2fz -> trough $r-   zNO favorite DD:  peak $c                 C   s‚   g }d}| D ]}||7 }|  |¡ q|d }d}d}d}d}t|ƒD ]4\}	}
|
|kr\|
}|	}||
 |krD||
 }|	}|}qD||fS )Nr   )r3   Ú	enumerate)r9   r2   r:   r    r;   Zpeak_ir*   Ztrough_iZ
max_peak_iÚir<   r   r   r   Úfind_dd_window„   s    rD   z"YES underdog max DD spanned bets #z -> #z  (z bets)z	  Dates: r   r   z  ->  z"NO favorite  max DD spanned bets #c                 C   sJ   t tƒ}t| tƒD ]*\}}| d¡p*|d }||  |7  < qt| ¡ ƒS r   )r   r8   ÚzipÚbetsr	   ÚsortedÚvalues)r9   Zby_dayr    r   Údr   r   r   Ú
daily_pnls�   s
    rJ   c              	   C   s<   | sdS t | ƒ} | tdtt| ƒd t|d t| ƒ ƒƒƒ S )Nr   r   r#   )rG   r7   Úminr5   Úint)Zarrr    r   r   r   Úpct§   s    rM   zDaily P&L metriczTrading dayszBest dayú$z+.2fz	Worst dayz
Median dayé2   z5th pctile (bad day)é   z95th pctile (great day)é_   z% losing daysc                 c   s   | ]}|d k rdV  qdS )r   r   Nr   )r   rI   r   r   r   r"   µ   r   r"   r#   z>15.1fz% ú%)/Ú__doc__Zjsonr6   Úpathlibr   Úcollectionsr   ÚloadsÚ	read_textÚhrF   Úsortr   r   r   r>   Zyes_pnlsZno_pnlsZ	yes_statsZno_statsÚprintr5   r   r'   ZfmtZyvZnvÚ
isinstancer8   ZisnanZisinfZysÚformatÚnsrD   Zyes_piZyes_tiZno_piZno_tir	   rJ   Z	yes_dailyZno_dailyrM   r7   rK   r4   r   r   r   r   Ú<module>   sl   7


$
$
    D D&::>>>