feat: AI 自然语言选股(GLM)+ 全市场数据管道 + 远程 PostgreSQL
- 首页双入口(智能选股/策略回测):引入 vue-router,顶部导航 - 智能选股:自然语言 -> LLM 解析结构化条件(智谱 GLM,OpenAI 兼容,/v4 兼容)-> SQL 快照预筛 + pandas 指标过滤(复用 indicators 单一事实源) - 条件模型:指标 vs 常数/指标(value_indicator,如 DIF>DEA、close<布林下轨)、lookback+match 表达连续N天/近N天任一天、市值/PE/PB/换手率快照条件、默认排除 ST/退市/北交所 - 全市场数据同步:按 trade_date 批量拉取未复权日线(与回测 candles qfq 隔离),交易日历/股票列表本地缓存,daily_basic 仅最新截面,Tushare 限频兜底(分钟级重试/小时级降级) - 存储:DATABASE_URL 切远程 PostgreSQL(cirry.cn/stock),本地 SQLite 已移除 - .env 入库(私有仓库);smoke_test 扩展选股链路 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
@@ -3,6 +3,9 @@
|
||||
Candle 表设计与 TimescaleDB hypertable 完全兼容:将来在目标 PG 库执行
|
||||
SELECT create_hypertable('candles', 'ts');
|
||||
即可升级为时序表 + Continuous Aggregates 多周期预聚合,无需改表结构。
|
||||
|
||||
智能选股三表(stock_basic / market_daily / daily_snapshot)与回测 candles(qfq)
|
||||
完全隔离:选股用未复权日线按 trade_date 全市场批量落地,避免污染回测复权缓存。
|
||||
"""
|
||||
from datetime import datetime
|
||||
|
||||
@@ -55,3 +58,75 @@ class BacktestRun(Base):
|
||||
max_drawdown: Mapped[float] = mapped_column(Float, default=0.0)
|
||||
sharpe: Mapped[float] = mapped_column(Float, default=0.0)
|
||||
num_trades: Mapped[int] = mapped_column(Integer, default=0)
|
||||
|
||||
|
||||
class StockBasic(Base):
|
||||
"""A股股票列表(stock_basic 快照;选股展示名称、排除 ST/退市/北交所的依据)。"""
|
||||
__tablename__ = "stock_basic"
|
||||
|
||||
id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True)
|
||||
ts_code: Mapped[str] = mapped_column(String(12), unique=True, index=True) # 000001.SZ
|
||||
symbol: Mapped[str] = mapped_column(String(10), index=True) # 000001
|
||||
name: Mapped[str] = mapped_column(String(32))
|
||||
area: Mapped[str | None] = mapped_column(String(32))
|
||||
industry: Mapped[str | None] = mapped_column(String(32))
|
||||
market: Mapped[str | None] = mapped_column(String(32)) # 主板/创业板/科创板/北交所
|
||||
exchange: Mapped[str] = mapped_column(String(8)) # SSE/SZSE/BSE
|
||||
list_status: Mapped[str] = mapped_column(String(2), index=True) # L上市 D退市 P暂停
|
||||
list_date: Mapped[str] = mapped_column(String(8), default="")
|
||||
delist_date: Mapped[str | None] = mapped_column(String(8))
|
||||
|
||||
|
||||
class MarketDaily(Base):
|
||||
"""全市场未复权日线(选股专用,与回测 candles(qfq) 隔离)。
|
||||
|
||||
单位沿用 Tushare 原始:vol 手、amount 千元。
|
||||
"""
|
||||
__tablename__ = "market_daily"
|
||||
|
||||
id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True)
|
||||
trade_date: Mapped[datetime] = mapped_column(DateTime, index=True)
|
||||
ts_code: Mapped[str] = mapped_column(String(12), index=True)
|
||||
open: Mapped[float] = mapped_column(Float)
|
||||
high: Mapped[float] = mapped_column(Float)
|
||||
low: Mapped[float] = mapped_column(Float)
|
||||
close: Mapped[float] = mapped_column(Float)
|
||||
pre_close: Mapped[float] = mapped_column(Float)
|
||||
change: Mapped[float | None] = mapped_column(Float)
|
||||
pct_chg: Mapped[float | None] = mapped_column(Float) # 日涨跌幅 %
|
||||
vol: Mapped[float] = mapped_column(Float) # 手
|
||||
amount: Mapped[float] = mapped_column(Float) # 千元
|
||||
|
||||
__table_args__ = (
|
||||
UniqueConstraint("ts_code", "trade_date", name="uq_mkt_code_date"),
|
||||
)
|
||||
|
||||
|
||||
class DailySnapshot(Base):
|
||||
"""每日指标快照(daily_basic)。total_mv/circ_mv 单位万元(Tushare 原始),API 层换算亿元。"""
|
||||
__tablename__ = "daily_snapshot"
|
||||
|
||||
id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True)
|
||||
trade_date: Mapped[datetime] = mapped_column(DateTime, index=True)
|
||||
ts_code: Mapped[str] = mapped_column(String(12), index=True)
|
||||
close: Mapped[float | None] = mapped_column(Float)
|
||||
turnover_rate: Mapped[float | None] = mapped_column(Float) # 换手率 %
|
||||
turnover_rate_f: Mapped[float | None] = mapped_column(Float) # 自由流通换手率 %
|
||||
volume_ratio: Mapped[float | None] = mapped_column(Float) # 量比
|
||||
pe: Mapped[float | None] = mapped_column(Float)
|
||||
pe_ttm: Mapped[float | None] = mapped_column(Float)
|
||||
pb: Mapped[float | None] = mapped_column(Float)
|
||||
total_mv: Mapped[float | None] = mapped_column(Float) # 总市值(万元)
|
||||
circ_mv: Mapped[float | None] = mapped_column(Float) # 流通市值(万元)
|
||||
|
||||
__table_args__ = (
|
||||
UniqueConstraint("ts_code", "trade_date", name="uq_snap_code_date"),
|
||||
)
|
||||
|
||||
|
||||
class TradeCalendar(Base):
|
||||
"""交易日历缓存(trade_cal 拉取一次宽范围后本地维护,低积分 token 限频 1 次/小时)。"""
|
||||
__tablename__ = "trade_calendar"
|
||||
|
||||
id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True)
|
||||
trade_date: Mapped[str] = mapped_column(String(8), unique=True, index=True) # YYYYMMDD
|
||||
|
||||
Reference in New Issue
Block a user