Skip to content

Latest commit

 

History

History
283 lines (218 loc) · 13.4 KB

File metadata and controls

283 lines (218 loc) · 13.4 KB

评分哲学:从算子到综合研判

核心问题

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 给中间变量赋值,然后套公式算分。这样做:

  1. 失去了上下文相关的判断力 — "负债率 85% 但全是预收款"和"负债率 40% 但全是短期借款",规则模型给同样的分,LLM 能区分
  2. 退化为量化模型 — 和 PE<10 打高分没有本质区别,失去了项目的核心价值
  3. 不可进化 — 权重是人拍的,调参就变成炼丹

正确的做法:引导思考过程

综合层的职责不是"算分",而是给 LLM 一个结构化的思考框架

Step 1: 一票否决检查   — 有没有致命问题?
Step 2: 定性归类       — 这属于什么投资机会?
Step 3: 一致性裁决     — 各章结论是否互相矛盾?(新增)
Step 4: 核心矛盾       — 最可能亏钱的原因是什么?赚的是什么钱?
Step 5: 锚点校准       — 参照评分锚点,给出分数
Step 6: 输出结论       — 结构化 JSON

评分锚点不是公式,是校准参考——告诉 LLM"90 分的标的长什么样",让不同分析之间的分数可比。

设计:综合研判配置

strategy.yaml 中的 synthesis 配置

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.pybuild_synthesis_prompt() 读取配置并组装 prompt。

信息传递:synthesis 默认接收每章的完整分析文本(包括推理过程和数据引用),而不仅是提取出的 JSON 字段。这确保最终综合研判基于完整论据做出,而非仅凭标签摘要。Token 消耗增加约 12k-24k(6 章完整文本),在 GPT-4o 128k 上下文内完全可承受。

设计原则

  1. 算子管"看什么",synthesis 管"怎么想",评分留给 LLM 判断力
  2. 思考步骤是认知框架,不是计算公式 — 引导推理路径,不限定结论
  3. 评分锚点是校准工具,不是权重矩阵 — 让不同标的的分数可比较
  4. 所有引导逻辑在 YAML 中配置 — 修改不需要动引擎代码
  5. 一票否决是唯一的硬规则 — 其余全部交由 LLM 在上下文中权衡
  6. 排雷优先于选股 — 回测证明回避信号的 alpha 贡献大于买入信号(回避组 -14.8pp vs 买入组 +6.4pp 相对筛选池)。宁可错过好股票,不可买入坏股票
  7. 一致性裁决是第二道硬规则 — 章节间核心结论矛盾时,禁止进入买入区间

与框架进化的关系

回测验证后如果发现系统性偏差(如"观望区没有区分度"、"周期股一律低分"),改进路径是:

  1. 调整 thinking_steps 的 instruction(如增加"周期股特殊考量"步骤)
  2. 调整 scoring_rubric 的描述(如细化"50-69 观望"区间的特征)
  3. 新增算子(如 macro_environment)提供更多分析维度
  4. 调整章节的算子组合

全部通过修改 YAML 和 .md 文件完成,无需修改引擎代码。

对比(v6 早期 vs 当前)

维度 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 统计显著

Agent 评分 vs 量化因子

评分体系 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 分以上样本不足,统计不可靠。

Alpha 来源拆解

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