31 lines
893 B
Python
31 lines
893 B
Python
from dataclasses import dataclass
|
|
from typing import Dict, List, Optional
|
|
from datetime import datetime
|
|
|
|
@dataclass
|
|
class NavErosionConfig:
|
|
max_erosion_level: int = 9
|
|
max_monthly_erosion: float = 1 - (0.1)**(1/12) # ~17.54% monthly for 90% annual erosion
|
|
use_per_ticker: bool = False
|
|
global_nav_rate: float = 0
|
|
per_ticker_rates: Dict[str, float] = None
|
|
|
|
@dataclass
|
|
class NavErosionResult:
|
|
ticker: str
|
|
nav_erosion_rate: float
|
|
monthly_erosion_rate: float
|
|
annual_erosion_rate: float
|
|
risk_level: int # 0-9 scale
|
|
risk_explanation: str
|
|
max_drawdown: float
|
|
volatility: float
|
|
is_new_etf: bool
|
|
etf_age_years: Optional[float]
|
|
|
|
@dataclass
|
|
class NavErosionAnalysis:
|
|
results: List[NavErosionResult]
|
|
portfolio_nav_risk: float # Average risk level
|
|
portfolio_erosion_rate: float # Weighted average erosion rate
|
|
risk_summary: str |