AI+量化实战
均线:
MACD:
【AI+量化实战 #06】金叉死叉只会看不会说?用LLM把技术指标翻译成交易语言
系列进度:AI+量化实战 #06 / 共 12 篇
痛点开场
做量化的人经常遇到这种情况:
- 自己看 K 线、看 MACD 能判断个大概;
- 但要把信号写成报告、讲给同事或客户听,却卡住了;
- 对方不是程序员,你跟他说"MA5 上穿 MA20",他眼神是懵的。
技术指标天然是"机器语言":金叉、死叉、红柱、绿柱、DIFF、DEA……对非技术背景的人极不友好。
LLM 在这里正好派上用场:把冰冷指标翻译成有上下文的投资语言。它不是替你决策,而是帮你把信号"说人话",降低团队沟通成本。
本文你将得到什么
stock_ma和stock_macd两个接口的字段说明。- 一段已跑通的代码:拉均线 + MACD → 判断金叉死叉/红绿柱 → 生成自然语言解释。
- 一个 LLM 解释 Prompt 模板(未配置 key 时自动回退到规则解释)。
- 6 只样本股的最新技术状态与"人话版"解释。
一、数据从哪来
均线:stock_ma
| 字段 | 含义 |
|---|---|
t |
日期 |
ma5 / ma10 / ma20 / ma60 |
对应周期均线 |
MACD:stock_macd
| 字段 | 含义 |
|---|---|
t |
日期 |
diff |
快线 |
dea |
慢线 |
macd |
柱状线(红绿柱) |
import mairui
import os
api = mairui.Client("<你的证书>") # 演示证书,请替换成你自己的正式证书
ma = api.stock_ma("600519")
macd = api.stock_macd("600519")
print(ma[-1]) # 最新日均线
print(macd[-1]) # 最新日 MACD
二、从指标到信号
信号计算的核心是比较"当前状态"和"前一天状态"。
MA 金叉 / 死叉
def ma_signal(prev, cur):
if cur["ma5"] > cur["ma20"] and prev["ma5"] <= prev["ma20"]:
return "golden_cross", "MA5 上穿 MA20,出现金叉"
if cur["ma5"] < cur["ma20"] and prev["ma5"] >= prev["ma20"]:
return "death_cross", "MA5 下穿 MA20,出现死叉"
if cur["ma5"] > cur["ma20"]:
return "bull_arrange", "MA5 在 MA20 上方,多头排列"
return "bear_arrange", "MA5 在 MA20 下方,空头排列"
MACD 红绿柱翻转
def macd_signal(prev, cur):
if cur["macd"] > 0 and prev["macd"] <= 0:
return "macd_bull_turn", "MACD 由负转正,柱状线翻红"
if cur["macd"] < 0 and prev["macd"] >= 0:
return "macd_bear_turn", "MACD 由正转负,柱状线翻绿"
if cur["macd"] > 0:
return "macd_bull", "MACD 红柱,多头动能占优"
return "macd_bear", "MACD 绿柱,空头动能占优"
三、把信号交给 LLM 翻译
Prompt 设计要点:给 LLM 角色、给数据、给输出约束。
你是一位量化策略研究员,正在给一位非技术背景的基金经理解释当前技术面状态。
股票:{name}
最新收盘价:{close:.2f} 元
日期:{date}
技术指标:
- MA5 = {ma5},MA20 = {ma20};{ma_desc}。
- MACD 柱状线 = {macd},DIFF = {diff},DEA = {dea};{macd_desc}。
请用 3 句话以内、通俗易懂的中文说明:
1. 当前股票处于什么技术状态?
2. 金叉/死叉/红绿柱变化分别代表什么含义?
3. 作为策略信号,需要注意哪些风险?
代码封装(缺 key 自动 fallback):
def explain_signal(prompt: str, ma_state: str, macd_state: str) -> str:
api_key = os.environ.get("LLM_API_KEY", "")
base_url = os.environ.get("LLM_BASE_URL", "")
if not api_key or not base_url:
# 规则化 fallback
if "golden_cross" in ma_state and "bull" in macd_state:
return "MA 与 MACD 同时转多,短期偏多;但需防范假突破与追高风险。"
if "death_cross" in ma_state and "bear" in macd_state:
return "MA 与 MACD 同时转空,短期偏空;需关注是否进入调整。"
if "bull" in macd_state:
return "动能偏多,但均线形态未确认金叉,属于多头中的震荡。"
return "动能偏空或处于震荡,未出现共振信号,宜观望。"
# 否则调用 LLM
...
四、真实运行结果
以 2026-08-12 收盘数据为例,6 只样本股的技术状态如下:
| 股票 | 收盘价 | MA 状态 | MACD 状态 | 规则化解释 |
|---|---|---|---|---|
| 贵州茅台 | 1343.00 | 多头排列 | 红柱 | 动能偏多,但均线形态未确认金叉,属于多头中的震荡。 |
| 五粮液 | 75.28 | 空头排列 | 红柱 | 动能偏多,但均线形态未确认金叉,属于多头中的震荡。 |
| 比亚迪 | 90.41 | 空头排列 | 绿柱 | 动能偏空或处于震荡,未出现共振信号,宜观望。 |
| 隆基绿能 | 13.14 | 多头排列 | 红柱 | 动能偏多,但均线形态未确认金叉,属于多头中的震荡。 |
| 招商银行 | 38.70 | 空头排列 | 绿柱 | 动能偏空或处于震荡,未出现共振信号,宜观望。 |
| 美的集团 | 84.34 | 死叉 | 绿柱 | MA 与 MACD 同时转空,短期偏空;需关注是否进入调整。 |
这里的关键不是"哪只股票该买",而是:把指标组合成一段能直接写进复盘报告里的解释。
比如贵州茅台,纯指标语言是:
MA5=1331.23,MA20=1316.73,MACD=1.508,DIFF=22.497,DEA=21.743
翻译后可以是:
当前股价位于短期均线上方,MACD 红柱显示多头动能仍占优;但尚未出现新的金叉,属于多头趋势中的震荡整理,追高风险可控但需观察量能配合。
五、常见坑
- 金叉死叉有滞后性:均线交叉发生在价格变化之后,不能作为领先指标。LLM 解释时要提示"这是趋势确认,不是预测"。
- 单一信号不可靠:MA 金叉但 MACD 绿柱,说明均线和动能背离,不能简单看多。
- 日线 vs 分钟线:本文用日线做演示,短线选手应换到 30 分钟/60 分钟周期。
- LLM 可能"脑补": Prompt 里要限制"只基于给定数据解释",避免 AI 编造未发生的事件。
- 历史不代表未来:任何技术信号都要配合仓位管理和止损,不能单押一个指标。
小结与下篇预告
今天我们做了三件事:
- 用
stock_ma/stock_macd拿到技术指标; - 用规则判断金叉死叉、红绿柱状态;
- 用 LLM Prompt 把指标翻译成普通人能听懂的投资语言,并保留规则 fallback。
下篇(#07)进入回测审计:让 LLM 检查你的回测代码里有没有未来函数、过拟合、前视偏差等致命陷阱。
风险提示:本文仅供技术学习交流,不构成投资建议。技术指标存在滞后性和钝化风险,历史表现不代表未来收益。



