"""公共配置 + 回测组合表(2026-09 重构)。 - `global_config`:全局唯一一行(id="default"),存费率/滑点/最低佣金/复权口径/基准。 - `backtest_combo`:回测组合,引用若干选股策略(strategy_ids JSON)+ 回测参数 (资金/持仓数/持仓天数区间/调仓时机/区间)。费率与复权不在此表 —— 运行时从 global_config 快照进归档的 config_snapshot,保证可复现。 """ from __future__ import annotations from datetime import date, datetime from sqlalchemy import Date, DateTime, Integer, Numeric, String, Text from sqlalchemy.orm import Mapped, mapped_column from app.infrastructure.persistence.sqlalchemy.base import Base class GlobalConfigModel(Base): __tablename__ = "global_config" id: Mapped[str] = mapped_column(String(32), primary_key=True) # 恒为 "default" commission_rate: Mapped[float] = mapped_column(Numeric(10, 6), default=0.0003) stamp_tax_rate: Mapped[float] = mapped_column(Numeric(10, 6), default=0.0005) slippage_rate: Mapped[float] = mapped_column(Numeric(10, 6), default=0.001) min_commission: Mapped[float] = mapped_column(Numeric(10, 4), default=5.0) price_adjustment: Mapped[str] = mapped_column(String(8), default="hfq") benchmark: Mapped[str] = mapped_column(String(16), default="000300.SH") updated_at: Mapped[datetime | None] = mapped_column(DateTime, nullable=True) class BacktestComboModel(Base): __tablename__ = "backtest_combo" id: Mapped[str] = mapped_column(String(32), primary_key=True) name: Mapped[str] = mapped_column(String(64), unique=True) description: Mapped[str] = mapped_column(String(300), default="") strategy_ids_json: Mapped[str] = mapped_column(Text) # JSON list[str] initial_capital: Mapped[float] = mapped_column(Numeric(20, 2), default=1_000_000.0) hold_count: Mapped[int] = mapped_column(Integer, default=20) hold_min_days: Mapped[int] = mapped_column(Integer, default=0) hold_max_days: Mapped[int | None] = mapped_column(Integer, nullable=True) rebalance_freq: Mapped[str] = mapped_column(String(12), default="monthly") start_date: Mapped[date] = mapped_column(Date) end_date: Mapped[date] = mapped_column(Date) version: Mapped[str] = mapped_column(String(16), default="1") created_at: Mapped[datetime] = mapped_column(DateTime)