Ë
    ½R±jà$  ã                  óª  — d Z ddlmZ ddlZddlZddlZddlmZ ddlZ	 ee
«      j                  «       j                  j                  Zej                  j                  d ee«      «       ddlmZ ddlmZmZmZ daddd	d
ddœZdd„Z et0        «      a ed«      ZdZddd„Zddd„Z	 	 d	 	 	 dd„Z dd„Z!d d„Z"d!d„Z#eZ$eZ%d"d„Z&e'dk(  r e&«        yy)#a˜  
MLP Backtest Results Table
==========================
Runs the MLP strategy backtest for every timeframe that has both a data file
and a winner CSV, then prints a comparison table matching TradingView's
Strategy Tester columns:

    TF | PnL % | Max DD % | Win Rate

Usage
-----
    python3 tools/mlp_results_table.py              # all TFs
    python3 tools/mlp_results_table.py --tf 4H 8H  # specific TFs
é    )ÚannotationsN)ÚPath)Ú	OOS_STARTÚSCORE_STARTÚ	TRAIN_ENDÚCOINBASE_BTCUSDÚ240Ú360Ú480Ú720Ú1D)Ú4HÚ6HÚ8HÚ12Hr   c           
     ól   — t         j                  «       D ��ci c]  \  }}|d| › d|› d�“Œ c}}S c c}}w )Nz	data/mlp/z, ú.csv)Ú_TF_PERIODSÚitems)ÚassetÚtfÚps      úh/Users/jameslopez/projects/TradingBot25/.worktrees/mlp-comparable-measurement/tools/mlp_results_table.pyÚ_tf_mapr   $   s=   € Ü:E×:KÑ:KÔ:MÔNÑ:M±°°QˆB�)˜E˜7 " Q C tÐ,Ñ,Ð:MÒNÐNùÓNs   ˜0zresults/winnersg{®Gázt?c                ó6   — |�|nt         }t        d|› d| › d�z  S )NÚ(optimization_winner_strategy_mlp_scores_Ú_r   )ÚASSETÚ
WINNER_DIR)r   r   Úas      r   Úwinner_pathr!   ,   s)   € ØÐ"‰¬€AÜÐBÀ1À#ÀQÀrÀdÈ$ÐOÑOÐOó    c                óà  — ddl m}m} | j                  rt	        ddddd¬«      S  || ||¬«      } || «      }dx}}d}	| j                  «       D ]ó  \  }
}|	�|	d|j                  |
   z   z  }	|d   rÊ|	�Èd	}|�5|t        j                  |d
   d	¬«      t        j                  |d	¬«      k\  z  }|�st        j                  |d	¬«      }t        j                  |d
   d	¬«      }|t        |t        «      r*t        |«      dk(  r||t        j                  d¬«      z   k  n||k  z  }|r|dz  }|t        |	dkD  «      z  }d}	|d   sŒòd}	Œõ t	        |d   |d   |rd|z  |z  nd|||d   |d   |d   ¬«      S )zJShared mark-to-market accounting; win rate includes completed trades only.r   )Únet_returnsÚwindow_metricsç        )ÚpnlÚmax_ddÚwin_pctÚwinsÚtotal©ÚstartÚendNé   Úexecute_exitTÚtime)Úutcé
   )ÚdaysÚexecute_entryg      ð?Úpnl_pctÚdd_pctéd   ÚentriesÚcarry_inÚopen_at_end)r'   r(   r)   r*   r+   r9   r:   r;   )Ústrategies.mlp_accountingr$   r%   ÚemptyÚdictÚiterrowsÚlocÚpdÚto_datetimeÚ
isinstanceÚstrÚlenÚ	TimedeltaÚint)Údf_sigr-   r.   r$   r%   ÚmetricsÚvaluesr*   Ú	completedÚgrowthÚiÚrowÚselectedÚboundÚstamps                  r   Úrun_backtestrR   1   s©  € çEØ‡|‚|Ü˜ 2¨r¸ÀÔCÐCÙ˜V¨5°cÔ:€GÙ˜Ó €FØÐ€Dˆ9Ø€FØ—/‘/Ö#‰ˆˆ3ØÐØ�a˜&Ÿ*™* Q™-Ñ'Ñ'ˆFØˆ~Ò 6Ð#5ØˆHØÐ ØœBŸN™N¨3¨v©;¸DÔAÄRÇ^Á^ÐTYÐ_cÔEdÑdÑd�ØˆÜŸ™ s°Ô5�ÜŸ™ s¨6¡{¸Ô=�ØÄZÐPSÔUXÔEYÔ^aÐbeÓ^fÐjlÒ^l˜U U¬R¯\©\¸qÔ-AÑ%AÒAÐrwð  |Añ  sAñ  B�ÙØ˜Q‘�	Øœ˜F Q™J›Ñ'�ØˆFØˆÓØ‰Fð! $ô" �G˜IÑ&¨w°xÑ/@Ù2;˜˜d™
 YÒ.ÀØ °G¸IÑ4FØ  Ñ,¸'À-Ñ:PôRð Rr"   c                óÎ  — |�|nt         }t        |«      j                  | «      }t        | |«      }|rt        j
                  j                  |«      s t        d| › d�t        j                  ¬«       y |j                  «       s t        d| › d�t        j                  ¬«       y t        j                  |«      j                  d   j                  «       }t        j                  |«      }|j                  j                  j!                  «       |_        t        j"                  j$                  j'                  |d   «      rdnd }	t        j(                  |d   |	d¬	«      j*                  j-                  d «      |d<   t/        |«      }
||
d
<   t1        j2                  |j5                  «       fi |
¤Ž}t7        |||¬«      }t7        ||¬«      }|j8                  s"|d   j;                  «       j=                  d«      nd}|d   t        j>                  t@        «      k\  jC                  «       rt7        |t@        ¬«      }nt/        ddd¬«      }| |d<   |d   |d<   |d   |d<   |d   |d<   ||d<   |S )Nú  u   : data file missing â€” skip©Úfileu   : no winner CSV â€” skipr   r1   ÚsT)Úunitr2   Ú_pine_time_startr,   )r-   z%Y-%m-%dÚ?r&   )r'   r+   r9   r   r'   Úpnl_fullÚpnl_oosr9   Ú	total_oosÚlatest_date)"r   r   Úgetr!   ÚosÚpathÚexistsÚprintÚsysÚstderrrA   Úread_csvÚilocÚto_dictÚcolumnsrD   ÚlowerÚapiÚtypesÚis_numeric_dtyperB   ÚdtÚtz_localizer>   ÚstratÚgenerate_signalsÚcopyrR   r=   ÚmaxÚstrftimeÚ	Timestampr   Úany)r   r-   r.   r   r    Ú	data_fileÚwpÚparamsÚdfrX   Úfull_paramsÚdf_sig_fullÚresultÚresult_fullr^   Ú
result_ooss                   r   Úevaluate_tfr€   Q   s  € ð Ð"‰¬€AÜ˜“
—‘˜rÓ"€IÜ	�R˜Ó	€BáœBŸG™GŸN™N¨9Ô5Ü��2�$Ð2Ð3¼#¿*¹*ÕEØØ�9‰9Œ;Ü��2�$Ð.Ð/´c·j±jÕAØä�[‰[˜‹_×!Ñ! !Ñ$×,Ñ,Ó.€Fä	�‰�YÓ	€BØ—‘—‘×%Ñ%Ó'€B„JÜ—&‘&—,‘,×/Ñ/°°6±
Ô;‰3À€DÜ—‘  6¡
°¸4Ô@×CÑC×OÑOÐPTÓU€B€v�Jô �v“,€KØ&+€KÐ"Ñ#Ü×(Ñ(¨¯©«ÑB°kÑB€KÜ˜+¨U¸Ô<€FÜ˜{°%Ô8€KØHS×HYÒHY�+˜fÑ%×)Ñ)Ó+×4Ñ4°ZÔ@Ð_b€KØ�FÑœrŸ|™|¬IÓ6Ñ6×;Ñ;Ô=Ü! +´YÔ?‰
ä˜b¨°1Ô5ˆ
à€Fˆ4�LØ$ UÑ+€Fˆ:ÑØ# EÑ*€Fˆ9ÑØ$ YÑ/€Fˆ;ÑØ'€Fˆ=ÑØ€Mr"   c                ó,   — | €y| dk\  rd| d›d�S | d›d�S )Nu   â€”r   Ú+z,.1fÚ%© )Úvals    r   Ú_fmt_pnlr†   €   s-   € Ø
€{ØØ! QšhˆQˆs�4ˆj˜ˆ?Ð:¨s°4¨j¸¨NÐ:r"   c                ó*  — ddl m }m} |j                  |j                  «      j	                  d«      }| r| d   j                  dd«      nd}d|› �dd|› d	|› d
|› dt        › d�	dd|› d�dg}| D ]Œ  }	|j                  d|	d   › dt        |	d   «      › d|	d   d›d|	d   d›d|	d   › d|	d   › dt        |	j                  d«      «      › dt        |	j                  d«      «      › d|	j                  d d«      › d!�«       ŒŽ |g d"¢z  }d#j                  |«      S )$zDReturn a GitHub-renderable markdown table for the given result rows.r   )ÚdatetimeÚtimezonez%Y-%m-%d %H:%M UTCr^   rZ   u   # MLP Performance â€” Ú z
*Updated: u    Â· IS: õ    â†’ u	    Â· OOS: z+*z6| TF | IS PnL % | Close-equity DD % | Win Rate | Thru z | OOS PnL % | OOS Entries |z#|---|---:|---:|---:|---:|---:|---:|z| r   z | r'   r(   ú.1fz% | r)   ú.0fú% (r*   Ú/r+   z) | r[   r\   r]   z |)rŠ   zoDrawdown uses close-equity including fees; open positions are marked to market. Win rate uses completed trades.rŠ   z6*Refresh: `python3 tools/mlp_results_table.py --save`*Ú
)
rˆ   r‰   Únowr2   rt   r_   r   Úappendr†   Újoin)
Úrowsr   r-   r.   rˆ   r‰   r‘   ÚlatestÚlinesÚrs
             r   Úformat_markdownr˜   †   s^  € ç+Ø�\‰\˜(Ÿ,™,Ó'×0Ñ0Ð1EÓF€CÙ04ˆT�!‰W�[‰[˜¨Ô,¸#€Fà
   Ð(Ø
Ø
�S�E˜ % ¨¨c¨U°)¼I¸;ÀbÐIØ
Ø
@ÀÀÐHdÐeØ-ð€Eó ˆØ�‰Ø��4‘�	ð Ü˜!˜E™(Ó#Ð$ð %Ø�8‘˜SÐ!ð "Ø�9‘˜cÐ" # a¨¡i [°°!°G±*°ð >Ü˜!Ÿ%™% 
Ó+Ó,Ð-ð .Ü˜!Ÿ%™% 	Ó*Ó+Ð,ð -Ø—‘�{ AÓ&Ð' rð+õ	
ð ð 
ò Lñ L€Eà�9‰9�UÓÐr"   c                ó–  — | st        d«       y | r| d   j                  dd«      nd}d|› d�}dt        › d�}d	d
›ddd›ddd›ddd›ddd›d|d›ddd›d|d›�}d› dd› dd› dd› ddd›dd› ddd›dd› �}t        «        t        |«       t        |«       | D ]§  }t        |d   «      }|d   d›d �}|d!   d"›d#|d$   › d%|d&   › d�}	t        |j                  d'«      «      }
|j                  d(d«      }t        |j                  d)«      «      › d*|› d+�}t        |d,   d
›d|d›d|d›d|	d›ddd›d|
d›ddd›d|d›�«       Œ© t        «        y )-NzNo results.r   r^   rZ   zPnL % (thru Ú)zOOS PnL % (z+)ÚTFz<5Ú zPnL %z>12z
Close DD %z>10zWin Ratez>18rT   rŠ   z>4z>22z>26z-----z------------z
----------z------------------z----------------------z--------------------------r'   r(   rŒ   rƒ   r)   r�   rŽ   r*   r�   r+   r[   r]   r\   z (z trades)r   )rc   r_   r   r†   )r”   r•   Úfull_hdrÚoos_hdrÚheaderÚsepr—   Úpnl_strÚdd_strÚwin_strÚfull_pnl_strÚ
oos_tradesÚoos_strs                r   Úprint_tabler§   ¢   sÐ  € ÙÜˆmÔØá48��a‘—‘˜]¨CÔ0¸c€FØ ˜x qÐ)€HØœy˜k¨Ð,€Gà�b�	˜˜7 3˜- q¨°cÐ(:¸!¸JÀsÐ;KØ�2�b�'˜˜H S˜>Ø�2�b�'˜˜G C˜=ð*€Fð ��q˜˜  & ¨¨6¨(Ø�2�b�'˜˜F˜8Ø�2�b�'˜˜F˜8ð%€Cô 
„GÜ	ˆ&„MÜ	ˆ#„JÛˆÜ  %¡Ó)ˆØ˜H™+ cÐ*¨!Ð,ˆØ˜I™, sÐ+¨3¨q°©y¨k¸¸1¸W¹:¸,ÀaÐHˆÜ §¡ jÓ 1Ó2ˆØ—u‘u˜[¨!Ó,ˆ
Ü" 1§5¡5¨Ó#3Ó4Ð5°R¸
°|À8ÐLˆÜ��4‘˜�˜A˜g c˜]¨!¨F°3¨<°q¸À¸Ø�2�b�'˜˜L¨Ð-Ø�2�b�'˜˜G C˜=ð*õ 	+ð ô 
…Gr"   c            	     óð  — t        j                  d¬«      } | j                  dt        dt        › d�¬«       | j                  ddt	        t
        j                  «       «      t	        t
        j                  «       «      d	¬
«       | j                  dt        dt        › d�¬«       | j                  dt        dt        › d�¬«       | j                  ddt        t        dz  dz  «      t        t        dz  dz  «      dd¬«       | j                  dddd d¬«       | j                  «       }|j                  at        t        «      at        dt        › d|j                   › d|j"                  › d�t$        j&                  ¬«       g }|j(                  D ]8  }t+        ||j                   |j"                  ¬ «      }|sŒ(|j-                  |«       Œ: t/        |«       |j0                  r™t3        |j0                  «      }|j4                  j7                  d!d!¬"«       |j9                  t;        |t        |j                   |j"                  «      «       t        d#|j=                  t        «      › �t$        j&                  ¬«       y y )$NzMLP backtest results table)Údescriptionz--assetzAsset to evaluate (default: rš   )ÚdefaultÚhelpz--tfÚ*z$Timeframes to include (default: all))Únargsrª   Úchoicesr«   z--startzStart date inclusive (default: z--endzEnd date inclusive (default: z--saverZ   Úresultszmlp_performance.mdÚPATHzZWrite markdown table to PATH (default: results/mlp_performance.md; pass --no-save to skip))r­   Úconstrª   Úmetavarr«   z	--no-saveÚsaveÚstore_constz"Skip writing the markdown artifact)ÚdestÚactionr±   r«   zRunning MLP backtest for z [r‹   z]...rU   r,   T)ÚparentsÚexist_okzSaved: )ÚargparseÚArgumentParserÚadd_argumentr   Úlistr   ÚkeysÚDEFAULT_STARTÚDEFAULT_ENDrD   ÚREPOÚ
parse_argsr   r   ÚTF_MAPrc   r-   r.   rd   re   r   r€   r’   r§   r³   r   ÚparentÚmkdirÚ
write_textr˜   Úrelative_to)ÚparserÚargsr”   r   r}   Ú	save_paths         r   ÚmainrÊ   Å   s'  € ä×$Ñ$Ð1MÔN€FØ
×Ñ˜	¬5Ø;¼E¸7À!ÐDð ô Fà
×Ñ˜ c´4¼×8HÑ8HÓ8JÓ3KÜ $¤[×%5Ñ%5Ó%7Ó 8ØCð ô Eð ×Ñ˜	¬=Ø>¼}¸oÈQÐOð ô Qà
×Ñ˜¬Ø<¼[¸MÈÐKð ô Mà
×Ñ˜¨Ü!¤$¨Ñ"2Ð5IÑ"IÓJÜ #¤D¨9Ñ$4Ð7KÑ$KÓ LØ &Øyð	 ô {ð
 ×Ñ˜¨&¸ÈdØAð ô Cà×ÑÓ€Dà�Z‰Z€EÜ”U‹^€Fä	Ð%¤e W¨B¨t¯z©z¨l¸%ÀÇÁ¸zÈÐ
NÔUX×U_ÑU_Õ`Ø€DØ�gŒgˆÜ˜R t§z¡z°t·x±xÔ@ˆÚØ�K‰K˜Õð ô
 �Ôà‡y‚yÜ˜Ÿ™“Oˆ	Ø×Ñ×Ñ t°dÐÔ;Ø×Ñœ_¨T´5¸$¿*¹*ÀdÇhÁhÓOÔPÜ�˜	×-Ñ-¬dÓ3Ð4Ð5¼C¿J¹JÖGð	 r"   Ú__main__)r   rD   Úreturnzdict[str, str])N)r   rD   r   ú
str | NonerÌ   r   )NN)rH   zpd.DataFramerÌ   r>   )NNN)
r   rD   r-   rÍ   r.   rÍ   r   rÍ   rÌ   zdict | None)r…   zfloat | NonerÌ   rD   )
r”   ú
list[dict]r   rD   r-   rD   r.   rD   rÌ   rD   )r”   rÎ   rÌ   ÚNone)rÌ   rÏ   )(Ú__doc__Ú
__future__r   r¹   r`   rd   Úpathlibr   ÚpandasrA   Ú__file__ÚresolverÃ   rÀ   ra   ÚinsertrD   Ústrategies.strategy_mlp_scoresÚstrategy_mlp_scoresrp   Úconfigr   r   r   r   r   r   rÂ   r   Ú
COMMISSIONr!   rR   r€   r†   r˜   r§   r¾   r¿   rÊ   Ú__name__r„   r"   r   Ú<module>rÜ      sô   ðñõ #ã Û 	Û 
Ý ã áˆHƒ~×ÑÓ×&Ñ&×-Ñ-€Ø ‡�‡��‘3�t“9Ô å .ß 4Ñ 4à€à %¨u¸UÈ$ÑO€óOñ 
”‹€áÐ#Ó$€
Ø€
ôPô
Rð@ FJØ%)ð,Ø"ð,Ø.9ó,ó^;óó8ð> €Ø€ó%HðP ˆzÒÙ…Fð r"   