o
    )mÚhZB  ã                   @   sr   d Z ddlZddlZddlmZmZmZm	Z	 ddl
m
Z
mZ ddlZddlmZ ddlZddlZG dd„ dƒZdS )uL   
Gestionnaire de corrÃ©lation BTC pour pondÃ©ration des entrÃ©es de trading
é    N)ÚDictÚListÚOptionalÚTuple)ÚdatetimeÚ	timedelta)Údequec                   @   s  e Zd ZdZd,defdd„Zdd„ Zd	d
„ Zdd„ Zd-de	dede
e fdd„Zd-de	de
e defdd„Zd-de
e	 fdd„Zdede	fdd„Zdedefdd„Zde	dedefdd„Zde	d edeee	f fd!d"„Zd#edefd$d%„Zdefd&d'„Zd(ed)e
e de
e fd*d+„ZdS ).ÚBTCCorrelationManageruy   
    Calcule et gÃ¨re les corrÃ©lations entre BTC et autres cryptos
    pour optimiser la distribution des positions
    Néd   Úlookback_periodsc                 C   s†   || _ || _t d¡| _i | _t|d�| _i | _d| _	d| _
ddddœ| _d	d
ddddœ| _dddddœ| _t ¡ | _d| _d| _dS )u·   
        Args:
            hyperliquid_client: Client pour rÃ©cupÃ©rer les donnÃ©es de marchÃ©
            lookback_periods: Nombre de pÃ©riodes pour calculer la corrÃ©lation
        r	   )ÚmaxlenNi,  çš™™™™™é?ç333333ã?ç333333Ó?)ÚhighÚmediumÚlowçÍÌÌÌÌÌì?çffffffî?ç      ð?gš™™™™™ñ?©Ú	very_highr   r   r   Úvery_lowé   é   é   é
   )r   r   r   r   F)Úclientr   ÚloggingÚ	getLoggerÚloggerÚprice_cacher   Ú
btc_pricesÚcorrelation_cacheÚcache_timestampÚcache_durationÚcorrelation_thresholdsÚweight_factorsÚmax_correlated_exposureÚ	threadingÚLockÚlockÚupdate_threadÚrunning)ÚselfÚhyperliquid_clientr   © r0   úT/var/www/html/HyperOracle/crypto_trader/simple_trading_system/correlation_manager.pyÚ__init__   s4   ýû
ü

zBTCCorrelationManager.__init__c                 C   sB   | j sd| _ tj| jd�| _d| j_| j ¡  | j d¡ dS dS )u6   DÃ©marre la mise Ã  jour pÃ©riodique des corrÃ©lationsT)Útargetz&Background correlation updates startedN)	r-   r)   ÚThreadÚ_background_updaterr,   ÚdaemonÚstartr    Úinfo©r.   r0   r0   r1   Ústart_background_updatesC   s   
ûz.BTCCorrelationManager.start_background_updatesc                 C   s"   d| _ | jr| jjdd� dS dS )u*   ArrÃªte les mises Ã  jour en arriÃ¨re-planFr   )ÚtimeoutN)r-   r,   Újoinr9   r0   r0   r1   Ústop_background_updatesL   s   ÿz-BTCCorrelationManager.stop_background_updatesc              
   C   sn   | j r5z|  ¡  t | j¡ W n  ty/ } z| j d|› �¡ t d¡ W Y d}~nd}~ww | j sdS dS )u4   Thread de mise Ã  jour pÃ©riodique des corrÃ©lationszError in background updater: é<   N)r-   Úupdate_all_correlationsÚtimeÚsleepr%   Ú	Exceptionr    Úerror)r.   Úer0   r0   r1   r5   R   s   €þüz)BTCCorrelationManager._background_updaterÚsymbolÚperiodsÚreturnc              
   C   s    | j sg S |p	| j}z&| j j|d|d�}|r.dd„ |D ƒ}t|ƒ|kr+|| d… W S |W S W g S  tyO } z| j d|› d|› �¡ W Y d}~g S d}~ww )u-   RÃ©cupÃ¨re l'historique des prix d'un symboleÚ1h)Úlookback_hoursc                 S   s&   g | ]}|  d ¡rt|  d d¡ƒ‘qS )Úcloser   )ÚgetÚfloat©Ú.0Úcr0   r0   r1   Ú
<listcomp>h   s   & z;BTCCorrelationManager.get_price_history.<locals>.<listcomp>Nz!Error fetching price history for ú: )r   r   Úget_candles_dataÚlenrB   r    rC   )r.   rE   rF   ÚcandlesÚpricesrD   r0   r0   r1   Úget_price_history\   s   
"ýý"€ýz'BTCCorrelationManager.get_price_historyr"   c              
   C   sî   zW|du r
|   d¡}|sW dS |   |¡}|rt|ƒt|ƒkr!W dS t t |¡¡}t t |¡¡}t|ƒdkrRt|ƒdkrUt ||¡d }t |¡rMW dS t|ƒW S W dS W dS  tyv } z| j	 
d|› d|› �¡ W Y d}~dS d}~ww )u‰   
        Calcule la corrÃ©lation entre un symbole et BTC

        Returns:
            Coefficient de corrÃ©lation entre -1 et 1
        NÚBTCç      à?r   )r   é   z"Error calculating correlation for rQ   )rV   rS   ÚnpÚdiffÚlogÚcorrcoefÚisnanrL   rB   r    rC   )r.   rE   r"   Úsymbol_pricesÚbtc_returnsÚsymbol_returnsÚcorrelationrD   r0   r0   r1   Úcalculate_correlationo   s0   



ùôý"€ýz+BTCCorrelationManager.calculate_correlationÚsymbolsc                 C   sR  | j �œ zo|  d¡}|s| j d¡ W W d  ƒ dS |s?| jr?z| j ¡ }|r5d|v r5dd„ |d D ƒ}W n   g d¢}Y i }|D ]}|dkr]|  ||¡}||  |¡|  |¡dœ||< qC|| _	t
 ¡ | _| j d	t|ƒ› d
�¡ W n tyŽ } z| j d|› �¡ W Y d}~nd}~ww W d  ƒ dS W d  ƒ dS 1 s¢w   Y  dS )u=   Met Ã  jour le cache des corrÃ©lations pour tous les symbolesrW   z1Could not fetch BTC prices for correlation updateNÚuniversec                 S   s   g | ]}|d  ‘qS )Únamer0   )rN   Úassetr0   r0   r1   rP   ¨   s    zABTCCorrelationManager.update_all_correlations.<locals>.<listcomp>)ÚETHÚSOLÚARBÚMATICÚAVAXÚBNBÚLINKÚUNIÚAAVEÚCRVÚALGOÚGRT)rb   Úweight_factorÚcategoryzUpdated correlations for z symbolszError updating correlations: )r+   rV   r    Úwarningr   Úget_metarc   Úget_weight_factorÚget_correlation_categoryr#   r   Únowr$   r8   rS   rB   rC   )r.   rd   r"   ÚmetaÚ	new_cacherE   rb   rD   r0   r0   r1   r?   —   sF   
ù


€

ý€
€ÿþÞ%"Ûz-BTCCorrelationManager.update_all_correlationsrb   c                 C   s<   t |ƒ}|dkr
dS |dkrdS |dkrdS |dkrdS d	S )
u%   CatÃ©gorise le niveau de corrÃ©lationr   r   r   r   r   r   r   r   r   )Úabs)r.   rb   Úabs_corrr0   r0   r1   ry   À   s   z.BTCCorrelationManager.get_correlation_categoryc                 C   s   |   |¡}| j |d¡S )u†   
        Retourne le facteur de pondÃ©ration basÃ© sur la corrÃ©lation

        Returns:
            Facteur entre 0.4 et 1.2
        r   )ry   r'   rK   )r.   rb   ru   r0   r0   r1   rx   Ï   s   
z'BTCCorrelationManager.get_weight_factorÚ	base_sizec                 C   sL   |   ¡ r|  ¡  || jv r| j| d }|| S |  |¡}|  |¡}|| S )uô   
        Calcule la taille de position pondÃ©rÃ©e selon la corrÃ©lation

        Args:
            symbol: Le symbole Ã  trader
            base_size: Taille de position de base

        Returns:
            Taille de position ajustÃ©e
        rt   )Úneeds_cache_updater?   r#   rc   rx   )r.   rE   r   rt   rb   r0   r0   r1   Úget_position_weightÙ   s   


z)BTCCorrelationManager.get_position_weightÚcurrent_positionsc           
         s   |   ¡ r|  ¡  || jvr|  |¡}|  |¡}n| j| d }ddddddœ‰ | ¡ D ]}|| jv rC| j| d }ˆ  |d¡d ˆ |< q+|dv rfˆ d ˆ d  }| j dd¡}||krfd	d
|› d|› d�fS t‡ fdd„ˆ D ƒƒ}	|	dkr~d	d|	d›d�fS dS )uü   
        DÃ©termine si une nouvelle position peut Ãªtre ouverte selon les corrÃ©lations

        Args:
            symbol: Symbole Ã  trader
            current_positions: Positions actuelles

        Returns:
            (peut_ouvrir, raison)
        ru   r   r   rY   ©r   r   r   r   r   Fu4   Limite de positions fortement corrÃ©lÃ©es atteinte (ú/ú)c                 3   s@   � | ]}ˆ | |d krdn|dkrdn|dkrdnd V  qdS )r   g       @r   g      ø?r   r   rX   Nr0   )rN   Úcat©Úcategory_countsr0   r1   Ú	<genexpr>  s   € ýþ
ÿz=BTCCorrelationManager.should_open_position.<locals>.<genexpr>r   u,   Exposition totale pondÃ©rÃ©e trop Ã©levÃ©e (ú.1fz/10))TÚOK)	r€   r?   r#   rc   ry   ÚkeysrK   r(   Úsum)
r.   rE   r‚   rb   ru   Ú
pos_symbolÚpos_categoryÚcurrent_high_corrÚmax_allowedÚtotal_weighted_exposurer0   r‡   r1   Úshould_open_positionò   s.   


€üz*BTCCorrelationManager.should_open_positionÚ	positionsc           
      C   sÚ   |s	dddddœS g }|  ¡ D ] }|| jv r#| t| j| d ƒ¡ q|  |¡}| t|ƒ¡ q|s9dddddœS t |¡}t |¡}d| }tdd„ |D ƒƒ}|rX|t	|ƒ nd}	t
|ƒt
|ƒt
|ƒt
|	ƒt	|ƒ|dœS )u—   
        Calcule les mÃ©triques de corrÃ©lation du portefeuille

        Returns:
            Dictionnaire avec les mÃ©triques du portefeuille
        r   r   )Úavg_correlationÚmax_correlationÚdiversification_scoreÚrisk_concentrationrb   c                 s   s   � | ]	}|d krdV  qdS )r   rY   Nr0   rM   r0   r0   r1   r‰   M  s   € z>BTCCorrelationManager.get_portfolio_metrics.<locals>.<genexpr>)r•   r–   r—   r˜   Útotal_positionsÚhigh_corr_positions)rŒ   r#   Úappendr}   rc   rZ   ÚmeanÚmaxr�   rS   rL   )
r.   r”   ÚcorrelationsrE   ÚcorrÚavg_corrÚmax_corrÚdiversificationÚhigh_corr_countr˜   r0   r0   r1   Úget_portfolio_metrics&  s<   ü

ü

úz+BTCCorrelationManager.get_portfolio_metricsc                 C   s&   | j sdS t ¡ | j   ¡ }|| jkS )u+   VÃ©rifie si le cache doit Ãªtre mis Ã  jourT)r$   r   rz   Útotal_secondsr%   )r.   Úelapsedr0   r0   r1   r€   Y  s   
z(BTCCorrelationManager.needs_cache_updateÚavailable_balanceÚsignalsc              	   C   sÔ  |sg S |   ¡ r|  ¡  g }|D ]K}| dd¡}|| jv r+| j| }|d }|d }n
|  |¡}|  |¡}| dd¡}	|	| }
| ¡ }||d< ||d< |
|d< |  |¡|d< | |¡ q|j	d	d
„ dd� g }d}ddddddœ}|D ]\}|d }|dv r‘|d |d  }|| j
d kr‘d|d< qs|d }||d  }|| |d kr¨d|d< qs||d< || d |d< | |¡ ||7 }| |d¡d ||< t|ƒdkrÏ nqs| j dt|ƒ› d|d›d|| d d ›d!�¡ |S )"u/  
        Recommande une distribution optimale des positions selon les corrÃ©lations

        Args:
            available_balance: Balance disponible pour trading
            signals: Liste des signaux de trading

        Returns:
            Liste des signaux avec tailles de position ajustÃ©es
        rE   Ú rb   rt   ÚscorerX   Úadjusted_scoreÚcorrelation_categoryc                 S   s   | d S )Nr«   r0   )Úxr0   r0   r1   Ú<lambda>Ž  s    zMBTCCorrelationManager.get_recommended_position_distribution.<locals>.<lambda>T)ÚkeyÚreverser   r   rƒ   r   r   u"   Limite corrÃ©lation haute atteinteÚskip_reasongš™™™™™¹?r   zBudget insuffisantÚposition_sizer
   Úposition_percentrY   r   zPosition distribution: z positions, Total allocated: $z.2fz (rŠ   z%))r€   r?   rK   r#   rc   rx   Úcopyry   r›   Úsortr(   rS   r    r8   )r.   r§   r¨   Úenhanced_signalsÚsignalrE   Ú	corr_datarb   rt   Úoriginal_scorer«   Úenhanced_signalÚallocated_signalsÚtotal_allocatedrˆ   ru   Ú
total_highÚbase_position_sizeÚadjusted_sizer0   r0   r1   Ú%get_recommended_position_distributiona  sf   





ÿÿ
ÿz;BTCCorrelationManager.get_recommended_position_distribution)Nr
   )N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__Úintr2   r:   r=   r5   Ústrr   rL   rV   rc   r?   ry   rx   r�   r   r   Úboolr“   r¤   r€   rÀ   r0   r0   r0   r1   r	      s(    /	
()
43ÿÿr	   )rÄ   ÚnumpyrZ   ÚpandasÚpdÚtypingr   r   r   r   r   r   r   Úcollectionsr   r)   r@   r	   r0   r0   r0   r1   Ú<module>   s    