Coverage for core/models/trading.py: 100.00%
222 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 date, datetime
6from decimal import Decimal
7from enum import Enum
8from typing import TYPE_CHECKING, Any, Dict, List, Optional
10from pydantic import BaseModel, Field
12if TYPE_CHECKING:
13 from core.models.broker import TradingFee
16class TradingMode(str, Enum):
17 """交易模式枚举"""
19 REALTIME = "realtime" # 实时交易
20 BACKTEST = "backtest" # 回测
23class AssetMode(str, Enum):
24 """资产模式枚举"""
26 REAL = "real" # 真实资产
27 SIMULATION = "simulation" # 模拟资产
30class SessionStatus(str, Enum):
31 """交易会话状态枚举"""
33 CREATED = "created" # 已创建
34 RUNNING = "running" # 运行中
35 PAUSED = "paused" # 已暂停
36 STOPPED = "stopped" # 已停止
37 COMPLETED = "completed" # 已完成
40class OrderStatus(str, Enum):
41 """订单状态枚举"""
43 PENDING = "pending" # 待处理
44 FILLED = "filled" # 已成交
45 CANCELLED = "cancelled" # 已取消
46 REJECTED = "rejected" # 已拒绝
49class OrderSide(str, Enum):
50 """订单方向枚举"""
52 BUY = "buy" # 买入
53 SELL = "sell" # 卖出
56class OrderType(str, Enum):
57 """订单类型枚举"""
59 LIMIT = "limit" # 限价单
60 MARKET = "market" # 市价单
63class RiskConfig(BaseModel):
64 """风险配置"""
66 max_position_ratio: float = Field(1.0, description="单只股票最大持仓比例")
67 stop_loss_ratio: float = Field(0.3, description="止损比例")
68 max_drawdown: float = Field(0.3, description="最大回撤")
69 allowed_symbols: List[str] = Field(
70 default_factory=list, description="允许交易的股票代码"
71 )
72 # 按股票的风险配置
73 per_stock_config: Dict[str, Dict[str, float]] = Field(
74 default_factory=dict, description="按股票的风险配置"
75 )
78class SessionConfig(BaseModel):
79 """交易会话配置"""
81 trading_mode: TradingMode = Field(..., description="交易模式")
82 asset_mode: AssetMode = Field(..., description="资产模式")
83 strategy_name: str = Field(..., description="策略名称")
84 initial_capital: Decimal = Field(..., description="初始资金")
85 start_date: Optional[datetime] = Field(None, description="回测开始时间")
86 end_date: Optional[datetime] = Field(None, description="回测结束时间")
87 timezone: str = Field("UTC", description="时区")
88 risk_config: RiskConfig = Field(..., description="风险配置")
89 strategy_params: Dict[str, Any] = Field(
90 default_factory=dict, description="策略参数"
91 )
94class TradingSessionCreate(BaseModel):
95 """创建交易会话请求"""
97 session_name: str = Field(..., description="会话名称")
98 trading_mode: TradingMode = Field(..., description="交易模式")
99 asset_mode: AssetMode = Field(..., description="资产模式")
100 strategy_name: str = Field(..., description="策略名称")
101 initial_capital: Decimal = Field(..., description="期初总资产")
102 initial_capital_by_currency: Optional[Dict[str, Dict[str, Any]]] = Field(
103 None, description="按货币分组的期初总资产"
104 )
105 start_date: Optional[datetime] = Field(None, description="回测开始时间")
106 end_date: Optional[datetime] = Field(None, description="回测结束时间")
107 timezone: str = Field("UTC", description="时区")
108 risk_config: RiskConfig = Field(..., description="风险配置")
109 strategy_params: Dict[str, Any] = Field(
110 default_factory=dict, description="策略参数"
111 )
112 tradable_symbols: Optional[List[str]] = Field(None, description="可交易股票列表")
115class TradingSessionUpdate(BaseModel):
116 """更新交易会话请求"""
118 session_name: Optional[str] = Field(None, description="会话名称")
119 status: Optional[SessionStatus] = Field(None, description="会话状态")
120 risk_config: Optional[RiskConfig] = Field(None, description="风险配置")
123class TradingSessionResponse(BaseModel):
124 """交易会话响应"""
126 id: str = Field(..., description="会话ID")
127 user_id: str = Field(..., description="用户ID")
128 session_name: str = Field(..., description="会话名称")
129 trading_mode: TradingMode = Field(..., description="交易模式")
130 asset_mode: AssetMode = Field(..., description="资产模式")
131 strategy_name: str = Field(..., description="策略名称")
132 status: SessionStatus = Field(..., description="会话状态")
133 start_time: Optional[datetime] = Field(None, description="开始时间")
134 end_time: Optional[datetime] = Field(None, description="结束时间")
135 initial_capital: Decimal = Field(..., description="期初总资产")
136 final_capital: Optional[Decimal] = Field(None, description="期末总资产")
137 initial_capital_by_currency: Optional[Dict[str, Dict[str, Any]]] = Field(
138 None, description="按货币分组的期初总资产"
139 )
140 final_capital_by_currency: Optional[Dict[str, Dict[str, Any]]] = Field(
141 None, description="按货币分组的期末总资产"
142 )
143 config: Dict[str, Any] = Field(..., description="配置信息")
144 strategy_params: Dict[str, Any] = Field(
145 default_factory=dict, description="策略参数"
146 )
147 tradable_symbols: Optional[List[str]] = Field(None, description="可交易股票列表")
148 performance_metrics: Optional[Dict[str, Any]] = Field(None, description="性能指标")
149 created_at: datetime = Field(..., description="创建时间")
150 updated_at: datetime = Field(..., description="更新时间")
153class TradingOrderCreate(BaseModel):
154 """创建交易订单请求"""
156 session_id: str = Field(..., description="会话ID")
157 symbol: str = Field(..., description="股票代码")
158 side: OrderSide = Field(..., description="订单方向")
159 order_type: OrderType = Field(..., description="订单类型")
160 quantity: Decimal = Field(..., description="数量")
161 price: Optional[Decimal] = Field(None, description="价格")
162 trading_fee: Optional[Dict[str, Any]] = Field(None, description="交易费用明细")
165class TradingOrderUpdate(BaseModel):
166 """更新交易订单请求"""
168 status: Optional[OrderStatus] = Field(None, description="订单状态")
169 filled_price: Optional[Decimal] = Field(None, description="成交价格")
170 filled_quantity: Optional[Decimal] = Field(None, description="成交数量")
171 commission: Optional[Decimal] = Field(None, description="手续费")
172 trading_fee: Optional[Dict[str, Any]] = Field(None, description="交易费用明细")
175class TradingOrderResponse(BaseModel):
176 """交易订单响应"""
178 id: str = Field(..., description="订单ID")
179 session_id: str = Field(..., description="会话ID")
180 symbol: str = Field(..., description="股票代码")
181 side: OrderSide = Field(..., description="订单方向")
182 order_type: OrderType = Field(..., description="订单类型")
183 quantity: Decimal = Field(..., description="数量")
184 price: Optional[Decimal] = Field(None, description="价格")
185 status: OrderStatus = Field(..., description="订单状态")
186 submitted_at: datetime = Field(..., description="提交时间")
187 filled_at: Optional[datetime] = Field(None, description="成交时间")
188 cancelled_at: Optional[datetime] = Field(None, description="取消时间")
189 filled_price: Optional[Decimal] = Field(None, description="成交价格")
190 filled_quantity: Optional[Decimal] = Field(None, description="成交数量")
191 commission: Decimal = Field(0, description="手续费")
192 trading_fee: Optional[Dict[str, Any]] = Field(None, description="交易费用明细")
195class PositionHistoryCreate(BaseModel):
196 """创建持仓记录请求"""
198 session_id: str = Field(..., description="会话ID")
199 symbol: str = Field(..., description="股票代码")
200 quantity: Decimal = Field(..., description="数量")
201 avg_price: Decimal = Field(..., description="平均价格")
202 market_value: Decimal = Field(..., description="市值")
203 unrealized_pnl: Decimal = Field(..., description="未实现盈亏")
204 realized_pnl: Decimal = Field(0, description="已实现盈亏")
207class PositionHistoryResponse(BaseModel):
208 """持仓记录响应"""
210 id: str = Field(..., description="记录ID")
211 session_id: str = Field(..., description="会话ID")
212 symbol: str = Field(..., description="股票代码")
213 quantity: Decimal = Field(..., description="数量")
214 avg_price: Decimal = Field(..., description="平均价格")
215 market_value: Decimal = Field(..., description="市值")
216 unrealized_pnl: Decimal = Field(..., description="未实现盈亏")
217 realized_pnl: Decimal = Field(..., description="已实现盈亏")
218 timestamp: datetime = Field(..., description="时间戳")
221class PerformanceMetrics(BaseModel):
222 """性能指标"""
224 total_return: Decimal = Field(..., description="总收益率")
225 annualized_return: Decimal = Field(..., description="年化收益率")
226 max_drawdown: Decimal = Field(..., description="最大回撤")
227 sharpe_ratio: Decimal = Field(..., description="夏普比率")
228 win_rate: Decimal = Field(..., description="胜率")
229 total_trades: int = Field(..., description="总交易次数")
230 winning_trades: int = Field(..., description="盈利交易次数")
231 losing_trades: int = Field(..., description="亏损交易次数")
232 total_fees: Decimal = Field(Decimal("0"), description="总交易费用")
233 platform_fees: Decimal = Field(Decimal("0"), description="平台费用")
234 activity_fees: Decimal = Field(Decimal("0"), description="活动费用")
235 clearing_fees: Decimal = Field(Decimal("0"), description="交收费")
236 audit_fees: Decimal = Field(Decimal("0"), description="审计费用")
239class StrategyContext(BaseModel):
240 """策略执行上下文"""
242 user_id: str = Field(..., description="用户ID")
243 trading_session_id: str = Field(..., description="交易会话ID")
244 start_time: datetime = Field(..., description="开始时间")
245 current_time: datetime = Field(..., description="当前时间")
246 market_data_cache: Dict[str, Any] = Field(
247 default_factory=dict, description="市场数据缓存"
248 )
249 portfolio_cache: Optional[Dict[str, Any]] = Field(None, description="投资组合缓存")
250 trading_engine: Optional[Any] = Field(None, description="交易引擎实例")
251 quote_adapter: Optional[Any] = Field(None, description="行情数据适配器")
252 config: Dict[str, Any] = Field(default_factory=dict, description="配置信息")
255class MarketData(BaseModel):
256 """市场数据"""
258 symbol: str = Field(..., description="股票代码")
259 timestamp: datetime = Field(..., description="时间戳")
260 open: Decimal = Field(..., description="开盘价")
261 high: Decimal = Field(..., description="最高价")
262 low: Decimal = Field(..., description="最低价")
263 close: Decimal = Field(..., description="收盘价")
264 volume: int = Field(..., description="成交量")
265 is_market_open: bool = Field(default=True, description="市场是否开盘")
268class Order(BaseModel):
269 """订单模型"""
271 symbol: str = Field(..., description="股票代码")
272 side: OrderSide = Field(..., description="订单方向")
273 order_type: OrderType = Field(..., description="订单类型")
274 quantity: Decimal = Field(..., description="数量")
275 price: Optional[Decimal] = Field(None, description="价格")
276 session_id: str = Field(..., description="会话ID")
277 order_id: Optional[str] = Field(None, description="订单ID")
278 status: OrderStatus = Field(OrderStatus.PENDING, description="订单状态")
279 trading_fee: Optional[Dict[str, Any]] = Field(None, description="交易费用明细")
282class OrderResult(BaseModel):
283 """订单结果"""
285 order_id: str = Field(..., description="订单ID")
286 status: OrderStatus = Field(..., description="订单状态")
287 message: str = Field(..., description="消息")
288 filled_price: Optional[Decimal] = Field(None, description="成交价格")
289 filled_quantity: Optional[Decimal] = Field(None, description="成交数量")
290 trading_fee: Optional[Dict[str, Any]] = Field(None, description="交易费用明细")
293class Trade(BaseModel):
294 """成交记录"""
296 order_id: str = Field(..., description="订单ID")
297 symbol: str = Field(..., description="股票代码")
298 side: OrderSide = Field(..., description="交易方向")
299 quantity: Decimal = Field(..., description="成交数量")
300 price: Decimal = Field(..., description="成交价格")
301 timestamp: datetime = Field(..., description="成交时间")
302 commission: Decimal = Field(0, description="手续费(已废弃,使用trading_fee)")
303 trading_fee: Optional[Dict[str, Any]] = Field(None, description="交易费用明细")
306class Position(BaseModel):
307 """持仓信息"""
309 symbol: str = Field(..., description="股票代码")
310 quantity: Decimal = Field(..., description="持仓数量")
311 avg_price: Decimal = Field(..., description="平均成本价")
312 current_price: Decimal = Field(..., description="当前价格")
313 market_value: Decimal = Field(..., description="市值")
314 unrealized_pnl: Decimal = Field(..., description="未实现盈亏")
315 realized_pnl: Decimal = Field(0, description="已实现盈亏")
318class Portfolio(BaseModel):
319 """投资组合"""
321 total_value: Decimal = Field(..., description="总价值")
322 cash: Decimal = Field(..., description="现金")
323 positions: List[Position] = Field(default_factory=list, description="持仓列表")
324 unrealized_pnl: Decimal = Field(..., description="未实现盈亏")
325 realized_pnl: Decimal = Field(..., description="已实现盈亏")
328class RiskLimits(BaseModel):
329 """风险限制"""
331 max_position_ratio: float = Field(..., description="最大持仓比例")
332 stop_loss_ratio: float = Field(..., description="止损比例")
333 max_drawdown: float = Field(..., description="最大回撤")
334 allowed_symbols: List[str] = Field(..., description="允许交易的股票代码")
337class RiskResult(BaseModel):
338 """风险检查结果"""
340 is_valid: bool = Field(..., description="是否通过风险检查")
341 errors: List[str] = Field(default_factory=list, description="错误信息")
342 warnings: List[str] = Field(default_factory=list, description="警告信息")
345class RiskMetrics(BaseModel):
346 """风险指标"""
348 var_95: Decimal = Field(..., description="95% VaR")
349 var_99: Decimal = Field(..., description="99% VaR")
350 max_drawdown: Decimal = Field(..., description="最大回撤")
351 volatility: Decimal = Field(..., description="波动率")
352 beta: Decimal = Field(..., description="贝塔系数")
355class AccountBalance(BaseModel):
356 """账户余额"""
358 total_cash: Decimal = Field(..., description="总现金")
359 available_cash: Decimal = Field(..., description="可用现金")
360 frozen_cash: Decimal = Field(..., description="冻结现金")
361 currency: str = Field(..., description="货币类型")