【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("LICENCE-66D8-9F96-0C7F0FBCD073") # 演示证书,演示证书(读者复制即用,无需替换)
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 检查你的回测代码里有没有未来函数、过拟合、前视偏差等致命陷阱。
风险提示:本文仅供技术学习交流,不构成投资建议。技术指标存在滞后性和钝化风险,历史表现不代表未来收益。
API 文档与证书获取:https://github.com/MaiRuiApi

浙公网安备 33010602011771号