/ __pycache__ / risk_models.cpython-310.pyc
risk_models.cpython-310.pyc
  1  o

  2  ,�ui)5�@s2dZddlZddlmZmZmZGdd�d�ZdS)za
  3  Risk Models Module
  4  
  5  Advanced risk modeling including stress testing and Monte Carlo simulation.
  6  �N)�List�Dict�Anyc@s6eZdZdZdd�Zdeedejdee	ee
  7  fde	ee
  8  ffdd	�Zdeedejde	ee
  9  ffd
 10  d�Zdeedejde	ee
 11  fd
e	ee
 12  fde	ee
 13  ff
 14  dd�Z
deedejde	ee
 15  ffdd�Zdeedejdee	ee
 16  ffdd�Zde	ee
 17  fdee	ee
 18  fde	ee
 19  fde	ee
 20  ffdd�ZdS)�
 21  RiskModelsz*Advanced risk modeling and stress testing.cCsd|_d|_dS)zInitialize risk models.��i'N)�trading_days�simulation_paths)�self�r
 22  �D/home/claudeworker/worker/project/ai-fintech-analyzer/risk_models.py�__init__s
 23  zRiskModels.__init__�symbols�weights�	scenarios�returnc
 24  	Csh|�||�}g}|D]}|j||||d�}|�|�q
 25  |�||�}|�||�}	||||	|�|||�d�S)a
 26          Run stress test scenarios on the portfolio.
 27  
 28          Args:
 29              symbols: List of stock symbols
 30              weights: Portfolio weights
 31              scenarios: List of stress scenarios
 32  
 33          Returns:
 34              Stress test results
 35          )r
r�baseline�scenario)r�scenario_analysis�monte_carlo�historical_events�risk_summary)�_calculate_baseline�
_run_scenario�append�_monte_carlo_simulation�_historical_stress_analysis�_generate_risk_summary)
 36  r	r
rrr�scenario_resultsr�result�
 37  mc_results�
 38  historicalr
 39  r
 40  r�stress_tests(���zRiskModels.stress_testc		Cs�tj�d�t|�}tj�ddd|f�}d}tj�ddd�}t|�D]}||d||d	d	�|f|d	d	�|f<q"t�||�}tt�|�d
 41  d�tt�	|�d
 42  d�tt�|�dd
 43  d�tt�	|�t�
 44  d�d
 45  d�tt�|d
�d
 46  d�dd�S)z%Calculate baseline portfolio metrics.�*g-C��6:?g���Q��?rg333333�?ga2U0*�3?g�~j�t��?�N�d����Y@)�expected_daily_return�daily_volatility�annualized_return�annualized_volatility�var_95�
current_value)�np�random�seed�len�normal�range�dot�round�mean�std�sqrt�
 47  percentile)	r	r
r�n_assets�returns�correlation_factor�
market_factor�i�portfolio_returnsr
 48  r
 49  rrBs$���zRiskModels._calculate_baselinerrc	s�|�dd��|�dd�}|�dd�}tj�t|d�d�g}|D].}|��d	vr5|�tj�d
 50  d��q"|��dvrF|�tj�d
d��q"|�tj�dd��q"t�|�}t�	||�}	�|	}
 51  |d|}|dd|
 52  }|d|}
|
|dd}�dkr�tj�
 53  dd�}n�dkr�tj�
 54  dd�}ntj�
 55  dd�}|dt�dd�t|	d�t|
 56  dd�t|d�t|
d�t|d�d�|t|d�td
|d�d�|dd��fd d!�t||�D�d"�S)#zRun a single stress scenario.�market_shockg������ɿ�volatility_spikeg@�correlation_increase皙�����?�namel��AAPL�GOOGL�MSFT�NVDA�METAg�������?g�?��JNJ�PG�KO�PEP�WMT��?皙�����?�333333�?r,r.r#r$g333333ӿ��$g333333ÿ���	r&)�portfolio_beta�return_impact_pct�value_after_shock�loss_amount�loss_percentage)�volatility_multiplier�stressed_volatility�correlation_assumptionz%Based on historical recovery patterns)�months�
 57  assumptioncs$i|]\}}|t�|dd��qS)r$r&)r6)�.0�symbol�beta�rAr
 58  r�
 59  <dictcomp>�s��z,RiskModels._run_scenario.<locals>.<dictcomp>)�
scenario_name�market_shock_pct�portfolio_impact�stressed_metrics�recovery_estimate�
asset_impacts)
�getr/r0r1�hash�upperr�uniform�arrayr5�randintr6�zip)r	r
rrr�	vol_spike�
corr_increase�betasrerZ�stressed_return�stressed_vol�stressed_value�loss�loss_pct�recovery_monthsr
 60  rgrr_sT
 61  ���
 62  ��zRiskModels._run_scenarioc
s�tj�d�t|�}tj�dd|�}tj�dd|�}t�|�}t|�D]}t|d|�D]}tj�dd�}	|	|||f<|	|||f<q,q#tj�|�}
 63  g�g}g}t|j	�D]@}
tj�
 64  d	d|j|f�}t�||
 65  j
�}|||}t�||�}d
 66  t�d|�}��|d�|�t�|��|�t�|��qTt����t�|�}gd�}�fd
d�|D�}|j	|jdd�tt���d�tt���d�tt���d�tt���d�d�|�tt�|�d�tt�|�d�tt��d
 67  k�d
 68  d�tt��dk�d
 69  d�d�tt���d
 70  d�tt��d
 71  k�d
 72  d�t��d
 73  k��r#tt���d
 74  k�d
 75  d�nd	t��d
 76  k��r:td
 77  t���d
 78  k�d�nd	d�d�S)z)Run Monte Carlo simulation for portfolio.r"g-C��6*?ga2U0*�C?g{�G�z�?g�������?r#rDg333333�?rr$�����)r'�
 79  ��2�K�Z�_cs&i|]}d|��tt��|�d��qS)�pr&)r6r/r:)rdr���final_valuesr
 80  rrh�s��z6RiskModels._monte_carlo_simulation.<locals>.<dictcomp>r()�paths�horizon_days�
initial_valuer&)r7r8�min�max�P)�average_min_value�worst_case_min�probability_of_loss�probability_of_20pct_loss)�mean_return_pct�probability_of_positive_return�expected_upside�expected_downside)�simulation_params�final_value_distribution�max_drawdown_analysis�return_distribution)r/r0r1r2rr�eyer4�linalg�choleskyrr3rr5�T�cumprodrr�r�rsr6r7r8�any)r	r
rr;�mean_returns�volatilities�corr_matrixr?�j�corr�chol�
 81  min_values�
 82  max_values�_�random_returns�correlated_returns�scaled_returnsr@�values�percentiles�value_at_percentilesr
 83  r�rr�s�
 84  �
 85  
 86  
 87  ��������������z"RiskModels._monte_carlo_simulationc
 88  Cs@dddddd�ddd	d
 89  dd�dd
dddd�dddddd�dddd
 90  dd�g}tj�d�g}|D].}|��dvrB|�tj�dd��q/|��dvrS|�tj�dd ��q/|�tj�d!d��q/t�|�}t�||�}g}|D]0}|d"|}	|�|d#|d$t|d"d%d
 91  �t|	d%d
 92  �td&t	|	�d'�|d(|d)d*��qm|S)+z1Analyze portfolio under historical stress events.z2008 Financial CrisiszSep 2008 - Mar 2009g=
 93  ףp=���1)�event�period�market_decline�duration_monthsr~z2020 COVID CrashzFeb - Mar 2020g��(\��տr#r'z2022 Bear MarketzJan - Oct 2022gпr��z2000 Dot-Com CrashzMar 2000 - Oct 2002g\���(\߿��8z1987 Black MondayzOct 1987g)\���(̿�r"rFrTg�������?rLrRrSg�������?r�r�r�r$i��rr�r~)r�r��market_decline_pct�estimated_portfolio_decline_pct�estimated_loss_on_100kr��historical_recovery_months)
 94  r/r0r1rqrrrrsr5r6�abs)
 95  r	r
rrrxrerZ�resultsr��portfolio_decliner
 96  r
 97  rrsl������'
 98  
 99  �
100  z&RiskModels._historical_stress_analysisrcCs�t|dd�d�}|d}|d}|dks|dkrd}n
|d	ks#|d
101  kr&d}nd}||�d
�|�d
�t|dd��d
�|dd�d
�d�gd�gd�d�S)zGenerate overall risk summary.cSs|ddS)Nrkr[r
102  )�xr
103  r
104  r�<lambda>Xsz3RiskModels._generate_risk_summary.<locals>.<lambda>)�keyr-r,r�rX�highr�r&�moderate�low�%rkr^r�r�)r,�daily_var_95�worst_case_scenario_loss�probability_of_annual_loss)z Market risk from equity exposurez-Concentration risk from portfolio compositionz*Systematic risk measured by portfolio beta)z.Consider rebalancing if risk exceeds tolerancez!Review asset allocation quarterlyz-Maintain emergency reserves outside portfolioz2Consider hedging strategies during high volatility)�overall_risk_level�key_metrics�risk_factors�recommendations)r�r�)r	rrr�worst_scenarior-�ann_vol�
105  risk_levelr
106  r
107  rrNs(���z!RiskModels._generate_risk_summaryN)�__name__�
108  __module__�__qualname__�__doc__rr�strr/�ndarrayrrr!rrrrrr
109  r
110  r
111  rrsj���
112  
113  �/��
114  
115  ���
116  �
117  �
118  
119  �K��
120  
121  �\��
122  �H
123  ��
124  �
125  �r)r��numpyr/�typingrrrrr
126  r
127  r
128  r�<module>s