Coverage for core/models/stock.py: 100.00%
49 statements
« prev ^ index » next coverage.py v7.10.7, created at 2025-10-13 18:58 +0000
« prev ^ index » next coverage.py v7.10.7, created at 2025-10-13 18:58 +0000
1"""
2股票数据模型
3"""
5from datetime import datetime
6from enum import Enum
7from typing import Optional
9from pydantic import BaseModel, Field
12class TradeSession(str, Enum):
13 """交易时段枚举"""
15 INTRADAY = "Intraday" # 盘中交易
16 PRE = "Pre" # 盘前交易
17 POST = "Post" # 盘后交易
18 OVERNIGHT = "Overnight" # 夜盘交易
21class StockData(BaseModel):
22 """股票数据模型"""
24 code: str = Field(..., description="股票代码", example="YINN.US")
25 open: float = Field(
26 ...,
27 description="开盘价",
28 ge=0,
29 )
30 high: float = Field(
31 ...,
32 description="最高价",
33 ge=0,
34 )
35 low: float = Field(
36 ...,
37 description="最低价",
38 ge=0,
39 )
40 close: float = Field(
41 ...,
42 description="收盘价",
43 ge=0,
44 )
45 volume: int = Field(..., description="成交量", ge=0)
46 turnover: float = Field(
47 ...,
48 description="成交额",
49 ge=0,
50 )
51 timestamp: int = Field(..., description="时间戳(UNIX时间戳)", example=1704067200)
52 trade_session: TradeSession = Field(..., description="交易时段")
54 class Config:
55 json_encoders = {datetime: lambda v: int(v.timestamp())}
58class StockDataCreate(BaseModel):
59 """创建股票数据模型"""
61 code: str = Field(..., description="股票代码")
62 open: float = Field(
63 ...,
64 description="开盘价",
65 ge=0,
66 )
67 high: float = Field(
68 ...,
69 description="最高价",
70 ge=0,
71 )
72 low: float = Field(
73 ...,
74 description="最低价",
75 ge=0,
76 )
77 close: float = Field(
78 ...,
79 description="收盘价",
80 ge=0,
81 )
82 volume: int = Field(..., description="成交量", ge=0)
83 turnover: float = Field(
84 ...,
85 description="成交额",
86 ge=0,
87 )
88 timestamp: int = Field(..., description="时间戳(UNIX时间戳)")
89 trade_session: TradeSession = Field(..., description="交易时段")
92class StockDataFilter(BaseModel):
93 """股票数据筛选模型"""
95 code: Optional[str] = Field(None, description="股票代码筛选")
96 start_timestamp: Optional[int] = Field(None, description="开始时间戳")
97 end_timestamp: Optional[int] = Field(None, description="结束时间戳")
98 trade_session: Optional[TradeSession] = Field(None, description="交易时段筛选")
99 sort_by: str = Field("timestamp", description="排序字段")
100 sort_order: str = Field("asc", description="排序方式: asc/desc")
101 page: int = Field(1, description="页码", ge=1)
102 page_size: int = Field(120, description="每页数量", ge=1, le=1440)
103 timezone: str = Field("Asia/Shanghai", description="时区")
106class StockDataResponse(BaseModel):
107 """股票数据响应模型"""
109 data: list[StockData] = Field(..., description="股票数据列表")
110 total: int = Field(..., description="总数量")
111 page: int = Field(..., description="当前页码")
112 page_size: int = Field(..., description="每页数量")
113 total_pages: int = Field(..., description="总页数")
116class StockCodeList(BaseModel):
117 """股票代码列表模型"""
119 codes: list[str] = Field(..., description="股票代码列表")