
    OhjiC                    H   d Z 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mZm
Z
 ddlmZmZmZ dZd	Zd
ZdZdZddddZ ed           G d d                      Z ed           G d d                      Z ed           G d d                      Z ed           G d d                      Ze G d d                      ZdUd"ZdVd$ZdWd&ZdXd*ZdYd.Z dZd2Z!d[d4Z"d\d8Z#d]d=Z$ ed           ed>          d?d^dKZ%d_dNZ&d`dOZ'dadQZ(dbdTZ)dS )czPure, reproducible portfolio-performance primitives.

The module never fetches live data and never substitutes missing prices or FX.
All money, rates and percentages remain :class:`~decimal.Decimal` values.
    )annotationsN)Iterable)	dataclassfield)UTCdatedatetime)DecimalInvalidOperationlocalcontextportfolio_performance_v2portfolio_performance_v1ttwror_daily_v1performance_attribution_chf_v1fifo_v1      )completepartialunavailableT)frozenc                  D    e Zd ZU ded<   dZded<   dZded<   dZded	<   dS )
Qualitystrstatus tuple[str, ...]reasonsN
str | Nonecoverage_fromcoverage_to)__name__
__module____qualname____annotations__r   r    r!   r       a/home/agent/.hermes/worktrees/FinanceManager-main-deploy/src/jarvis_finance/ledger/performance.pyr   r      sN         KKK!G!!!! $M$$$$"K""""""r&   r   c                  &   e Zd ZU ded<   ded<   ded<   ded<   ded<   ded<   dZd	ed
<   dZded<   dZded<   dZded<    ed          Z	ded<    ed          Z
ded<   dZded<   dZded<   dZded<   dZd	ed<   dZd	ed<   dZd	ed<   dZded<   dS )Activityr   activity_idkind
account_idoccurred_atbooking_datecurrencyNr   instrument_idDecimal | Nonequantitypricegrossr   r
   feetaxnetfx_rate_to_baseunknownsourceexternal_referencelineage_hashreversal_ofTbool	supported)r"   r#   r$   r%   r0   r2   r3   r4   r
   r5   r6   r7   r8   r:   r;   r<   r=   r?   r   r&   r'   r)   r)       s?        IIIOOOMMM $M$$$$#H#### E     E    71::C71::CC&*O****F%)))))#L####"K""""Ir&   r)   c                      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ed<   ded<   dZded<   dZded<   edd            ZdS )	Valuationr   snapshot_id
scope_kindscope_idr   r,   r
   valuer/   r1   r8   valuation_atcaptured_atr:   intversionr   quality_statusr   r   quality_reasonsreturnc                2    | j         d S | j        | j         z  S N)r8   rE   )selfs    r'   
value_basezValuation.value_baseG   s     '4zD000r&   N)rL   r1   )r"   r#   r$   r%   rJ   rK   propertyrP   r   r&   r'   rA   rA   7   s         OOOMMMNNNMMM####KKKLLL$N$$$$')O))))1 1 1 X1 1 1r&   rA   c                  $    e Zd ZU ded<   ded<   dS )ReturnResultr1   rE   r   qualityN)r"   r#   r$   r%   r   r&   r'   rS   rS   N   s*         r&   rS   c                  z    e Zd ZU dZded<   dZded<   dZded<   dZded<    ed           Z	d	ed
<   dZ
ded<   dS )
LotSummaryNr1   remaining_quantityremaining_cost_basisrealized_pnlunrealized_pnlc                 "    t          dd          S )Nr   )missing_cost_basis)r   r   r&   r'   <lambda>zLotSummary.<lambda>[   s    7N O O r&   )default_factoryr   rT   r   r   lineage_activity_ids)r"   r#   r$   rW   r%   rX   rY   rZ   r   rT   r_   r   r&   r'   rV   rV   T   s         )-----+/////#'L''''%)N))))uOO  G     -/......r&   rV   rE   object
field_namer   rL   r
   c               b   t          | t                    rt          | d          	 t          | t                    r| nt          t	          |                     }n,# t
          t          f$ r}t          | d          |d }~ww xY w|                                st          | d          |S )Nu    darf kein binärer Float seinu    ist keine gültige Dezimalzahlz muss endlich sein)
isinstancefloat
ValueErrorr
   r   r   	is_finite)rE   ra   parsedexcs       r'   parse_decimalri   `   s    % HJFFFGGGR$UG44M'#e**:M:Mj) R R RJGGGHHcQR <J:::;;;Ms   3A B.BBr	   c                   |                                  }t          |          dk    rCt          j        t	          j        |          t          j                                                  S t          j        |                    dd                    }|j	        .|
                    t                                        d           n|S )N
   Zz+00:00)tzinfo)striplenr	   combiner   fromisoformatmintimereplacerm   
astimezoner   )rE   textrg   s      r'   _instantrw   l   s    ;;==D
4yyB 24 8 8(,:K:K:M:MNNN#DLLh$?$?@@F:@-:S6S!!)))666Y__r&   r   c                ^    t          j        |                                 dd                   S )zDReturn the source calendar day used by the daily valuation contract.Nrk   )r   rq   rn   )rE   s    r'   _calendar_dayry   t   s$    ekkmmCRC0111r&   
activitiesIterable[Activity]&tuple[list[Activity], tuple[str, ...]]c                   t          | d           }d |D             }t                      t                      }|D ]}|j        dk    r[|j        r	|j        |vr|                    d           3                    |j                                       |j                   h|j        s|                    d           fd|D             t          t          |                    fS )Nc                8    t          | j                  | j        fS rN   )rw   r-   r*   items    r'   r]   z&effective_activities.<locals>.<lambda>z   s    8D<L3M3MtO_2` r&   keyc                    i | ]
}|j         |S r   )r*   .0r   s     r'   
<dictcomp>z(effective_activities.<locals>.<dictcomp>{   s    888Tt888r&   reversalunsupported_activityc                4    g | ]}|j         v|j        |S r   )r*   r?   )r   r   neutralizeds     r'   
<listcomp>z(effective_activities.<locals>.<listcomp>   s4       D$4K$G$GDN$G$G$G$Gr&   )sortedsetr+   r=   addr*   r?   tuple)rz   orderedby_idr   r   r   s        @r'   effective_activitiesr   y   s   Z%`%`aaaG88888EEEKG 0 09
""# t'7u'D'D2333OOD,---OOD,---- 	0KK.///      VG__ r&   activitybase_currencyr1   c                    | j         dvrd S | j        | j        n| j        }|d S | j        |k    rt	          d          }n| j        }|d S t          ||z            }| j         dk    r|n| S )N>   external_depositexternal_withdrawalr   r   )r+   r7   r4   r/   r
   r8   abs)r   r   amountratesigneds        r'   external_cashflowr      s    }GGGt%\5X\\8>F~tM))qzz'|t$F]&88866vgEr&   
valuationslist[tuple[str, Decimal]]	cashflowsc                   t          | d           }|st          dt          dd                    S t          |          dk     r8t          dt          dd|d         d         |d         d                             S |d         d	         dk    r8t          dt          dd
|d         d         |d         d                             S d |dd         D             t	          fd|D                       r8t          dt          dd|d         d         |d         d                             S i }|D ]=\  }}t          |          }|                    |t          d                    |z   ||<   >t          d	          }t          d	t          |                    D ]}||d	z
           \  }	}
||         \  }}|
|                    t          |	          t          d                    z   }|dk    r:t          dt          dd|d         d         |d         d                             c S |||z  z  }t          |t          d	          z
  t          dd|d         d         |d         d                             S )a@  Geometrically link subperiods.

    A cashflow must occur exactly at a valuation boundary and is treated as
    happening immediately *after* that boundary. It therefore changes the next
    subperiod's opening capital. This explicit convention makes the result
    reproducible and avoids Modified-Dietz estimates.
    c                <    t          | d                   | d         fS Nr   rw   r   s    r'   r]   ztwr_v1.<locals>.<lambda>       (472C2CT!W1M r&   r   Nr   missing_opening_valuationmissing_closing_valuationr   r   r   r   invalid_opening_valuationc                2    h | ]\  }}t          |          S r   r   r   at_s      r'   	<setcomp>ztwr_v1.<locals>.<setcomp>   s"    <<<ur1hrll<<<r&   c              3  @   K   | ]\  }}t          |          vV  d S rN   r   )r   r   r   boundary_timess      r'   	<genexpr>ztwr_v1.<locals>.<genexpr>   s2      
E
E%"a8B<<~-
E
E
E
E
E
Er&   missing_cashflow_valuationinvalid_subperiod_capitalr   r   )	r   rS   r   ro   anyrw   getr
   range)r   r   pointsflow_by_timer   r   r   linkedindexprevious_atprevious_valuer   closing_valuecapitalr   s                 @r'   twr_v1r      s    J$M$MNNNF 
'-)cdd
 
 	
 6{{Q'-)GPQSTW]^_W`abWcdd
 
 	
 ay|qM#A6!9Q<QWXZQ[\]Q^__
 
 	
 =<ss<<<N

E
E
E
E9
E
E
EEE 
M#BF1IaLRXY[R\]^R_``
 
 	
 -/L G G
Frll(,,S'!**==FSQZZFq#f++&& 	* 	*&,UQY&7#^!%== <#3#3H[4I4I7ST::#V#VVa<<'EvayQR|U[\^U_`aUbcc     	-'))+WZVAYq\SYZ\S]^_S`-a-abbbr&   list[tuple[str, Decimal, str]]c                	   t          | d           }|st          dt          dd                    S t          |          dk     r8t          dt          dd|d         d         |d         d                             S |d         d	         dk    r8t          dt          dd
|d         d         |d         d                             S d |D             t                    t          |          k    r8t          dt          dd|d         d         |d         d                             S t	          fd|D                       r8t          dt          dd|d         d         |d         d                             S t          |d         d                   t          |d         d                   }}i }i }|D ]\  }}}	t          |          }
|	dk    rp|dk    rj|
|k    r:t          dt          dd|d         d         |d         d                             c S |                    |
t          d                    |z   ||
<   |	dk    r~|dk     rx|
|k    r:t          dt          dd|d         d         |d         d                             c S |                    |
t          d                    t          |          z   ||
<   |	dv r:t          dt          dd|d         d         |d         d                             c S t          dt          dd|d         d         |d         d                             c S t          d	          }t          d	t          |                    D ]}||d	z
           \  }}||         \  }}||                    t          |          t          d                    z   }||                    t          |          t          d                    z   }|dk    s|dk     r:t          dt          dd|d         d         |d         d                             c S |||z  z  }t          |t          d	          z
  t          dd|d         d         |d         d                             S )ay  True time-weighted return with explicit cashflow-boundary timing.

    Deposits are included in the opening capital of the subperiod beginning on
    their valuation boundary. Withdrawals are added back to the closing value of
    the subperiod ending on their boundary. Every cashflow date must have a
    stored valuation; no Modified-Dietz or provider fallback is used.
    c                <    t          | d                   | d         fS r   r   r   s    r'   r]   z!ttwror_daily_v1.<locals>.<lambda>   r   r&   r   Nr   r   r   r   r   r   r   r   c                2    h | ]\  }}t          |          S r   ry   r   s      r'   r   z"ttwror_daily_v1.<locals>.<setcomp>   s$    ;;;52q]2&&;;;r&   )ambiguous_daily_valuationc              3  B   K   | ]\  }}}t          |          vV  d S rN   r   )r   r   r   boundary_dayss      r'   r   z"ttwror_daily_v1.<locals>.<genexpr>   s6      
L
Lhb!Q=M1
L
L
L
L
L
Lr&   r   r   )!cashflow_outside_return_subperiodr   >   r   r   )invalid_cashflow_sign)unsupported_external_cashflowr   r   r   )
r   rS   r   ro   r   ry   r   r
   r   r   )r   r   r   first_boundarylast_boundarydepositswithdrawalsr   r   r+   r   r   r   r   r   
closing_atr   r   proceedsr   s                      @r'   r   r      s    J$M$MNNNF 
'-)cdd
 
 	
 6{{Q'-)GPQSTW]^_W`abWcdd
 
 	
 ay|qM#A6!9Q<QWXZQ[\]Q^__
 
 	
 <;F;;;M
=S[[((M#A6!9Q<QWXZQ[\]Q^__
 
 	
 
L
L
L
L)
L
L
LLL 
M#BF1IaLRXY[R\]^R_``
 
 	
 %2&)A,$?$?vVXzZ[}A]A]MN$&H')K% % %FDB%%%&1**m###%>q	!r
1	      %LLgajj99FBHSMM***vzzn$$#%>q	!r
1	       +sGAJJ??#f++MK@@@'A6!9Q<QWXZQ[\]Q^__    
  !#EvayQR|U[\^U_`aUb      QZZFq#f++&& 
% 
%&,UQY&7#^$*5M!
M 8<<k0J0JGTUJJ#W#WW ;??=3L3LgVWjj#Y#YYa<<8a<<'EvayQR|U[\^U_`aUbcc     	(W$$+WZVAYq\SYZ\S]^_S`-a-abbbr&   
cumulativedaysrH   c                ^   |dk    rd S | t          d          k    rd S t                      5 }d|_        t          d          | z   t          d          t          |          z  z  t          d          z
                      t          d                    cd d d            S # 1 swxY w Y   d S )Nm  r   *   r   0.000000000001)r
   r   precquantize)r   r   contexts      r'   annualize_returnr   *  s    s{{tWR[[  t	 
7j(gcllWT]].JKgVWjjXbb$%%
 

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
s   A)B""B&)B&opening"dict[str, tuple[Decimal, Decimal]]closingtuple[Decimal, Decimal] | Nonec                (   | r t          |           t          |          k    rdS t          d          }t          d          }t          |           D ]=}| |         \  }}||         \  }}|dk    s|dk    r dS |||z
  |z  z  }||||z
  z  z  }>||fS )zKSplit unchanged-position local-value movement, assigning interaction to FX.Nr   )r   r
   r   )	r   r   r3   fxr   opening_local
opening_fxclosing_local
closing_fxs	            r'   price_fx_attribution_v1r   6  s      c'llc'll22tAJJE	Bg 8 8$+CL!z$+CL!z??jAoo44--/:==
mzJ677"9r&   z0.01)other_effects	toleranceopening_valuer   net_external_cashflowsmarket_pricer   dividends_and_interestfeestaxesr   r   dict[str, Decimal | str | None]c        
            || z
  |z
  }
||z
  |z
  |z   }|||z  }|||z  }|
|z
  }|duo|du}|rt          |          |	k    rdnd}|
|||| | ||||	d
S )zCBuild an explicit CHF value bridge; unknown effects remain visible.Nr   r   )
investment_resultr   r   r   r   r   r   unattributed_residualr   tolerance_chf)r   )r   r   r   r   r   r   r   r   r   r   r   knownresidual
decomposedr   s                  r'   attribution_bridge_v1r   J  s     &58NN"T)E1MAE	~ 5(HT)<bnJ%S#h--9*D*DZZ)F.$"8&!)"  r&   r   list[tuple[date, Decimal]]c                x   | t          d          k    rt          d          |d         d         }t          d          | z   }t          d          }t                      5 }d|_        |D ]7\  }}t          ||z
  j                  t          d          z  }||||z  z  z  }8	 d d d            n# 1 swxY w Y   |S )Nr   zrate out of ranger   r   r   r   )r
   re   r   r   r   )	r   r   originbasetotalr   	cash_dater   yearss	            r'   _xnpvr  p  s   wr{{,---q\!_F1::DAJJE	 ,7!* 	, 	,IvY/566EEVtU{++EE	,, , , , , , , , , , , , , , ,
 Ls    AB//B36B3c                n   t          d | D             d           }t          |          dk     s2t          d |D                       rt          d |D                       st          d t	          dd                    S d	 |D             }t          d
 t          ||dd                    D                       dk    rt          d t	          dd                    S t          d          t          d          t          d          t          d          t          d          t          d          t          d          g}|                    d t          ddd          D                        |                    t          d          t          d          t          d          t          d          t          d          t          d          t          d          t          d          g           d }d }|d         }t          ||          }t          d          }t          |          |k    r=t          |                    t          d                    t	          d                    S |dd          D ]|}	t          |	|          }
t          |
          |k    r?t          |	                    t          d                    t	          d                    c S |dk     |
dk     k    r||	}} n|	|
}}}||t          d t	          dd                     S ||k    rt          |t	          d                    S t          ||          }t          d!          D ]}||z   t          d          z  }t          ||          }t          |          t          d          k    s#t          ||z
            t          d          k    r?t          |                    t          d                    t	          d                    c S |dk     |dk     k    r||}}|}t          d t	          dd                     S )"Nc                P    g | ]#\  }}t          j        |d d                   |f$S )Nrk   )r   rq   )r   r   r   s      r'   r   zxirr_v1.<locals>.<listcomp>  s4    KKK:2v$
RW
%
%v	.KKKr&   c                    | d         S r   r   r   s    r'   r]   zxirr_v1.<locals>.<lambda>  s
    a r&   r   r   c              3  (   K   | ]\  }}|d k     V  dS r   Nr   r   r   r   s      r'   r   zxirr_v1.<locals>.<genexpr>  *      55)!V6A:555555r&   c              3  (   K   | ]\  }}|d k    V  dS r  r   r  s      r'   r   zxirr_v1.<locals>.<genexpr>  r	  r&   r   )insufficient_cashflowsc                ,    g | ]\  }}|d k    |d k    S )r   r   r  s      r'   r   zxirr_v1.<locals>.<listcomp>  s%    >>>IAv&A++VaZ+++r&   c              3  (   K   | ]\  }}||k    V  d S rN   r   )r   leftrights      r'   r   zxirr_v1.<locals>.<genexpr>  s*      
B
B[T545=
B
B
B
B
B
Br&   r   )mwr_multiple_solutionsz-0.9999z-0.99z-0.9z-0.75z-0.5z-0.25r   c              3  T   K   | ]#}t          |          t          d           z  V  $dS )d   N)r
   )r   rE   s     r'   r   zxirr_v1.<locals>.<genexpr>  s3      MM5'#,,.MMMMMMr&      i   z1.5   rk      r  i  z
0.00000001r   r   )mwr_not_converged   )r   ro   r   rS   r   sumzipr
   extendr   r  r   r   )r   datedsignsrateslowhighr  
left_valuer   r  right_value	low_valuer   midrE   s                  r'   xirr_v1r%  ~  s   KKKKK    E
 	E

Q55u55555 	55u55555 	 D'-9T"U"UVVV ?>>>>E

B
BCuQRRy,A,A
B
B
BBBQFFD'-9T"U"UVVV	

E 
LLMME!S!<L<LMMMMMM	LLENNAJJAJJAJJBKKBKKCLLDMM		
   CD8DtU##J%%I
:)##DMM'2B*C*CDDgjFYFYZZZqrr . .E5)){y((w7G/H/H I I7S]K^K^_____Na00eCE +j
{dlD'-9O"P"PQQQ
d{{C!4!4555c5!!I3ZZ  TzWQZZ'c5!!u::....#dSj//WM]E^E^2^2^W5E-F-F G GQ[I\I\]]]]]Muqy)) %CCDDgm5KLLMMMr&   payloadc                    t          j        | dddt                    }t          j        |                    d                                                    S )NT),:F)	sort_keys
separatorsensure_asciidefaultzutf-8)jsondumpsr   hashlibsha256encode	hexdigest)r&  	canonicals     r'   stable_input_fingerprintr5    sP    
4JUTW  I >)**73344>>@@@r&   	qualitiesIterable[Quality]c                V   t          |           }|st          dd          S t          |d           j        }t	          t          d |D                                 }d |D             }d |D             }t          |||rt          |          nd |rt          |          nd           S )Nr   )insufficient_datac                &    t           | j                 S rN   )QUALITY_ORDERr   r   s    r'   r]   z"combined_quality.<locals>.<lambda>  s    -*D r&   r   c                &    h | ]}|j         D ]}|S r   )r   )r   r   reasons      r'   r   z#combined_quality.<locals>.<setcomp>  s'    QQQtDLQQ&FQQQQr&   c                *    g | ]}|j         	|j         S r   )r    r   s     r'   r   z$combined_quality.<locals>.<listcomp>  s#    JJJTt7IJd JJJr&   c                *    g | ]}|j         	|j         S r   )r!   r   s     r'   r   z$combined_quality.<locals>.<listcomp>  s#    DDD43CDDDDDr&   )listr   rr   r   r   r   max)r6  valuesr   r   startsendss         r'   combined_qualityrE    s    )__F >}&<===DDEEELFFQQvQQQRRSSGJJVJJJFDDDDDD676$CCKKKtRVE`SYYY\`aaar&   )rE   r`   ra   r   rL   r
   )rE   r   rL   r	   )rE   r   rL   r   )rz   r{   rL   r|   )r   r)   r   r   rL   r1   )r   r   r   r   rL   rS   )r   r   r   r   rL   rS   )r   r
   r   rH   rL   r1   )r   r   r   r   rL   r   )r   r
   r   r
   r   r
   r   r1   r   r1   r   r
   r   r
   r   r
   r   r
   r   r
   rL   r   )r   r
   r   r   rL   r
   )r   r   rL   rS   )r&  r`   rL   r   )r6  r7  rL   r   )*__doc__
__future__r   r0  r.  collections.abcr   dataclassesr   r   r	   r   r   decimalr
   r   r   ENGINE_VERSIONLEGACY_ENGINE_VERSIONTTWROR_VERSIONATTRIBUTION_VERSIONCOST_BASIS_VERSIONr;  r   r)   rA   rS   rV   ri   rw   ry   r   r   r   r   r   r   r   r  r%  r5  rE  r   r&   r'   <module>rP     sp    # " " " " "   $ $ $ $ $ $ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ; ; ; ; ; ; ; ; ; ;+2 "6  1Q?? $# # # # # # # # $       , $1 1 1 1 1 1 1 1, $       
 / / / / / / / /	 	 	 	` ` ` `2 2 2 2
   &F F F F .c .c .c .cbZc Zc Zc Zcz	
 	
 	
 	
   < %WQZZ # # # # # #L   CN CN CN CNLA A A Ab b b b b br&   