a
    y:Djm)  ã                   @   s6  d Z ddlZddlZddlZddlZddlmZmZ ddlm	Z	 ddl
mZ ddlmZ ddlmZ ddlZe d¡ ddlmZ ej dd	¡ dd
lmZmZmZmZmZmZmZmZ ej j!ddd� e	dƒZ"dd„ Z#e#dƒZ$e$ %dd¡Z&e$ %dd¡Z'e$ %dd¡Z(ddd„Z)efdd„Z*dd„ Z+e,dk�r2e+ƒ  dS )u’   
Weekly bet summary â€” emails previous week's (Monâ€“Sun) bets.
Scheduled Monday nights via Task Scheduler.

Usage: python weekly_bet_summary.py
é    N)ÚdateÚ	timedelta)ÚPath)ÚMIMEMultipart)ÚMIMEText)Ú	MIMEImageZAggz	E:\soccer)Úbuild_signalsÚ_kellyÚCOMBOSÚBANK0Ú	MIN_STAKEÚFLAT_DOLLARÚFREEZE_DATEÚlog_forward_snapshotzutf-8Úreplace)ÚencodingÚerrorszE:\soccer\data\bet_history.jsonc                 C   sl   i }zPt | ƒD ]B}| ¡ }|r| d¡sd|v r| dd¡\}}| ¡ || ¡ < qW n tyf   Y n0 |S )Nú#ú=é   )ÚopenÚstripÚ
startswithÚsplitÚ	Exception)ÚpathÚenvÚlineÚkÚv© r    ú$E:\soccer\main\weekly_bet_summary.pyÚ	_load_env   s    r"   zE:\soccer\.envZEMAIL_SENDERÚ ÚEMAIL_RECIPIENTÚEMAIL_APP_PASSWORDc           	      C   sâ   t dƒ}| |d< t|d< t|d< t dƒ}| |¡ | t|dƒ¡ |pHg D ]H\}}t|dd�}| d	d
|› d�¡ |jdd|› d�d� | |¡ qJt dd¡�.}| 	tt
¡ | tt| ¡ ¡ W d  ƒ n1 sÔ0    Y  dS )zLinline_images: list of (cid, png_bytes) tuples to embed via cid: references.ZrelatedZSubjectZFromZToZalternativeÚhtmlÚpng)Z_subtypez
Content-IDú<ú>zContent-DispositionZinlinez.png)Úfilenamezsmtp.gmail.comiÑ  N)r   ÚEMAIL_ADDRESSr$   Zattachr   r   Z
add_headerÚsmtplibZSMTP_SSLZloginr%   ZsendmailZ	as_string)	ÚsubjectZ	html_bodyÚinline_imagesÚmsgZaltZcidZ	png_bytesZimgZsrvr    r    r!   Ú
send_email,   s    
r0   c                    sÒ  ddl m ‰  ‡ fdd„}tƒ }|s&dS dddddd	œ}d
ddœ}tjdd�\}}d}tD �]’\}}	}
}|	dv }| }g }g }t|dd„ d�D ]ø}|	dkr¤|d dk r¤qŠ|r°|d n|d }|rÄ|d n|d }d|  k ràdk säqŠ qŠ|	dkrö||ksöqŠ||d ƒ}|du �rqŠ|d �r$d| | nd}|
dk�r^t||ƒ}|dk�rHqŠtt|| t	ƒ|ƒ}nt
}||| 7 }| |¡ | |¡ qŠ|�sŒqX||  d d }|
d k�rªd!nd"}|j|||| |d#|› d$|d%›d&|d'›d(t|ƒ› d)�d*� d+}qX|�st |¡ dS |j| d,d-dd.d/� |tƒ}|du�r\|j|d0d!dd1d/� |j|| ¡ d d2d3d4d5d6d7� | d8¡ | d9¡ | d:¡ |jd;d+d<d=� |jd+d>d?� | ¡  | ¡  t ¡ }|j|d@dAdB� t |¡ | ¡ S )Ca&  Return PNG bytes of the four backtest/forward strategy equity paths
    (baseline/momentum x flat/kelly) over the full live_data signal history.
    Blue = baseline, red = momentum; dashed = flat $10, solid = kelly.
    A vertical line marks FREEZE_DATE (left = in-sample, right = forward/OOS).r   )Údatetimec                    s(   zˆ   | d¡W S  ty"   Y d S 0 d S )Nz%Y-%m-%d)Ústrptimer   )Úgd©Z_dtr    r!   Ú_dE   s    zbuild_equity_chart.<locals>._dNz#1f77b4z#d62728z#2ca02c)ZbfZbkZmfZmkZef)é   é   )ÚflatÚkelly)é   g      @)ZfigsizeF)ÚmomentumÚedgec                 S   s   | d S )Nr3   r    )Úsr    r    r!   Ú<lambda>V   ó    z$build_equity_chart.<locals>.<lambda>)Úkeyr;   ZdriftZaLZa0ZpLZp0r   r<   r3   Úwong      ð¿r9   éd   r8   z--ú-gÍÌÌÌÌÌü?z ($z,.0fz, ú+.1fz%, n=ú))ÚcolorÚ	linestyleÚ	linewidthÚlabelTZgrayú:g333333ã?)rF   rG   rH   ÚalphaZblackgš™™™™™Ù?u    forward â†’ÚtopÚlefté   z#555)ZvaZhaÚfontsizerF   z	Game datezBankroll ($)u?   Strategy equity paths â€” baseline vs momentum Ã— flat vs kellyZbesté	   )ZlocZframeonrO   g333333Ó?)rK   r'   éx   )ÚformatZdpi)r1   r   ÚpltZsubplotsr
   Úsortedr	   ÚminÚmaxr   r   ÚappendZplotÚlenÚcloseZaxhliner   ZaxvlineÚtextZget_ylimZ
set_xlabelZ
set_ylabelZ	set_titleZlegendZgridZautofmt_xdateZtight_layoutÚioÚBytesIOZsavefigÚgetvalue)Ústartr5   ZsigsZstylesZdashesZfigZaxZplottedÚtagZsigZstkrI   ZlateZbankZxsZysÚbÚaÚpÚdZunitnetZfracÚstakeÚroiZlsZfzZbufr    r4   r!   Úbuild_equity_chart>   s€    ÿ




"ÿ

ÿ



rf   c            "         s8  t  ¡ } | tdd� ‰ˆtdd� ‰ˆ d¡› dˆ d¡› �}t ¡ rTt t ¡ ¡ng }‡‡fdd„|D ƒ}d	d
„ ‰dd„ ‰ dd„ }dd„ }t	dd„ |D ƒƒ}t	dd„ |D ƒƒ}t	‡ fdd„|D ƒƒ}t	‡fdd„|D ƒƒ}	|	rì||	 d nd}
|dkrüdnd}d}|D ]þ}| 
d¡}|�r dn|du �r.dnd}ˆ |ƒ}| 
dd¡}| 
d ¡�p`| 
d!¡�p`d}t|ttfƒ�r~|d"›d#�nd}||ƒ}|d$|d% › d&|d' › d(|d) › d&| 
d*d¡› d&| 
d+d¡› d&|› d&||ƒ› d&|› d,ˆ|ƒd-›d&|› d.|› d/|d0›d1�7 }�q|�sd2}z&t td3ƒ ¡ ¡d4 }d5|d6›�}W n t�yP   d7}Y n0 tƒ }|�rbd8nd9}d:|› d;|› d<|› d=|› d>|› d/|d0›d?|› d@|
d"›dA|	d-›dB|› dC|› dD�}dE|› dF|› dG|› dH|d0›�}|�râdI|fgng }t|||dJ� tdK|› �ƒ ztƒ }tdL|dM › dN�ƒ W n4 t�yT } ztdO|› �ƒ W Y d }~n
d }~0 0 z4ddPlm} |ƒ }tdQ|dR › dS|dT › dN�ƒ W n4 t�y¾ } ztdU|› �ƒ W Y d }~n
d }~0 0 z>ddPlm}  | ƒ }!tdV|!dW › dX|!dY › dZ|!d[ › dN�ƒ W n4 t�y2 } ztd\|› �ƒ W Y d }~n
d }~0 0 d S )]Nr   )Zdaysé   z%b %du    â€“ z	%b %d, %Yc                    s8   g | ]0}ˆ   ¡ | d d¡  kr,ˆ  ¡ krn q|‘qS )r   r#   )Z	isoformatÚget©Ú.0r`   )Úlast_mondayÚlast_sundayr    r!   Ú
<listcomp>”   s   (ÿzmain.<locals>.<listcomp>c                 S   s   |   d¡p|   d¡pdS )Nrd   Úkalshi_staker   ©rh   ©r`   r    r    r!   Ú_stake™   r?   zmain.<locals>._stakec                 S   s   |   d¡p|   d¡pdS )NÚpnlZ
kalshi_pnlr   ro   rp   r    r    r!   Ú_pnlš   r?   zmain.<locals>._pnlc                 S   s   |   d¡p|   d¡pdS )NZb365Z
kalshi_asku   â€”ro   rp   r    r    r!   Ú_odds›   r?   zmain.<locals>._oddsc                 S   s   |   d¡s|   d¡rdS dS )Nrd   rn   ZKalshiZB365ro   rp   r    r    r!   Ú	_platformœ   r?   zmain.<locals>._platformc                 s   s   | ]}|  d ¡rdV  qdS )rA   r   Nro   ri   r    r    r!   Ú	<genexpr>ž   r?   zmain.<locals>.<genexpr>c                 s   s*   | ]"}|  d ¡du r|  d¡sdV  qdS )rA   FZvoidr   Nro   ri   r    r    r!   rv   Ÿ   r?   c                 3   s   | ]}ˆ |ƒV  qd S ©Nr    ri   )rs   r    r!   rv       r?   c                 3   s   | ]}ˆ |ƒV  qd S rw   r    ri   )rq   r    r!   rv   ¡   r?   rB   r   z#27ae60z#e74c3cr#   rA   Fz#888Úscoreú?Zclv_b365Z
clv_kalshirD   ú%z
        <tr>
          <td>r   z</td>
          <td>Úhomez vs ZawayZleagueZbetz</td>
          <td>$z.2fz!</td>
          <td style="color:z;font-weight:bold">$z+.2fz</td>
        </tr>zJ<tr><td colspan="10" style="text-align:center">No bets this week</td></tr>z#E:\soccer\data\kalshi_bankroll.jsonZbankrollú$z,.2fzN/Azl<img src="cid:equitychart" alt="strategy equity paths" style="max-width:100%;border:1px solid #ddd"><br><br>z+<p><i>(no signal history available)</i></p>u[   <html><body style="font-family:sans-serif;max-width:960px">
    <h2>Weekly Bet Summary â€” u   </h2>
    <h3 style="margin-top:24px;margin-bottom:6px">Strategy equity paths (baseline vs momentum Ã— flat vs kelly)</h3>
    z²
    <table style="border-collapse:collapse;margin-bottom:16px">
      <tr>
        <td style="padding:8px 20px;background:#f5f5f5;border-radius:4px">
          <b>Record</b><br>zW / zŠL
        </td>
        <td style="padding:8px 20px;background:#f5f5f5;border-radius:4px">
          <b>Net P&L</b><br><span style="color:zŒ</span>
        </td>
        <td style="padding:8px 20px;background:#f5f5f5;border-radius:4px">
          <b>ROI</b><br><span style="color:z">z~%</span>
        </td>
        <td style="padding:8px 20px;background:#f5f5f5;border-radius:4px">
          <b>Staked</b><br>$z~
        </td>
        <td style="padding:8px 20px;background:#f5f5f5;border-radius:4px">
          <b>Kalshi Bankroll</b><br>a^  
        </td>
      </tr>
    </table>
    <table border="1" cellpadding="6" cellspacing="0" style="border-collapse:collapse;width:100%">
      <tr style="background:#eee">
        <th>Date</th><th>Match</th><th>League</th><th>Bet</th>
        <th>Platform</th><th>Odds/Mid</th><th>CLV</th><th>Stake</th><th>Score</th><th>P&L</th>
      </tr>
      z 
    </table>
    </body></html>zWeekly Bets u    â€” zW/zL  $Zequitychart)r.   zSent: z4Appended forward-test snapshot (momentum-flat fwd n=Zmf_nrE   z,WARN: forward-test snapshot logging failed: )Úlog_snapshotz,Appended de-vig band snapshot (honest fwd n=Zhonest_nz, live fwd n=Zlive_nz+WARN: de-vig band snapshot logging failed: z1Appended cross-book snapshot (xlow PRIMARY fwd n=Zxlow_nz, unique n=Zunique_nz, overlap n=Z	overlap_nz*WARN: cross-book snapshot logging failed: )r   Útodayr   ÚstrftimeÚBET_HISTORYÚexistsÚjsonÚloadsÚ	read_textÚsumrh   Ú
isinstanceÚintÚfloatr   r   rf   r0   Úprintr   Z research.forward_test_devig_bandr}   Z!research.forward_test_unique_book)"r~   Z
week_labelZbetsZ	week_betsrt   ru   ZwinsZlossesZnetZstakedre   rF   Z	rows_htmlr`   rA   Zresult_colorrr   rx   ZclvZclv_strÚplatformZ	kalshi_brZkalshi_br_strZ	chart_pngZ
chart_htmlr&   r-   ZimagesZsnapÚeZ
_devig_logrc   Z_unique_logÚur    )rs   rq   rk   rl   r!   Úmain‹   sà    ÿ
 þýý
ü
ûúùø	÷
öõõ
þþÿýùù
ö
öóóðíä $"$ÿÿr�   Ú__main__)N)-Ú__doc__r‚   Úsysr,   r[   r1   r   r   Úpathlibr   Zemail.mime.multipartr   Zemail.mime.textr   Zemail.mime.imager   Z
matplotlibZuseZmatplotlib.pyplotZpyplotrS   r   ÚinsertZforward_test_drift_momentumr   r	   r
   r   r   r   r   r   ÚstdoutÚreconfigurer€   r"   Z_envrh   r+   r$   r%   r0   rf   r�   Ú__name__r    r    r    r!   Ú<module>   s0    
(
M 
