o
    @àÊh‘'  ã                   @   sr   d Z ddlmZmZmZ ddlZe e¡ZG dd„ dƒZ	e	ƒ Z
dee dedefd	d
„Zdee defdd„ZdS )z¨
Position Bias Analyzer - Enrichit les signaux avec le contexte des positions ouvertes
Utilise les positions actuelles pour confirmer ou ajuster les signaux de trading
é    )ÚDictÚListÚTupleNc                   @   s†   e Zd ZdZdd„ Zdee dedefdd„Zdee defd	d
„Zdededefdd„Z	dee defdd„Z
dedefdd„ZdS )ÚPositionBiasAnalyzerzK
    Analyse le biais des positions ouvertes pour enrichir les signaux
    c                 C   s
   d| _ d S )Né   )Úmin_positions_for_analysis)Úself© r	   úA/var/www/html/HyperOracle/crypto_trader/position_bias_analyzer.pyÚ__init__   s   
zPositionBiasAnalyzer.__init__Ú	positionsÚ
new_signalÚreturnc                 C   s0   |r	t |ƒ| jk r|S |  |¡}|  ||¡}|S )u8  
        Analyse le biais des positions et ajuste le signal en consÃ©quence
        
        Args:
            positions: Liste des positions ouvertes
            new_signal: Signal Ã  analyser et potentiellement ajuster
            
        Returns:
            Signal ajustÃ© avec contexte de position
        )Úlenr   Ú_calculate_bias_metricsÚ_adjust_signal_with_bias)r   r   r   Úbias_metricsÚadjusted_signalr	   r	   r
   Úanalyze_position_bias   s
   
z*PositionBiasAnalyzer.analyze_position_biasc                 C   s  dd„ |D ƒ}dd„ |D ƒ}t |ƒ}t |ƒ}t |ƒ}|dkr)tdd„ |D ƒƒ| nd}|dkr:tdd„ |D ƒƒ| nd}tdd„ |D ƒƒ| }	|| }
t|
ƒd	k rTd
}n	||kr[d}nd}td	t|
ƒd ƒ}|dkrl|n|}t||ƒ| }||||||||	|||dk|	dkdœS )u,   Calcule les mÃ©triques de biais du portfolioc                 S   ó   g | ]
}|d  dkr|‘qS )ÚsideÚLONGr	   ©Ú.0Úpr	   r	   r
   Ú
<listcomp>-   ó    z@PositionBiasAnalyzer._calculate_bias_metrics.<locals>.<listcomp>c                 S   r   )r   ÚSHORTr	   r   r	   r	   r
   r   .   r   r   c                 s   ó   � | ]}|d  V  qdS ©Úpnl_percentNr	   r   r	   r	   r
   Ú	<genexpr>5   ó   € z?PositionBiasAnalyzer._calculate_bias_metrics.<locals>.<genexpr>c                 s   r   r   r	   r   r	   r	   r
   r!   6   r"   c                 s   r   r   r	   r   r	   r	   r
   r!   7   r"   ç      ð?ÚNEUTRALr   r   g      $@g      è?)Útotal_positionsÚ
long_countÚshort_countÚdirectional_biasÚbias_strengthÚlong_pnl_avgÚshort_pnl_avgÚtotal_pnl_avgÚdominant_side_performanceÚconcentration_ratioÚis_concentratedÚis_profitable)r   ÚsumÚabsÚminÚmax)r   r   Úlong_positionsÚshort_positionsÚtotal_countr&   r'   Úlong_pnlÚ	short_pnlÚ	total_pnlÚperformance_differentialr(   r)   r-   Úmax_side_ratior	   r	   r
   r   *   s<   ""ôz,PositionBiasAnalyzer._calculate_bias_metricsÚsignalr   c              	   C   sà  |  ¡ }| dd¡}g }| dd¡}|dkrdn|dkrdnd	}|d	kr&|S ||d
 kr[|d dkr[d|d d  }td|| ƒ|d< | d|d
 › d|d d›d|d d›d�¡ nû||d
 kr�|d dkr�d|d d  }td|| ƒ|d< | d|d
 › d|d d›d|d d›d�¡ nÆ||d
 krÅ|d dk rÅd|d d  }	td||	 ƒ|d< | d|d
 › d|d d›d|	d d›d�¡ n‘|d  rô||d
 krôt|d ƒd!k rôd}
td||
 ƒ|d< | d"|d
 › d#|
d d›d�¡ nb|d$ d%k �r ||d
 k�r d}td|| ƒ|d< | d&|d$ d›d'|d d›d�¡ n6||d
 k�rV|d d(k�rVd|d d  }	td||	 ƒ|d< | d)|d
 › d*|d d›d|	d d›d�¡ |�rn| d+d,¡}d- |¡}|› d.|› d/�|d+< |S )0u.   Ajuste le signal selon les mÃ©triques de biaisÚ
confidenceg      à?Úsignal_typeÚHOLDÚBUYr   ÚSELLr   r$   r(   r-   g      @g      Ð?r)   g333333Ã?r#   zSTRONG_MOMENTUM: z bias very profitable (ú+.1fz%) +éd   ú.0fú%gš™™™™™¹?zPROFITABLE_TREND: z bias profitable (g       Àgš™™™™™É?zLOSING_TREND_STOP: z bias losing (z%) -r/   g       @zDIVERSIFICATION: High z3 concentration but neutral performance, diversify +r,   g      Àz'CAPITULATION_SIGNAL: Portfolio losing (z%), potential reversal +g      @z'COUNTER_TREND_RISK: Against profitable z (Ú	reasoningÚ z | z [POSITION_BIAS: ú])ÚcopyÚgetr3   Úappendr4   r2   Újoin)r   r=   r   r   Úoriginal_confidenceÚreasoning_additionsr?   Úsignal_sideÚboostÚ	reductionÚdiversification_boostÚcapitulation_boostÚexisting_reasoningÚbias_reasoningr	   r	   r
   r   ]   s–   ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
z-PositionBiasAnalyzer._adjust_signal_with_biasc              	   C   sx   |sddiS |   |¡}|d |d › d|d › d�|d |d	 d
 d›d�|d d›d�|d d
 d›d�|  |¡dœS )u+   RÃ©sumÃ© du portfolio pour logging et debugÚstatusÚemptyr%   r&   zL/r'   ÚSr(   r)   rD   rE   rF   r,   rC   r.   )r%   Údirectional_splitÚbiasr)   ÚperformanceÚconcentrationÚ
risk_level)r   Ú_assess_risk_level)r   r   r   r	   r	   r
   Úget_portfolio_summaryµ   s   
ùz*PositionBiasAnalyzer.get_portfolio_summaryc                 C   s<   |d r|d dk rdS |d rdS t |d ƒdkrdS dS )	u(   Ã‰value le niveau de risque du portfolior/   r-   éûÿÿÿÚHIGHÚMEDIUMr,   é
   ÚLOW)r2   )r   r   r	   r	   r
   r_   Æ   s   z'PositionBiasAnalyzer._assess_risk_levelN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   r   r   r   r`   Ústrr_   r	   r	   r	   r
   r      s    3Xr   r   r=   r   c                 C   s   t  | |¡S )z?Fonction helper pour analyser un signal avec contexte positions)Úposition_bias_analyzerr   )r   r=   r	   r	   r
   Úanalyze_signal_with_positionsÔ   s   rl   c                 C   s
   t  | ¡S )z2Fonction helper pour obtenir le contexte portfolio)rk   r`   )r   r	   r	   r
   Úget_portfolio_contextØ   s   
rm   )ri   Útypingr   r   r   ÚloggingÚ	getLoggerrf   Úloggerr   rk   rl   rm   r	   r	   r	   r
   Ú<module>   s   
 G