feat: 增加跨资产上下文与外围风险偏好输入

Author: ZhuLinsenCreated Jul 3, 2026Updated Jul 3, 2026
Labelsenhancementaifeat

背景

这个 issue 从 #1733 的“跨市场 / 跨资产上下文”方向拆出来,单独收敛成可执行 feature。

现在 DSA 已经能做个股分析、市场复盘、多市场支持、热点/行业/概念数据接入,也有部分 FX / 市场指数相关上下文。但个股报告里还缺一个稳定的“外围环境是否支持”的统一输入。

大白话:股票自己再好,如果美元、美债、原油、铜、黄金、纳指、VIX、A50、人民币汇率这些大环境正在反向压制,就不应该轻易给高置信买入。

想解决的问题

当前报告容易把个股放在相对孤立的环境里看,导致以下场景解释不够充分:

  • 有色股:铜、黄金大跌时,个股技术面强也需要降一档信心。
  • 石油化工:原油价格和裂解价差可能比单日 K 线更关键。
  • 港股:美元、美债、恒生科技、南向资金会明显影响风险偏好。
  • 科技成长:纳指、VIX、BTC 等风险资产信号会影响估值弹性。
  • A 股:A50、人民币汇率、北向资金、外围隔夜走势会影响开盘和情绪。
  • 组合层面:同一个账户如果同时暴露在汇率、商品、利率风险下,单只股票报告不应该完全无感。

现状

已有相关基础,但还没有统一契约:

  • README.md 和现有文档已经描述多市场分析、市场复盘、热点题材、Agent 分析等能力。
  • docs/full-guide.md 已有 sector_rankings / concept_rankings / belong_boards 等行业和概念上下文。
  • docs/analysis-context-pack.md 已经提到组合快照和 FX stale 信息。
  • 代码里已有多数据源、市场复盘、报告生成、Agent/DecisionSignal 等可挂载上下文的位置。
  • 但目前缺少一个明确的 CrossAssetContext:哪些资产要看、如何归一化、怎么注入报告和 Agent、源失败时如何降级、如何影响置信度。

相关 issue:

  • #1733:更大的长期增强方向。
  • #1909:市场结构 / 题材主线系统,偏 A 股内部结构。
  • #1903:后验复盘与 Agent 记忆,可后续消费跨资产 regime。

建议目标

新增一个跨资产上下文层,让个股分析、市场复盘、组合风险、Agent 和 DecisionSignal 都能消费同一份低敏摘要。

核心不是“堆更多行情数据”,而是回答:

  • 当前是 risk-on、neutral,还是 risk-off?
  • 这只股票所属行业最该关注哪些外部资产?
  • 外部资产现在是支持、拖累,还是信号不明?
  • 如果外部环境明显不支持,是否应该限制高置信 aggressive buy?

建议数据契约

可以先定义一个低敏、可缓存、可降级的结构,例如:

{
  "schema_version": "cross-asset-v1",
  "market": "cn|hk|us|jp|kr|tw",
  "trade_date": "YYYY-MM-DD",
  "risk_appetite": "risk_on|neutral|risk_off|unknown",
  "indices": {},
  "fx": {},
  "rates": {},
  "commodities": {},
  "crypto": {},
  "volatility": {},
  "sector_links": [],
  "impact_summary": "外部环境对本次分析的简短影响",
  "risk_tags": [],
  "data_quality": {}
}

说明:

  • risk_appetite 只给方向,不做交易指令。
  • indices/fx/rates/commodities/crypto/volatility 不要求全部有数据,按市场和可用数据填充。
  • sector_links 用来说明“这个股票为什么要看这些外部资产”。
  • data_quality 必须记录来源、更新时间、缺失字段、是否 stale。
  • Prompt 和报告里默认只注入摘要,不直接塞完整原始 payload。

分阶段实现建议

P0:定义契约和降级规则

  • 新增 CrossAssetContext schema / service 返回结构。
  • 明确字段含义、数据质量标记、缺失数据时的 fallback。
  • 默认 fail-open:外部数据源失败不能拖垮个股分析主流程。
  • 对旧 API / 旧报告保持兼容,新增字段优先可选。

P1:接入基础资产源

按可用性和稳定性逐步接入:

  • 指数:A50、沪深主要指数、恒生指数、恒生科技、标普、纳指、道指等。
  • 波动率:VIX 或等价风险偏好指标。
  • 汇率:USD/CNH、USD/HKD、组合已有 FX 缓存可复用的部分。
  • 利率:美国 10 年期国债收益率等,如数据源稳定再启用。
  • 商品:黄金、原油、铜,允许使用稳定 proxy 或 provider adapter。
  • Crypto:BTC / ETH 作为科技成长和风险偏好的可选输入。

所有来源都要记录 sourceas_ofstaleerror,不能静默伪装成有效数据。

P2:注入分析与 Agent

  • 在个股分析里增加“外围环境”低敏摘要。
  • 在 Agent reasoning 里加入问题:外部环境是否支持当前结论?
  • risk_appetite=risk_off 或关键外部资产明显反向时,应降低 aggressive buy 的置信度,或者要求报告写明为什么仍然可以例外。
  • 避免把跨资产信号写成硬规则,应该作为风控和置信度校准输入。

P3:报告和 Web 展示

  • 报告里增加简洁的“外围环境”模块。
  • Web 端可以展示:风险偏好、主要拖累/支持因素、行业关联资产、数据质量。
  • 不要把所有原始数据铺满页面,重点是解释“为什么它影响这只股票”。

P4:接入 DecisionSignal / 复盘

  • 在 DecisionSignal metadata 中记录:
    • cross_asset_version
    • risk_appetite
    • external_pressure
    • key_external_drivers
  • 后验复盘时可以按 risk-on / neutral / risk-off 分组,观察不同环境下建议质量。
  • 后续可与 #1903 的 Agent 记忆联动,让系统学会哪些外围信号真的有用。

非目标

  • 不做自动交易 / 下单。
  • 不承诺所有外部资产实时、全市场、全数据源覆盖。
  • MVP 不依赖付费数据源。
  • 不因为单个外部数据源失败而中断主分析。
  • 不把跨资产信号直接等同于买卖指令。

验收标准

  • 有明确的 CrossAssetContext 契约、数据质量字段和 fail-open 行为。
  • 至少覆盖 A 股 / 港股 / 美股三个市场的基础外围摘要。
  • 个股报告能说明外部环境是支持、拖累还是不明确。
  • 当外围环境明显 risk-off 时,高置信 aggressive buy 需要被降级,或在报告中给出清晰例外理由。
  • Web / API 对旧客户端保持兼容,新增字段可选。
  • 有 mock provider 单元测试覆盖数据成功、缺失、stale、provider 异常等路径。
  • 文档说明支持资产、字段语义、降级行为和限制。

可能影响的路径

  • data_provider/:跨资产 provider adapter / fallback。
  • src/services/:新增或扩展跨资产上下文服务。
  • src/core/src/analyzer.py:分析流程上下文注入。
  • src/agent/:Agent reasoning 输入。
  • src/services/decision_signal_*:信号 metadata 和后验统计。
  • api/v1/schemas/:历史报告或分析响应的可选字段。
  • apps/dsa-web/:报告页面展示外围环境模块。
  • docs/:字段契约、配置说明、CHANGELOG。

验证建议

  • 使用 mock 数据测试不同市场的 CrossAssetContext 生成。
  • 测试 provider 失败 / 超时 / stale 时主分析仍能继续。
  • 测试 risk-off 摘要能影响 prompt / decision metadata,而不是只展示在 UI。
  • 若改 Web,执行 cd apps/dsa-web && npm run lint && npm run build
  • 若改后端,执行 ./scripts/ci_gate.sh 或至少覆盖变更文件的 py_compile + 相关 pytest。

回滚方式

  • 新上下文字段默认可选,回滚时可关闭注入或移除展示,不影响旧报告读取。
  • provider 出问题时保留 fail-open,返回 risk_appetite=unknowndata_quality 警告。
  • 如果置信度 guardrail 误伤,可先保留展示层,临时关闭对 DecisionSignal 的约束。

Source: ZhuLinsen/daily_stock_analysis