【AI+量化实战 #10】趋势还是震荡?用 LLM 把市场状态变成一句话
风险提示:本文仅用于技术演示,不构成投资建议。市场状态分类只是研究辅助,不能替代独立判断。
你看完行情,脑海里会先冒出一个词:「今天市场是趋势、震荡,还是恐慌?」
这个判断听起来很主观,但其实可以结构化:宽基指数的同向性、涨跌幅大小、板块内部的离散度,都是可量化的信号。今天的文章教你把这些信号喂给 LLM,让它用一句话说出当前市场状态。
本文你将得到什么
- 一套把市场数据映射成状态标签的规则;
- 一段可直接运行的 Python 脚本,自动判断趋势/震荡/恐慌/分化;
- 规则分类 + LLM 增强两种模式;
- 一个 Prompt 模板,可直接接入你自己的大模型。
一、为什么需要状态分类
不同市场状态下,策略的适用性完全不同:
- 趋势市:动量策略、趋势跟踪更有效;
- 震荡市:均值回归、高抛低吸相对占优;
- 恐慌市:风控优先,止损和仓位管理比选股更重要;
- 分化市:指数没方向,但结构有机会,需要看板块。
如果你每天能先用一句话定下「市场状态」,后面的选股、择时、仓位判断都会更清晰。
二、状态分类的输入信号
我们选取两类信号:
- 宽基指数:看市场整体方向和同向性;
- 热门板块:看结构是否一致、离散度大不大。
2.1 宽基指数
INDEX_CODES = {
"000001.SH": "上证指数", "000016.SH": "上证50",
"000300.SH": "沪深300", "000905.SH": "中证500",
"399001.SZ": "深证成指", "399006.SZ": "创业板指",
}
index_rows = []
for code, name in INDEX_CODES.items():
snap = client.index_real_time(code=code)
index_rows.append({"code": code, "name": name, "pc": snap["pc"]})
2.2 板块离散度
对板块成分股批量拉行情,计算:
-
平均涨跌幅;
-
上涨家数占比;
-
涨跌幅标准差(离散度)。
detail = client.sector_detail(sector_name="GN半导体")
stocks = detail["stocks"][:20]
codes = [s["dm"].split(".")[0] for s in stocks]
records = client.stock_ssjy_more(stock_codes=",".join(codes))pcs = [r["pc"] for r in records]
avg_pc = sum(pcs) / len(pcs)
up_ratio = sum(1 for x in pcs if x > 0) / len(pcs)
std = pd.Series(pcs).std()
示例输出:
板块 平均涨跌幅% 上涨占比% 离散度%
半导体 +0.80 50.0 2.67
人工智能 -0.38 20.0 1.58
新能源 -2.14 20.0 2.78
机器人 -1.44 15.0 2.69
低空经济 +0.04 35.0 1.93
离散度越大,说明板块内部越分歧;离散度小,说明板块内部方向一致。
三、规则层分类:先让机器自己判断
在调用 LLM 之前,先用规则给状态打一个初判:
def rule_classify(index_rows, sectors):
pcs = [r["pc"] for r in index_rows]
avg = sum(pcs) / len(pcs)
up = sum(1 for x in pcs if x > 0)
down = len(pcs) - up
max_abs = max(abs(x) for x in pcs)
sector_std = [s["std"] for s in sectors if s]
avg_std = sum(sector_std) / len(sector_std)
if down >= 5 and avg < -1.0 and avg_std > 1.5:
return "恐慌", "多数指数下跌且板块分歧大"
elif up >= 5 and avg > 1.0:
return "趋势上行", "多数指数同步上涨"
elif down >= 5 and avg < -1.0:
return "趋势下行", "多数指数同步下跌"
elif max_abs < 1.0 and avg_std < 1.5:
return "震荡", "涨跌不大且板块分歧小"
else:
return "分化", "涨跌互现,板块方向不一"
规则层的价值是可解释、可调试、不依赖外部 LLM。你可以根据自己的风险偏好调整阈值。
四、实测结果
用 2026-08-14 数据跑出来的结果:
创业板指 +1.12%
深证成指 +0.45%
中证500 +0.28%
沪深300 +0.04%
上证指数 +0.01%
上证50 -0.41%
规则层判断:分化(置信度 60%)
理由:涨跌互现(上 5 下 1),板块标准差 2.33%
6 只指数里 5 只上涨、1 只下跌,但板块平均涨跌幅有正有负,离散度偏高。规则判断为「分化」而不是「趋势上行」,这是合理的——大盘指数偏暖,但结构并不一致。
五、LLM 增强:把数据变成一句话
把指数和板块数据结构化后,传给 LLM:
你是一名市场状态分类助手。请根据以下数据,判断当前市场状态:
只能从「趋势上行 / 趋势下行 / 震荡 / 恐慌 / 分化」中选择一种,并说明理由。
主要指数:
- 上证指数 +0.01%
- 上证50 -0.41%
- 沪深300 +0.04%
...
热门板块:
- 半导体:平均 +0.80%,上涨 50.0%,离散度 2.67%
- 新能源:平均 -2.14%,上涨 20.0%,离散度 2.78%
...
规则层初步判断:分化(置信度 60%)
要求:给出最终状态标签,用 2~3 句话说明理由,不要给出买卖建议。
如果你的环境没有配置 LLM_API_KEY 和 LLM_BASE_URL,脚本会自动退回规则判断,保证可复现。
六、完整可运行脚本
依赖安装:
pip install mairui pandas numpy requests
核心初始化:
import os
import mairui
licence = "LICENCE-66D8-9F96-0C7F0FBCD073" # 演示证书,演示证书(读者复制即用,无需替换)
client = mairui.Client(licence)
脚本已整理到 Demo 目录,包含:
- load_index_snapshot():拉指数快照;
- analyze_sector():计算板块平均涨跌幅、上涨占比、离散度;
- rule_classify():规则状态分类;
- llm_classify_prompt() + call_llm():LLM 增强入口。
七、使用边界与常见坑
- 状态标签是定性工具:不是量化信号,不能直接用来开仓平仓;
- 阈值要根据自己的策略调:趋势跟踪者和均值回归者的「趋势」定义不同;
- 板块样本影响结果:不同板块的风险属性不同,离散度口径需要固定;
- LLM 可能过度解释:规则层结果可以帮助约束 LLM,避免它编造原因;
- 不要事后解释:状态分类必须用收盘数据,不能用未来的涨跌幅来修正。
小结
市场状态分类解决的是「今天是什么市」。规则层给出一个可解释、可调试的判断,LLM 层把这个判断翻译成自然语言。对量化研究者来说,这种「数据 → 规则 → 文本」的链路,比单纯看 K 线图更可持续。
AI 在这里的作用不是创造判断,而是把已有的结构化判断表达得更易读。下篇预告:【AI+量化实战 #11】AI+量化里最危险的幻觉:数据泄漏、伪造数据、事后解释。
代码与接口文档参考:https://github.com/MaiRuiApi

浙公网安备 33010602011771号