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
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
|