
    %j                       d dl mZ d dlZd dlZd dlm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mZ  ed	
           G d d                      Z ed	
           G d d                      Z ed	
           G d d                      Zd4dZd5dZd6dZd7d!Zd8d%Zd9d(Zd)d*d:d/Zd;d<d2Zed3k    r e e                      dS )=    )annotationsN)	dataclass)datetimetimezone)Path)mean)Any)	BotConfigRuntimePathsT)frozenc                  j    e Zd ZU ded<   ded<   ded<   ded<   ded	<   d
ed<   ded<   ded<   ded<   dS )TradeContextMatchstrcoinr   entry_tsexit_tszdatetime | None
context_tsztuple[str, ...]context_tagszfloat | Nonecontext_reliabilityfloatrealized_pnl_usdexit_reasoninttime_in_trade_minutesN__name__
__module____qualname____annotations__     signal_correlation.pyr   r      s{         III!!!!%%%%r!   r   c                  L    e Zd ZU ded<   ded<   ded<   ded<   ded<   ded	<   d
S )TagStatsr   tagr   sample_sizer   win_rateavg_pnl_usdtotal_pnl_usdavg_time_in_trade_minutesNr   r    r!   r"   r$   r$      sT         HHHOOO$$$$$$r!   r$   c                  8    e Zd ZU ded<   ded<   ded<   ded<   dS )	CorrelationResultlist[TradeContextMatch]matchesdict[str, TagStats]	tag_statsr   closed_trade_countopen_entry_countNr   r    r!   r"   r,   r,   %   sB         $$$$""""r!   r,   valuer	   returnr   c                    t          j        t          |                     }|j         |                    t
          j                  S |                    t
          j                  S )N)tzinfo)r   fromisoformatr   r6   replacer   utc
astimezone)r3   dts     r"   	_parse_tsr<   -   sJ    		E

	+	+B	yzzz...==&&&r!   path
str | Pathlist[dict[str, Any]]c                H   t          |                                           }|                                sg S g }|                    d                                          D ]?}|                                }|r'|                    t          j        |                     @|S )Nzutf-8)encoding)	r   
expanduserexists	read_text
splitlinesstripappendjsonloads)r=   prowslines       r"   _read_jsonlrM   4   s    T

A88:: 	DW--88:: * *zz|| 	*KK
4(()))Kr!   entrydict[str, Any]contextsdict[str, Any] | Nonec                   t          |                     dd                                                    }t          |                     d                    }g }|D ]}t          |                    dd                                                    |k    r<	 t          |                    d                    }n# t          $ r Y lw xY w||k    r|                    ||f           |sd S t          |d           d         S )Nr    tsc                    | d         S )Nr   r    )xs    r"   <lambda>z_best_context.<locals>.<lambda>O   s
    1 r!   key   )r   getupperr<   	ExceptionrG   max)rN   rP   r   r   
candidatesctxctx_tss          r"   _best_contextrb   @   s   uyy$$%%++--D4))HJ - -swwvr""##))++t33	swwt}}--FF 	 	 	H	Xvsm,,, tz~~...q11s   "B<<
C	C	events7tuple[list[tuple[dict[str, Any], dict[str, Any]]], int]c                r   i }g }t          | d           }|D ]}|                    d          du rt          |                    dd                                                    }|                    d          dk    r*|                    |g                               |           |                    d          d	k    rE|                    |          pg }|r,|                    d
          }|                    ||f           t          d |                                D                       }||fS )Nc                H    t          |                     dd                    S )NrT   rS   )r   r[   )es    r"   rW   z%_pair_closed_trades.<locals>.<lambda>U   s    QUU4__1E1E r!   rX   dry_runTr   rS   
event_typerN   exitr   c              3  4   K   | ]}t          |          V  d S N)len).0vs     r"   	<genexpr>z&_pair_closed_trades.<locals>.<genexpr>a   s(      ;;SVV;;;;;;r!   )	sortedr[   r   r\   
setdefaultrG   popsumvalues)	rc   open_entriespairssorted_eventseventr   entriesrN   
open_counts	            r"   _pair_closed_tradesr|   R   s@   46L9;E6'E'EFFFM 
- 
-99Y4''599VR(())//1199\""g--##D"--44U;;;;YY|$$.."&&t,,2G -AeU^,,,;;\%8%8%:%:;;;;;J*r!   r.   r-   r/   c                   i }| D ]5}|j         D ]+}|                    |g                               |           ,6i }|                                D ]\  }}d |D             }t	          |t          |          |r7t          t          d |D                       t          |          z  d          nd|rt          t          |          d          ndt          t          |          d          |r't          t          d |D                       d          nd          ||<   t          t          |                                d d	
                    S )Nc                    g | ]	}|j         
S r    r   rn   rs     r"   
<listcomp>z(_aggregate_tag_stats.<locals>.<listcomp>l   s    111q"111r!   c              3  &   K   | ]}|d k    dV  dS )r   rZ   Nr    )rn   rJ   s     r"   rp   z'_aggregate_tag_stats.<locals>.<genexpr>p   s&      88Q!a%%q%%%%88r!                 c              3  $   K   | ]}|j         V  d S rl   )r   r   s     r"   rp   z'_aggregate_tag_stats.<locals>.<genexpr>s   s%      0W0WQ1H0W0W0W0W0W0Wr!   )r%   r&   r'   r(   r)   r*   c                6    | d         j         | d         j        fS )NrZ   )r&   r)   )kvs    r"   rW   z&_aggregate_tag_stats.<locals>.<lambda>u   s    be6GAI\5] r!   T)rY   reverse)r   rr   rG   itemsr$   rm   roundrt   r   dictrq   )r.   bucketsmatchr%   statsrK   pnlss          r"   _aggregate_tag_statsr   e   st   24G 6 6% 	6 	6CsB''..u5555	6!#E]]__ 	
 	
	T11D111D		LPYU388$888883t99DaHHHVY04=d4jj!,,,#D		1--_c&leD0W0WRV0W0W0W,W,WYZ&[&[&[il
 
 
c

 u{{}}*]*]gklllmmmr!   journal_pathmarket_context_pathc                   t          |           }t          |          }t          |          \  }}g }|D ]\  }}t          ||          }	t          |                    d                    }
t          |                    d                    }|	rt          |	d                   nd }t          d |	pi                     dg           D                       }t          |                    dd                    }t          ||
z
                                  dz            }|	r|	                    d          nd }|	                    t          t          |                    dd	                                                    |
||||t          |          nd |t          |                    d
d	                    |	  	                   t          |t          |          t          |          |          S )NrT   c              3  4   K   | ]}t          |          V  d S rl   )r   )rn   rV   s     r"   rp   z0correlate_trades_with_context.<locals>.<genexpr>   s(      EESVVEEEEEEr!   tagsr   r   <   reliability_scorer   rS   reason)	r   r   r   r   r   r   r   r   r   )r.   r0   r1   r2   )rM   r|   rb   r<   r[   tupler   r   total_secondsrG   r   r   r\   r,   r   rm   )r   r   rc   rP   rw   r{   r.   rN   
exit_eventcontextr   r   r   r   pnlminutesreliability_values                    r"   correlate_trades_with_contextr   x   s   &&F.//H+F33E:')G"  zx00UYYt__--JNN4001118BYwt}---d
EEgm%8%8%D%DEEEEEJNN#5s;;<<w)88::b@AA@GQGKK(;<<<T(UYYvr**++1133!<M<Y&7 8 8 8_c JNN8R8899")

 

 

 
	 
	 
	 
	 &w//u::#	   r!      min_samplesresultr   r   r   c                  t          d | j        D                       }dd| j         d| j         d|ddg}| j        |k     r|                    d| d	           | j        r||                    d
           | j                                        D ]L}|                    d|j         d|j         d|j	        dd|j
        dd|j        dd|j        dd           Mn|                    d           d                    |          S )Nc              3  $   K   | ]}|j         V  d S rl   r   )rn   ms     r"   rp   z,render_correlation_report.<locals>.<genexpr>   s%      ??1A&??????r!   zSignal Correlation ReportzClosed trades: zOpen entries: zTotal PnL: z+.4fz USDCz Observation only: Sample Size < u5   ; keine Strategieänderung aus diesen Daten ableiten.z
Tag stats:z- z: n=z, win=z.2fz, avg=z, total=z, avg_time=z.1fr   z;Tag stats: keine geschlossenen Trades mit Kontext gefunden.
)rt   r.   r1   r2   rG   r0   ru   r%   r&   r'   r(   r)   r*   join)r   r   	total_pnllinesstats        r"   render_correlation_reportr      s   ???????I#5&3552022+i++++	E  ;..zzzz{{{ T\"""$++-- 	 	DLL }TX  }  }4#3  }  }4=  }  }  }TXTd  }  }  }sw  tF  }  }  }  X\  Xv  }  }  }  }   	
 	RSSS99Ur!   argvlist[str] | Nonec                    t          j                    }t          j        |          }t	          j        d          }|                    dt          |j                             |                    dt          |j	                             |                    dt          d           |                    |           }t          |j        |j	                  }t          t          ||j        	                     d
S )NzBCorrelate paper/live trade outcomes with collected market context.)descriptionz	--journal)defaultz--market-contextz--min-samplesr   )typer   r   r   )r
   	from_filer   from_configargparseArgumentParseradd_argumentr   trade_journalmarket_contextr   
parse_argsr   journalprintr   r   )r   cfgpathsparserargsr   s         r"   mainr      s    



C$S))E$1uvvvF
S1D-E-EFFF
*C8L4M4MNNN
c1===T""D*4<9LMMF	
#F8H
I
I
IJJJ1r!   __main__)r3   r	   r4   r   )r=   r>   r4   r?   )rN   rO   rP   r?   r4   rQ   )rc   r?   r4   rd   )r.   r-   r4   r/   )r   r>   r   r>   r4   r,   )r   r,   r   r   r4   r   rl   )r   r   r4   r   )
__future__r   r   rH   dataclassesr   r   r   pathlibr   
statisticsr   typingr	   configr
   r   r   r$   r,   r<   rM   rb   r|   r   r   r   r   r   
SystemExitr    r!   r"   <module>r      sM   " " " " " "   ! ! ! ! ! ! ' ' ' ' ' ' ' '                   * * * * * * * * $	 	 	 	 	 	 	 	 $% % % % % % % % $       ' ' ' '	 	 	 	2 2 2 2$   &n n n n&   B PQ      *
 
 
 
 
 z
*TTVV

 r!   