写在前面
很多人用 DeepSeek、千问写股票研报,输出的都是一堆"建议审慎关注""行业景气度较高"这种废话。不是模型不行,是 Prompt 太粗糙。
我在做 多智能体 AI 股票分析 系统的过程中,光研报这一个环节就迭代了 20 多版 Prompt。这篇文章把最终可用的模板开源出来,以 2025Q1 贵州茅台为案例,演示从烂 Prompt → 可用 Prompt 的全过程。
完整茅台案例研报可以看这里 👉 AI 研报 Prompt
⚠️ 免责声明:本文所有研报输出片段(包括"中性偏谨慎""批价 2200 元"等表达)均为 Prompt 工程的方法论范例,仅用于演示提示词结构差异,不构成任何投资建议。涉及的财务数据为公开信息整理,市值 / 股价 / 批价等以发布当日实际行情为准。投资有风险,入市需谨慎。
一、烂 Prompt 长什么样
先看两个真实用户输入:
❌ 烂 Prompt v1
帮我分析一下贵州茅台。
输出结果:
贵州茅台是中国高端白酒龙头企业,拥有极强的品牌价值和稳定的现金流,建议长期关注。
这就是一段百度百科摘要,没有任何决策价值。
❌ 烂 Prompt v2
贵州茅台现在能买吗?给我买卖建议。
输出结果(合规模型直接拒答):
抱歉,我不能提供具体的股票买卖建议。
即使越狱成功,输出也是"建议逢低吸纳"这种不可验证的废话。
核心问题:模型没有数据、没有角色、没有输出结构,只能瞎编。
二、Prompt 三段式:角色 + 数据 + 输出规范
经过几十轮迭代,我收敛到一个固定结构:
┌─────────────────────────────┐
│ 第 1 段:角色(Role) │ → 锁定专业口吻
├─────────────────────────────┤
│ 第 2 段:数据(Context) │ → 喂真实财务 / 新闻
├─────────────────────────────┤
│ 第 3 段:输出规范(Schema)│ → 强制 9 小节 + 免责声明
└─────────────────────────────┘
每一段都不能省。缺角色 → 输出像小白;缺数据 → 纯瞎编;缺输出规范 → 结构散乱。
三、第 1 段:角色设定
烂写法:
你是一个股票分析师。
好写法(茅台案例):
你是一家头部券商(国泰君安级别)A 股消费组的资深研究员,
深耕白酒行业 10 年,擅长从预收款(合同负债)、
经销商打款意愿、茅台批价三条线索判断高端白酒基本面。
你的研报要被基金经理直接看,所以只讲事实和推理,不讲套话。
关键差异:
- 锁定行业(白酒不是泛消费)
- 锁定经验年限(10 年,会引用周期)
- 锁定读者(基金经理,不是散户)
- 锁定风格(只讲事实,拒绝套话)
这一段直接决定输出的"口吻",LLM 在后续 token 里会自动向这个画像靠拢。
四、第 2 段:结构化数据喂入
这是最容易被忽视的一段。没数据的 Prompt 再好也是瞎编。
以茅台 2025Q1 为例,我们用代码块把数据喂给模型:
【公司基本面】
- 股票: 贵州茅台(600519.SH)
- 行业: 白酒 - 高端
- 市值: 约 1.95 万亿
- 当前股价: 1552 元(2025-04-30)
【2025Q1 财务】
- 营收: 514.4 亿(同比 +10.7%)
- 归母净利: 268.5 亿(同比 +11.6%)
- 毛利率: 92.6%(同比 +0.3pct)
- 预收款(合同负债): 95.1 亿(同比 -18.2%)⚠️
【经销商数据】
- 2025Q1 经销商打款进度: 约 28%(去年同期 35%)
- 茅台飞天批价: 2180 元(2024 年高点 3050 元,累计 -28.5%)
【近 30 日催化】
- 2025-04-20: 集团层面表态"不压货"
- 2025-04-15: 部分经销商反馈配额被砍 5%
- 2025-03-30: 茅台 1935 批价跌破 800 元
⚠️ 重点:预收款下滑 -18% 这种"反常数据"一定要加 ⚠️ 符号,LLM 会自动把它拎出来重点分析。这是一个实测非常有效的 trick。
五、第 3 段:输出规范(Schema)
不给输出结构,LLM 会随心所欲地写。我们强制 9 小节:
请按以下 9 小节输出研报,每节 150~250 字,不要空话:
1. 一句话结论(看多 / 中性 / 看空,附核心理由)
2. 公司画像(业务结构、护城河、同业比较)
3. 最新财务拆解(用【数据】里的 2025Q1 数据)
4. 核心矛盾点(把预收款 -18% 这个⚠️展开讲)
5. 行业 β(白酒库存周期、消费降级影响)
6. 估值(PE / PB / DCF 保守估算)
7. 三大风险(不要写"市场波动"这种废话)
8. 三大催化(具体事件 + 预计时间窗口)
9. 免责声明(必须包含)
禁止:
- 禁止给出具体买入价、卖出价
- 禁止预测未来股价
- 禁止使用"建议关注""审慎看好"这类无信息量的词
- 每小节必须有至少 1 个来自【数据】的具体数字
三个关键约束:
- 字数范围:防止模型摸鱼(太短)或啰嗦(太长)
- 禁止项:比"请不要 XX"更有效的是列 ban 词清单
- 数据回引约束:强制每节引用【数据】里的数字 → 抑制幻觉
六、完整 Prompt 模板(可直接复用)
把上面三段拼起来,就是一份可以反复复用的研报 Prompt 模板:
# 角色
你是头部券商 A 股消费组资深研究员,深耕白酒行业 10 年...
# 数据(调用方按标的替换)
【公司基本面】...
【最新财务】...
【行业数据】...
【近 30 日催化】...
# 输出规范
请按 9 小节输出研报...
工程上把这段做成 Jinja2 模板,填充变量即可:
from jinja2 import Template
REPORT_PROMPT = Template("""
你是头部券商 A 股{{ sector }}组资深研究员,深耕 {{ sector }}行业 10 年,
擅长从 {{ key_indicators }} 三条线索判断{{ sector }}基本面...
【公司基本面】
- 股票: {{ stock_name }}({{ stock_code }})
- 行业: {{ sector }}
- 市值: {{ market_cap }}
- 当前股价: {{ price }}
【最新财务】
{{ financial_block }}
【近 30 日催化】
{{ news_block }}
请按 9 小节输出研报...
""")
prompt = REPORT_PROMPT.render(
sector="白酒",
key_indicators="预收款、经销商打款、批价",
stock_name="贵州茅台",
stock_code="600519.SH",
...
)
七、茅台案例的实际输出对比
以下表格为 Prompt 方法论范例,对比烂 / 好两种提示词的输出差异,不构成对贵州茅台或任何标的的投资建议。
同样的数据,烂 Prompt vs 好 Prompt 输出摘要:
| 小节 | 烂 Prompt 输出 | 好 Prompt 输出 |
|---|---|---|
| 结论 | "建议关注茅台长期价值" | "中性偏谨慎:基本面稳健但预收款 -18% 预示渠道库存压力未释放" |
| 财务 | "业绩稳健增长" | "Q1 营收 +10.7%、净利 +11.6%,但预收款从 116 亿降至 95 亿,意味着经销商打款意愿下降" |
| 风险 | "市场波动、政策风险" | "1) 批价跌破 2200 元若失守 → 渠道恐慌抛售;2) 1935 批价跌破成本线 → 利润率压力;3) 消费降级下宴席场景替代率提升" |
差距一目了然。好 Prompt 输出的内容,至少是一份能发到基金经理群里的研报雏形。
完整 9 小节范例见 👉 AI 研报 Prompt 茅台案例
八、踩坑总结(Prompt 工程专属)
坑 1:把数据写在 Prompt 结尾
LLM 对 Prompt 开头和结尾的 token 注意力最强,中间容易被"遗忘"。
解法:核心数据放在最后一个【】块里,紧贴输出规范。
坑 2:禁止项写成"尽量不要"
"尽量不要预测股价" → 模型照样预测。
解法:写死"禁止预测股价,违反此项输出视为无效"。
坑 3:小节标题用中文冒号 vs 英文冒号
中英混用会导致部分模型解析失败(尤其是小尺寸模型)。
解法:统一中文全角符号。
坑 4:温度设高了
研报类任务 temperature=0.3 比 0.7 稳定得多。
高温度适合创意写作,研报要可复现 → 低温度。
九、延伸:从单股研报到多智能体协作
单 Prompt 能写出一份还凑合的研报,但做不到:
- 基本面分析师 vs 技术派 vs 新闻派多视角
- 看多派 vs 看空派辩论
- 风控独立审查
想要更深度的拆解,可以参考多智能体协作的实现思路:把本文的研报 Prompt 当作"基本面分析师"角色,再组合技术 / 新闻 / 情绪 / 风控等角色,形成完整 pipeline。在线方法论笔记可见 nbstockai.com(仅供学习交流)。
结语
Prompt 工程在金融垂类的核心不是"魔法咒语",而是工程化:
- 角色 → 定口吻
- 数据 → 防幻觉
- 规范 → 保结构
把这三件事做扎实,即使换模型(DeepSeek、千问、Claude)也能稳定输出。
如果你也在做金融 / 法律 / 医疗等强垂类 LLM 应用,欢迎评论区交流你迭代 Prompt 的心路历程。