AI不是股神?用大模型辅助量化研究的正确姿势与Prompt框架
系列进度:AI+量化实战 #01 / 共 12 篇
痛点开场
你是不是也干过这些事:
- 打开 ChatGPT/DeepSeek,直接问「贵州茅台还能买吗」,结果被一句「请咨询专业人士」打发了;
- 让 AI「预测明天哪只票涨停」,它一本正经给出一串代码,第二天全错;
- 拿到一份研报/财报,想快速抓住重点,却不知道怎么让 AI 真正读懂数字,而不是瞎编。
问题不在 AI,而在提问方式。大模型不是股神,也不会算命。把它当成「会读数据、会写摘要、会找逻辑漏洞的研究助理」,它才好用。
今天我们就从一只股票的量价数据出发,搭一个可复用的 Prompt 框架:角色限定 + 输入格式化 + 任务明确化 + 输出约束。让 AI 帮你把数据翻译成逻辑,而不是替你做梦。
本文你将得到什么
- 一个「把 LLM 当量化助理」的正确姿势:什么事该问、什么事不该问。
- 一套可直接复制的 Prompt 模板(角色 / 输入 / 任务 / 约束 四段式)。
- 一段已跑通的 Python 代码:拉取历史 K 线 → 算指标 → 生成 Prompt → 调用大模型(无 key 也能跑)。
- 三个 AI 量化里最常见的幻觉陷阱。
一、先摆正预期:LLM 能干什么、不能干什么
| 能干 | 不能干 |
|---|---|
| 把枯燥数据总结成可读摘要 | 预测明天股价涨跌 |
| 检查研报/财报里的逻辑矛盾 | 代替你下交易指令 |
| 把策略信号翻译成自然语言解释 | 保证策略实盘赚钱 |
| 帮你整理研究思路、写代码骨架 | 凭空编造未提供的财务数据 |
一句话:AI 是副驾驶,方向盘在你手里。
二、Prompt 四段式模板
下面这套模板我把它叫作「IT 化金融 Prompt」,专治 AI 瞎编和答非所问。
【角色限定】
你是一位拥有 X 年 A 股量化研究经验的金融数据分析师,擅长把量价数据翻译成可验证的投资逻辑摘要。
你的回答必须基于以下输入数据,不做股价预测,不提供买卖建议。
【输入格式化】
股票代码:{code}
股票名称:{name}
数据区间:{start} 至 {end},共 {n} 个交易日
最新收盘价:¥{close}
区间累计涨跌幅:{return}%
区间最大回撤:{drawdown}%
年化波动率:{volatility}%
20 日均线:¥{ma20}(最新价偏离 {pct20}%)
60 日均线:¥{ma60}(最新价偏离 {pct60}%)
【任务明确化】
请完成以下 3 项任务,每项用 2-4 句话:
1. 概括该股票在过去 n 个交易日的走势特征。
2. 基于均线位置,判断当前价格处于短期/中期趋势的什么位置,并说明这是否构成交易信号。
3. 列出 2-3 条投资者在看这段数据时最容易误读的陷阱。
【输出约束】
- 不输出买入/卖出/持仓建议。
- 不预测未来股价。
- 总字数控制在 250 字以内。
为什么这样写有效?
- 角色限定:让模型进入「分析师」模式,而不是「客服」模式。
- 输入格式化:把数据框死,防止它「脑补」不存在的信息。
- 任务明确化:把开放性问答拆成客观子任务,输出更可预期。
- 输出约束:提前卡死合规红线,避免它给投资建议。
三、Python 实战:从数据到 Prompt
3.1 环境准备
# 安装依赖(Python 3.8+)
pip install mairui pandas numpy requests
# 运行
python main.py
代码里需要两个环境变量:
MAIRUI_LICENCE:你的 API 证书(安装mairui后,参考 GitHub 仓库 了解获取方式)。LLM_API_KEY+LLM_BASE_URL:可选,接入 DeepSeek/OpenAI 兼容接口;未配置时脚本自动降级为规则化 demo 输出。
3.2 核心代码
import os
from datetime import datetime, timedelta
import numpy as np
import pandas as pd
import requests
import mairui
DEMO_CODE = "600519"
DEMO_NAME = "贵州茅台"
HISTORY_DAYS = 120
def fetch_history(api, code, days):
et = datetime.now()
st = et - timedelta(days=days * 2)
kline = api.stock_history(code, "d", "n", st=st.strftime("%Y%m%d"), et=et.strftime("%Y%m%d"))
df = pd.DataFrame(kline)
df["t"] = pd.to_datetime(df["t"])
df = df.sort_values("t").tail(days).reset_index(drop=True)
for col in ["o", "h", "l", "c", "v"]:
df[col] = pd.to_numeric(df[col], errors="coerce")
return df
def calc_metrics(df):
close = df["c"]
return {
"sample_start": df["t"].iloc[0].strftime("%Y-%m-%d"),
"sample_end": df["t"].iloc[-1].strftime("%Y-%m-%d"),
"days": len(df),
"latest_close": round(close.iloc[-1], 2),
"total_return_pct": round((close.iloc[-1] / close.iloc[0] - 1) * 100, 2),
"max_drawdown_pct": round((close / close.cummax() - 1).min() * 100, 2),
"annual_volatility_pct": round(close.pct_change().std() * np.sqrt(252) * 100, 2),
"ma20": round(close.rolling(20).mean().iloc[-1], 2),
"ma60": round(close.rolling(60).mean().iloc[-1], 2),
"price_vs_ma20_pct": round((close.iloc[-1] / close.rolling(20).mean().iloc[-1] - 1) * 100, 2),
"price_vs_ma60_pct": round((close.iloc[-1] / close.rolling(60).mean().iloc[-1] - 1) * 100, 2),
}
def build_prompt(code, name, metrics):
return f"""【角色限定】
你是一位拥有 10 年 A 股量化研究经验的金融数据分析师,擅长把量价数据翻译成可验证的投资逻辑摘要。
你的回答必须基于以下输入数据,不做股价预测,不提供买卖建议,只输出事实梳理与风险提示。
【输入格式化】
股票代码:{code}
股票名称:{name}
数据区间:{metrics['sample_start']} 至 {metrics['sample_end']},共 {metrics['days']} 个交易日
最新收盘价:¥{metrics['latest_close']}
区间累计涨跌幅:{metrics['total_return_pct']}%
区间最大回撤:{metrics['max_drawdown_pct']}%
年化波动率:{metrics['annual_volatility_pct']}%
20 日均线:¥{metrics['ma20']}(最新价偏离 {metrics['price_vs_ma20_pct']}%)
60 日均线:¥{metrics['ma60']}(最新价偏离 {metrics['price_vs_ma60_pct']}%)
【任务明确化】
请完成以下 3 项任务,每项用 2-4 句话:
1. 用一句话概括该股票在过去 {metrics['days']} 个交易日的走势特征(趋势/震荡/回撤修复)。
2. 基于均线位置,判断当前价格处于短期/中期趋势的什么位置,并说明这是否构成交易信号(明确说"不是信号"也可以)。
3. 列出 2-3 条投资者在看这段数据时最容易误读的陷阱(例如把波动当趋势、把回撤当利空等)。
【输出约束】
- 不输出买入/卖出/持仓建议。
- 不预测未来股价。
- 总字数控制在 250 字以内。
"""
def call_llm_or_fallback(prompt):
key = os.environ.get("LLM_API_KEY", "").strip()
base = os.environ.get("LLM_BASE_URL", "").rstrip("/")
model = os.environ.get("LLM_MODEL", "deepseek-chat")
if key and base:
resp = requests.post(
f"{base}/chat/completions",
headers={"Authorization": f"Bearer {key}", "Content-Type": "application/json"},
json={"model": model, "messages": [{"role": "user", "content": prompt}]},
timeout=60,
)
resp.raise_for_status()
return resp.json()["choices"][0]["message"]["content"]
# 未配置 key 时返回 demo 分析,保证脚本可运行
return "[LLM key 未配置,这里是规则化 demo 输出]\n..."
api = mairui.Client(os.environ["MAIRUI_LICENCE"])
df = fetch_history(api, DEMO_CODE, HISTORY_DAYS)
metrics = calc_metrics(df)
prompt = build_prompt(DEMO_CODE, DEMO_NAME, metrics)
answer = call_llm_or_fallback(prompt)
print(answer)
3.3 运行结果(真实输出)
以贵州茅台(600519)2026-02-09 至 2026-08-10 共 120 个交易日为例:
最新收盘价:¥1348.86
区间累计涨跌幅:-11.55%
区间最大回撤:-23.37%
年化波动率:23.93%
20 日均线:¥1305.56(偏离 +3.32%)
60 日均线:¥1269.04(偏离 +6.29%)
LLM 输出摘要(无 key 时 demo 输出):
- 过去 120 个交易日整体呈震荡下行,区间收益 -11.55%,最大回撤 -23.37%,属于波动可控但趋势不强的阶段。
- 当前价格位于 20 日均线上方、60 日均线上方;均线位置只说明历史强弱,不是入场或离场信号。
- 常见误读:把短期波动误判为趋势反转;把最大回撤当成未来下跌空间;把均线偏离当作超买超卖依据。
这段回答好在哪里?有数字、有定性、有否定、有警示,但没有一句投资建议。
四、三个常见坑
坑 1:直接问「明天涨不涨」
大模型是生成式 AI,不是预测式 AI。你问它明天涨跌,它要么拒绝回答,要么胡编。正确问法是:「基于这些数据,有哪些逻辑矛盾/误读陷阱?」
坑 2:不给数据,让它「看着办」
AI 会脑补。你不给具体财务数据,它就敢编。正确做法是:把数据格式化后贴进 Prompt,并加一句「所有结论必须基于以上输入数据」。
坑 3:把 AI 摘要当交易信号
AI 可以帮你「读得快」,但不能帮你「做决定」。交易信号必须来自你验证过的规则(比如双均线金叉、量价背离),AI 只能帮你解释信号、检查逻辑。
五、小结与下篇预告
今天我们做了一件小事:
- 摆正了 LLM 在量化研究中的位置;
- 搭了一个四段式 Prompt 框架;
- 用历史 K 线数据跑出了一个可复现的 demo。
下篇(#02)我们进入文本信号:用 Python 批量拉取 A 股公告,给公告标题打情绪标签,看看「利好公告」后面股价到底怎么走。
风险提示:本文仅供技术学习交流,不构成投资建议。历史数据不代表未来收益,据此操作风险自担。
API 文档与证书获取:https://github.com/MaiRuiApi



