algebraic-portfolio-provena.../algebraic_portfolio_provena.../dsl.py

78 lines
2.0 KiB
Python

from __future__ import annotations
from dataclasses import dataclass, field
from typing import Dict, Optional, Any, List
@dataclass
class LocalAsset:
symbol: str
asset_class: str # e.g., Equity, Bond
notional: float
constraints: Dict[str, Any] = field(default_factory=dict)
def to_dict(self) -> Dict[str, Any]:
return {
"symbol": self.symbol,
"asset_class": self.asset_class,
"notional": self.notional,
"constraints": self.constraints,
}
@dataclass
class Objective:
target_return: Optional[float] = None
target_vol: Optional[float] = None
target_sharpe: Optional[float] = None
liquidity_budget: Optional[float] = None
def to_dict(self) -> Dict[str, Any]:
return {
"target_return": self.target_return,
"target_vol": self.target_vol,
"target_sharpe": self.target_sharpe,
"liquidity_budget": self.liquidity_budget,
}
@dataclass
class RiskBudget:
max_drawdown: Optional[float] = None
tail_risk: Optional[float] = None
exposure_caps: Dict[str, float] = field(default_factory=dict)
def to_dict(self) -> Dict[str, Any]:
return {
"max_drawdown": self.max_drawdown,
"tail_risk": self.tail_risk,
"exposure_caps": self.exposure_caps,
}
@dataclass
class PlanDelta:
step: int
deltas: Dict[str, Any] = field(default_factory=dict)
def to_dict(self) -> Dict[str, Any]:
return {"step": self.step, "deltas": self.deltas}
@dataclass
class SharedSignals:
signals: Dict[str, Any] = field(default_factory=dict)
def to_dict(self) -> Dict[str, Any]:
return {"signals": self.signals}
@dataclass
class AuditLog:
events: List[Dict[str, Any]] = field(default_factory=list)
version: str = "0.0.1"
def log(self, event: Dict[str, Any]) -> None:
self.events.append(event)
def to_dict(self) -> Dict[str, Any]:
return {"events": self.events, "version": self.version}