""" Universe Snapshot models for historical stock screening (backtesting universe) """ from sqlalchemy import Column, String, Float, Index, UniqueConstraint, Boolean from sqlalchemy.dialects.postgresql import UUID, TIMESTAMP from datetime import datetime, timezone import uuid from app.core.database import Base class UniverseTickerRegistry(Base): __tablename__ = "universe_ticker_registry" id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4) ticker = Column(String(10), nullable=False) name = Column(String(255), nullable=True) cik = Column(String(20), nullable=True) sector = Column(String(100), nullable=True) industry = Column(String(200), nullable=True) exchange = Column(String(20), nullable=True) is_active = Column(Boolean, default=True, nullable=False) created_at = Column( TIMESTAMP(timezone=True), default=lambda: datetime.now(timezone.utc) ) updated_at = Column( TIMESTAMP(timezone=True), default=lambda: datetime.now(timezone.utc), onupdate=lambda: datetime.now(timezone.utc), ) __table_args__ = ( UniqueConstraint("ticker", name="uq_universe_ticker_registry"), Index("idx_registry_ticker", "ticker"), Index("idx_registry_sector", "sector"), Index("idx_registry_exchange", "exchange"), Index("idx_registry_active", "is_active"), ) class UniverseSnapshot(Base): __tablename__ = "universe_snapshot" id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4) ticker = Column(String(10), nullable=False, index=True) snapshot_date = Column(TIMESTAMP(timezone=True), nullable=False) close_price = Column(Float, nullable=True) shares_outstanding = Column(Float, nullable=True) market_cap = Column(Float, nullable=True) sector = Column(String(100), nullable=True) industry = Column(String(200), nullable=True) exchange = Column(String(20), nullable=True) created_at = Column( TIMESTAMP(timezone=True), default=lambda: datetime.now(timezone.utc) ) __table_args__ = ( UniqueConstraint("ticker", "snapshot_date", name="uq_universe_snapshot"), Index("idx_snapshot_ticker_date", "ticker", "snapshot_date"), Index("idx_snapshot_date_mcap", "snapshot_date", "market_cap"), Index("idx_snapshot_sector", "sector"), Index("idx_snapshot_date", "snapshot_date"), )