|
139 | 139 | }, |
140 | 140 | } |
141 | 141 |
|
| 142 | +COMPANY_RISKS_ZH = { |
| 143 | + "AMD": "主要风险是 AI 加速器竞争强、客户订单兑现不及预期、毛利率波动,以及股价快速上涨后的回撤风险。", |
| 144 | + "AVGO": "主要风险是云厂商资本开支节奏放缓、定制芯片订单集中、软件整合不及预期,以及估值对 AI 需求预期较敏感。", |
| 145 | + "COIN": "主要风险是加密资产价格和交易量波动大、监管规则变化、手续费率下行,以及平台合规成本上升。", |
| 146 | + "CVX": "主要风险是油气价格回落、项目资本开支超预期、地缘政治和政策变化,以及能源股周期性回撤。", |
| 147 | + "DELL": "主要风险是 AI 服务器利润率偏低、订单转收入节奏不稳定、企业硬件需求周期波动,以及股价已反映较高增长预期。", |
| 148 | + "INTC": "主要风险是晶圆代工转型执行难度高、资本开支和现金流压力大、先进制程追赶不及预期,以及竞争格局仍然激烈。", |
| 149 | + "MSTR": "主要风险是比特币价格大幅波动、融资环境变化、资产净值溢价收缩,以及监管规则变化。", |
| 150 | + "MU": "主要风险是存储周期反转、HBM 供需和价格不及预期、客户集中度较高,以及强动量后的估值和回撤压力。", |
| 151 | + "NEE": "主要风险是利率上行压制公用事业估值、电网和新能源项目审批延迟、资本开支压力,以及电力需求兑现慢于预期。", |
| 152 | + "TSM": "主要风险是先进制程资本开支高、客户需求周期波动、地缘政治风险,以及 AI 芯片需求预期过高。", |
| 153 | + "VRT": "主要风险是数据中心建设节奏放缓、订单转收入和交付能力不及预期、液冷竞争加剧,以及估值已反映较高成长预期。", |
| 154 | + "XOM": "主要风险是油气价格回落、炼化利润收缩、地缘政治和政策变化,以及能源股周期性回撤。", |
| 155 | +} |
| 156 | + |
142 | 157 | EXCLUDED_THEME_PICK_SYMBOLS = { |
143 | 158 | "DIA", |
144 | 159 | "IWM", |
@@ -337,6 +352,14 @@ def company_profile(symbol: Any, name: Any = "") -> dict[str, str]: |
337 | 352 | } |
338 | 353 |
|
339 | 354 |
|
| 355 | +def company_risk_summary(symbol: Any) -> str: |
| 356 | + symbol_text = str(symbol or "").upper() |
| 357 | + return COMPANY_RISKS_ZH.get( |
| 358 | + symbol_text, |
| 359 | + "主要风险是行业需求不及预期、估值对增长假设较敏感、业绩兑现延后,以及股价波动带来的回撤。", |
| 360 | + ) |
| 361 | + |
| 362 | + |
340 | 363 | def normalize_ai_mapping(mapping: Any) -> dict[str, Any]: |
341 | 364 | if not isinstance(mapping, dict): |
342 | 365 | return {} |
@@ -925,7 +948,7 @@ def build_final_decisions( |
925 | 948 | "business_summary": profile["business"], |
926 | 949 | "prospect_summary": profile["prospect"], |
927 | 950 | "why_selected": dedupe(reasons), |
928 | | - "risk_summary": rec.get("risk_notes", ["需复核估值、财报、回撤和流动性。"])[0] if rec else "需复核估值、财报、回撤和流动性。", |
| 951 | + "risk_summary": company_risk_summary(symbol), |
929 | 952 | } |
930 | 953 | ) |
931 | 954 |
|
@@ -1054,26 +1077,11 @@ def build_advisory_report( |
1054 | 1077 | def render_markdown(report: dict[str, Any]) -> str: |
1055 | 1078 | cadence_label = CADENCE_LABELS_ZH.get(str(report["cadence"]), str(report["cadence"]).title()) |
1056 | 1079 | lines = [ |
1057 | | - f"# 量化模型推荐{cadence_label}复盘", |
1058 | | - "", |
1059 | | - f"- 日期: `{report['as_of']}`", |
1060 | | - f"- 模式: `{report['mode']}`", |
1061 | | - f"- 受众: `{report['audience_scope']}`", |
1062 | | - f"- AI 状态: `{report['summary']['ai_regime']}`", |
1063 | | - "", |
1064 | | - "## 政策边界", |
1065 | | - "", |
1066 | | - "- 允许下单: `false`", |
1067 | | - "- 允许组合配置: `false`", |
1068 | | - "- 允许个性化建议: `false`", |
1069 | | - "- 允许非个性化模型推荐: `true`", |
1070 | | - "- 允许账户级建议: `false`", |
| 1080 | + f"# 量化模型推荐{cadence_label}复盘 - {report['as_of']}", |
1071 | 1081 | "", |
1072 | 1082 | ] |
1073 | 1083 | final_decisions = report.get("final_decisions", {}) |
1074 | 1084 | if final_decisions: |
1075 | | - lines.extend(["## 本期最终结论", ""]) |
1076 | | - lines.append("- 口径: 以 AI信号仓库(AiLongHorizonSignalPipelines)和动量为主,政策/新闻事件用于提高置信度和提示风险。") |
1077 | 1085 | horizon_buckets = final_decisions.get("horizon_buckets", {}) |
1078 | 1086 | for horizon, label in (("short", "短线"), ("medium", "中线"), ("long", "长线")): |
1079 | 1087 | symbols = ", ".join(horizon_buckets.get(horizon, [])) or "暂无最终推荐" |
|
0 commit comments