Ë
    qµjÕ  ã                  ó°   — d Z ddlmZ ddlZddlmZmZ ddlZddl	Z
ddlmZ ddlmZmZmZmZ dZdZd	Zd
Zd
Zdd„Zdd„Z	 	 	 	 	 	 	 	 	 	 dd„Zdd„Zdd„Zy)zGSmall-threshold execution guard; proximity counts are diagnostics only.é    )ÚannotationsN)ÚAnyÚCallable)Úwindow_metrics)ÚSCORE_STARTÚ	TRAIN_ENDÚSUBPERIOD_SPLITÚ	WFO_FOLDSÚexecution_stability_v1)Ú!i_long_entry_activation_thresholdÚ i_long_exit_activation_thresholdÚ-i_long_exit_activation_confirmation_threshold)g      ð¿gš™™™™™©¿gš™™™™™©?ç      ð?r   c            
     ó&  — dt         t        fdt         t        t        j                  t
        «      t        j                  d¬«      z
  «      fdt
        t        fgt        t        «      D � ���cg c]  \  } \  }}}d| › �||f‘Œ c}}}} z   S c c}}}} w )NÚISÚSub1é   )ÚnanosecondsÚSub2ÚWFO)	r   r   ÚstrÚpdÚ	Timestampr	   Ú	TimedeltaÚ	enumerater
   )ÚiÚ_ÚstartÚends       úM/Users/jameslopez/projects/TradingBot25/strategies/mlp_execution_stability.pyÚstability_periodsr!      sŽ   € Ø”;¤	Ð*Ø”[¤#¤b§l¡l´?Ó&CÄbÇlÁlÐ_`ÔFaÑ&aÓ"bÐcØ”_¤iÐ0ð2ô ?HÌ	Ô>Rö5TÙ>RÑ(:¨©?¨A¨u°cˆs�1�#ˆY˜˜sÒ#Ð>Rô5TñTð Tùõ5Ts   Á-Bc           	     ód  — | d   | d   |d   |d   g}t        j                  |«      j                  «       r| d   dk  rt        d«      ‚ddd|d   dz  z   d| d   dz  z   z  z
  z  }| d   |d   z
  }t	        t        |«      t        |«      t        |t        dz   kD  xs |t        dz   kD  «      ¬«      S )	NÚpnl_pctÚdd_pctiœÿÿÿz-Cannot assess nonfinite or insolvent baselineéd   r   g»½×Ùß|Û=)Úwealth_loss_pctÚdrawdown_worsening_ppÚharmful)	ÚnpÚisfiniteÚallÚ
ValueErrorÚdictÚfloatÚboolÚMAX_WEALTH_LOSS_PCTÚMAX_DRAWDOWN_WORSENING_PP)ÚbaseÚchangedÚvaluesÚlossÚdds        r    Úperformance_changer7      sÑ   € Ø�9‰o˜t H™~¨w°yÑ/AÀ7È8ÑCTÐU€FÜ�;‰;�vÓ×"Ñ"Ô$¨¨Y©¸4Ò(?ÜÐHÓIÐIØ�!�q˜7 9Ñ-¨cÑ1Ñ1°a¸$¸y¹/È#Ñ:MÑ6MÑNÑNÑO€DØ	ˆh‰˜' (Ñ+Ñ	+€BÜ¤ d£Ä5ÈÃ9Ü�TÔ/°%Ñ7Ñ7Òa¸2Ô@YÐ\aÑ@aÑ;aÓbôdð dó    c                ó@  — |r8t        j                  t        D �cg c]  }||   ‘Œ	 c}«      j                  «       st	        d«      ‚ || j                  «       ||||«      }|D �	�
�cg c]  \  }	}
}t        ||
|¬«      ‘Œ }}
}	}g }t        D �]Î  }t        D �]Á  } || j                  «       t        |fi |||   |z   i¤Ž|||«      }g }t        ||«      D �]c  \  \  }}
}}t        ||
|¬«      }t        j                  |«      }|j                  t        j                  |
«      k\  t        |«      dk(  r&|j                  |t        j                  d¬«      z   k  n|j                  |k  z  }|j                  |j                  k7  |j                   |j                   k7  z  }d}|j#                  t        d||
||D �ci c]  }|||   “Œ
 c}|D �ci c]  }|||   “Œ
 c}t%        ||z  j'                  «       «      t%        |j(                  |j(                  k7  |z  j'                  «       «      dœt+        ||«      ¤Ž«       �Œf |j#                  t        |||¬«      «       �ŒÄ �ŒÑ t        t,        t/        d	„ |D «       «       t0        t2        |¬
«      S c c}w c c}}
}	w c c}w c c}w )zEAll periods retain preceding history for carry-in P&L and fee timing.z/Finite thresholds and nonempty periods required)r   r   é
   r   )Údays)r#   r$   ÚcalmarÚentriesÚexits)Únamer   r   ÚcenterÚ	perturbedÚchanged_action_barsÚchanged_position_bars)Ú	thresholdÚdeltaÚperiodsc              3  ó:   K  — | ]  }|d    D ]	  }|d   –— Œ Œ y­w)rF   r(   N© ©Ú.0ÚtÚps      r    Ú	<genexpr>z#assess_stability.<locals>.<genexpr>@   s&   è ø€ Ð/cÁfÀÐVWÐXaÔVbÐQR°°)µÐVb°Áfùs   ‚)ÚversionÚpassedÚmax_wealth_loss_pctÚmax_drawdown_worsening_ppÚtrialsrH   )r)   r*   Ú
THRESHOLDSr+   r,   Úcopyr   ÚDELTASr-   Úzipr   r   ÚtimeÚlenr   Úexecute_entryÚexecute_exitÚappendÚintÚsumÚpositionr7   ÚVERSIONÚanyr0   r1   )ÚscoredÚparamsÚstochÚcloseÚhighÚsignalrF   Úkr2   r   r   r   Ú	baselinesrR   rD   rE   r3   Úmeasurementsr?   r@   Ú	candidateÚupperÚmaskÚactionsÚmetricss                            r    Úassess_stabilityro   &   sƒ  € ñ œ"Ÿ+™+½*Ó&E¹*°Q v¨a£y¸*Ñ&EÓF×JÑJÔLÜÐJÓKÐKÙ�&—+‘+“- ¨°°tÓ<€DÙQXÕYÑQXÁÀÀ5È#” ¨E°sÖ;ÐQX€IÒYØ€Fß�Zˆ	ß�VˆEÙ˜VŸ[™[›]¬D°Ñ,`¸IÀvÈiÑGXÐY^ÑG^Ð;_Ñ,`ÐbgÐinÐptÓuˆGØˆLÜ.1°'¸9×.EÑ*Ñ"��u˜c FÜ*¨7¸%ÀSÔI�	ÜŸ™ SÓ)�ØŸ	™	¤R§\¡\°%Ó%8Ñ8ÜBEÀcÃ(ÈbÂ.�T—Y‘Y ¬¯©¸1Ô)=Ñ!=Ò=ÐW[×W`ÑW`ÐdiÑWiñl�à×-Ñ-°×1FÑ1FÑFÈ4×K\ÑK\Ð`g×`tÑ`tÑKtÑu�ØM�Ø×#Ñ#¤Dð %=¨d¸%ÀSÙ18Ó9±¨A˜A˜f Q™i™K°Ñ9Ñ^eÓEfÑ^eÐYZÀaÈ	ÐRSÉÁnÐ^eÑEfÜ(+¨W°t©^×,@Ñ,@Ó,BÓ(CÜ*-°·±À×AQÑAQÑ0QÐUYÑ/Y×.^Ñ.^Ó.`Ó*añ%=ô )¨°Ó;ñ	%=ö >ð /Fð �M‰Mœ$¨¸%ÈÔVÖWò ð  ô" œ¬CÑ/cÁfÓ/cÓ,cÐ(cÜ/ÔKdØôð ùò- 'Fùô Zùò :ùÒEfs   šJ
Á&JÆ4JÇJc                óÂ  ‡— | j                  d«      dvsP| j                  d«      r?| j                  d«      r.| j                  d«      | d   k7  s| j                  d«      | d   k7  ry	 t        j                  | d   «      }|d	   t        k7  st	        |d
   «      t
        ury|d   }t        |«      dk7  s<|D �ch c]  }|d   |d   f’Œ c}t        D ��ch c]  }t        D ]  }||f’Œ Œ c}}k7  ryt        «       Št        ˆfd„|D «       «      syt        d„ |D «       «      }||d
   k(  xr | d   |rd
ndk(  S c c}w c c}}w # t        t        t        t        f$ r Y yw xY w)zAOld or partial cached rows cannot silently satisfy the new guard.ÚStability_Status)rO   ÚfailedÚEvaluation_KeyÚComparison_FingerprintÚStability_Evaluation_KeyÚStability_ContextFÚStability_ReportrN   rO   rR   é   rD   rE   c              3  ól   •K  — | ]&  }|d    D �cg c]  }|d   |d   |d   f‘Œ c}‰k(  –— Œ( yc c}w ­w)rF   r?   r   r   NrH   )rJ   rK   rL   Úexpecteds      €r    rM   z%stability_assessed.<locals>.<genexpr>T   sD   øè ø€ ÐiÑbhÐ]^¸qÀº|ÓL¹|¸!�Q�v‘Y  '¡
¨A¨e©HÒ5¸|ÑLÐPXÕXÑbhùÒLùs   ƒ4�/¤4c              3  ó\   K  — | ]$  }|d    D ]  }t        |d   |d   «      d    –— Œ Œ& y­w)rF   r@   rA   r(   N)r7   rI   s      r    rM   z%stability_assessed.<locals>.<genexpr>V   s@   è ø€ ð <Ù$˜¨a°	¬l¨ô ,¨A¨h©K¸¸;¹ÓHÈÑSÔSØ.:ð TÙ$ùs   ‚*,rr   )ÚgetÚjsonÚloadsr_   Útyper/   rX   rS   rU   r!   r+   ÚKeyErrorÚ	TypeErrorr,   ÚOverflowError)ÚrowÚreportrR   rK   rg   ÚdrO   rz   s          @r    Ústability_assessedr†   E   s{  ø€ à�‰Ð"Ó#Ð+?Ñ?ÀsÇwÁwÐO_ÔG`Ø—7‘7Ð3Ô4Ø�w‰wÐ1Ó2°cÐ:JÑ6KÒKØ�w‰wÐ*Ó+¨sÐ3KÑ/LÒLØðÜ—‘˜CÐ 2Ñ3Ó4ˆØ�)Ñ¤Ò'¬4°°xÑ0@Ó+AÌÑ+MØØ˜Ñ!ˆÜˆv‹;˜"ÒÁvÓ NÁvÀ! ! K¡.°!°G±*Ò!=ÀvÑ NÕcmÔR~ÑcmÐ^_×w}ÐrsÐTUÐWXÒSYÐw}ÐSYÐcmÒR~Ò ~ØÜ$Ó&ˆÜÓiÑbhÓiÔiØÜñ <Ù$ó<ó <ˆà˜ Ñ)Ñ)Òk¨cÐ2DÑ.EÑV\É(ÐbjÑ.kÐkùò !OùÓR~øô ”i¤¬]Ð;ò ÙðúsB   Á'8E Â E Â7D7ÃE ÃD<Ã)E Ã0E Ä'E Ä7E ÅEÅEc                óD   — | j                  d«      dk(  xr t        | «      S )Nrq   rO   )r|   r†   )rƒ   s    r    Ústability_passesrˆ   ]   s"   € Ø�7‰7Ð%Ó&¨(Ñ2ÒNÔ7IÈ#Ó7NÐNr8   )Úreturnúlist[tuple[str, str, str]])r2   r-   r3   r-   r‰   r-   )ra   zpd.DataFramerb   r-   rc   ú
np.ndarrayrd   r‹   re   r‹   rf   r   rF   rŠ   r‰   r-   )rƒ   zdict[str, Any]r‰   r/   )Ú__doc__Ú
__future__r   r}   Útypingr   r   Únumpyr)   Úpandasr   Ústrategies.mlp_accountingr   Úconfigr   r   r	   r
   r_   rS   rU   r0   r1   r!   r7   ro   r†   rˆ   rH   r8   r    Ú<module>r“      s�   ðÙ MÝ "ã ß  ã Û å 4ß EÓ Eà
"€ð?€
à	€ØÐ ØÐ óTódðØ&ðØ.8ðØBJðà8ðà=Aóó>ô0Or8   