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:定义契约和降级规则
- 新增
CrossAssetContextschema / service 返回结构。 - 明确字段含义、数据质量标记、缺失数据时的 fallback。
- 默认 fail-open:外部数据源失败不能拖垮个股分析主流程。
- 对旧 API / 旧报告保持兼容,新增字段优先可选。
P1:接入基础资产源
按可用性和稳定性逐步接入:
- 指数:A50、沪深主要指数、恒生指数、恒生科技、标普、纳指、道指等。
- 波动率:VIX 或等价风险偏好指标。
- 汇率:USD/CNH、USD/HKD、组合已有 FX 缓存可复用的部分。
- 利率:美国 10 年期国债收益率等,如数据源稳定再启用。
- 商品:黄金、原油、铜,允许使用稳定 proxy 或 provider adapter。
- Crypto:BTC / ETH 作为科技成长和风险偏好的可选输入。
所有来源都要记录 source、as_of、stale、error,不能静默伪装成有效数据。
P2:注入分析与 Agent
- 在个股分析里增加“外围环境”低敏摘要。
- 在 Agent reasoning 里加入问题:外部环境是否支持当前结论?
- 当
risk_appetite=risk_off或关键外部资产明显反向时,应降低 aggressive buy 的置信度,或者要求报告写明为什么仍然可以例外。 - 避免把跨资产信号写成硬规则,应该作为风控和置信度校准输入。
P3:报告和 Web 展示
- 报告里增加简洁的“外围环境”模块。
- Web 端可以展示:风险偏好、主要拖累/支持因素、行业关联资产、数据质量。
- 不要把所有原始数据铺满页面,重点是解释“为什么它影响这只股票”。
P4:接入 DecisionSignal / 复盘
- 在 DecisionSignal metadata 中记录:
cross_asset_versionrisk_appetiteexternal_pressurekey_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=unknown和data_quality警告。 - 如果置信度 guardrail 误伤,可先保留展示层,临时关闭对 DecisionSignal 的约束。
Source: ZhuLinsen/daily_stock_analysis