42 lines
1.4 KiB
Python
42 lines
1.4 KiB
Python
# -*- coding: utf-8 -*-
|
|
"""Signal and analysis-related schemas."""
|
|
|
|
from pydantic import BaseModel
|
|
|
|
from shared.schema.portfolio import Portfolio
|
|
|
|
|
|
class AnalystSignal(BaseModel):
|
|
signal: str | None = None
|
|
confidence: float | None = None
|
|
reasoning: dict | str | None = None
|
|
# Extended fields for richer signal information
|
|
reasons: list[str] | None = None # Core drivers/reasons for the signal
|
|
risks: list[str] | None = None # Key risk factors
|
|
invalidation: str | None = None # Conditions that would invalidate the thesis
|
|
next_action: str | None = None # Suggested next action for PM
|
|
# Valuation-related fields
|
|
intrinsic_value: float | None = None # DCF intrinsic value
|
|
fair_value_range: dict | None = None # {bear, base, bull} fair value range
|
|
value_gap_pct: float | None = None # Value gap percentage
|
|
valuation_methods: list[str] | None = None # List of valuation methods used
|
|
max_position_size: float | None = None # For risk management signals
|
|
|
|
|
|
class TickerAnalysis(BaseModel):
|
|
ticker: str
|
|
analyst_signals: dict[str, AnalystSignal] # agent_name -> signal mapping
|
|
|
|
|
|
class AgentStateData(BaseModel):
|
|
tickers: list[str]
|
|
portfolio: Portfolio
|
|
start_date: str
|
|
end_date: str
|
|
ticker_analyses: dict[str, TickerAnalysis] # ticker -> analysis mapping
|
|
|
|
|
|
class AgentStateMetadata(BaseModel):
|
|
show_reasoning: bool = False
|
|
model_config = {"extra": "allow"}
|