37 个算子(含 11 个行业专用)组合成 6-8 个章节,最终输出一个 0-100 分和买入/观望/回避建议。凭什么这个组合能打分?
算子层 (Operators) → 解决"看什么"
章节层 (Chapters) → 解决"看的顺序和依赖"
综合层 (Synthesis) → 解决"怎么想"和"怎么判断"
每个算子是一个分析镜头,强制 LLM 从特定维度审视标的:
| 算子 | 强制 LLM 回答的问题 |
|---|---|
| debt_structure | 这家公司的负债是"好债"还是"坏债"? |
| cycle_analysis | 现在是周期的哪个位置? |
| cash_trend_5y | 现金流趋势在改善还是恶化? |
| pe_trap_detection | 低 PE 是真便宜还是利润即将下滑? |
| safety_margin | 当前价格相对内在价值打了几折? |
算子的价值不在于产出一个分数,而在于保证 LLM 不遗漏关键维度。没有 pe_trap_detection,LLM 可能看到 PE=5 就直接说"便宜"。有了这个算子,它被迫分析利润是否可持续。
章节不是随意分组,而是编码了分析的认知顺序:
Ch01 数据核查 → 数据可信吗?不可信则后续分析无意义
Ch02 基本面 → 这是什么类型的公司?(决定后续用什么方法分析)
Ch03 现金流 → 利润是"真金白银"还是"纸面富贵"?
Ch04 估值 → 基于真实盈利能力,当前价格是否低估?
Ch05 压力测试 → 最坏情况下会怎样?
Ch06 投资决策 → 具体在什么价格买入/卖出?
这个顺序反映了价值投资的决策逻辑:先验证质量,再评估价格,最后做决策。
关键设计:后面的章节能看到前面的结论。Ch04 估值分析时能看到 Ch02 的流派判定和 Ch03 的现金流质量——这避免了"孤立估值"的错误。
这是当前最薄弱的环节,也是本设计要解决的。
一种诱人但错误的方案是把评分规则化:
# 错误方案:显式权重
dimensions:
- name: 财务安全
weight: 0.25
scoring: { 健康: 100, 危险: 0 }这实质上是把定性判断又变回了量化模型——用 LLM 给中间变量赋值,然后套公式算分。这样做:
- 失去了上下文相关的判断力 — "负债率 85% 但全是预收款"和"负债率 40% 但全是短期借款",规则模型给同样的分,LLM 能区分
- 退化为量化模型 — 和 PE<10 打高分没有本质区别,失去了项目的核心价值
- 不可进化 — 权重是人拍的,调参就变成炼丹
综合层的职责不是"算分",而是给 LLM 一个结构化的思考框架:
Step 1: 一票否决检查 — 有没有致命问题?
Step 2: 定性归类 — 这属于什么投资机会?
Step 3: 一致性裁决 — 各章结论是否互相矛盾?(新增)
Step 4: 核心矛盾 — 最可能亏钱的原因是什么?赚的是什么钱?
Step 5: 锚点校准 — 参照评分锚点,给出分数
Step 6: 输出结论 — 结构化 JSON
评分锚点不是公式,是校准参考——告诉 LLM"90 分的标的长什么样",让不同分析之间的分数可比。
framework:
synthesis:
# 思考步骤:引导 LLM 的推理路径
thinking_steps:
- step: 一票否决
instruction: |
检查是否触发以下任一条件(触发则直接回避,评分 ≤ 25):
- 数据不可信(Ch01 未通过初筛)
- 管理层诚信存疑或不可信
- 有息负债结构为"危险"且无改善迹象
- 审计意见非标准无保留
- step: 识别投资机会类型
instruction: |
基于 Ch02 流派判定,确认这是哪种投资机会:
- 纯硬收息:关注股息可持续性和派息率稳定性
- 价值发现:关注估值修复催化剂和安全边际
- 质量成长(GARP):关注ROE稳定性、成长持续性、估值合理性
- 烟蒂股:关注清算价值和资产变现可能
- 关联方资源:关注政策依赖度和可持续性
不同流派的评分侧重不同。
注意:回测显示"价值发现"流派12m胜率仅47%,需格外审慎评估催化剂的确定性。
- step: 一致性裁决
instruction: |
检查各章结论是否存在内部矛盾(回测显示此步骤对避免错误评分至关重要):
1. Ch01 初筛结论 vs Ch06 最终建议:若初筛为"观察/不通过",最终建议不得直接买入,除非后续章节提供了明确的推翻理由
2. 估值链一致性:买入价 < 正常价 < 卖出价?EV/FCF倍数方向与目标价方向一致?
3. 现金流 vs 估值:Ch03 判定现金流质量差,Ch04 不应给出激进的FCF估值
4. 压力测试 vs 建议:Ch05 压力测试未通过(0/3),不应给出买入建议
若发现核心矛盾且无法调和,评分上限为 65(观望),禁止进入买入区间。
- step: 核心矛盾
instruction: |
回答两个关键问题:
1. 这只股票最可能让我亏钱的原因是什么?(来自 Ch05 压力测试)
2. 如果买入,我赚的是什么钱?(估值修复 / 股息收入 / 业绩成长)
如果问题 1 的答案比问题 2 更有说服力,倾向回避。
回测验证:排雷能力的alpha贡献(回避组 -14.8pp vs 筛选池)大于选股能力(买入组 +6.4pp vs 筛选池)。宁可错过,不可错买。
- step: 评分与决策
instruction: 基于以上分析,参照评分锚点给出综合评分和最终建议。
# 评分锚点:校准参考,不是公式
scoring_rubric:
- range: "85-100"
description: "极度低估 + 现金流强劲 + 管理层可信 + 无重大风险 + 明确催化剂"
- range: "75-84"
description: "明确低估 + 基本面健康 + 风险可控 + 各章结论一致 → 买入区间"
- range: "50-74"
description: "有一定吸引力但存在明确疑虑(周期位置不确定、管理层存疑、章节间有矛盾)→ 观望"
- range: "30-49"
description: "风险收益不对称,下行风险大于上行空间 → 偏向回避"
- range: "0-29"
description: "重大风险、价值陷阱、或数据不可信 → 明确回避"
# 决策边界(回测优化:75分阈值 Sharpe 0.62 vs 70分 0.36)
decision_thresholds:
buy: 75 # ≥75 买入(回测验证的最优阈值)
watch: [30, 74] # 30-74 观望
avoid: 29 # ≤29 回避
# 输出字段定义(保留现有 synthesis_fields)
synthesis_fields:
- '流派判定: 纯硬收息 / 价值发现 / 质量成长(GARP) / 烟蒂股 / 关联方资源'
- '筛选评级: S级 / A级 / B级 / 未达标'
- '核心估值指标: EV/FCF倍数、安全边际'
- '苹果买卖模型: 正常价 / 买入价 / 卖出价'
- '一句话买入逻辑(强制): 可证伪的投资命题'
- '关键风险: Top 3-5 风险点'
- '管理人诚信评估: 可信 / 存疑 / 不可信'
- '最终建议: 买入 / 观望 / 回避'
- '综合评分: 0-100分'
- '信心水平: 高 / 中 / 低'strategy.yaml runtime.py
│ │
├── synthesis.thinking_steps → build_synthesis_prompt() 注入思考步骤
├── synthesis.scoring_rubric → build_synthesis_prompt() 注入评分锚点
├── synthesis.decision_thresholds → build_synthesis_prompt() 注入决策边界
└── synthesis_fields → build_synthesis_prompt() 注入输出字段
run_blind_analysis() build_synthesis_prompt()
│ │
├── chapter_texts (完整分析文本) → 各章推理过程 + 数据引用(优先)
└── chapter_outputs (JSON) → 结构化结论字段(回退)
StrategyConfig 提供 getter 方法,runtime.py 的 build_synthesis_prompt() 读取配置并组装 prompt。
信息传递:synthesis 默认接收每章的完整分析文本(包括推理过程和数据引用),而不仅是提取出的 JSON 字段。这确保最终综合研判基于完整论据做出,而非仅凭标签摘要。Token 消耗增加约 12k-24k(6 章完整文本),在 GPT-4o 128k 上下文内完全可承受。
- 算子管"看什么",synthesis 管"怎么想",评分留给 LLM 判断力
- 思考步骤是认知框架,不是计算公式 — 引导推理路径,不限定结论
- 评分锚点是校准工具,不是权重矩阵 — 让不同标的的分数可比较
- 所有引导逻辑在 YAML 中配置 — 修改不需要动引擎代码
- 一票否决是唯一的硬规则 — 其余全部交由 LLM 在上下文中权衡
- 排雷优先于选股 — 回测证明回避信号的 alpha 贡献大于买入信号(回避组 -14.8pp vs 买入组 +6.4pp 相对筛选池)。宁可错过好股票,不可买入坏股票
- 一致性裁决是第二道硬规则 — 章节间核心结论矛盾时,禁止进入买入区间
回测验证后如果发现系统性偏差(如"观望区没有区分度"、"周期股一律低分"),改进路径是:
- 调整
thinking_steps的 instruction(如增加"周期股特殊考量"步骤) - 调整
scoring_rubric的描述(如细化"50-69 观望"区间的特征) - 新增算子(如
macro_environment)提供更多分析维度 - 调整章节的算子组合
全部通过修改 YAML 和 .md 文件完成,无需修改引擎代码。
| 维度 | v6 早期 | 当前(已实现) |
|---|---|---|
| 思考引导 | 无("请给 0-100 分") | 6 步结构化思考(含一致性裁决) |
| 评分校准 | 无 | 5 级锚点描述 |
| 一票否决 | 无(LLM 自行判断) | 显式列出 4 种否决条件 |
| 决策边界 | 隐含(LLM 自行决定) | 显式定义 buy/watch/avoid 阈值 |
| 配置位置 | synthesis_fields 10 条文本 | synthesis 结构化配置 |
| 可调性 | 改文本 | 改步骤/锚点/阈值,粒度更细 |
三层评分体系在 119 只股票 × 12 个截面(2020-2025)的回测中验证有效。
| 评分档 | 样本数 | 6m平均收益 | 6m胜率 | 12m平均收益 | 12m胜率 |
|---|---|---|---|---|---|
| <40 回避 | 24 | -5.3% | 33% | -4.9% | 38% |
| 40-55 弱观望 | 30 | +0.3% | 47% | -1.7% | 47% |
| 55-70 观望 | 31 | +2.7% | 52% | +5.5% | 58% |
| 70-85 买入 | 33 | +8.9% | 70% | +17.2% | 70% |
每一档收益和胜率严格递增,无倒挂。
| 指标 | 数值 | 解读 |
|---|---|---|
| Spearman IC | 0.271 | 专业量化因子通常 0.03-0.08,Agent 评分是 3-5 倍 |
| IC > 0 比例 | 92% (11/12期) | 仅 2021H1 为负(-0.612,政策冲击期) |
| IR (IC均值/标准差) | 0.94 | 信号稳定性好 |
| 买入-回避 12m 差 | 21.2pp | 统计显著 |
| 评分体系 | vs 6m收益 Spearman |
|---|---|
| Agent 评分 | 0.271 |
| 量化 tier_score | 0.043 |
| Agent 与量化相关性 | 0.355(低相关 → 信息互补) |
Agent 评分捕捉了量化因子看不到的定性信息(管理层、政策、商业模式判断),且这些信息有真实预测力。
| 阈值 | 选中数 | 6m收益 | 胜率 | Sharpe |
|---|---|---|---|---|
| 70 | 43 | 8.1% | 65% | 0.36 |
| 75 | 27 | 12.5% | 74% | 0.62 |
| 80 | 9 | 4.1% | 56% | 0.19 |
75 分是最优阈值:Sharpe 翻倍,胜率从 65% 提升至 74%。80 分以上样本不足,统计不可靠。
12 个月维度:
- 买入组 vs 筛选池:+6.4pp
- 回避组 vs 筛选池:-14.8pp
- 排雷贡献是选股贡献的 2.3 倍 — 系统的最大价值在于排除坏股票
| 流派 | 样本 | 12m收益 | 12m胜率 |
|---|---|---|---|
| 纯硬收息+价值发现 | 4 | +38.4% | 100% |
| 纯硬收息 | 31 | +7.4% | 58% |
| 价值发现 | 62 | +0.0% | 47% |
"价值发现"流派表现最弱(12m 胜率仅 47%),需在综合层对该流派的催化剂确定性提出更高要求。
- 2021H1 唯一翻车期(IC = -0.612):教育/互联网政策冲击导致评分系统失效,与政策风险算子当时过于薄弱有关(已在 v2 算子优化中加强)
- 样本量有限:119 只股票 × 12 期,统计显著但置信区间较宽
- "价值发现"流派拖累:占比最大(62/119)但贡献最低,需收紧准入或加强催化剂验证
文档版本: v3.0 更新日期: 2026-03-18 关联文档: docs/design/agent.md, docs/design/operators.md