
    i7                         d Z ddlZddlmZmZmZmZ ddlZddl	m
Z
  ej                  d      Z G d d      ZdadefdZy)	ux   
Correlation Analyzer - Analyse des corrélations inter-cryptos
Détecte les rotations sectorielles et dépendances BTC
    N)DictListOptionalTuple)defaultdictCorrelationAnalyzerc                       e Zd ZdZd ZdedefdZddededed	efd
Z	ddeded	efdZ
ded	efdZd	ee   fdZded	eeef   fdZddee   ded	efdZdee   d	efdZ	 ddee   dee   ded	eeeef      fdZy)r   u3   Analyse les corrélations entre cryptos et avec BTCc                 V   t        t              | _        d| _        dgg dg dg dg dg dg dg d	g d
g dd
| _        i | _        | j                  j                         D ]  \  }}|D ]  }|| j
                  |<     i | _        i | _        g | _	        t        j                  d       y )Nd   BTC)ETHSOLADAAVAXDOTATOMNEARALGO)MATICARBOPIMX)UNIAAVESNXCRVCOMPMKRSUSHI)BNBCROFTTOKB)AXSSANDMANAENJGALA)LINKBANDTRB)FILARSTORJ)XMRZECDASH)DOGESHIBPEPEFLOKI)
r   L1L2DEFIEXCHANGEGAMINGORACLESTORAGEPRIVACYMEMEu$   ✅ Correlation Analyzer initialisé)r   listprice_historymax_historysectorssymbol_to_sectoritemscorrelationsbtc_correlationsactive_sectorsloggerinfo)selfsectorsymbolssymbols       ./correlation_analyzer.py__init__zCorrelationAnalyzer.__init__   s    (. 7N/I4<---5
 !##||113 	7OFG! 706%%f-7	7
  " !:;    rM   pricec                 $   |j                  dd      j                  dd      }| j                  |   j                  |       t        | j                  |         | j                  kD  r+| j                  |   | j                   d | j                  |<   yy)u   
        Met à jour l'historique de prix pour un symbole
        
        Args:
            symbol: Symbole (ex: 'BTC', 'ETH')
            price: Prix actuel
        /USDT USDTN)replacer@   appendlenrA   )rJ   rM   rQ   clean_symbols       rN   update_pricez CorrelationAnalyzer.update_price3   s     ~~gr2::62F 	<(//6 t!!,/043C3CC/3/A/A,/OQUQaQaPaPb/cD|, DrP   symbol1symbol2periodreturnc                    |j                  dd      j                  dd      }|j                  dd      j                  dd      }|| j                  vs|| j                  vry| j                  |   }| j                  |   }t        |      |k  st        |      |k  ryt        j                  || d       }t        j                  || d       }	t        j
                  |      |dd z  }
t        j
                  |	      |	dd z  }t        |
      dk  st        |      dk  ryt        j                  |
|      d   }t        j                  |      ry|S )	u  
        Calcule la corrélation entre 2 symboles
        
        Args:
            symbol1: Premier symbole
            symbol2: Deuxième symbole
            period: Nombre de points pour le calcul
            
        Returns:
            Corrélation de Pearson (-1 à +1)
        rS   rT   rU           N   )r      )rV   r@   rX   nparraydiffcorrcoefisnan)rJ   r[   r\   r]   clean_symbol1clean_symbol2prices1prices2p1p2returns1returns2correlations                rN   calculate_correlationz)CorrelationAnalyzer.calculate_correlationE   sB     4<<VRH4<<VRH  2 22m4K]K]6]$$]3$$]3w<& CL6$9 XXgvgh'(XXgvgh'( 772;CR(772;CR( x=1H 1kk(H5d; 88K rP   c                 (    | j                  |d|      S )u   
        Retourne la corrélation avec BTC
        
        Args:
            symbol: Symbole à analyser
            period: Période de calcul
            
        Returns:
            Corrélation avec BTC (-1 à +1)
        r   )rr   )rJ   rM   r]   s      rN   get_btc_correlationz'CorrelationAnalyzer.get_btc_correlationr   s     ))&%@@rP   c           	         |j                  dd      j                  dd      }|ddddddg d}| j                  |d      }t        |d	      |d
<   |dkD  rd|d<   |d   j                  d       n|dkD  rd|d<   |d   j                  d       n~|dkD  r'd|d<   |dxx   dz  cc<   |d   j                  d       nR|dkD  r'd|d<   |dxx   dz  cc<   |d   j                  d       n&d|d<   |dxx   dz  cc<   |d   j                  d       | j                  j                  |d      }||d<   |dk7  r,|| j                  v r| j                  |   }g }|D ]a  }|| j                  v st        | j                  |         dk\  s.| j                  |   }	|	d    |	d!   z
  |	d!   z  d"z  }
|j                  |
       c |rt        j                  |      }|| j                  v rt        | j                  |         dk\  rf| j                  |   }	|	d    |	d!   z
  |	d!   z  d"z  }||d#z  kD  r)d$|d%<   |dxx   dz  cc<   |d   j                  d&|        t        ||z
  d'      |d(<   |S ))u   
        Analyse la force de corrélation d'un symbole avec BTC et son secteur
        
        Returns:
            Dict avec analyse de corrélation
        rS   rT   rU   r`   UNKNOWNF)rM   btc_correlationbtc_correlation_strengthrK   sector_correlationis_sector_leadercorrelation_bonusrecommendations      rw   gffffff?u   TRÈS FORTErx   r|   u3   ⚠️ Très corrélé à BTC - suivre BTC de prèsg      ?FORTEu   📊 Forte corrélation BTCg333333?MOYENNEr{      u/   ✅ Corrélation modérée - diversification OKr   FAIBLE
   u4   ✅ Faible corrélation - excellente diversificationu	   NÉGATIVE   u2   🔥 Corrélation négative - potentiel de hedgingrK   ra   ir   g333333?Trz   u   🚀 Leader du secteur rb   symbol_vs_sector)rV   rt   roundrW   rC   getrB   r@   rX   rd   mean)rJ   rM   rY   analysisbtc_corrrK   sector_symbolssector_perfs
sec_symbolpricesperfavg_sector_perfsymbol_perfs                rN   analyze_correlation_strengthz0CorrelationAnalyzer.analyze_correlation_strength   s    ~~gr2::62F #"(1"% %!$!	
 ++L"=&+Ha&8"# c>3@H/0&'../de^3:H/0&'../LM^3<H/0()Q.)&'../`a\3;H/0()R/)&'../ef3>H/0()R/)&'../cd &&**<C# Y6T\\#9!\\&1NL, .
!3!33D<N<Nz<Z8[_a8a!//
;F"2J4sCcID ''-	. "$'',"7  4#5#55#d>P>PQ]>^:_ce:e!//=F#)":s#;vc{"JS"PK"_s%::7;!34 !45;5 !23::=TU[T\;]^389VXY3ZH/0rP   c                 D   i }| j                   j                         D ]  \  }}|dk(  rg }|D ]a  }|| j                  v st        | j                  |         dk\  s.| j                  |   }|d   |d   z
  |d   z  dz  }|j	                  |       c |swt        j                  |      }|||<    t        |j                         d d      }	|	d	d
 D cg c]  \  }}|dkD  s| }
}}|
| _        |
r't        j                  ddj                  |
              |
S c c}}w )u   
        Détecte les secteurs en rotation (performance récente forte)
        
        Returns:
            Liste des secteurs actifs
        r      ra   ir   c                     | d   S Nrc    xs    rN   <lambda>z<CorrelationAnalyzer.detect_sector_rotation.<locals>.<lambda>   s
    !A$ rP   TkeyreverseNr~   r   u   🔄 Secteurs en rotation: z, )rB   rD   r@   rX   rW   rd   r   sortedrG   rH   rI   join)rJ   sector_performancerK   rL   perfsrM   r   r   avg_perfsorted_sectorsrG   s              rN   detect_sector_rotationz*CorrelationAnalyzer.detect_sector_rotation   s?     #||113 	6OFGE! 'T///C8J8J68R4SWY4Y!//7F"2J4sCcIDLL&' 775>-5"6*	6"   2 8 8 :X\] 6DBQ5GT\VT4RS8&TT,KK5dii6O5PQR Us   D#Dc                    |j                  dd      j                  dd      }| j                  j                  |d      }|| j                  v r?| j                  j	                  |      dk(  ry| j                  j	                  |      dk(  ryy	y
)u   
        Vérifie si le symbole est dans un secteur actif
        
        Returns:
            (is_active, bonus_score)
        rS   rT   rU   rv   r   )Tr   rc   )Tr   )Tr   )Fr   )rV   rC   r   rG   index)rJ   rM   rY   rK   s       rN   is_in_active_sectorz'CorrelationAnalyzer.is_in_active_sector   s     ~~gr2::62F&&**<CT(((""((0A5$$**62a7rP   rL   c                     i }|D ]A  }i ||<   |D ]5  }||k(  r	d||   |<   | j                  |||      }t        |d      ||   |<   7 C |S )u   
        Calcule une matrice de corrélation pour plusieurs symboles
        
        Args:
            symbols: Liste de symboles
            period: Période de calcul
            
        Returns:
            Dict avec matrice de corrélation
        g      ?r~   )rr   r   )rJ   rL   r]   matrixsym1sym2corrs          rN   get_correlation_matrixz*CorrelationAnalyzer.get_correlation_matrix  st      	8DF4L 84<),F4L&55dD&ID).tQF4L&8	8 rP   portfolio_symbolsc                    t        |      dk  rdddS g }t        |      D ]?  \  }}||dz   d D ]/  }| j                  ||d      }|j                  t	        |             1 A |sdddS t        j                  |      }d|z
  dz  }|dkD  rd	}	n|d
kD  rd}	n
|dkD  rd}	nd}	t        |d      t        |d      |	t        |      dS )u   
        Évalue la diversification d'un portfolio
        
        Args:
            portfolio_symbols: Liste des symboles du portfolio
            
        Returns:
            Dict avec score de diversification
        rb   r   zN/A)diversification_scorequalityrc   Nr}   F   
EXCELLENTE2   BONNEr   r   r~   )r   avg_correlationr   num_positions)rX   	enumeraterr   rW   absrd   r   r   )
rJ   r   rE   ir   r   r   r   r   r   s
             rN   get_diversification_scorez-CorrelationAnalyzer.get_diversification_score  s     !A%-0UCC  !23 	/GAt)!A#$/ /11$bA##CI./	/
 -0UCC'',/ "#_!4 ; !2%"G"R'G"R'GG &++@!%D$_a8 !23	
 	
rP   current_symbols
candidatestop_nc                 0   g }|D ]w  }||v rg }|D ]/  }| j                  ||d      }|j                  t        |             1 |sAt        j                  |      }	d|	z
  }
|j                  |t        |
d      f       y |j                  d d       |d| S )uI  
        Recommande des symboles pour améliorer la diversification
        
        Args:
            current_symbols: Symboles actuels du portfolio
            candidates: Symboles candidats
            top_n: Nombre de recommandations
            
        Returns:
            Liste de (symbol, diversification_score)
        r}   rc   r~   c                     | d   S r   r   r   s    rN   r   zCCorrelationAnalyzer.recommend_for_diversification.<locals>.<lambda>l  s
    1Q4 rP   Tr   N)rr   rW   r   rd   r   r   sort)rJ   r   r   r   r|   	candidaterE   currentr   avg_corr	div_scores              rN   recommend_for_diversificationz1CorrelationAnalyzer.recommend_for_diversificationL  s     # 	IIO+ L* /11)WbI##CI./ 77<0L	&&	5A3F'GH	I" 	>v&&rP   N)r}   )r   )__name__
__module____qualname____doc__rO   strfloatrZ   intrr   rt   r   r   r   r   r   boolr   r   r   r   r   rP   rN   r   r      s!   = <Dd3 du d$+S +3 + +UZ +ZA# As AE AJ3 J4 JX$S	 $L# %e2D *d3i  d 0,
49 ,
 ,
^ JK"'T#Y "'15c"'CF"'OSTYZ]_dZdTeOf"'rP   r^   c                  .    t         
t               a t         S )z3Retourne l'instance globale du correlation analyzer)_correlation_analyzerr   r   rP   rN   get_correlation_analyzerr   t  s     $ 3 5  rP   )r   numpyrd   typingr   r   r   r   loggingcollectionsr   	getLoggerrH   r   r   r   r   rP   rN   <module>r      sP   
  . .  #			0	1`' `'H  !"5 !rP   