Skip to content

v0.4.0 全市场自主选股

Choose a tag to compare

@oldfunk oldfunk released this 16 Oct 11:16
· 314 commits to main since this release

Paper Trading v0.4.0

全市场自主选股 + 面板手动触发 + 模型拉取开放化。生产已实跑验证(2026-10-16 收盘首日)。

核心:全市场选股漏斗(程序 + AI 共同选)

全市场 5527 只(母项目夜间量化筛选)
  ↓ 程序选:--pool-from auto(缺省)= screening Top20 → 观察池 → 手填 config 池(逐级降级)
候选 20 只
  ↓ AI 提名(pass1):写名称或 6 位代码,候选之外随便点,上限 picks_max(默认 5)
  ↓ 程序校验:母库全市场代码表解析 + A 股前缀 + 过滤指数/ETF + 去重 + 补齐 K 线
本轮决策范围 = 候选 ∪ 提名 → 风控钳制 → 成交
  • 手填池降级为兜底:auto 与 all 都不再叠加手填池(all = screening + watchlist)。
  • 提名不放宽风控:只是把股票放进候选范围,100 股倍数/单笔上限/日笔数/T+1/熔断一道不少。
  • fail-closed:LLM 坏 JSON、点名不存在的票、指数 ETF → 一律丢弃,退回"只用候选池"。
  • 不白花调用:提名放在新鲜守卫之后,没新行情就不调 LLM。
  • 可审计:ai:decide 流水记 n_picks 与提名清单。
  • 可关闭:--no-picks / agent.picks_enabled: false。

面板手动触发

定时队列每行末尾加「执行」按钮:立即跑该行动作(不占队列名额;交易无视今日已决策闸,风控不变;与 cron 共用运行锁防并发)。

模型拉取开放化

  • GET /api/llm/models 去掉口令门禁(只回模型 id,Key 不出本机);失败直接给可执行原因(未配置 / Key 被拒 401 / 超时 / 地址非法)。
  • Key 保存一次长期有效:重启不丢、换模型不用重填(文案与门禁单测锁定)。
  • 坏 JSON 请求体返回 400 + 真实原因(以前静默变空 body → 误导性报错)。

修问答幻觉

上下文里 positions(真持仓)与 recent_closes(池内行情)平级,模型会把池内股票当持仓。现:system 顶部置顶「当前真实持仓」权威段 + 4 条防幻觉硬规则 + context legend 逐 key 说明 + 用户侧附真实持仓切片。决策 prompt 也加了"不得声称买入未持有股票"。

定时机制加固

  • 队列消费改 slot 标记制(修 CI 红灯的双时钟错位:mock 时间 vs 落库时间曾让队列重放)。
  • 定时闸按日期查全天流水,不再依赖"最近 N 条"窗口(面板高频问答曾把决策挤出窗口致失忆重跑)。
  • 单测 hermetic:tests/conftest.py 每例切临时 cwd(本机 strategy.local.yaml 泄漏进断言的教训)。

工程质量

  • 62 → 70 单测(新增 picks/幻觉/模型拉取/JSON 校验/隔离),本地 + Pi 双端全绿。
  • 生产实跑(2026-10-16):16:45 分析提名 5 只 → 17:00 计划提名 2 只 → 17:15 成交 2 笔(盐湖股份、融捷股份各 100 股,T+1 冻结、费用正确)→ 17:30/17:45 队列跑完空转不重下单。

升级指引(下游 Stock Dashboard subtree)

git subtree pull --prefix paper_trading git@github-paper:oldfunk/paper-trading.git v0.4.0 --squash

注意:

  1. 面板新增「执行」按钮与定时队列行编辑,vendor 后硬刷页面;
  2. cron 若用 agent tick,建议去掉 --pool-from screening(缺省已是 auto,会自动择优并叠加 AI 提名);
  3. integration/universe.py 依赖母库 stock_snapshot 表(全市场代码表)做提名解析,独立运行(无母库)时退化为本地名称表匹配,不报错。