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.

64 lines
1.5 KiB
Python

"""
Pydantic schemas for FINRA short volume data
"""
from datetime import date, datetime
from typing import Dict, List, Any, Optional
from pydantic import BaseModel, Field, ConfigDict
class ShortVolumeEntry(BaseModel):
model_config = ConfigDict(from_attributes=True)
date: date
symbol: str
short_volume: float
short_exempt_volume: float = 0.0
total_volume: float
market: Optional[str] = None
short_ratio: Optional[float] = None
@classmethod
def from_orm_obj(cls, obj):
d = obj.date
if isinstance(d, datetime):
d = d.date()
return cls(
date=d,
symbol=obj.symbol,
short_volume=obj.short_volume,
short_exempt_volume=obj.short_exempt_volume or 0.0,
total_volume=obj.total_volume,
market=obj.market,
short_ratio=obj.short_ratio,
)
class ShortVolumeResponse(BaseModel):
symbol: str
entries: List[ShortVolumeEntry]
total_count: int
metadata: Dict[str, Any] = Field(default_factory=dict)
class ShortRatioPoint(BaseModel):
date: date
short_volume: float
short_exempt_volume: float
total_volume: float
short_ratio: float
class ShortRatioHistoryResponse(BaseModel):
symbol: str
history: List[ShortRatioPoint]
avg_short_ratio: Optional[float] = None
metadata: Dict[str, Any] = Field(default_factory=dict)
class IngestResponse(BaseModel):
date: Optional[str] = None
date_range: Optional[Dict[str, str]] = None
records_ingested: int
status: str