92 lines
1.9 KiB
Python
92 lines
1.9 KiB
Python
from __future__ import annotations
|
|
|
|
from dataclasses import dataclass
|
|
from datetime import datetime
|
|
from enum import StrEnum
|
|
from typing import Any
|
|
|
|
|
|
class DataSource(StrEnum):
|
|
TUSHARE = "tushare"
|
|
IFIND = "ifind"
|
|
EASTMONEY = "eastmoney"
|
|
TENCENT = "tencent"
|
|
LOCAL = "local"
|
|
|
|
|
|
class DataUsage(StrEnum):
|
|
DISPLAY = "display"
|
|
CALCULATION = "calculation"
|
|
|
|
|
|
class SnapshotState(StrEnum):
|
|
REALTIME = "realtime"
|
|
FINAL = "final"
|
|
ARCHIVE = "archive"
|
|
|
|
|
|
@dataclass(frozen=True, slots=True)
|
|
class ObservationMetadata:
|
|
source: DataSource
|
|
observed_at: datetime
|
|
unit: str
|
|
adjustment: str
|
|
freshness_seconds: int
|
|
coverage: float
|
|
state: SnapshotState
|
|
usage: DataUsage
|
|
|
|
def __post_init__(self) -> None:
|
|
if not 0 <= self.coverage <= 1:
|
|
raise ValueError("coverage must be between zero and one")
|
|
if self.freshness_seconds < 0:
|
|
raise ValueError("freshness_seconds cannot be negative")
|
|
|
|
|
|
@dataclass(frozen=True, slots=True)
|
|
class ProviderResult:
|
|
rows: tuple[dict[str, Any], ...]
|
|
metadata: ObservationMetadata
|
|
|
|
|
|
@dataclass(frozen=True, slots=True)
|
|
class TradeContext:
|
|
requested_date: str
|
|
actual_date: str | None
|
|
previous_date: str | None
|
|
observed_at: datetime | None
|
|
state: SnapshotState | None
|
|
carried_forward: bool
|
|
message: str
|
|
|
|
|
|
@dataclass(frozen=True, slots=True)
|
|
class MarketEntity:
|
|
entity_type: str
|
|
identifier: str
|
|
code: str
|
|
name: str
|
|
sector: str | None = None
|
|
|
|
|
|
@dataclass(frozen=True, slots=True)
|
|
class ChartPoint:
|
|
time: str
|
|
open: float
|
|
high: float
|
|
low: float
|
|
close: float
|
|
volume: float
|
|
amount: float
|
|
average: float | None = None
|
|
|
|
|
|
@dataclass(frozen=True, slots=True)
|
|
class ChartSeries:
|
|
entity: MarketEntity
|
|
interval: str
|
|
trade_date: str
|
|
previous_close: float | None
|
|
points: tuple[ChartPoint, ...]
|
|
metadata: ObservationMetadata
|