← 返回博客列表

AI+量化实战

【AI+量化实战 #10】趋势还是震荡?用 LLM 把市场状态变成一句话

2026年10月15日 07:59 · 麦蕊智数 MyData

风险提示:本文仅用于技术演示,不构成投资建议。市场状态分类只是研究辅助,不能替代独立判断。

本文示例使用麦蕊智数(mairui)Python SDK。稳定、低延迟的行情数据是 AI 量化的前置条件,可在麦蕊官网申请免费证书体验。

你看完行情,脑海里会先冒出一个词:「今天市场是趋势、震荡,还是恐慌?」

这个判断听起来很主观,但其实可以结构化:宽基指数的同向性、涨跌幅大小、板块内部的离散度,都是可量化的信号。今天的文章教你把这些信号喂给 LLM,让它用一句话说出当前市场状态。

本文你将得到什么

  • 一套把市场数据映射成状态标签的规则;
  • 一段可直接运行的 Python 脚本,自动判断趋势/震荡/恐慌/分化;
  • 规则分类 + LLM 增强两种模式;
  • 一个 Prompt 模板,可直接接入你自己的大模型。

一、为什么需要状态分类

不同市场状态下,策略的适用性完全不同:

  • 趋势市:动量策略、趋势跟踪更有效;
  • 震荡市:均值回归、高抛低吸相对占优;
  • 恐慌市:风控优先,止损和仓位管理比选股更重要;
  • 分化市:指数没方向,但结构有机会,需要看板块。

如果你每天能先用一句话定下「市场状态」,后面的选股、择时、仓位判断都会更清晰。

二、状态分类的输入信号

我们选取两类信号:

  1. 宽基指数:看市场整体方向和同向性;
  2. 热门板块:看结构是否一致、离散度大不大。

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 = "<你的证书>"  # 演示证书,请替换成你自己的正式证书
client = mairui.Client(licence)

脚本已整理到 Demo 目录,包含:

  • load_index_snapshot():拉指数快照;
  • analyze_sector():计算板块平均涨跌幅、上涨占比、离散度;
  • rule_classify():规则状态分类;
  • llm_classify_prompt() + call_llm():LLM 增强入口。

七、使用边界与常见坑

  1. 状态标签是定性工具:不是量化信号,不能直接用来开仓平仓;
  2. 阈值要根据自己的策略调:趋势跟踪者和均值回归者的「趋势」定义不同;
  3. 板块样本影响结果:不同板块的风险属性不同,离散度口径需要固定;
  4. LLM 可能过度解释:规则层结果可以帮助约束 LLM,避免它编造原因;
  5. 不要事后解释:状态分类必须用收盘数据,不能用未来的涨跌幅来修正。

小结

市场状态分类解决的是「今天是什么市」。规则层给出一个可解释、可调试的判断,LLM 层把这个判断翻译成自然语言。对量化研究者来说,这种「数据 → 规则 → 文本」的链路,比单纯看 K 线图更可持续。

AI 在这里的作用不是创造判断,而是把已有的结构化判断表达得更易读。下篇预告:【AI+量化实战 #11】AI+量化里最危险的幻觉:数据泄漏、伪造数据、事后解释。


体验麦蕊数据:访问 https://www.mairuiapi.com → 请求证书 → 免费版,3 步领取 API 证书,即可复现本文代码。

代码与接口文档参考:见官网 麦蕊智数 www.mairuiapi.com 站内「API 文档」与「证书获取」(免费版 500 次/日,邮箱验证即领)

标签: Python量化
QQ 客服 3826425416 咨询时请提供证书号或订单号,便于快速处理
咨询