Team Ai
Apppublic

Deepvest/ProfilingAI

sourceHugging Faceupdated 2y agoView on Hugging Face
0likes
backtest_engine.cpython-310.pyc512 linesDownload Raw Back to __pycache__
1o

2/��g.{�@sZddlZddlZddlmZmZmZmZm	Z	ddl3mZddlmZm
Z
ddlmZddlmZddlmZddlmZddlmZddlmZddlZe�d	�dd4lmZm Z m!Z!ddl"m#Z#ddl$m%Z%d
dl&m'Z'd
dl(m)Z)d
dl*m+Z+d
dl,m-Z-m.Z.d
dl/m%Z0eGdd�d��Z1eGdd�d��Z2Gdd�d�Z3Gdd�d�Z4gd�Z5dS)�N)�List�Dict�Tuple�Optional�Any)�	dataclass)�datetime�	timedelta)�stats)�TimeSeriesSplit)�GaussianMixture)�ProcessPoolExecutor�ignore)�PortfolioOptimizerImpl�OptimizationConstraints�MarketAnalyzerImpl)�MLEnhancedAnalyzer)�MarketAnalyzerProtocol�)�AlternativeAssetsPortfolio)�EnhancedRiskMetrics)�PersonalProfile)�MarketUpdate�PortfolioAlertc@s�eZdZUdZejed<ejed<ejed<ee	e5fed<ee	e6fed<ejed<ejed<ejed	<ee	ejfed7<ee	e8fed<defd
d�ZdS)�BacktestResultzStore backtest results�returns�	positions�trades�metrics�risk_metrics�transaction_costs�turnover�	drawdowns�attribution�stress_test_results�returncCsT|j��|j��|j��|j|j|j��|j��|j��dd�|j	�9�D�|jd�10S)z$Convert results to dictionary formatcSsi|]	\}}||���qS�)�to_dict��.0�k�vr&r&�?/Users/sandrine/Deepvest_system/src/analysis/backtest_engine.py�11<dictcomp>6�z*BacktestResult.to_dict.<locals>.<dictcomp>�12rrrrrr r!r"r#r$)rr'rrrrr r!r"r#�itemsr$��selfr&r&r,r'+s�zBacktestResult.to_dictN)�__name__�13__module__�__qualname__�__doc__�pd�Series�__annotations__�	DataFramer�str�floatr'r&r&r&r,rs14151617181920rc@s�eZdZUdZeed<eed<eed<dZeed<dZ	eed<d	Z21eeefed22<dZe
ed<d
Zeed<dZeed<d	Zeeeeeffed<dd�Zd	S)�BacktestConfigzConfiguration for backtest�23start_date�end_date�initial_capital�monthly�rebalance_frequency�24percentage�transaction_cost_modelN�transaction_cost_paramsT�include_alternative_assets�{�G�z�?�risk_free_rateZSPY�benchmark_index�stress_periodscCsZ|jdur25ddi|_|jdur+tddd�tddd�ftd	d26d�tddd�fd
�|_dSdS)z+Validate configuration after initializationN�	cost_rate�����MbP?i�r���i��	�i�)Zcovid_crashZfinancial_crisis)rErJrr1r&r&r,�
__post_init__Hs2728293031�3233���zBacktestConfig.__post_init__)r3r4r5r6rr9r<rBr;rDrErrF�boolrHrIrJrrRr&r&r&r,r=:s34r=c
@sv	eZdZdZdd�Zdejfdd�Z	d�dedejd	e	d35e36ejdef37dd
�Zd�dedejd	e	d38e39ejde
eejff40dd�Zdejdeddfdd�Zdedejddfdd�Zde
eejfde
eejffdd�Zdejde
eeeffdd�Zdejdejfdd�Zdejdejfdd�Zdejdejfdd �Zdejdejfd!d"�Zdejdejfd#d$�Zd%ed&ejdejdefd'd(�Z d)ejdejde
eejffd*d+�Z!d,ejd-ed.ejdejfd/d0�Z"de
eejfde
eeffd1d2�Z#d)ejdefd3d4�Z$d)ejdefd5d6�Z%d�d)ejd8edefd9d:�Z&de
eejfdejfd;d<�Z'dejfd=d>�Z(de
eejfde
eeffd?d@�Z)d�d)ejdBe*de
eejffdCdD�Z+d)ejde
ee
eefffdEdF�Z,d)ejde*fdGdH�Z-d�d)ejdJe*dejfdKdL�Z.d)ejdejfdMdN�Z/de
eejfde
eejffdOdP�Z0d)ejdejdejfdQdR�Z1d)ejdejdejfdSdT�Z2d)ejdejdejfdUdV�Z3d)ejdejdejfdWdX�Z4dYejd.ejdZed[e
eefdef41d\d]�Z5d)ejdefd^d_�Z6ded`e7de
eeffdadb�Z8dceddedee*defdfdg�Z9de
eejfdhe
ee:eeffde
eeffdidj�Z;d)ejdhe
ee:eeffde
eeffdkdl�Z<dejde
eeffdmdn�Z=d)ejde
eeffdodp�Z>d�d)ejdre*de
eeffdsdt�Z?d)ejdejfdudv�Z@d�dedwe42ede
eeAffdxdy�ZBded`e7de
eeAffdzd{�ZCded`e7de
eeffd|d}�ZDded`e7de
eeffd~d�ZEded`e7deefd�d��ZFd`e7de
eeffd�d��ZGded`e7de
eeffd�d��ZHd`e7defd�d��ZId`e7de
eeffd�d��ZJd`e7de
eeffd�d��ZKd`e7de
eeAffd�d��ZLdejfd�d>�Z(d`e7de
eeAffd�d��ZMdede
eeffd�d��ZNdede
eeAffd�d��ZOd)ejd�e
dejfd�d��ZPdede
eeQjRffd�d��ZSd�e
eeAfd�e
eeQjRfdwefd�d��ZT	d�d`e7dejd43e44ejdefd�d��ZUd`e7defd�d��ZVd`e7d�e*de	fd�d��ZWded`e7de
eeffd�d��ZXd)ejd`e7defd�d��ZYd)ejd`e7de
eeffd�d��ZZded`e7de
eeffd�d��Z[d)ejdefd�d��Z\d)ejdejfd�d��Z]d)ejdefd�d��Z^d�ed�ed)ejdefd�d��Z_ded`e7de
eeAffd�d��Z`dedefd�d��Z[dedefd�d��Z[d`e7dejfd�d��Zaded`e7de
eeAffd�d��Zbded`e7de
eeQjRffd�d��Zcded`e7d�eQjRfd�dÄZdded`e7d�eQjRfd�dńZeded`e7d�eQjRfd�dDŽZfded`e7d�eQjRfd�dɄZgd�e
ded`e7fd�d˄Zhdefd�d̈́Zidefd�dτZjd�d%ede45edekfd�dфZlemd)ejde*fd�dӄ�Znemd�ejod�edeefd�dׄ�ZpdS)��BacktestEnginezKMain backtesting engine with enhanced risk metrics and performance analysiscKsv||_tddd�|_t|t�std��|dur!t�}t|d�|_n||_t	|_	t46|_47d|_d|_d|_
g|_i|_dS)N)r�pricesz>portfolio_optimizer must be instance of PortfolioOptimizerImpl)�ml_analyzer)�backtest_enginerr�48isinstancer�	TypeErrorrr�market_analyzerZalternative_assets_portfoliorH�current_positionsr �current_portfolio_value�rebalance_dates�_cache)r2�portfolio_optimizerrZrW�kwargsrVr&r&r,�__init__\s4950zBacktestEngine.__init__�datac51Cs�z6|dus|jrtd��t�|j��d�|_|��|_|j���	d�|_52|j��|_|j53��|_54td�WdSt
yP}ztd|���WYd}~dSd}~ww)zInitialize market data properlyNzNo market data providedrz$Market data initialized successfullyTz Error initializing market data: F)�empty�55ValueErrorr7�to_datetime�index�tz_localize�copy�market_data�56pct_change�fillnar�57sort_index�print�	Exception)r2rb�er&r&r,�_initialize_market_datass58��z&BacktestEngine._initialize_market_dataN�config�constraints�alternative_datar%c�s�t�|j��d�|_t�|j��d�|_t�|j��d�|_	zX|�||�|�|�|j�	|�IdH}|�59||�|j||||jd�}|�
|�}|�|�}|�|�}	|�||j�}60t|d|d|d|||d|d|�|d�|	|61d�62WSty�}ztd|����d}~ww)	N)rqrrrsrbrrrr r!r/z!Error during backtest execution: )r7rerfrgr>r?�_validate_datarprZ�analyze_market_conditions�_initialize_backtest�_run_simulationri�_calculate_performance_metrics�_calculate_risk_metrics�_perform_attribution_analysis�_run_stress_testsrJr�_calculate_drawdownsrnrm)r2rqrbrrrs�market_conditions�resultsrrr#�stress_resultsror&r&r,�run_backtest�sJ�63�646566�
��zBacktestEngine.run_backtestc�s4��ztj|j|jtd�tj|j|jtd�tj|jtd�tj|jtd�tj|jtd�tj|jtd�d�}|j}t�t	|j��}|jD]�}|�67||j�r�|jd|�}	z|j
�|	�IdH}68Wntyz}ztdt|����d}69WYd}~nd}~wwz	|jj|d�}Wnty�}ztdt|����|}WYd}~nd}~ww|�|||�}
|�|
|j||j|j�}|d|9}|}|
|d	j|<||d70j|<t�t�|
��d||dj|<|�|||�}|d|9}||d
j|<||dj|<||dj|<qB|WSt�y}z71tdt|�����d}~ww)zRun the main simulation loop)rf�columns�dtype)rfr�)rrrr r!�portfolio_valuesNzMarket analysis error: )rrzOptimization error: rQrr rr!rrr�zError in simulation: )r7r:rfr�r<r8r@�np�zeros�len�_should_rebalancerB�locrZrurnrmr;r_�optimize_portfolio�_calculate_trades�_calculate_transaction_costsrDrE�sum�abs�_calculate_daily_returns)r2rqrbrrrsr~�portfolio_value�previous_weights�dateZcurrent_datar}ro�new_weightsr�costsZdaily_returnr&r&r,rw�s\��	72����"��zBacktestEngine._run_simulationc73Cszm|dus|jrtd��|jjstd�|jdd�t�|j�|_t�|j�}t�|j	�}|jd|ks;|jd|krQtd|jd�d	|jd�d74|�d	|����|�75�����rk|j|�76����
�}td|����WdSty�}z77tdt|�����d}~ww)
z#Validate input data for backtestingNzData cannot be emptyz2Warning: Data index not monotonic, sorting data...T)�inplacer�����zData range � to z  does not cover backtest period z!Missing values found in columns: zError validating data: )rcrdrf�is_monotonic_increasingrmrlr7rer>r?�isnull�anyr��tolistrnr;)r2rbrqZconfig_startZ78config_end�missing_colsror&r&r,rt�s4������zBacktestEngine._validate_datacCsHtjd|jd�|_tjd|jd�|_|j|_i|_|�	|j|j79�|_dS)zInitialize backtest stater�rfN)r7r8r�r[rfr r@r\r^�_generate_rebalance_datesrBr])r2rqrbr&r&r,rv s80�z#BacktestEngine._initialize_backtestr~c81Cs�zL|��D]\}}t|tj�st|tj�r#|�tjtjgtj�||<q|dj	dd�|d<|��D]\}}t|tj�sBt|tj�rI|�	d�||<q2|WSt82yg}ztd|���|WYd}~Sd}~ww)u'Nettoie les résultats de la simulationr�ffill)�methodrzError cleaning results: N)r0rXr7r:r8�replacer��inf�nanrkrnrm)r2r~�key�valueror&r&r,�_clean_results-s ����zBacktestEngine._clean_resultsr�c83CsJzd|��iWSty$}ztdt|����iWYd}~Sd}~ww)zGet sector mapping for assets�defaultzError in sector mapping: N)r�rnrmr;)r2r�ror&r&r,�_get_sector_mappingCs��z"BacktestEngine._get_sector_mappingrc84CsXz	|jdd���WSty+}ztdt|����tj|jd�WYd}~Sd}~ww)zCalculate value factor exposure����windowz"Error calculating value exposure: r�N)�rolling�meanrnrmr;r7r8rf�r2rror&r&r,�_calculate_value_exposureK���z(BacktestEngine._calculate_value_exposurec85Cs\z|��jdd���WSty-}ztdt|����tj|jd�WYd}~Sd}~ww)z Calculate growth factor exposurer�r�z#Error calculating growth exposure: r�N�	rjr�r�rnrmr;r7r8rfr�r&r&r,�_calculate_growth_exposureSs��z)BacktestEngine._calculate_growth_exposurec86Cs`z
|��}|jdd���WSty/}ztdt|����tj|jd�WYd}~Sd}~ww)z"Calculate momentum factor exposurer�r�z%Error calculating momentum exposure: r�Nr��r2rrror&r&r,�_calculate_momentum_exposure[s��z+BacktestEngine._calculate_momentum_exposurec87Csdz|��}d|jdd���WSty1}ztdt|����tj|jd�WYd}~Sd}~ww)z!Calculate quality factor exposurerQ�?r�z$Error calculating quality exposure: r�N)	rjr��stdrnrmr;r7r8rfr�r&r&r,�_calculate_quality_exposureds��z*BacktestEngine._calculate_quality_exposurec88CsXz	|��jdd�WSty+}ztdt|����tj|jd�WYd}~Sd}~ww)zCalculate size factor exposurerQ��axisz!Error calculating size exposure: r�N)r�r�rnrmr;r7r8rfr�r&r&r,�_calculate_size_exposuremr�z'BacktestEngine._calculate_size_exposurer��market_returnsc89Csxztj||jd�}t|tj�r|j|}nWdS||��WSty;}ztd|�d|���WYd}~dSd}~ww)z6Calculate daily returns properly handling numpy arraysr��z$Error calculating daily returns for �: N)	r7r8r�rXr:r�r�rnrm)r2r�r�rZpositions_seriesZ
daily_returnsror&r&r,r�us��z'BacktestEngine._calculate_daily_returnsrc90Csjz||��|||��||��d�}|WSty4}ztdt|����iWYd}~Sd}~ww)zDecompose portfolio performance)Z
market_effectZselection_effectZinteraction_effectzError decomposing performance: N)r��diffrnrmr;)r2rr�
decompositionror&r&r,�_decompose_performance�s9192���z%BacktestEngine._decompose_performancer�r�rUc	CsJ|j|}||}|||}tj|dd�}||}||}||jd<|S)zGCalculate required trades to achieve new weights with advanced handlingr)�decimals�actual_weights)r[r��roundr^)	r2r�r�rUZcurrent_values�
target_valuesrZ
actual_valuesr�r&r&r,r��s9394z BacktestEngine._calculate_tradesc95Cs�z�|d�tjtjgtj���}t|�dkrtd��d|��d}||�|�|�	�t�96d�|�|�|�|�|�
|�t||dk�t|�d�}z^|�|ddkr]t|d|d�ntj||dk��dkr{t||dk��||dk���ntjt||dk�dkr�||dk��ndt||dk�dkr�||dk��ndd	��Wnty�}z
td97|���WYd}~nd}~wwdd
�|��D�}|WSty�}ztd|���iWYd}~Sd}~ww)z+Calculate comprehensive performance metricsrr�No valid returns datarQr�)�total_return�cagr�98volatility�sharpe_ratio�
sortino_ratio�max_drawdown�win_rater�r�)Zcalmar_ratioZ
profit_factorZavg_winZavg_lossz4Warning: Could not calculate some advanced metrics: NcSs*i|]\}}t�|�st�|�s||�qSr&)r��isnan�isinfr(r&r&r,r-�s*zABacktestEngine._calculate_performance_metrics.<locals>.<dictcomp>z'Error calculating performance metrics: )r�r�r�r��dropnar�rd�prod�_calculate_cagrr��sqrt�_calculate_sharpe_ratio�_calculate_sortino_ratio�_calculate_max_drawdown�updater�r�r�rnrmr0)r2r~rr�rror&r&r,rx�s> �$<&&�����z-BacktestEngine._calculate_performance_metricscCsT|dus99t|�dkrdSd|��}t|�d}|dkr(|dkr(|d|dSdS)z%Calculate Compound Annual Growth RateNrr�rQr�)r�r�)r2rr��n_yearsr&r&r,r��szBacktestEngine._calculate_cagrc100Cs�z&||jd}||dk}|��t�d�}|dkrWdS|��d|WSty@}ztd|���WYd}~dSd}~ww)zCalculate Sortino ratior�rr�z!Error calculating Sortino ratio: N�rHr�r�r�r�rnrm)r2r�excess_returns�negative_returns�downside_stdror&r&r,r��s��z'BacktestEngine._calculate_sortino_ratio�ffffff�?�101confidencec102CsLzt�|d|d�WSty%}ztd|���WYd}~dSd}~ww)zCalculate Value at RiskrQ�dzError calculating VaR: Nr�)r��103percentilernrm)r2rr�ror&r&r,�_calculate_var�s��zBacktestEngine._calculate_varcCs|d}tjtd�S)zGet benchmark returns seriesr)r�)r7r8r<)r2r~rr&r&r,�_get_benchmark_returns�sz%BacktestEngine._get_benchmark_returnsc104Csz[|jj}tj|d�}|jjdd�|jd|d<t|d�r*d|jvr*|��|d<n	tj	d	|d�|d<t|d�rDd105|jvrD|�106�|d<n	tj	d	|d�|d<|��|d<|��|d
<|WSt
y�}ztd|���t�d|jjdd�i�WYd}~Sd}~ww)uCRécupère les facteurs de risque pour l'attribution de performancer�rQr�r��MKTriZ107market_cap�SMBrZbook_to_market�HML�MOM�VOLz%Erreur dans le calcul des facteurs : N)rrfr7r:r�rH�hasattrri�_calculate_size_factorr8�_calculate_value_factor�_calculate_momentum_factor�_calculate_volatility_factorrnrm)r2�dates�factorsror&r&r,�_get_factor_returnss$$��z"BacktestEngine._get_factor_returnsc108Csz�z�|d�tjtjgtj���}t|�dkrtd��i}z|�|j�	|d�|j�109|d�|j�|d�d��Wn"tyZ}zt
d|���|�dddd��WYd}~nd}~wwz|�|��t�d	�|j�|�|j�|�|j�|�d110��Wn#ty�}zt
d|���|�ddddd111��WYd}~nd}~wwz|�|��|��|j�|�|j�|�d��Wn#ty�}zt
d
|���|�ddddd��WYd}~nd}~wwz|�|j�|�|j�|�|j�|�|j�|�d��Wn$t�y}zt
d|���|�ddddd��WYd}~nd}~wwz|�|j�|�|j�|�|j�|�|j�|�d��Wn$t�y[}zt
d|���|�ddddd��WYd}~nd}~wwz|�|�}|�|�Wn,t�y�}zt
d|���|�ddd�ddd�ddd�d��WYd}~nd}~wwdd�|� �D�}|WSt�y�}zt
d|���iWYd}~Sd}~ww)z$Calculate comprehensive risk metricsrrr�r�)�var_historical_95Zvar_gaussian_95�cvar_95zError calculating VaR metrics: r�Nr�)Zvolatility_annualZdownside_deviationZupside_volatilityZvolatility_skewz&Error calculating volatility metrics: )�skewness�kurtosisZ112tail_ratioZ
jar_bera_statz(Error calculating distribution metrics: ��?)�beta�alpha�tracking_error�	r_squaredz"Error calculating market metrics: )Zulcer_index�113pain_indexZ114pain_ratioZburke_ratioz$Error calculating advanced metrics: �"Error calculating regime metrics: )�	frequency�115avg_return)Zregime_0Zregime_1Zregime_2cSs4i|]\}}t|t�rt�|�st�|�s||�qSr&)rXr<r�r�r�r(r&r&r,r-�s����z:BacktestEngine._calculate_risk_metrics.<locals>.<dictcomp>z Error calculating risk metrics: )!r�r�r�r�r�r�rdr�r�calculate_historical_var�calculate_gaussian_var�calculate_cvarrnrmr�r��calculate_downside_deviation�calculate_upside_volatility�calculate_volatility_skew�skewr��calculate_tail_ratio�calculate_jarque_bera�calculate_beta�calculate_alpha�calculate_tracking_error�calculate_r_squared�calculate_ulcer_index�calculate_pain_index�calculate_pain_ratio�calculate_burke_ratio�_calculate_regime_metricsr0)r2r~rrro�regime_metricsr&r&r,ry's� ����	116117118����119120121����122123124125126����127128129130131����132 133���	���z&BacktestEngine._calculate_risk_metricsr�r�c134Cslz|j�|�|j�|�|j�|�|j�|�|j�|�d�}|WSty5}z135tdt|�����d}~ww)z%Calculate rolling performance metrics)�rolling_sharpe�rolling_sortino�rolling_volatility�rolling_beta�rolling_varz#Error calculating rolling metrics: N)	r�calculate_rolling_sharpe�calculate_rolling_sortino�calculate_rolling_volatility�calculate_rolling_beta�calculate_rolling_varrnrmr;)r2rr�Zrolling_metricsror&r&r,�_calculate_rolling_metrics�s136137138139140���z)BacktestEngine._calculate_rolling_metricsc141Cs�zG|�|�}i}t�|�D]7}|||k}t|�t|�|��|��t�d�|j�|�|j�	|�t||dk�t|�d�|d|��<q
|WSt142y]}z143tdt|�����d}~ww)z0Calculate metrics under different market regimesr�r)r�r�r��sharper�r��regime_r�N)
�_identify_market_regimesr��uniquer�r�r�r�r�calculate_regime_sharpe�calculate_regime_drawdownrnrmr;)r2r�regimesr
�regime�regime_returnsror&r&r,r�s$144145146�	��z(BacktestEngine._calculate_regime_metricsc147Cs�|dus148t|�dkrdSd|��}|����}||d}d}d}t|�D]\}}|s5|dkr5d}|}	q&|rA|dkrAd}||	}q&|S)u5Calcule le temps de récupération après un drawdownNrrQFT)r��cumprod�	expanding�max�	enumerate)149r2r�150cumulative�running_maxr"�recovery_periods�in_drawdown�i�dd�	start_idxr&r&r,�_calculate_recovery_time�s �z'BacktestEngine._calculate_recovery_timerN�	n_regimesc151Cszz|�|�}t�|��dd�}t|dd�}|�|�}|WSty<}ztd|���t�t	|��WYd}~Sd}~ww)Nr�rQ�*��n_components�random_statez"Error identifying market regimes: )152�_prepare_regime_featuresr��153nan_to_num�reshaper�fit_predictrnrmr�r�)r2rr.�features�gmmrror&r&r,r�s154155��z'BacktestEngine._identify_market_regimesc	156Cs�z>d}|j|d����d�}|j|d����d�}|j|d����d�}|j|d����d�}t�|j|j|j|jg�}|WSt	y`}zt157d|���t�t|�df�WYd}~Sd}~ww)z%Prepare features for regime detection�r�rz!Error preparing regime features: �N)
r�r�rkr�r�kurtr��column_stack�valuesrnrmr�r�)	r2rr�r�r�rr;r7ror&r&r,r3�s$���z'BacktestEngine._prepare_regime_featuresc158Cs|z'|d}|d}|�||�|�||�|�||�|�||�|�||�d�}|WSty=}z159tdt|�����d}~ww)z1Perform detailed performance attribution analysisrr)Zfactor_attributionZsector_attribution�style_attributionZrisk_attributionZperformance_decompositionz'Error performing attribution analysis: N)�_calculate_factor_attribution�_calculate_sector_attribution�_calculate_style_attribution�_calculate_risk_attributionr�rnrmr;)r2r~rrr#ror&r&r,rzs160161162163164���z,BacktestEngine._perform_attribution_analysisc165CsNz�tj|jd�}|�d���|jd|d<|�d�jdd�����|d<tjd|jd�|d<|�d�jdd���|d	<|�d�jd166d���|d<|�	t167jt168jgt169j�}|�d�}|�d�}zt
�||���}tj|j|��|jd�}W|WStjd|jd�}Y|WSty�}ztdt|����t��WYd
}~Sd
}~ww)u�170        Calcule l'attribution de performance basée sur les facteurs171        172        Args:173            returns: Rendements du portefeuille174            positions: Positions du portefeuille175        r�rr�r�r9r�r�r�r�r�r�z&Error calculating factor attribution: N)r7r:rfrkr�rHr�r�r8r�r�r�r��sm�OLS�fit�paramsr�rnrmr;)r2rrr��modelZfactor_contributionror&r&r,r?s2176177����z,BacktestEngine._calculate_factor_attributionc178179Cs�z4|�|j�}i}|��D] \}}||jdd�}||��}||��||��d�||<q
t�|�jWStyJ}	z180t	dt181|	�����d}	~	ww)z.Calculate sector-based performance attributionrQr�)r��average_weightZcontributionz&Error calculating sector attribution: N)r�r�r0r�r�r7r:�Trnrmr;)182r2rrZsector_mapping�sector_returns�sectorZassetsZsector_positionsZ183sector_retror&r&r,r@Os 184���z,BacktestEngine._calculate_sector_attributionc	185Cs�z2|�|�|�|�|�|�|�|�|�|�d�}i}|��D]\}}||��}|||<qt�|�WSt	yH}z186t187dt|�����d}~ww)zFCalculate investment style attribution (value, growth, momentum, etc.))r��growth�momentum�quality�sizez%Error calculating style attribution: N)r�r�r�r�r�r0r�r7r8rnrmr;)	r2rr�
style_factorsr>�style�exposureZstyle_returnror&r&r,rAfs"�	188��z+BacktestEngine._calculate_style_attributionc189Cs�z%|��t�d�}|��t�d�}||��|}tj|��|jd�WStyD}zt	dt190|����t��WYd}~Sd}~ww)z,Calculate risk-based performance attributionr�r�z$Error calculating risk attribution: N)r�r�r��corrr7r8r�r�rnrmr;)r2rr�volZpos_volZrisk_contributionror&r&r,rB~s��z*BacktestEngine._calculate_risk_attributionr�191cost_model�cost_paramscCsV|dkrt�t�||��|dS|dkr$t�t�|dk��|dStd|����)z4Calculate transaction costs based on specified modelrCrK�fixedrZ192fixed_costz Unknown transaction cost model: )r�r�r�rd)r2rrUrUrVr&r&r,r��s193z+BacktestEngine._calculate_transaction_costsc194Csrz||jd}|��dkrWdSt�d�|��|��WSty8}ztd|���WYd}~dSd}~ww)zCalculate Sharpe ratior�rr�z Error calculating Sharpe ratio: Nr�)r2rr�ror&r&r,r��s��z&BacktestEngine._calculate_sharpe_ratio�profilec	195Cs�zG|j|j}||jd}|d}|jd}|����|��|j|����|d|jvr6|jdjdnd|�|����||j�d�}|WStyh}zt	d|���dddddd�WYd	}~Sd	}~ww)196u"197        Calcule le score de liquidité du portefeuille par rapport au profil investisseur198    199        Args:200            results: Résultats du backtest201            profile: Profil de l'investisseur202        203        Returns:204            Dict contenant les métriques de liquidité205        皙�����?g{�G�zd?��cashr�r)Zaverage_days_to_liquidateZliquidity_cost_percentZliquidity_coverage_ratioZemergency_buffer_ratio�overall_liquidity_scoreu/Erreur dans le calcul du score de liquidité : N)206rr\�
annual_incomer�r��iloc�"_calculate_overall_liquidity_score�risk_tolerancernrm)	r2r~rX�daily_volumeZliquidation_daysZliquidity_cost�required_liquidity�liquidity_scoreror&r&r,�_calculate_liquidity_score�s4207208209�����z)BacktestEngine._calculate_liquidity_score�days_to_liquidaterbr`cCs*dddddd�|}tdd||�}|S)	u; 210        Calcule le score global de liquidité211    212        Args:213            days_to_liquidate: Nombre moyen de jours pour liquider214            required_liquidity: Liquidité requise215            risk_tolerance: Tolérance au risque du profil (1-5)216        217        Returns:218            Score entre 0 et 1219        r��220���rQrrNr:rfrrQ)r$)r2rerbr`Zmax_acceptable_daysZ221days_scorer&r&r,r_�s��	z1BacktestEngine._calculate_overall_liquidity_scorerJc222Cszz�|d}|jjdur|j�d�|_i}|��D]�\}\}}zdt�|��d�}t�|��d�}||jdks=||jdkrFtd|���Wqt||jd�}t||jd�}|||�}t	|�dkr�d|�223�d|�|�|��t
�d�|��|�|�d�||<Wqty�}	ztd	|�d224|	���WYd}	~	qd}	~	ww|WSty�}	ztd|	���iWYd}	~	Sd}	~	ww)z.Run stress tests with proper timezone handlingrNr�rzNo data for stress period rQr�)r�r�r��	worst_day�
recovery_time�Error in stress period r�zError in stress tests: )rf�tzrgr0r7rermr$�minr�r�r�r�r�r�r-rn)225r2r~rJrr�period_name�start�end�period_returnsror&r&r,r{�sB226�� ����z BacktestEngine._run_stress_testsc
Csi}|dust|�dkrtd�|S|j��}|j��}|��D]�\}\}}z�t�|�}t�|�}||ks9||krOtd|�d|�d|�d|�d|�d��Wq t||�}	t||�}227|jjdurm|	�	|jj�}	|228�	|jj�}229|j230|	|231�}t|�d	kr�td232|���Wq d|��d|j�
|�|��t�d�t�|d	�|��|�|�d
�||<||��D]\}}
t�|
�s�t�|
�r�d|||<td|�d|���q�Wq ty�}ztd|�dt|����ddddddd
�||<WYd}~q d}~ww|s�td�|S)zRun historical stress testsNrz2Warning: No return data available for stress testszWarning: Stress period z (r�z ) outside available data range (�)rfz-Warning: Insufficient data for stress period rQr�)r�r�r��var_95rkZ
recovery_dayszWarning: Invalid z value for period rmr�z/Warning: No valid stress test results generated)r�rmrfror$r0r7rernrgr�r�r�calculate_max_drawdownr�r�r�r�r-r�r�rnr;)r2rrJZhistorical_resultsZ233data_startZdata_endrprqrr�adjusted_startZadjusted_endrsr�r�ror&r&r,�_run_historical_stress_tests!sb234235236237(238239240241242�243�����z+BacktestEngine._run_historical_stress_testsc244Cs$zm|��}dddd�dddd�d�}i}|��D]R\}}||d}t�||d	|d245�}t�|d�|jd}t�||||j��t�d
�d�}	|	d|	||j��t�d
��	�|�246�|��d�||<q|WSty�}247zt
dt|248����dddddd�iWYd}249~250Sd}251~252ww)z�253        Run correlation stress tests on portfolio positions254    255        Args:256            positions: Portfolio positions over time257        258        Returns:259            Dictionary of correlation stress test results260        �333333�?r�)�261adjustment�floor�capg�g�������皙�����?)�high_correlation�correlation_breakdownrzr{r|r�r�r�rrQ)�portfolio_riskZdiversification_score�max_correlation�min_correlationz#Error in correlation stress tests: r~r�N)rSr0r��clip�
fill_diagonalr^r�rr�r�r$rornrmr;)r2rZ	base_corrZstress_scenariosr~�scenariorFZ
stressed_corr�weightsr�ror&r&r,�_run_correlation_stress_testshsN262���
263264��"�����z,BacktestEngine._run_correlation_stress_testsc	Cs�ddd�ddd�ddd	�d265dd�d
�}i}|��D]&\}}|�||�}|��t�|d266�||t�|d267�k��|�|�d�||<q|S)z!Run hypothetical stress scenariosg������ɿ�)�shock�durationrNrg)�vol_multiplierr�皙�����?rh)Zcorrelation_shockr�rf�)Zbid_ask_multiplierr�)Zmarket_crashZvolatility_spikerZliquidity_crisis)Zmax_lossru�expected_shortfallrl)r0�_simulate_scenarioror�r�r��_estimate_recovery_time)r2rZ	scenariosr~Z
scenario_namerFZscenario_returnsr&r&r,�_run_hypothetical_stress_tests�s�268�z-BacktestEngine._run_hypothetical_stress_tests���
n_simulationsc	269s�zUtddd�}|�|j�dd��g}t|�D]}|jt|�d�d��}|�|�qt	�270|�}t	�|d�t	�||t	�|d�k�t	��fdd	�|D�d271�|�
�d�}|WStyk}z272tdt|�����d
}~ww)zRun Monte Carlo stress testsrr/r0r�rQ)�	n_samplesrcsg|]}��|��qSr&)r�)r)�simr1r&r,�273<listcomp>�sz@BacktestEngine._run_monte_carlo_stress_tests.<locals>.<listcomp>�c)�var_99Zes_99Zmax_drawdown_99Zworst_case_lossz(Error running Monte Carlo stress tests: N)rrEr=r5�range�sampler��flatten�appendr��arrayr�r�rornrmr;)	r2rr�r8�simulated_returns�_r�r~ror&r1r,�_run_monte_carlo_stress_tests�s&274275���z,BacktestEngine._run_monte_carlo_stress_testscCsR|dus276t|�dkrt��St|tj�rt�|�}|�tjtjgtj��	�}|S)zValidate and clean return dataNr)277r�r7r8rXr��ndarrayr�r�r�r�)r2rr&r&r,�_validate_returns�s278z BacktestEngine._validate_returns�	save_pathc279Cs~z(|�|�|�|�|�|�|�|�|�|�d�}|�|�}|r&|�|||�|WSty>}z280tdt	|�����d}~ww)z&Generate comprehensive backtest report)�summaryZdetailed_analysis�
risk_analysisr#Zstress_testszError generating report: N)281�_generate_summary_metricsZ_generate_detailed_analysisZ_generate_risk_analysisZ_generate_attribution_analysisZ_generate_stress_test_analysis�_generate_report_figures�_save_reportrnrmr;)r2r~r��report�figuresror&r&r,�generate_report�s �282	��zBacktestEngine.generate_reportcCs|�||�S)z.Generate profile-specific performance analysis)�#_calculate_profile_specific_metrics�r2r~rXr&r&r,�&_generate_profile_performance_analysissz5BacktestEngine._generate_profile_performance_analysiscCs|�|j|�|j�dd�d�S)z'Generate profile-specific risk analysisr�r)�risk_tolerance_alignmentZrisk_adjusted_returns)�_calculate_risk_alignmentrr�getr�r&r&r,�_generate_profile_risk_analysiss�z.BacktestEngine._generate_profile_risk_analysisc283284Cs�z<i}|j����}|j}|jD])}t|t�r"||d}|||<qt|t�r9|�d|d�}||}|||d<q|WStyW}	zt	d|	���iWYd}	~	Sd}	~	ww)zGenerate goal tracking analysisrQ�target_value��?�namez!Error in goal tracking analysis: N)285rr�r@�investment_goalsrXr;�dictr�rnrm)286r2r~rX�
goal_tracking�
current_value�
initial_value�goal�progress�targetror&r&r,� _generate_goal_tracking_analysiss&287288289290���z/BacktestEngine._generate_goal_tracking_analysiscCsDg}|j��t�d�}dddddd�|j}||dkr#|�d	�n||d291kr.|�d�|j�dd
�}d|j}t|�t|�krG|�d�|j	j292d}|��dkrX|�d�|j�dd
�}	dd|j}293|	|294kro|�d�t
|d�r�|jd
kr�|�||�}|ddkr�|�d�|jdkr�|�d�|S|jdkr�|�d�|S)u$295        Génère des recommandations basées sur les résultats du backtest et le profil investisseur296        297        Args:298            results: Résultats du backtest299            profile: Profil de l'investisseur300            301        Returns:302            Liste des recommandations303        r�皙�����?�{�G�z�?���Q��?�304ףp=305�?��?rjg333333�?uLe portefeuille présente un risque supérieur à votre profil. Considérez une réduction de l'exposition aux actifs risqués.r�uLe portefeuille est plus conservateur que votre profil. Une augmentation mesurée du risque pourrait améliorer les rendements.r�r皙������uoLes pertes maximales dépassent le seuil recommandé. Envisagez des stratégies de protection supplémentaires.r�ryu^La concentration du portefeuille est élevée. Une meilleure diversification est recommandée.r�g�Q���?rGuyLa performance est inférieure aux objectifs. Une révision de la stratégie d'investissement pourrait être nécessaire.�liquidity_needsr\�ffffff�?ujLe niveau de liquidité pourrait être insuffisant pour vos besoins. Considérez des actifs plus liquides.rgzdVotre horizon long terme permet d'envisager une exposition plus importante aux actifs de croissance.rfuSCompte tenu de votre horizon court terme, privilégiez la préservation du capital.)rr�r�r�r`r�rr�r�rr^r$rr�r�rd�investment_horizon)r2r~rX�recommendations�realized_vol�306target_vol�max_ddZmax_acceptable_ddZcurrent_weightsr�Zrequired_returnrcr&r&r,�_generate_recommendations#s>307��308309310311312313314315316�317z(BacktestEngine._generate_recommendationsc318Cs�z6|j}|dkrdddd�WS|dkrdddd�WS|d	kr%d319ddd�WS|dkr0dddd�WSdd
dd�WStyS}ztd|���ddiWYd}~Sd}~ww)z,Get target asset allocation based on profilerQr�r}rY)�bonds�stocksr[r�333333�?ryrN皙�����?��?r:r�z!Error getting target allocation: r�r�N�r`rnrm)r2rXZ320risk_levelror&r&r,�_get_target_allocation\s>�������z%BacktestEngine._get_target_allocationc321s�z$|�|��|jjd�����fdd�tt����t�����D�WSty?}ztd|���iWYd}~Sd}~ww)z&Calculate drift from target allocationr�cs&i|]}|��|d���|d��qS�r)r�)r)�asset��currentr�r&r,r-�s��z>BacktestEngine._calculate_allocation_drift.<locals>.<dictcomp>z$Error calculating allocation drift: N)	r�rr^r'�set�list�keysrnrm)r2r~rXror&r�r,�_calculate_allocation_drift�s322���z*BacktestEngine._calculate_allocation_driftc323Cs\z|jdkr	WdS|jdkrWdSWdSty-}ztd|���WYd}~dSd}~ww)z%Get appropriate rebalancing frequencyr�	quarterlyr:rA�weeklyz%Error getting rebalancing frequency: Nr��r2rXror&r&r,�_get_rebalancing_frequency�s324325��z)BacktestEngine._get_rebalancing_frequencyc326Cs`zd}|jdd}||ddd�WSty/}ztd|���ddiWYd	}~Sd	}~ww)327z"Get rebalancing trigger thresholdsr�rN�{�G�z�?r}ry)�asset_driftZvolatility_changeZcorrelation_changez$Error getting rebalancing triggers: r�Nr�)r2rXZbase_threshold�risk_adjustmentror&r&r,�_get_rebalancing_triggers�s���z(BacktestEngine._get_rebalancing_triggersc328Csfzd}|jdd}||||dd�WSty2}ztd|���ddiWYd}~Sd}~ww)	zCalculate stop loss levels�333333�?rNr�r���	portfolioZindividual_positionsz$Error calculating stop loss levels: r�Nr�)r2rXZ	base_stopr�ror&r&r,�_calculate_stop_loss_levels�s329���z*BacktestEngine._calculate_stop_loss_levelsc330Cs�z"|jdkrddddgd�WS|jdkrdddgd�WSd	d331gd�WSty?}ztd|���dd	iWYd
}~Sd
}~ww)zDefine hedging strategyrTry�optionsZinverse_etfs)�use_hedgingZhedge_ratioZinstrumentsr:r}Fr�z Error getting hedging strategy: r�Nr�r�r&r&r,�_get_hedging_strategy�s(332�333����z$BacktestEngine._get_hedging_strategyc334Cs�z8|jj}t|�}tj|d�}|jjdd�|d<tj�dd|�|d<tj�dd|�|d<tj�dd|�|d	<|WSt	yY}zt335d336|���tj|jjd�WYd}~Sd}~ww)uCRécupère les rendements des facteurs pour l'analyse d'attributionr�rQr�ZMarketrr��Size�ValueZMomentumz3Erreur dans le calcul des rendements de facteurs : N)rrfr�r7r:r�r��random�normalrnrm)r2r��	n_periodsr�ror&r&r,r��s��c337Cs�z@|�|�|�|�|�|�d|jd|jd|jtdd|jd�d�tdd|j�td	d|jd338�tdd|j�d
�d�WStyf}ztd|���ddd�dddd	d�d�WYd}~Sd}~ww)u@Obtient les règles de gestion des risques basées sur le profilr�r�g{�G�z��r}r�)r�Zmax_volatilityZmax_varZmax_position_sizerfrgryr�rr:)Z339min_assetsZmax_sector_exposureZmin_asset_classes)�	stop_loss�hedging_strategyZrebalancing_triggers�risk_limitsZdiversification_rulesz%Error getting risk management rules: r�r�r�g333333ÿg��������)r�r�N)r�r�r�r`ror$rnrmr�r&r&r,�_get_risk_management_rules�s2�������z)BacktestEngine._get_risk_management_rulesc340Cs�z&|jjd}|j}t�|d�dt�|d�dt|�������d�WStyA}zt	d|���iWYd}~Sd}~ww)z!Calculate diversification metricsr�rrQ)Zherfindahl_indexZeffective_nZcorrelation_scorez+Error calculating diversification metrics: N)341rr^rr�r�r�rSr�rnrm)r2r~rrror&r&r,�"_calculate_diversification_metricss���z1BacktestEngine._calculate_diversification_metricscCs�|jdd�|jdd�|jdd�|jdd�|jdd�d�|jd	d�|jd342d�|jdd�|jdd�d
�|j��d�|j��d�|jdd�d�d�S)z'Generate summary metrics for the reportr��.2%r�r�z.2fr�r�)r�Zannualized_returnr�r�r�r�r�r�r�)rur��correlationr�r�)r!r r�)Zperformance_summaryZrisk_summaryZtrading_summary)rrr!r�r r�)r2r~r&r&r,r�s ����z(BacktestEngine._generate_summary_metrics�scenario_paramsc343Cs�z2|��}d|vr$|d}|�dd�}|j|d�d|9<|WSd|vr0|d}||9}|WStyM}ztd|���|WYd}~Sd}~ww)z+Simulate scenario based on given parametersr�r�r�NrQr�zError in scenario simulation: )rhr�r^rnrm)r2rr�r�Zshock_valuer�Zvol_multror&r&r,r�-s ���z!BacktestEngine._simulate_scenarioc	Cs�i}tjdd�}d|j��}t�|j|j�t�d�||d<tjdd�}t�|jj|jj�t�d�||d<tjdd�}|j	jdd	d344�t�d�||d<tjdd�}t345�|jd
|jd|jdd��}|��t�d�||d<|S)z-Generate visualization figures for the report�rZ���figsizerQzCumulative PerformanceZperformancezDrawdown Analysisr"�areaT��kind�stackedzPortfolio Allocation Over Time�346allocationrrr)zRolling VolatilityzRolling VaRzRolling BetazRolling Risk MetricsZrisk)
�plt�figurerr"�plotrfr=�titler"rr7r:r)	r2r~r�Zfig_perf�cum_returnsZfig_ddZ	fig_alloc�fig_riskrr&r&r,r�As0347348349�350z'BacktestEngine._generate_report_figuresr�r�c351Cs�zBtj|dd�ttj�|d�d��}tj||dd�Wd�n1s%wY|��D]\}}|�tj�||�d���q.WdSt	yX}z352t353d	t|�����d}~ww)354z Save report and figures to filesT)�exist_okzreport.json�wr:)�indentNz.pngzError saving report: )�os�makedirs�open�path�join�json�dumpr0�savefigrnrmr;)r2r�r�r��fr��figror&r&r,r�es����zBacktestEngine._save_reportc355Cstz#|�|�}|�|t|j��}|�||||�}|j�|�||��|WSty9}z356t	dt357|�����d}~ww)z:358        Run backtest adapted to investor profile359        z!Error in profile-based backtest: N)�_create_profile_based_config�!_create_profile_based_constraintsr�r�r�rr�r�rnrmr;)r2rXrbrsrqrrr~ror&r&r,�run_profile_based_backtestws360��z)BacktestEngine.run_profile_based_backtestc	CsPdddddd�}tt��tdd�t��|j|j||jddd	i|jd361kd�S)z7Create backtest configuration based on investor profiler�rAr�rji�)�daysrCrKrLr)r>r?r@rBrDrErF)r=r�nowr	�total_assets�362total_debtr`)r2rXZrebalance_freqr&r&r,r�s�363�z+BacktestEngine._create_profile_based_config�n_assetsc	Cs�ddd�ddd�ddd�ddd�d	d364d�d�}||j}tt�|�t�|�|dtt|d
��tt|d
|��d�d|didd|di|jd
krOdd�Sdd�S)z9Create optimization constraints based on investor profiler�r�)�365max_weight�min_bond_allocr}r�r�ryrYgffffff�?r�rjrrN)r�r�r�rr�rQ)�min_weights�max_weights�
asset_classes�min_class_weights�max_class_weights�max_turnover)r`rr�r��onesr�r�)r2rXrZrisk_based_constraintsrrr&r&r,r�s&�366�367�	�z0BacktestEngine._create_profile_based_constraintscCs8|j}|�||�|�||�|�||�|�||�d�}|S)z9Calculate additional metrics specific to investor profile)r�Zincome_generationZgoal_achievementZliquidity_adequacy)rr��_calculate_income_metrics�_calculate_goal_progressrd)r2r~rXrZprofile_metricsr&r&r,r��s368369370371�z2BacktestEngine._calculate_profile_specific_metricscCsB|��t�d�}dddddd�|j}dtt||�|d�S)	uACalcule l'alignement entre le risque réel et le profil de risquer�r�r�r�r�r�rjrQ)r�r�r�r`ror�)r2rrXr�r�r&r&r,r��s��z(BacktestEngine._calculate_risk_alignmentcCs\t|d�s|j|j|_d|��dt|�d}|j||jt|dd�|�|�d�S)u7Calcule les métriques liées au revenu du portefeuiller\rQr�r�g{�G�z�?)Zincome_to_need_ratioZsustainable_withdrawal_rate�income_stability)	r�rrr\r�r�r]ro�_calculate_income_stability)r2rrX�
annual_returnr&r&r,r%�s372�z(BacktestEngine._calculate_income_metricsc	373Cs�z?|jjd��}|jjd��}|dkr|j}i}|jD]}||dkr*||dnd|j||d|jd�d�}|||<q|WSty\}ztdt	|����iWYd}~Sd}~ww)	u:Évalue la progression vers les objectifs d'investissementr�rrQr�)r�r)r��progress_ratio�time_to_goalz!Error calculating goal progress: N)374rr^r�r\r��_estimate_time_to_goalrrnrmr;)	r2r~rXr�r�r�r��
goal_progressror&r&r,r&�s,375��376	��z'BacktestEngine._calculate_goal_progresscCs&|�d���}d|��t|���S)u,Calcule la stabilité des revenus générés�MrQ)�resampler�r�r�r�)r2rZmonthly_returnsr&r&r,r(sz*BacktestEngine._calculate_income_stabilitycCs>t|tj�rt�|�}d|��}|����}||d}|S)zCalculate drawdown seriesrQ)rXr�r�r7r8r"r#r$)r2r�cumulative_returnsr'r"r&r&r,r|s377z#BacktestEngine._calculate_drawdownscCs(t|tj�rt�|�}|�|�}|��S)zCalculate maximum drawdown)rXr�r�r7r8r|ro)r2rr"r&r&r,r�s378379z&BacktestEngine._calculate_max_drawdownr�r�cCsHd|��dt|�d}|dkrtd�St�||�t�d|�S)u6Estime le temps nécessaire pour atteindre un objectifrQr�rr�)r�r�r<r��log)r2r�r�rr)r&r&r,r,sz%BacktestEngine._estimate_time_to_goalc	380Cs�zgi}|jD]}t|t�r|n|�d�}|�|�}|||<qd|j�d�|j�d�d|j�d�d|j�d�d�|j	j381d��|�|�|�
|�d�||j�dd	�|j�d382d	�|j�dd	�d�|�||�d
�}|WSty}}z383tdt|�����d}~ww)zAGenerate comprehensive report including profile-specific analysisr�zNiveau z/5z ans)�risk_profile�horizonZ	knowledgeZ	stabilityr�)�current_allocationZrebalancing_frequency�risk_managementr�rr�ru)�realized_volatilityr�ru)�profile_summaryZinvestment_strategyr�r�r�z'Error generating profile-based report: N)r�rXr;r�r&r`r��financial_knowledger'rr^r'r�r�rr�rnrm)	r2r~rXr�r��	goal_namer�r�ror&r&r,�generate_profile_based_report"s8384385386387���388���z,BacktestEngine.generate_profile_based_reportcC�$t|d�sdSd|j��d}|S�z)Calcule la progression vers les objectifsrr�rQ�r�rr��r2r~�cumulative_returnr&r&r,r&I�389cCr;r<r=r>r&r&r,r&Qr@cCs�t�|j|j|jd��}t�|j|j|j|j|jd��}t�||d��}t	|d�r2t�|j390�|d<t	|d�r?t�|j�|d<|S)z$Generate summary of investor profile)uNiveau de tolérancezHorizon d'investissementuConnaissance financière)z
Revenu annuelz
Actifs totauxzDette totalezValeur nette)zProfil de RisqueuSituation Financièrer�Z	ObjectifsrrZContraintes)r7r8r`r�r8r]rrr:r�r�rr)r2rXr2Zfinancial_situationZ391summary_dfr&r&r,�_generate_profile_summaryYs(�392��393394z(BacktestEngine._generate_profile_summarycCsh|�|�|jjd��|�||�d�|�|�|�|�|jd�d�d�|�	|�|�395|�|�|�d�d�S)z'Generate summary of investment strategyr�)Ztarget_allocationr4Zallocation_driftz%Y-%m-%d)r��triggers�last_rebalance)Zstop_loss_levelsr�Zdiversification_metrics)�asset_allocationZrebalancing_strategyr5)r�rr^r'r�r�r�r]�strftimer�r�r�r�r&r&r,�_generate_strategy_summaryys396����z)BacktestEngine._generate_strategy_summarycCs�i}tjdd�}|�|||�||d<tjdd�}|�|||�||d<tjdd�}|�|||�||d<tjdd�}|�|||�||d<|S)z(Generate profile-specific visualizationsr�r�r-Zrisk_alignmentZincome_analysisZportfolio_evolution)rr�_plot_goal_progress�_plot_risk_alignment�_plot_income_analysis�_plot_portfolio_evolution)r2r~rXr�Z	fig_goalsrZ397fig_incomeZ
fig_evolutionr&r&r,�_generate_profile_figures�sz(BacktestEngine._generate_profile_figuresrcCs�|�d�}|�||�}t|���}dd�|��D�}|�||�|jddddd�|�d	�|�d398�t	|�D]\}}	||	d}399|400t401d�krV|j||||402d
�d�dd�q7dS)z&Plot progress towards investment goals�ocSsg|]}|d�qS)r*r&)r)r�r&r&r,r��sz6BacktestEngine._plot_goal_progress.<locals>.<listcomp>rr*�-ry)�x�color�	linestyler�z!Progress Towards Investment GoalszProgress Ratior+r�z.1fz years left�center)�vaN)�add_subplotr&r�r�r=�barh�axvline�	set_title�403set_xlabelr%r<�text)r2r~rXr�axr-�goalsZprogress_valuesr*r�r+r&r&r,rG�s 404405406���z"BacktestEngine._plot_goal_progressc	Cs�|j��t�d�}dddddd�|j}|�d�}|jj}|jjd	d407���t�d�}|j||dd�|j	|d
ddd�|�408d�|�d�|�d�|�
�dS)zPlot risk alignment analysisr�r�r�r�r�r�rjrLr�r�zRealized Volatility��label�r�--zTarget Volatility��yrOrPr\z Risk Profile Alignment Over Time�DatezAnnualized VolatilityN)rr�r�r�r`rSrfr�r�axhlinerVrW�409set_ylabel�legend)	r2r~rXrr�r�rYr�Zrolling_volr&r&r,rH�s410��411412413414z#BacktestEngine._plot_risk_alignmentcCsz|�d�}|j|j}|�d���}|j|j|jdd�|j|j	ddddd	�|�415d416�|�d�|�d�|�
�d
S)zPlot income generation analysisrLr.zPortfolio Incomer[rZr]r^zMonthly Income Targetr_z#Monthly Income Generation vs TargetrazMonthly IncomeN)rSrr\r/r�rrfr=rbr]rVrWrcrd)r2r~rXrrYZmonthly_incomer&r&r,rI�s417�418419420z$BacktestEngine._plot_income_analysiscCs�|�d�}d|j��|j}|j|j|jdd�|jD]}t|t	�r6d|vr6|j421|ddd|d��d	�q|�d422�|�d�|�
d�|��dS)
z+Plot portfolio evolution against objectivesrLrQzPortfolio Valuer[r�r^zGoal: r�)r`rPr\zPortfolio Evolution vs GoalsraN)rSrr"r\rrfr=r�rXr�rbrVrWrcrd)r2r~rXrrYr�r�r&r&r,rJ�s423424��425426427z(BacktestEngine._plot_portfolio_evolutionc428s�tjdd�t�d�t�d�r0t�jtj�r0d�j��}t�	|j429|j�t�d�t�
d�t�d�t�d	�rZt�jtj�rZ�jjsZ�jj	d430dt��d�t�d�t�
d�t�d
�d|vr�|d}t|t�r�g}g}|��D]+\}}t|t�r�d|vr�|�|�|�|d�qtt|ttf�r�|�|�|�|�qt|r�|r�t�t|��}	t�|	|�tj|	|ddd�t�d�t�
d�t�d�t�d�r�gd�}431�fdd�|432D�}t�tt|433��|�tjtt|434��|435dd�t�d�t�
d�t��td�t|�d�tj��rt|d�td�t�d��rZ�j ��D]7\}}
t|
ttf��rXt|
t!��sXz
t|�d|
d ���W�q"t"t#f�yWt|�d|
���Y�q"w�q"t�$�dS)!N)rhrgr���rrQ�Performance CumulativeT��rr�)r�r�rY�Allocation des Actifs��r�r*�-�right)�rotation�hazProgression vers les Objectifs��r)r�r�r�csg|]	}�j�|d��qSr�)rr�)r)�m�r~r&r,r�%r.z2BacktestEngine.display_results.<locals>.<listcomp>)rluMétriques Clész436=== Profil Investisseur ===r7u437=== Statistiques Clés ===z	metric  sr�r�)%rr�subplotr�rXrr7r8r"rrfr=r�gridrr:rc�gcar�r0r��intr<r��aranger��bar�xticksr��tight_layoutrmr�rrSrdrY�show)r�r~rXr0r-rZr=r�rbZy_posZkey_metricsZmetrics_values�metricr�r&rpr,�display_results�sp438439440441442443444445446447448�449450451452453454��zBacktestEngine.display_resultscCs�tjdd�d|j��}t�|j|j�t�d�t�d�t�	d�t�455d�t��tjdd�t�|jj|jj�t�d�t�d�t�	d	�t�456d�t��d457S)u#Crée les graphiques de performancer�r�rQrfrazValeur du PortefeuilleTZ	DrawdownsZDrawdownN)
rrrr"rrfr=r�xlabel�ylabelrrryr")r~r0r&r&r,�_plot_portfolio_performance=s458459460461462463464465z*BacktestEngine._plot_portfolio_performancecCs�d|jvr.tjdd�t�|jj|jd�t�d�t�d�t�d�t�	d�t�466�tjdd�|jjddd	�t�d467�t�d�t�d�t�	d�t�468�dS)
u-Crée les graphiques des métriques de risquerr�r�uVolatilité GlissanterauVolatilitéTr�r�rhz	Poids (%)N)rrrrrrfrr|r}rrryrrpr&r&r,�_plot_risk_metricsSs469470471472473474475476477z!BacktestEngine._plot_risk_metricscCsx|jdurdS|dur|}nd}|dkrdS|dkr |��dkS|dkr)|jdkS|d	kr7|jdko6|jd478vS||jvS)a*Determine if portfolio should be rebalanced at given date479        480        Args:481            date: Current date to check for rebalancing482            config: Optional rebalancing frequency config483            484        Returns:485            bool: True if rebalancing is needed, False otherwise486        NFrA�dailyTr�rrQr�)rQr:�rg)r]�weekday�day�month)r2r�rqr�r&r&r,r�is487 488489490z BacktestEngine._should_rebalancec	Cs�d|��}|����}||d}g}d}d}t|�D]\}}|s+|dkr+d}|}q|r:|dkr:d}|�||�q|rBt�|�SdS)z&Estimate time to recover from drawdownrQFrT)r"r#r$r%r�r�r�)	rrr'r"r(r)r,r*r+r&r&r,r��s�z&BacktestEngine._estimate_recovery_timer�r�cCsz|dkrt|�S|dkrt||jdk�S|dkr"t||jdk�S|dkr6t||jddk|jdk@�Std|����)	z-Generate rebalancing dates based on frequencyr�r�rrArQr�rNz#Unsupported rebalancing frequency: )r�r�r�r�rd)r�r�r&r&r,r��s z(BacktestEngine._generate_rebalance_dates�N)r�)r�)rN)r�)qr3r4r5r6rar7r:rpr=rrrr�rr;rwrtrvr��Indexrr�r8r�r�r�r�r�rr�r�r<r�r�r�rxr�r�r�r�r�ryrtrrr-rr3rzr?r@rArBr�r�rrdr_rr{rxr�r�r�r�rr�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�Figurer�r�rrrr�r�r%r&r(r|r�r,r:rArFrKrGrHrIrJr{r~rrSr��staticmethodr��
DatetimeIndexr�r&r&r&r,rTYs8 �����491�25;!&
 		$
���492�$+
$%$u$&0���493�494�0���495�8 0,G?"$9'
 ($����496���497���498499� 

	��500501�'  G"rTc502@sBeZdZdZdefdd�Zdedejde	de503eeffd	d504�Z
dS)�ValidationFrameworkz/Framework for comprehensive strategy validationrWcCs505||_dSr�)rW)r2rWr&r&r,ra�s506zValidationFramework.__init__rqrbrrr%cCsPi}|j�|||�}||d<|j�|||�}||d<|j�|||�}||d<|S)z<507        Perform comprehensive strategy validation.508        �insample_results�walkforward_results�monte_carlo_results)rWr�Zrun_walk_forward_analysisZrun_monte_carlo_simulation)r2rqrbrrZvalidation_resultsr�r�r�r&r&r,�validate_strategy�s���z%ValidationFramework.validate_strategyN)r3r4r5r6rTrar=r7r:rrr;rr�r&r&r&r,r��s���509�r�)rTr=rr�)6�numpyr��pandasr7�typingrrrrr�dataclassesrrr	�statsmodels.api�apirC�scipyr510Zsklearn.model_selectionr�sklearn.mixturer�matplotlib.pyplot�pyplotr�concurrent.futuresr
�warnings�filterwarnings�src.corerrr�src.analysis.ml_analyzerrZsrc.core.typesr�strategies.alternative_assetsrZcore.risk_metricsr�core.profilingrZcore.event_typesrr�511core.types�MarketAnalyzerrr=rTr��__all__r&r&r&r,�<module>sX512b$