You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
40 lines
1.2 KiB
Python
40 lines
1.2 KiB
Python
"""
|
|
Stock Screener schemas - request/response models
|
|
"""
|
|
from typing import Optional, List, Any, Dict
|
|
from pydantic import BaseModel
|
|
|
|
|
|
class ScreenerStockItem(BaseModel):
|
|
symbol: str
|
|
name: Optional[str] = None
|
|
exchange: Optional[str] = None # User-friendly: NYSE, NASDAQ, etc.
|
|
exchange_code: Optional[str] = None # Raw yfinance code: NYQ, NMS, etc.
|
|
quote_type: Optional[str] = None
|
|
market_cap: Optional[float] = None
|
|
price: Optional[float] = None
|
|
change_percent: Optional[float] = None
|
|
volume: Optional[int] = None
|
|
avg_volume_3m: Optional[int] = None
|
|
shares_outstanding: Optional[float] = None
|
|
pe_ratio: Optional[float] = None
|
|
forward_pe: Optional[float] = None
|
|
eps_ttm: Optional[float] = None
|
|
dividend_yield: Optional[float] = None
|
|
fifty_two_week_high: Optional[float] = None
|
|
fifty_two_week_low: Optional[float] = None
|
|
analyst_rating: Optional[str] = None
|
|
book_value: Optional[float] = None
|
|
price_to_book: Optional[float] = None
|
|
|
|
|
|
class ScreenerResponse(BaseModel):
|
|
stocks: List[ScreenerStockItem]
|
|
total_available: int
|
|
returned_count: int
|
|
page: int
|
|
page_size: int
|
|
total_pages: int
|
|
query_time_seconds: float
|
|
metadata: Dict[str, Any]
|