"""
Risk Assessment Module
Calculate various risk metrics for trading decisions.
"""
import pandas as pd
import numpy as np
from typing import Dict, Any
def calculate_volatility(returns: pd.Series, window: int = 20) -> float:
"""Calculate rolling volatility."""
return returns.rolling(window=window).std().iloc[-1]
def calculate_var(returns: pd.Series, confidence: float = 0.05) -> float:
"""Calculate Value at Risk."""
return np.percentile(returns.dropna(), confidence * 100)
def calculate_sharpe_ratio(returns: pd.Series, risk_free_rate: float = 0.02) -> float:
"""Calculate Sharpe ratio."""
excess_returns = returns.mean() - risk_free_rate / 252
return excess_returns / returns.std() if returns.std() != 0 else 0
def calculate_risk_metrics(prices: pd.Series) -> Dict[str, float]:
"""Calculate comprehensive risk metrics."""
returns = prices.pct_change().dropna()
return {
'volatility': calculate_volatility(returns),
'var_5': calculate_var(returns, 0.05),
'var_1': calculate_var(returns, 0.01),
'sharpe_ratio': calculate_sharpe_ratio(returns),
'max_drawdown': calculate_max_drawdown(prices),
'skewness': returns.skew(),
'kurtosis': returns.kurtosis()
}
def calculate_max_drawdown(prices: pd.Series) -> float:
"""Calculate maximum drawdown."""
peak = prices.expanding().max()
drawdown = (prices - peak) / peak
return drawdown.min()