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