跳转至

改进路线图(Roadmap)

更新:2026-10-02。承接 docs/Token控制改进方案.md 的调研结论,将全项目可改进方向收敛为一份可执行清单。 每条给出目标、优先级与验收方式;已完成的条目在 CHANGELOG 中留痕。

上游对齐(TradingAgents v0.4.x)

上游 TauricResearch/TradingAgents 在 v0.4.0~v0.4.2(2026-08-31 ~ 09-07)几乎没有 新增功能,全部在做正确性,主线就是前视偏差与决策可信度。我们已完成同源修复, 详见 docs/前视偏差防护.md:

# 方向 状态
A1 交易记忆时间点门控(get_past_context(as_of=...)) ✅ 已落地
A2 向量记忆检索日期门控(TF-IDF 排序前过滤 + chroma where + 兜底) ✅ 已落地
A3 反思闭环持有窗口按交易日判定 + 平仓日作为落地日 ✅ 已落地
A4 新闻窗口:未来/无日期条目保守丢弃,筛空不退回全量 ✅ 已落地
A5 评级解析不出来 → 「待复核」,不再静默降级成「持有」 ✅ 已落地
A6 Trader 拿到技术面报告 + 绝对价位约束 ✅ 已落地
A7 研究经理/组合经理「证据不足→持有」裁决纪律 ✅ 已落地
A8 VendorError 层级 + 软失败串也触发换源 ✅ 已落地
A9 基本面「当期快照」泄漏(上游 #1300) ✅ 已落地
A10 若接入带 vintage 的宏观源,vintage 必须钉在 as-of 日 ⏳ 未接入该源

P0 — 性能与成本

# 方向 现状 行动 验收
1 统一系统提示词前缀(Token 策略 2B) ✅ 已完成(68f7d0f) — guard tests 通过
2 分层模型路由(Token 策略 1) ✅ 节点级路由已存在:辩手→heavy、研究经理+交易员+风控→standard、分析师→quick、基金经理→deep;信号提取为规则引擎(0 Token) 剩余:TASK_COMPLEXITY_MAP 显式常量化供文档引用 映射常量 + 文档一致
3 摘要式上下文传递(Token 策略 2A) ✅ 全面完成:研究员侧 _compress_prose() 确定性摘要 + 基金经理侧 _build_decision_matrix() 决策矩阵(0 额外 token) tests/test_context_digest.py + tests/test_pm_matrix.py
4 语义缓存(Token 策略 3) ✅ llm_clients/semantic_cache.py(TTL+LRU+归一化key+0.92 相似度),默认关闭挂在 _safe_invoke 复现实验:同股同日重复分析命中率统计

P1 — 能力边界

# 方向 说明
5 MCP server 化 ✅ 零依赖 mcp_server.py:analyze_stock / list_snapshots / get_snapshot / read_recent_memories,stdio NDJSON 协议含端到端测试
6 外部校准接入 跟踪可公开结算、与 A 股个股评级可比的第三方记分板(已知候选:Headline Arena,见 issue #1)。试点支撑已落地(external_calibration/ + scripts/external_calibration.py + docs/外部校准接入.md):只读拉取公开机械结算并写入独立台账(带 source: external_headline_arena,与内部交易记忆物理隔离),与提交前冻结的本地判断配对成两条线比对报告。未做:自动提交预测(按约定试点期人工提交)、接入反思闭环主流程。验收:issue #1 的两周比对数据
7 回测复盘 MCP 工具 ✅ review_backtest 工具接入 scripts/review_backtest.py(days/report 参数)
8 数据源容灾 ✅ 换源触发条件补齐(异常 + [ERROR] 软失败串),错误类型化(dataflows/errors.py),缺 key 降为 debug 级、限流为 warning@tests/test_dataflows_vendor_errors.py(35 项)
8b 基本面当期快照泄漏(A9) ✅ point_in_time.report_is_known(公告日精确、退回法定披露截止日)+ 四个基本面工具的运行日由 InjectedState("trade_date") 注入:Tushare 按 ann_date/trade_date 过滤、akshare 按报告期+公告日过滤并隐去当期市值/股本快照、妙想无可判定报告期则抛 VendorError 换源;实时运行不门控@tests/test_fundamentals_pointintime.py(25 项)+tests/test_point_in_time.py(+24 项)
8c 监控层(盯盘与告警) ✅ monitor/ 包:规则 DSL(8 类,支持按标的覆盖)+ 轮询引擎(交易时段门控、冷却去重、JSONL 台账)+ 8 通道通知(企业微信/钉钉/飞书/Server酱/PushPlus/Bark/webhook/console)+ astock-trader watch 子命令。实时行情源 dataflows/realtime_data.py(腾讯主源+新浪兜底,免 Key,历史日期硬拒绝)。设计依据见 docs/监控层与数据源扩展.md@tests/test_monitor.py + tests/test_realtime_data.py。未做:异动触发深度分析、每日触发上限、交易日历、TTL 缓存
8d 数据广度:GDELT 全球新闻 ✅ dataflows/gdelt_data.py(免 Key,DOC 2.0 API),作为 get_global_news 第三顺位接入路由表;查询上界钉死在分析日(时点门控)+ 客户端 5 秒节流。已知限制:DOC API 只索引最近约 3 个月;共享出口 IP 会被他人拖成 429@tests/test_gdelt_data.py(20 项)
8e 行情源容灾:日线三源 fallback ✅ 东方财富 → 新浪 → 腾讯依次尝试,表头回写实际出数的源。东财按出口 IP 做服务端拦截(UA/Referer/TLS 指纹均无效,akshare #6100/#7098),此前单源一挂整条技术面就没有输入。三源列名/单位不同,统一归一化为 volume(手) / turnover(元)(腾讯 1.18.x 的 amount 列实为成交量、≥1.19 才改语义,按列名结构判别)@tests/test_ohlcv_fallback.py(31 项)
8f 工具封装与 vendor 签名一致性守卫 ✅ tests/test_tool_signatures.py:把每个工具真实路由到的 vendor 函数取出来逐参数比对。get_indicators 的封装从首次提交起就传着 vendor 不存在的 start_date/end_date,技术分析师一次都没拿到过均线/MACD/RSI/BOLL —— 这个形状在原有 600+ 项测试里完全没有覆盖,因为它只在真正调用时才炸
8g 辩论历史被嵌套状态覆盖 ✅ graph/setup.py::_merge_debate。LangGraph 不对嵌套 TypedDict 应用 reducer(子字典按 LastValue 整体替换),而辩论顺序是 Bull→Bear→Bull→主管,于是主管只看到最后一轮多头、空头论据被冲掉,实测中出现「本次空头未提交论据」并由主管代拟空方立场。前提已用最小 StateGraph 钉死在 tests/test_debate_state_merge.py
8h 统一落盘根目录 ✅ paths.resolve_project_dir()(ASTOCK_HOME → D:\astock_trader → ~/.astock_trader)+ default_config.derive_paths()。此前 ~/.astock_trader 硬编码在九个模块里,改根要动九处、漏一处就是半迁移状态;报告目录缺省空串导致默认根本不生成报告,一并改为默认写 <项目根>/reports/@tests/test_paths.py(17 项)

P2 — 生态与体验

# 方向 说明
9 Skills 扩展 龙虎榜解读 ✅、行业对比解读 ✅(skills/);候选:同板块轮动对比(已含于 W3 提示维度,升级版待议)
10 CI 工作流 ✅ .github/workflows/ci.yml 已存在(ruff + pytest 矩阵 3.10/3.11/3.12)
11 国际化 README 英文精简版 + 术语表(买入/增持/持有/减持/卖出 ↔ buy/overweight/hold/reduce/sell)
12 文档站 ✅ mkdocs-material + Pages 工作流(cf19d28);需在仓库 Settings→Pages 选择 GitHub Actions 源一次
13 前视偏差防护专题文档 ✅ docs/前视偏差防护.md:五道门的判据、错误层级契约、新增数据源检查清单、已知缺口

已搁置/不做

  • Headline Arena 自动提交预测(题域错位、数据出境依赖;试点期改由人工提交,代码层只做记录与比对)——issue #1
  • 把外部结算结果直接写入内部交易记忆(违反来源隔离约束 3:两套证据必须分开存放)