Team Ai
Apppublic

Deepvest/ProfilingAI

sourceHugging Faceupdated 2y agoView on Hugging Face
0likes
risk_metrics.cpython-312.pyc195 linesDownload Raw Back to __pycache__
1�

2fH�g�V���ddlZddlZddlmZddlmZmZddl	m3Z4ddlmZddl
mZddlmZeGd�d	��ZeGd5�d��ZGd�d
�Zy)�N)�stats)�Optional�Dict��6arch_model)�GaussianMixture)�	dataclass)rc�r�eZdZUeed<eed<eed<eed<eed<eed<eed<eed<eeefed	<y7)�RiskAssessment�8volatility�var_95�cvar_95�	tail_risk�correlation_risk�liquidity_risk�regime_risk�
systemic_risk�stress_test_resultsN)�__name__�9__module__�__qualname__�float�__annotations__r�str���8/Users/sandrine/Deepvest_system/src/core/risk_metrics.pyrr10s?�����M�
�N������������c�5�j�)�)rrc�~�eZdZUdZeed<eed<eed<eed<eed<eeefed<eeefed<edd	��Z	y11)�
MarketMetricszContainer for market metricsr�skewness�kurtosisr�liquidity_score�correlation_structure�regime_probabilitiesc�(�|ddddddddd�i�	�S)12zGet default market metricsg333333�?�g@�{�G�z�?g�?��?g�)�avg_correlation�max_correlation�min_correlation)rr r!rr"r#r$r)�clss r�get_defaultzMarketMetrics.get_default!s3��������#&�#&�#'�#�13"$�14�	15rN)�returnr)16rrr�__doc__rrrr�classmethodr-rrrrrsQ��&����O��O�������U�17�+�+��s�E�z�*�*��18��19rrc���eZdZdZdEdej20dejdefd�Zde	fd�Z21d	�Zd22efd�Zd23efd�Z
d24efd
�Zd25efd�Zd26efd�Zd27efd�Zd28efd�ZdFdeej29d30efd�Zd31efd�Zdej32d33efd�ZdFdej34d35efd�Zd36ee	effd�Zdej37d38ee	ee	efffd�Zdej39d40efd�Zdej41d42efd�ZdGded43efd�Zd44ej45fd�Zdej46d47efd�Zdej48d49efd �Zd50efd!�Z d51efd"�Z!d52efd#�Z"d53e#fd$�Z$d54efd%�Z%dHd&ed55efd'�Z&dGdej56ded57efd(�Z'dGdej58ded59efd)�Z(dej60d61efd*�Z)dFdeej62d63efd+�Z*dId,e#fd-�Z+dej64d65efd.�Zdej66d67efd/�Z,d68efd0�Z-d,e#d69ej70fd1�Z.d,e#d71ej72fd2�Z/d,e#d73ej74fd3�Z0d,e#d75ej76fd4�Z1d,e#d77ej78fd5�Z2d79efd6�Z3d80efd7�Z4dFdeej81d82efd8�Z5d83efd9�Z6d84efd:�Z7dej85d86efd;�Z8dej87d88efd<�Z9dFdeej89d90efd=�Z:d91e;jxfd>�Z=dGdej92ded93efd?�Z>dej94d95efd@�Z6d96efdA�Z?d97efdB�Z@dGdej98ded99efdC�ZAdej100d101efdD�ZBy)J�EnhancedRiskMetricsu9Calcul amélioré des métriques de risque et performanceN�returns�prices�risk_free_ratec�<�||_||_||_i|_y�N)r3r4r5�_cache)�selfr3r4r5s    r�__init__zEnhancedRiskMetrics.__init__7s��������,�����r�keyc�d�||jvr|�|j|<|j|S)u*Utilise le cache pour les calculs coûteux�r8)r9r;�calculation_funcs   r�_cached_calculationz'EnhancedRiskMetrics._cached_calculation=s.���d�k�k�!�/�1�D�K�K����{�{�3��rc��i|_y)u"Réinitialise le cache des calculsNr=�r9s r�reset_cachezEnhancedRiskMetrics.reset_cacheCs	����rr.c���|jjd��j�tj|j102�z}|j
�}d|zd|zzS)u<Volatilité avec estimation EWMA pour meilleure réactivité�?)�spangffffff�?g333333�?)r3�ewm�std�np�sqrt�trading_days�103_fit_garch)r9�ewm_vol�	garch_vols   r�calculate_volatilityz(EnhancedRiskMetrics.calculate_volatilityGsU���,�,�"�"��"�+�/�/�1�B�G�G�D�<M�<M�4N�N���O�O�%�	��W�}�s�Y��.�.rc�"�|j�Sr7)rNrAs r�calculate_annualized_volatilityz3EnhancedRiskMetrics.calculate_annualized_volatilityNs���(�(�*�*rc��ddlm}||jddd��}|jd��}|j	d��}tj|jjd	�tj|j�zS)104u+Implémentation GARCH(1,1) pour volatilitérr�Garch���vol�p�q�off��disp)�horizon�����)105�archrr3�fit�forecastrHrI�variance�valuesrJ)r9r�model�resultsr_s     rrKzEnhancedRiskMetrics._fit_garchQsp��#��4�<�<�W��Q�?���)�)��)�'���#�#�A�#�.���w�w�x�(�(�/�/��3�4�r�w�w�t�?P�?P�7Q�Q�Qrc���|j|jz106}tj|j�|j�|j
�zz|_|j�}|j|zS)z*Sharpe ratio avec ajustement pour skewness)	r3�rfrHrIrJ�meanrG�sr�_skewness_adjustment)r9�excess_returns�skew_adjs   r�calculate_sharpe_ratioz*EnhancedRiskMetrics.calculate_sharpe_ratioYsc��������/���'�'�$�+�+�,��0C�0C�0E��HZ�HZ�H\�0\�]����,�,�.���w�w��!�!rc���tj|j�}tj|j�}d|dz|jzz107|dz108dz|jdzzz}|S)z+Ajustement du Sharpe ratio pour la skewnessrS����)r�skewr3r!rg)r9rq�kurt�adjs    rrhz(EnhancedRiskMetrics._skewness_adjustment`s\���z�z�$�,�,�'���~�~�d�l�l�+���4��6�T�W�W�$�$��Q���{�T�W�W�a�Z�'?�?���109rc��td|j�}|j|j|k}tjtj110|dz�t
|j�z�tj|j�z}|jj�|jz111|jz|zS)z"Sortino ratio avec seuil dynamiquerrp)	�maxrer3rHrI�sum�lenrJrf)r9�	threshold�downside_returns�downside_stds    r�calculate_sortino_ratioz+EnhancedRiskMetrics.calculate_sortino_ratiogs�����4�7�7�O�	��<�<����y�(@�A���w�w�r�v�v�&6��&9�:�3�t�|�|�;L�L�M�PR�PW�PW�X\�Xi�Xi�Pj�j�����!�!�#�d�g�g�-��1B�1B�B�\�Q�Qrc�v�|j�dt|jj��dzzzS)NrSg�������?)r{�absr3rqrAs r� calculate_modified_sortino_ratioz4EnhancedRiskMetrics.calculate_modified_sortino_rations3���+�+�-��S����9J�9J�9L�5M�PS�5S�1S�T�Trc��|�|j}d|zj�}|j�j�}||zdz112}|j	�S)zCalculate Maximum DrawdownrS)r3�cumprod�	expandingru�min)r9r3�113cumulative�running_max�	drawdownss     r�calculate_max_drawdownz*EnhancedRiskMetrics.calculate_max_drawdownqsT��114�/��\�\�7���[�)�)�+�z��)�)�+�/�/�1�{���+�a�/�y��m�m�o�rc���|jd��}|jd��}|jj�|jz115tj|j�z|zS)z&Calcul du ratio de Sharpe conditionnel�ffffff�?)�116confidence)�
calculate_var�calculate_cvarr3rfrerHrIrJ)r9r
rs   r�"calculate_conditional_sharpe_ratioz6EnhancedRiskMetrics.calculate_conditional_sharpe_ratio|s]���#�#�t�#�4���%�%��%�6�����!�!�#�d�g�g�-�����9J�9J�1K�K�g�U�Urc��|�t|�dk(ryttj|d��ttj|d��zS)zCalculate tail ratiorr(�_�)rwr}rH�117percentile�r9r3s  r�calculate_tail_ratioz(EnhancedRiskMetrics.calculate_tail_ratio�s@���?�c�'�l�a�/���2�=�=��"�-�.��R�]�]�7�A�5N�1O�O�Or�market_returnsc�f�|�Lt|jtj�r|jj	d��n|j}tj118|j|jj
d�gd��j�}tj119||j
d�gd��j�}tj|jdd�df|jdd�df�dtj|jdd�df�z}|S)u7Calcul du bêta avec correction pour l'autocorrélationNrS)�axisr�rrS)�120isinstancer3�pd�	DataFramerf�concat�shift�dropnarH�cov�iloc�var)r9r��returns_lag�121market_lag�betas     r�calculate_betaz"EnhancedRiskMetrics.calculate_beta�s����!�:D�T�\�\�SU�S_�S_�:`�T�\�\�.�.�A�.�6�fj�fr�fr�N��i�i����t�|�|�/A�/A�!�/D� E�A�N�U�U�W���Y�Y���0D�0D�Q�0G�H�q�Q�X�X�Z�122��v�v�k�&�&�q��s�+�Z�_�_�Q�q�S�-A�B�3�G�"�&�&�Q[�Q`�Q`�ab�cd�ad�Qe�Jf�f���rc��tdd��}|j|jjj	dd��|j|jjj	dd��}i}t
d�D]}}|j||k(}|j�tj|j�ztj|d�|j�|jzd�|d|��<�|S)	u4Analyse du risque basée sur les régimes de marchérn�*��n_components�random_stater\rSr�)rr
�mean_return�regime_)
rr^r3ra�reshape�predict�rangerGrHrIrJr�rf)r9�gmm�regimes�regime_risks�i�regime_returnss      r�calculate_regime_based_riskz/EnhancedRiskMetrics.calculate_regime_based_risk�s����1�2�>��������#�#�+�+�B��2�3��+�+�d�l�l�1�1�9�9�"�a�@�A�����q��A�!�\�\�'�Q�,�7�N�,�0�0�2�R�W�W�T�=N�=N�5O�O��-�-���:�-�2�2�4�t�7H�7H�H�+�L�7�1�#��'���rc��	t|tj�rtj|�}|�t|�dk(riS|jjdd�}tdd��}|j|�|j|�}tj||d��}i}t|j�D]�}||d	|k(d123}t|�dkDs� t|�t|�z|j�dz|j�tj d�z|j#|�|j%|�tj&|d�t)j*|�t)j,|�d
�|d|��<��|S#t.$r#}	t1dt3|	����icYd}	~	Sd}	~	wwxYw)z0Calculate metrics under different market regimesNrr\rSrnr�r�)r3�regimer�r3��r�)�	frequency�124avg_returnr�sharpe�max_drawdownr
r r!r�z"Error calculating regime metrics: )r�rH�ndarrayr��Seriesrwrar�rr^r�r�r�r�rfrGrI�calculate_regime_sharper�r�rrqr!�	Exception�printr)125r9r3�datar�r��regime_data�regime_metricsr�r��es126          r�_calculate_regime_metricsz-EnhancedRiskMetrics._calculate_regime_metrics�s���-	��'�2�:�:�.��)�)�G�,����#�g�,�!�"3��	��>�>�)�)�"�a�0�D�"�q�r�B�C��G�G�D�M��k�k�$�'�G��,�,�"�!�(��K� �N��3�+�+�,��!,�[��-B�a�-G�!H��!S���~�&��*�%(��%8�3�w�<�%G�&4�&9�&9�&;�c�&A�&4�&8�&8�&:�R�W�W�S�\�&I�"&�">�">�~�"N�(,�(C�(C�N�(S�"$�-�-���"B�$)�J�J�~�$>�$)�N�N�>�$B�	5�N�W�Q�C�=�1�-�"�!���	��6�s�1�v�h�?�@��I��	�s,�AF�BF�B6F�	G�F;�5G�;Gc�6�	t|�dk(ry||jdzz127}|j�dk(rytjd�|j�z|j�zS#t$r!}tdt|����Yd}~yd}~wwxYw)z*Calculate Sharpe ratio for specific regimerr&r�z!Error calculating regime Sharpe: N)	rwr5rGrHrIrfr�r�r)r9r3rir�s    rr�z+EnhancedRiskMetrics.calculate_regime_sharpe�s���
	��7�|�q� ��%��(;�(;�c�(A�B�N��!�!�#�q�(���7�7�3�<�.�"5�"5�"7�7�.�:L�:L�:N�N�N���	��5�c�!�f�X�>�?���	�s!�A.�%A.�6A.�.	B�7B�Bc��	t|�dk(ryd|zj�}|j�j�}||zdz128}|j	�S#t129$r!}t
dt|����Yd}~yd}~wwxYw)zCalculate maximum drawdownrr&rSz Error calculating max drawdown: N)rwr�r�rur�r�r�r)r9r3�cum_returns�rolling_maxr�r�s      rr�z*EnhancedRiskMetrics.calculate_max_drawdown�s���
	��7�|�q� ���w�;�/�/�1�K�%�/�/�1�5�5�7�K�#�k�1�A�5�I��=�=�?�"���	��4�S��V�H�=�>���	�s�A�AA�	B�#A?�?Br�c��|jjd��j�}tj|d|z130dz�S)u)Estimation du risque de drawdown extrêmerD��windowrS�d)r3�rollingrvrHr�)r9r��rolling_returnss   r�calculate_extreme_drawdown_riskz3EnhancedRiskMetrics.calculate_extreme_drawdown_risk�s<���,�,�.�.�b�.�9�=�=�?���}�}�_�q��|�S�.@�A�Arc��	ddl}|j|jddd��}|jd��}t	j131|j�t	j132|j�zS#t$rM|jjd�	�j�t	j133|j�zcYSwxYw)134u"Estimation GARCH de la volatilitérNrRrSrTrXrYrDr�)r]rr3r^rHrI�conditional_volatilityrJ�ImportErrorr�rG)r9r]rb�ress    r�calculate_garch_volatilityz.EnhancedRiskMetrics.calculate_garch_volatilitys���	V���O�O�D�L�L�g��a�O�H�E��)�)��)�'�C��7�7�3�5�5�6�����AR�AR�9S�S�S���	V��<�<�'�'�r�'�2�6�6�8�2�7�7�4�CT�CT�;U�U�U�	V�s�A3A6�6AC�C�benchmark_returnsc���|j|z135}|j�tj|j�z}|j�|jz|z}|S)z-Calcul du ratio d'information avec ajustement)r3rGrHrIrJrf)r9r��active_returns�tracking_error�irs     r�calculate_information_ratioz/EnhancedRiskMetrics.calculate_information_ratio136sV�����(9�9��'�+�+�-�����8I�8I�0J�J��
�
 �
 �
"�T�%6�%6�
6��
G���	rc�Z�d|zj�}t|�dz}|d|zzdz137S)z%Calculate Compound Annual Growth RaterSr�)�prodrw)r9r3�total_return�n_yearss    r�calculate_cagrz"EnhancedRiskMetrics.calculate_cagrs6���G��)�)�+���g�,��$����7��+�q�0�0rc��|j�}t|�dkrtjS|jj�|jz138|zS�Ng�����ư>)r�r}rH�infr3rfre�r9r�s  r�calculate_treynor_ratioz+EnhancedRiskMetrics.calculate_treynor_ratiosF���"�"�$���t�9�t���6�6�M����!�!�#�d�g�g�-��5�5rc��|j�}t|�dkrtjS|j	|j139�|zSr�)r�r}rHr�r�r3)r9�max_dds  r�calculate_calmar_ratioz*EnhancedRiskMetrics.calculate_calmar_ratiosB���,�,�.���v�;����6�6�M��#�#�D�L�L�1�1�F�:�:rc��d|jzj�}|j�j�}||zdz140}|j	�S)NrS)r3r�r�rurf)r9r�r�r�s    r�calculate_average_drawdownz.EnhancedRiskMetrics.calculate_average_drawdown#sL���4�<�<�'�0�0�2��!�+�+�-�1�1�3���+�-��1�	��~�~��rc���d|jzj�}|j�j�}||zdz141}d}d}d}|D]$}|dkr142|sd}|dz
}�|s�t||�}d}d}�&|S)NrSFrT)r3r�r�ru)r9r�r�r��in_drawdown�current_duration�max_duration�dds        r�calculate_drawdown_durationz/EnhancedRiskMetrics.calculate_drawdown_duration)s����4�<�<�'�0�0�2��!�+�+�-�1�1�3���+�-��1�	��������B��A�v�"�"&�K� �A�%� ��#&�|�5E�#F�L�'(�$�"'�K���rc�r�|j�}|jj�}|d|dz143dzz144zS)NrSrng�������?)rkr3r!)r9r�rrs   r�"calculate_kurtosis_adjusted_sharpez6EnhancedRiskMetrics.calculate_kurtosis_adjusted_sharpe?s;���,�,�.���|�|�$�$�&����d�Q�h�#�-�-�.�.rrxc���|j|j|kDj�}t|j|j|kj��}|dk7r||zStjS)Nr)r3rvr}rHr�)r9rx�
returns_above�
returns_belows    r�calculate_omega_ratioz)EnhancedRiskMetrics.calculate_omega_ratioDsb���|�|�D�L�L�9�$<�=�A�A�C�}��4�<�<����	�(A�B�F�F�H�I�}�/<��/A�m�m�+�M�r�v�v�Mrc�\�|�t|�dk(rytj|d|z145dz�S)z"Calculate historical Value at Riskrr&rSr�)rwrHr�)r9r3r�s   r�calculate_historical_varz,EnhancedRiskMetrics.calculate_historical_varIs/���?�c�'�l�a�/���}�}�W�q�:�~��&<�=�=rc���	tjj|�}|j�}|j	�}|||zzS#t146$r}t
d|���Yd}~yd}~wwxYw)Nz Error calculating Gaussian VaR: r&)r�norm�ppfrfrGr�r�)r9r3r��z_score�mu�sigmar�s       r�calculate_gaussian_varz*EnhancedRiskMetrics.calculate_gaussian_varPsd��	��j�j�n�n�Z�0�G�����B��K�K�M�E��'�E�/�)�*�*���	��4�Q�C�8�9���	�s�AA147�148	A+�A&�&A+c��|�t|�dk(ry||dk}t|�dkDr&|j�tjd�zSdS)zCalculate downside deviationrr&r�)rwrGrHrI)r9r3�negative_returnss   r�calculate_downside_deviationz0EnhancedRiskMetrics.calculate_downside_deviationZsU���?�c�'�l�a�/��"�7�Q�;�/��8;�<L�8M�PQ�8Q��#�#�%������4�Z�WZ�Zrc���	|�|j}||dkD}t|�dkDr&|j�tjd�zSdS#t149$r}t
d|���Yd}~yd}~wwxYw)Nrr�r&z%Error calculating upside volatility: )r3rwrGrHrIr�r�)r9r3�positive_returnsr�s    r�calculate_upside_volatilityz/EnhancedRiskMetrics.calculate_upside_volatilityasx��150����<�<�� '��!�� 4�
�=@�AQ�=R�UV�=V�$�(�(�*�R�W�W�S�\�9�
_�\_�
_���151�
�:�1�#�>�
?���152�s�A	A�A�	A/�A*�*A/r�c�����jj|�j�fd���jj|�jd���jj|�j�t	j153d�z�jj|�jd���jj|�j
d�d�}|S)z)Calculate rolling versions of key metricsc���tjd�|j��jdzz154z|j	�zS)Nr�)rHrIrfr5rG)�xr9s �r�<lambda>z?EnhancedRiskMetrics.calculate_rolling_metrics.<locals>.<lambda>ps3������������D�4G�4G��4K�)K�L�q�u�u�w�Vrc���t||dk�dkDr=tjd�|j�z||dkj	�zStj155S�Nrr�)rwrHrIrfrGr��rs rrz?EnhancedRiskMetrics.calculate_rolling_metrics.<locals>.<lambda>ssN��c�!�A�PQ�E�(�m�VW�FW�"�'�'�#�,�����1�A�a�!�e�H�L�L�N�B�c�]_�]c�]c�crr�c�x�tj|tjd|j���ddzS)NrS)�indexr�)rHr�r�r�r
rs rrz?EnhancedRiskMetrics.calculate_rolling_metrics.<locals>.<lambda>ws(��"�&�&��B�I�I�a�q�w�w�$?�@��E��Ir皙�����?)�rolling_sharpe�rolling_sortino�rolling_volatility�rolling_beta�rolling_var)r3r��applyrGrHrI�quantile)r9r��metricss`  r�calculate_rolling_metricsz-EnhancedRiskMetrics.calculate_rolling_metricsls����#�l�l�2�2�6�:�@�@�V�� $�|�|�3�3�F�;�A�A�c� �#'�,�,�"6�"6�v�">�"B�"B�"D�r�w�w�s�|�"S� �L�L�0�0��8�>�>�I�� �<�<�/�/��7�@�@��F�156���rc��|j�dk(rtjStjd�|j	�z|j�zSr157)rGrHr�rIrfr�s  rr�z+EnhancedRiskMetrics.calculate_regime_sharpe}s=���;�;�=�A���6�6�M��w�w�s�|�g�l�l�n�,�w�{�{�}�<�<rc�$�|j|�Sr7)r�r�s  r�calculate_regime_drawdownz-EnhancedRiskMetrics.calculate_regime_drawdown�s���*�*�7�3�3rc�v�|j�}tj|j�}|d|dzz158zS)z,Calculate Sharpe ratio adjusted for skewnessrSrm)rkrrqr3)r9r�rqs   r�"calculate_skewness_adjusted_sharpez6EnhancedRiskMetrics.calculate_skewness_adjusted_sharpe�s5���,�,�.���z�z�$�,�,�'����d�1�f��&�&rc���|jj|��j�}|jj|��j�}t	j159d�||jz160z|zS)zCalculate rolling Sharpe ratior�r��r3r�rfrGrHrIre)r9r��rolling_mean�rolling_stds    r�calculate_rolling_sharpez,EnhancedRiskMetrics.calculate_rolling_sharpe�sc���|�|�+�+�6�+�:�?�?�A���l�l�*�*�&�*�9�=�=�?���w�w�s�|�|�d�g�g�5�6��D�Drc��|jj|��j�}|j|jdk}|j|��j�}t	j161d�||jz162z|zS)zCalculate rolling Sortino ratior�rr�r)r9r�rry�rolling_downsides     r�calculate_rolling_sortinoz-EnhancedRiskMetrics.calculate_rolling_sortino�sy���|�|�+�+�6�+�:�?�?�A���<�<����q�(8�9��+�3�3�6�3�B�F�F�H���w�w�s�|�|�d�g�g�5�6�9I�I�Irc��|jj|��j�tjd�zS)zCalculate rolling volatilityr�r�)r3r�rGrHrI�r9r�s  r�calculate_rolling_volatilityz0EnhancedRiskMetrics.calculate_rolling_volatility�s0���|�|�#�#�6�#�2�6�6�8�2�7�7�3�<�G�Grc�163�tj|j�}|j}|j|��j	|�}tj164|�j|��j
�}||zS)zCalculate rolling betar�)r�r�r3r�r�r�r�)r9r�r3r��rolling_covrs      r�calculate_rolling_betaz*EnhancedRiskMetrics.calculate_rolling_beta�sj���,�,�t�|�|�,�������o�o�V�o�4�8�8��H���i�i��/�7�7�v�7�F�J�J�L���[�(�(rc�X�|jj|��jd�S)zCalculate rolling VaRr�r)r3r�rr&s  r�calculate_rolling_varz)EnhancedRiskMetrics.calculate_rolling_var�s%���|�|�#�#�6�#�2�;�;�D�A�Arc�@�tj|j�S)zCalculate returns skewness)rrqr3rAs r�calculate_skewnessz&EnhancedRiskMetrics.calculate_skewness�s���z�z�$�,�,�'�'rc�@�tj|j�S)zCalculate returns kurtosis)rr!r3rAs r�calculate_kurtosisz&EnhancedRiskMetrics.calculate_kurtosis�s���~�~�d�l�l�+�+rc��	|�|j}tj|�dS#t$r}t	d|���Yd}~yd}~wwxYw)NrzError calculating Jarque-Bera: r&)r3r�jarque_berar�r�)r9r3r�s   r�calculate_jarque_beraz)EnhancedRiskMetrics.calculate_jarque_bera�sN��	����,�,���$�$�W�-�a�0�0���	��3�A�3�7�8���	�s�%(�	A	�A�A	c���|j�}|jj�|j||jj�|jz165zzz166S)zCalculate Jensen's alpha)r�r3rfrer�s  r�calculate_alphaz#EnhancedRiskMetrics.calculate_alpha�sL���"�"�$���|�|� � �"�d�g�g�����8I�8I�8K�d�g�g�8U�0V�&V�W�Wrc���t|jtj�r|jj	�n|j}|jj|�}|dzS)zCalculate R-squaredrp)r�r3r�r�rf�corr)r9r��correlations   r�calculate_r_squaredz'EnhancedRiskMetrics.calculate_r_squared�sO��1;�4�<�<����0V����*�*�,�\`�\h�\h���l�l�'�'��7���a��rc���|�t|�dk(ryd|zj�}||j�j�zdz167}t	j168t	j|dz��S)zCalculate Ulcer Indexrr&rSrp)rwr�r�rurHrIrf�r9r3r�r�s    r�calculate_ulcer_indexz)EnhancedRiskMetrics.calculate_ulcer_index�sd���?�c�'�l�a�/���'�k�*�*�,�169���!5�!5�!7�!;�!;�!=�=��A�	��w�w�r�w�w�y�A�~�.�/�/rc��d|zj�}d||j�j�zz170}|j�S)zCalculate Pain indexrS)r�r�rurfr;s    r�calculate_pain_indexz(EnhancedRiskMetrics.calculate_pain_index�sB���'�k�*�*�,�171��172�Z�%9�%9�%;�%?�%?�%A�A�A�	��~�~��rc���	|�|j}|j|�}|dk(ry|j�|jz173|zS#t$r}td|���Yd}~yd}~wwxYw)Nrr&zError calculating pain ratio: )r3r>rfr5r�r�)r9r3�174pain_indexr�s    r�calculate_pain_ratioz(EnhancedRiskMetrics.calculate_pain_ratio�sn��		����,�,���2�2�7�;�J��Q����L�L�N�T�%8�%8�8�J�F�F���	��2�1�#�6�7���	�s�$A�A�	A(�A#�#A(c��d|jzj�}|j�j�}||z175|z}|jS)zCalculate drawdown seriesrS)r3r�r�rura)r9�cumulative_returnsr�r�s    r�_calculate_drawdownsz(EnhancedRiskMetrics._calculate_drawdowns�sL���$�,�,�.�7�7�9��(�2�2�4�8�8�:��'�+�5��D�	����rc�R�|j||�}|||kj�S)z#Calculate Conditional Value at Risk)r�rf)r9r3r�r�s    rr�z"EnhancedRiskMetrics.calculate_cvar�s,��� � ��*�5���w�#�~�&�+�+�-�-rc��|j|�}|jj�}|j�|j|||jz176zzz177S)zCalculate alpha)r�r3rfr5)r9r3r��
market_returns    rr5z#EnhancedRiskMetrics.calculate_alpha�sP���"�"�7�+�����)�)�+�
��|�|�~��!4�!4�t�}�t�Ob�Ob�?b�7c�!c�d�drc���|j�y	|jj�tjd�zS#t$r}td|���Yd}~yd}~wwxYw)zCalculate tracking errorNr&r�z"Error calculating tracking error: )r3rGrHrIr�r�)r9r�s  r�calculate_tracking_errorz,EnhancedRiskMetrics.calculate_tracking_error�sW���<�<���	��<�<�#�#�%������4�4���	��6�q�c�:�;���	�s�/?�	A �A�A c�r�	|j�t|j�dk(ry|j�}tj|dz�}|dk(ry|jj�|jdzz178tj|�zS#t$r}td|���Yd}~yd}~wwxYw)z0Calculate Burke ratio with proper error handlingNrr&rpr�zError calculating Burke ratio: )179r3rwrDrHrvrfr5rIr�r�)r9r��squared_drawdownsr�s    r�calculate_burke_ratioz)EnhancedRiskMetrics.calculate_burke_ratios���	��|�|�#�s�4�<�<�'8�A�'=���1�1�3�I� "���y�A�~� 6�� �A�%���L�L�%�%�'�$�*=�*=�c�*A�A�R�W�W�M^�E_�_�_���	��3�A�3�7�8���	�s"�$B�-B�?B�	B6�B1�1B6c��	|�t|�dk(rytj|d|z180dz�S#t$r}t	d|���Yd}~yd}~wwxYw)zCalculate Value at RiskNrr&rSr�zError calculating VaR: )rwrHr�r�r�)r9r3r�r�s    rr�z!EnhancedRiskMetrics.calculate_varsW��	���#�g�,�!�"3���=�=��1�z�>�S�*@�A�A���	��+�A�3�/�0���	�s�/�/�	A�A�Ac���	|�y||dkD}||dk}t|�dkDr!|j�|j�zSdS#t$r}td|���Yd}~yd}~wwxYw)zCalculate volatility skewNr&rr(z#Error calculating volatility skew: )rwrGr�r�)r9r3rrr�s     r�calculate_volatility_skewz-EnhancedRiskMetrics.calculate_volatility_skew"s���	����&�w��{�3��&�w��{�3��FI�JZ�F[�^_�F_�#�'�'�)�,<�,@�,@�,B�B�h�eh�h���	��7��s�;�<���	�s"�A�>A�A�	A'�A"�"A')NNr'r7)r�)r)r�)Crrrr/r�r�r�rr:rr?rBrNrPrKrkrhr{r~rr�r�r�r�rr�r�r�r�r�r�r�r�r�r��intr�r�r�r�r�rrrrrr!r$r'r*r,r.r0r3r5r9r<r>rArHr�rDr�rIrLr�rOrrrr2r24sl��C���	�	��"�,�,��_d�� �s� ��/�e�/�+��+�R�E�R�"��"��e��R��R�U�%�U��h�r�y�y�.A��U��V�E�V�P�B�I�I�P�%�P��R�Y�Y��%���T�#�u�*�-=��"/����/�t�C��c�SX�j�IY�DY�?Z�/�b�r�y�y��U��"�b�i�i��E��"B�%�B�5�B�181V�B�I�I�V��R�Y�Y��5��1�b�i�i�1�E�1�6��6�;��;� �E� ��S��,/�E�/�182N�u�N�U�N�183>��	�	�>�u�>�X]�>��b�i�i��U��V[��[�B�I�I�[�%�[��8�B�I�I�3F��RW�����"=�r�y�y�=�U�=�1844����4�u�4�'�E�'�E�s�E�r�y�y�E�J��J��	�	�J�H�3�H�2�9�9�H�	)�S�	)�R�Y�Y�	)�B�C�B�B�I�I�B�(�E�(�,�E�,��X�b�i�i�-@��E��X��X�185 �U� �0�R�Y�Y�0�5�0� �B�I�I� �%� �186�H�R�Y�Y�,?�187�5�188� �b�j�j� �.�b�i�i�.�U�.�e�.�e�r�y�y�e�U�e��%���u��$�R�Y�Y��E��U��189����190�u�191rr2)�numpyrH�pandasr��scipyr�typingrrr]r�sklearn.mixturer�dataclassesr	rrr2rrr�<module>rWsY�����!��+�!��192�	*�	*��	*��193�194��195�:x�xr