44 lines
1.3 KiB
Python
44 lines
1.3 KiB
Python
from __future__ import annotations
|
|
|
|
from dataclasses import dataclass, field
|
|
from typing import List, Dict, Optional
|
|
from datetime import datetime
|
|
|
|
|
|
@dataclass(frozen=True)
|
|
class Asset:
|
|
symbol: str
|
|
asset_type: str # e.g., "equity", "option", "futures"
|
|
venue: str
|
|
|
|
def __post_init__(self):
|
|
if self.asset_type not in {"equity", "option", "futures"}:
|
|
raise ValueError("asset_type must be one of 'equity', 'option', or 'futures'")
|
|
|
|
|
|
@dataclass(frozen=True)
|
|
class MarketSignal:
|
|
asset_symbol: str
|
|
venue: str
|
|
price: float
|
|
delta: Optional[float] = None # local delta proxy if available
|
|
timestamp: datetime = field(default_factory=datetime.utcnow)
|
|
meta: Dict[str, float] = field(default_factory=dict)
|
|
|
|
|
|
@dataclass
|
|
class StrategyDelta:
|
|
asset: Asset
|
|
target_delta: float # desired delta exposure for this block
|
|
risk_budget: float # allowed risk budget for this block
|
|
objective: str # e.g., "delta-neutral", "calendar-spread"
|
|
timestamp: datetime = field(default_factory=datetime.utcnow)
|
|
|
|
|
|
@dataclass
|
|
class PlanDelta:
|
|
hedges: List[StrategyDelta] = field(default_factory=list)
|
|
actions: List[Dict] = field(default_factory=list) # provenance and trade actions
|
|
total_cost: float = 0.0
|
|
timestamp: datetime = field(default_factory=datetime.utcnow)
|