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

1""" 

2交易相关数据模型 

3""" 

4 

5from datetime import date, datetime 

6from decimal import Decimal 

7from enum import Enum 

8from typing import TYPE_CHECKING, Any, Dict, List, Optional 

9 

10from pydantic import BaseModel, Field 

11 

12if TYPE_CHECKING: 

13 from core.models.broker import TradingFee 

14 

15 

16class TradingMode(str, Enum): 

17 """交易模式枚举""" 

18 

19 REALTIME = "realtime" # 实时交易 

20 BACKTEST = "backtest" # 回测 

21 

22 

23class AssetMode(str, Enum): 

24 """资产模式枚举""" 

25 

26 REAL = "real" # 真实资产 

27 SIMULATION = "simulation" # 模拟资产 

28 

29 

30class SessionStatus(str, Enum): 

31 """交易会话状态枚举""" 

32 

33 CREATED = "created" # 已创建 

34 RUNNING = "running" # 运行中 

35 PAUSED = "paused" # 已暂停 

36 STOPPED = "stopped" # 已停止 

37 COMPLETED = "completed" # 已完成 

38 

39 

40class OrderStatus(str, Enum): 

41 """订单状态枚举""" 

42 

43 PENDING = "pending" # 待处理 

44 FILLED = "filled" # 已成交 

45 CANCELLED = "cancelled" # 已取消 

46 REJECTED = "rejected" # 已拒绝 

47 

48 

49class OrderSide(str, Enum): 

50 """订单方向枚举""" 

51 

52 BUY = "buy" # 买入 

53 SELL = "sell" # 卖出 

54 

55 

56class OrderType(str, Enum): 

57 """订单类型枚举""" 

58 

59 LIMIT = "limit" # 限价单 

60 MARKET = "market" # 市价单 

61 

62 

63class RiskConfig(BaseModel): 

64 """风险配置""" 

65 

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 ) 

76 

77 

78class SessionConfig(BaseModel): 

79 """交易会话配置""" 

80 

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 ) 

92 

93 

94class TradingSessionCreate(BaseModel): 

95 """创建交易会话请求""" 

96 

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="可交易股票列表") 

113 

114 

115class TradingSessionUpdate(BaseModel): 

116 """更新交易会话请求""" 

117 

118 session_name: Optional[str] = Field(None, description="会话名称") 

119 status: Optional[SessionStatus] = Field(None, description="会话状态") 

120 risk_config: Optional[RiskConfig] = Field(None, description="风险配置") 

121 

122 

123class TradingSessionResponse(BaseModel): 

124 """交易会话响应""" 

125 

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="更新时间") 

151 

152 

153class TradingOrderCreate(BaseModel): 

154 """创建交易订单请求""" 

155 

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="交易费用明细") 

163 

164 

165class TradingOrderUpdate(BaseModel): 

166 """更新交易订单请求""" 

167 

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="交易费用明细") 

173 

174 

175class TradingOrderResponse(BaseModel): 

176 """交易订单响应""" 

177 

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="交易费用明细") 

193 

194 

195class PositionHistoryCreate(BaseModel): 

196 """创建持仓记录请求""" 

197 

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="已实现盈亏") 

205 

206 

207class PositionHistoryResponse(BaseModel): 

208 """持仓记录响应""" 

209 

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="时间戳") 

219 

220 

221class PerformanceMetrics(BaseModel): 

222 """性能指标""" 

223 

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="审计费用") 

237 

238 

239class StrategyContext(BaseModel): 

240 """策略执行上下文""" 

241 

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="配置信息") 

253 

254 

255class MarketData(BaseModel): 

256 """市场数据""" 

257 

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="市场是否开盘") 

266 

267 

268class Order(BaseModel): 

269 """订单模型""" 

270 

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="交易费用明细") 

280 

281 

282class OrderResult(BaseModel): 

283 """订单结果""" 

284 

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="交易费用明细") 

291 

292 

293class Trade(BaseModel): 

294 """成交记录""" 

295 

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="交易费用明细") 

304 

305 

306class Position(BaseModel): 

307 """持仓信息""" 

308 

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="已实现盈亏") 

316 

317 

318class Portfolio(BaseModel): 

319 """投资组合""" 

320 

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="已实现盈亏") 

326 

327 

328class RiskLimits(BaseModel): 

329 """风险限制""" 

330 

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="允许交易的股票代码") 

335 

336 

337class RiskResult(BaseModel): 

338 """风险检查结果""" 

339 

340 is_valid: bool = Field(..., description="是否通过风险检查") 

341 errors: List[str] = Field(default_factory=list, description="错误信息") 

342 warnings: List[str] = Field(default_factory=list, description="警告信息") 

343 

344 

345class RiskMetrics(BaseModel): 

346 """风险指标""" 

347 

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="贝塔系数") 

353 

354 

355class AccountBalance(BaseModel): 

356 """账户余额""" 

357 

358 total_cash: Decimal = Field(..., description="总现金") 

359 available_cash: Decimal = Field(..., description="可用现金") 

360 frozen_cash: Decimal = Field(..., description="冻结现金") 

361 currency: str = Field(..., description="货币类型")