
    i7                     ~    d Z ddlZddlmZmZmZmZ ddlZ ej                  d      Z
 G d d      Zdad	dedefdZy)
u   
Monte Carlo Simulator - Simulations probabilistes pour les prédictions
Génère des intervalles de confiance et évalue la robustesse des signaux
    N)DictListOptionalTupleMonteCarloSimulatorc            	           e Zd ZdZddefdZ	 ddedee   dedefdZ	d	edefd
Z
	 ddee   dedefdZ	 ddedee   dee   defdZy)r   uG   Simule des scénarios futurs par Monte Carlo pour évaluer la confiancenum_simulationsc                     || _         t        j                  j                  d      | _        t
        j                  d| d       y )N*   u'   ✅ Monte Carlo Simulator initialisé (z simulations))r	   nprandomRandomStaterandom_stateloggerinfo)selfr	   s     ./monte_carlo_simulator.py__init__zMonteCarloSimulator.__init__   s8    .II11"5=o=Nm\]    current_pricehistorical_returnsperiods_aheadreturnc                    |rt        |      dk  r|||dz  |dz  ddg dS t        j                  |      }t        j                  |      dz  }t        j                  |      dz  }g }g }t        | j                        D ]n  }	|g}
|}t        |      D ]7  }	| j                  j                  ||      }|d|z   z  }|
j                  |       9 |j                  |
       |j                  |       p t        j                  |      }t        j                  |      }t        j                  |      }t        j                  |d	      }t        j                  |d
      }t        j                  |d      }t        j                  |d      }t        j                  ||kD        }|| j                  z  dz  }||z
  |z  dz  }||z
  }||z
  }|dkD  r||z  nd}t        |d      t        |d      t        |d      t        |d      t        |d      t        |d      t        |d      t        |d      t        |d      t        |d      | j                  |dS )u<  
        Simule les prix futurs par Monte Carlo
        
        Args:
            current_price: Prix actuel
            historical_returns: Rendements historiques (%)
            periods_ahead: Nombre de périodes à simuler
            
        Returns:
            Dict avec statistiques des simulations
        
   g?g?g      I@g        )
mean_pricemedian_priceconfidence_95_lowconfidence_95_highprobability_profitexpected_returnsimulationsd            @     `X@   T   r         )r   r   r   r   r   confidence_68_lowconfidence_68_highr    r!   risk_reward_ratior	   r   )lenr   arraymeanstdranger	   r   normalappendmedian
percentilesumround)r   r   r   r   returns_arraymean_return
std_returnsimulated_pricesfinal_prices_
price_pathpricerandom_returnfinal_prices_arrayr   r   r   r   r+   r,   profitable_simulationsr    r!   potential_gainpotential_lossrisk_rewards                             r   simulate_future_pricesz*MonteCarloSimulator.simulate_future_prices   sz    "S);%<r%A+ -%2S%8&3c&9&*#&!  !34ggm,s2VVM*S0
 t++, 	'A'J!E=) ) $ 1 1 8 8j Q]!23!!%(	) ##J/&	'  XXl3 WW/0
yy!34 MM*<cB]]+=tD MM*<bA]]+=rB "$(:](J!K4t7K7KKsR '6-G3N ,m;&)::9G!9Kn~5QR #=!4
A.!,2!&'8!!<"'(:A">!&'8!!<"'(:A">"'(:A">$_a8!&{A!6#33*
 	
r   simulation_resultsc                    |j                  dd      }|j                  dd      }|j                  dd      }|dk\  rd}n5|d	k\  rd
}n-|dk\  rd}n%|dk\  rd}n|dk\  rd}nt        d|dz
  dz  dz        }|dk\  rd}n/|dk\  rd}n'|dk\  rd}n|dk\  rd}n|dk\  rd}nt        d|dz        }|dk\  rd}n*|dk\  rd}n"|dk\  rd}n|dk\  rd}n|dk\  rd}n
|dkD  rd}nd}||z   |z   }t        dt        d|            }|dk\  rd}	d}
n"|dk\  rd}	d}
n|dk\  rd}	d }
n|d
k\  rd!}	d"}
nd#}	d$}
t        |d      |	||||
t        |d      t        |d      t        |d      d%d&S )'u  
        Calcule un score de confiance basé sur les résultats Monte Carlo
        
        Args:
            simulation_results: Résultats de simulate_future_prices
            
        Returns:
            Dict avec score de confiance (0-100) et détails
        r    2   r-   r$   r!   r   K   (   F   #   A      <      7            r%   r*   g      ?r         r#   P   u   TRÈS HAUTEu(   🔥 Très haute confiance - Signal fortHAUTEu    ✅ Haute confiance - Bon signalMOYENNEu(   📊 Confiance moyenne - Signal modéréFAIBLEu"   ⚠️ Faible confiance - Prudenceu   TRÈS FAIBLEu%   🚫 Très faible confiance - Éviter)probability_pointsrisk_reward_pointsexpected_return_points)confidence_scoreconfidence_qualityr    r-   r!   recommendation
components)getmaxminr8   )r   rH   prob_profitrF   r!   prob_points	rr_pointsreturn_pointsr`   qualityrb   s              r   calculate_confidence_scorez.MonteCarloSimulator.calculate_confidence_scorel   s    ),,-A2F(,,-@!D,001BAF
 "KBKBKBKBKa+"2b!82!=>K !ICIAICIAIA{R/0I b M!M!M!M!Mq MM '2]BsC+;$<= r!#GGN#G?N#GGN#GAN$GDN !&&6 :")"-!,.,&+K&;&+Iq&9*/q*A
 	
r   	positionsc                    |s	dddddddS t        d |D              }g }t        | j                        D ]  }d}|D ]  }|d   }|d   }	|j                  dg       }
|
rt	        |
      dk  r|}n}t        j                  |
      }t        j                  |      d	z  }t        j                  |      d	z  }|}t        |      D ]&  }| j                  j                  ||      }|d
|z   z  }( |}|||	z  z  } |j                  |        t        j                  |      }t        j                  |      }t        j                  |      }t        j                  |d      }t        j                  |d      }t        j                   ||kD        }|| j                  z  d	z  }t        j                  |d      |z
  }|dkD  r||z  d	z  nd}|dkD  r||z
  |z  d	z  nd}t        |d      t        |d      t        |d      t        |d      t        |d      t        |d
      t        |d      t        |d      t        |d      t	        |      d
S )u(  
        Simule les scénarios futurs d'un portfolio
        
        Args:
            positions: Liste de positions {symbol, price, amount, historical_returns}
            periods_ahead: Périodes à simuler
            
        Returns:
            Dict avec statistiques du portfolio
        r   rJ   )portfolio_valueexpected_valuer   r   r    var_95c              3   2   K   | ]  }|d    |d   z    yw)r@   amountN ).0poss     r   	<genexpr>zCMonteCarloSimulator.simulate_portfolio_scenarios.<locals>.<genexpr>   s     %Xsc'lS]&B%Xs   r@   rs   r   r   r#   r$   r%   r&   rX   r*   )
current_valuerp   median_valuer   r   r    r!   rq   var_95_percentnum_positions)r7   r2   r	   rd   r.   r   r/   r0   r1   r   r3   r4   r5   r6   r8   )r   rm   r   current_portfolio_valueportfolio_simulationsr>   ro   rv   r   rs   r   final_pricer9   r:   r;   r@   rA   portfolio_arrayrp   ry   r   r   profitable_simsr    rq   rz   r!   s                              r   simulate_portfolio_scenariosz0MonteCarloSimulator.simulate_portfolio_scenarios   s    #$"#%&&'&(  #&%Xi%X"X !#t++, 	:AO  8 #GX%(WW-A2%F")S1C-Dr-I"/K %'HH-?$@M"$''-"83">K!#!6!<J)E"=1 <(,(9(9(@(@j(Y %]): ;< #(K;#77+8. "((95	:8 ((#89 1yy1 MM/3?]]?DA &&3J!JK-0D0DDK 25LLE\_`E`&#::cAfg kB  EF  kFN-DDH__cff  LM ##:A>#NA6!,2!&'8!!<"'(:A">"'(:A">$_a8FA&#NA6 ^
 	
r   Nstress_scenariosc           	         |dddddddddd	d
dddddg}i }|D ]  }|d   }|d   }|d   }g }	t        | j                        D ]7  }
| j                  j                  ||      }|d|z   z  }|	j	                  |       9 t        j                  |	      }t        j                  |      }t        j                  |      }t        j                  |      }t        j                  |      }||z
  |z  dz  }t        |d      t        |d      t        |d      t        |d      t        |d      d||<    ||t        t        d |j                         D              d      dS )uO  
        Test de stress avec scénarios extrêmes
        
        Args:
            current_price: Prix actuel
            historical_returns: Rendements historiques
            stress_scenarios: Liste de scénarios {name, mean_shock, std_shock}
            
        Returns:
            Dict avec résultats des stress tests
        zMarket Crashg333333ӿg333333?)name
mean_shock	std_shockzFlash Crashg      g?z
Bull Rallyg      ?g?z
Black Swangffffffr   r   r   r$   r#   r)   r*   )r   r   
worst_case	best_caseexpected_lossc              3   &   K   | ]	  }|d      yw)r   Nrt   )ru   ss     r   rw   z2MonteCarloSimulator.stress_test.<locals>.<genexpr>^  s     +Y1Ao,>+Ys   )r   	scenariosmax_potential_loss)r2   r	   r   r3   r4   r   r/   r0   r5   rf   re   r8   values)r   r   r   r   resultsscenarior   r   r   r=   r>   shockr~   rB   r   r   r   r   losss                      r   stress_testzMonteCarloSimulator.stress_test%  s    # (u4P&e$O%TM%UN	  ( 	HF#D!,/J -I L4//0 1))00YG+q5y9##K01
 "$,!7 !34J99%78L 23J12I-/=@CGD $J2 %lA 6#J2"9a0!&tQGDM-	> + "'+YHX+Y(Y[\"]
 	
r   i  )r   )N)__name__
__module____qualname____doc__intr   floatr   r   rG   rl   r   r   rt   r   r   r   r      s    Q^ ^ 57T
E T
tTY{ T
.1T
;?T
l]
T ]
d ]
@ :<X
d4j X
36X
@DX
v 37:
 :
DK :
%)$Z:
;?:
r   r	   r   c                 0    t         t        |       a t         S )z4Retourne l'instance globale du Monte Carlo simulator)_monte_carlo_simulatorr   )r	   s    r   get_monte_carlo_simulatorr   e  s     %!4_!E!!r   r   )r   numpyr   typingr   r   r   r   logging	getLoggerr   r   r   r   r   rt   r   r   <module>r      sT   
  . . 			0	1R
 R
l
  "s ">Q "r   