【Python实时盯盘与预警 #12】盯盘只看个股不够?盘中指数快照一屏看全市场温度
上一篇我们解决了「告警怎么发到手机」。但还有一个问题:你盯着自选股涨跌,却不知道大盘在干嘛。个股突然跳水,是自身利空还是整个市场都在砸?创业板指狂拉,你的持仓没动,是跑输还是板块没轮动到?
这篇文章用 Python 拉取 8 大宽基指数实时行情,做一个「大盘温度快照」:一眼看清上证、深证、创业板、科创50、沪深300、中证500、上证50、中证1000 谁在领涨、谁在拖后腿。
一、本文你将得到什么
- 用麦蕊 index_real_time 接口拉取指数实时行情。
- 把 8 大宽基指数汇总成一张 pandas 表格。
- 计算「市场温度」:红盘数、平均涨跌幅、最强/最弱指数、异动指数数。
- 一个可扩展的指数监控脚本,替换代码就能加更多指数。
- 与个股告警结合的进阶思路。
想先在线试试接口效果?打开 API Playground 即可直接调用测试:
https://mairuiapi.com/playground
二、环境准备
本文代码使用 mairui SDK 获取指数数据,安装方法如下:
pip install mairui
SDK 的完整接口文档与使用说明请查阅 GitHub 仓库:https://github.com/MaiRuiApi/mairui
指数接口的详细参数说明请查阅官网 API 文档:https://mairuiapi.com/hszsdata
运行环境:
- Python 3.9+
- mairui SDK 1.0.0
- pandas(用于表格展示)
本文数据截至 2026-08-07,读者复现时数据可能因行情更新而略有差异。
证书直接写在代码里(文中使用演示证书,演示证书(读者复制即用,无需替换))。
import sys, os
三、指数代码与字段
麦蕊的指数代码格式为 代码.交易所,例如:
指数 代码
上证指数 000001.SH
深证成指 399001.SZ
创业板指 399006.SZ
科创50 000688.SH
沪深300 000300.SH
中证500 000905.SH
上证50 000016.SH
中证1000 000852.SH
先用 index_list 拿到全部指数列表,再用 index_real_time(code='000001.SH') 逐个拉取。注意:index_real_time 每次只返回一个指数的数据,所以我们要循环调用。
返回的核心字段:
- p:现价
- pc:涨跌幅(%)
- zf:振幅(%)
- ud:涨跌额
- cje:成交额(元)
- t:快照时间
四、拉取指数实时行情
from mairui import Client
import pandas as pd
import time
INDEX_CODES = [
("000001.SH", "上证指数"),
("399001.SZ", "深证成指"),
("399006.SZ", "创业板指"),
("000688.SH", "科创50"),
("000300.SH", "沪深300"),
("000905.SH", "中证500"),
("000016.SH", "上证50"),
("000852.SH", "中证1000"),
]
def fetch_index_snapshot():
api = Client(licence="LICENCE-66D8-9F96-0C7F0FBCD073") # 演示证书,演示证书(读者复制即用,无需替换)
rows = []
for code, name in INDEX_CODES:
r = api.index_real_time(code=code)
rows.append({
"代码": code,
"名称": name,
"现价": r["p"],
"涨跌额": r["ud"],
"涨跌幅%": r["pc"],
"振幅%": r["zf"],
"成交额亿": r["cje"] / 1e8,
"时间": r["t"][-8:],
})
time.sleep(0.05) # 轻微间隔
return pd.DataFrame(rows)
df = fetch_index_snapshot()
print(df.to_string(index=False))
关键解释:
- 8 个指数循环调用,约 0.8~1.2 秒完成。
- cje 是元为单位,除以 1e8 转成「亿」。
- 时间只取最后 8 位(HH:MM:SS),表格更紧凑。
五、计算市场温度
拉完数据后,计算几个简单但实用的指标:
def market_temperature(df):
up = (df["涨跌幅%"] > 0).sum()
down = (df["涨跌幅%"] < 0).sum()
flat = len(df) - up - down
avg_pc = df["涨跌幅%"].mean()
max_idx = df["涨跌幅%"].idxmax()
min_idx = df["涨跌幅%"].idxmin()
return {
"红盘": int(up),
"绿盘": int(down),
"平盘": int(flat),
"平均涨跌幅%": avg_pc,
"最强指数": df.loc[max_idx, "名称"],
"最弱指数": df.loc[min_idx, "名称"],
"最大涨幅%": df.loc[max_idx, "涨跌幅%"],
"最大跌幅%": df.loc[min_idx, "涨跌幅%"],
}
temp = market_temperature(df)
print(f"红盘 {temp['红盘']} | 绿盘 {temp['绿盘']} | 平盘 {temp['平盘']}")
print(f"平均涨跌幅: {temp['平均涨跌幅%']:+.2f}%")
print(f"最强: {temp['最强指数']} ({temp['最大涨幅%']:+.2f}%)")
print(f"最弱: {temp['最弱指数']} ({temp['最大跌幅%']:+.2f}%)")
关键解释:
- 8 个指数如果红盘占多数,说明市场整体偏暖。
- 平均涨跌幅比单看上证指数更客观,因为weighted 指数会被权重股带偏。
- 创业板指和科创50通常弹性最大,适合观察风险偏好。
六、异动提醒
设定阈值,当某个指数涨跌幅绝对值超过 1% 时打印提醒:
PC_ALERT = 1.0
abnormal = df[df["涨跌幅%"].abs() >= PC_ALERT]
for _, row in abnormal.iterrows():
direction = " " if row["涨跌幅%"] > 0 else " "
print(f"{direction} {row['名称']} 涨跌幅 {row['涨跌幅%']:+.2f}% 振幅 {row['振幅%']:.2f}%")
这个阈值可以根据自己的需求调整:
- 日内波段:1%
- 重要关口/突发消息:2%
- 尾盘/开盘扫描:0.5%
七、完整可运行示例
from future import annotations
import os, sys, time
import pandas as pd
from mairui import Client
INDEX_CODES = [
("000001.SH", "上证指数"),
("399001.SZ", "深证成指"),
("399006.SZ", "创业板指"),
("000688.SH", "科创50"),
("000300.SH", "沪深300"),
("000905.SH", "中证500"),
("000016.SH", "上证50"),
("000852.SH", "中证1000"),
]
def fetch_index_snapshot():
api = Client(licence="LICENCE-66D8-9F96-0C7F0FBCD073") # 演示证书,演示证书(读者复制即用,无需替换)
rows = []
for code, name in INDEX_CODES:
r = api.index_real_time(code=code)
rows.append({
"代码": code, "名称": name,
"现价": r["p"], "涨跌额": r["ud"],
"涨跌幅%": r["pc"], "振幅%": r["zf"],
"成交额亿": r["cje"] / 1e8,
"时间": r["t"][-8:],
})
time.sleep(0.05)
return pd.DataFrame(rows)
def market_temperature(df):
valid = df.dropna(subset=["涨跌幅%"])
up = (valid["涨跌幅%"] > 0).sum()
down = (valid["涨跌幅%"] < 0).sum()
flat = len(valid) - up - down
return {
"红盘": int(up), "绿盘": int(down), "平盘": int(flat),
"平均涨跌幅%": valid["涨跌幅%"].mean(),
"最强指数": valid.loc[valid["涨跌幅%"].idxmax(), "名称"],
"最弱指数": valid.loc[valid["涨跌幅%"].idxmin(), "名称"],
"最大涨幅%": valid["涨跌幅%"].max(),
"最大跌幅%": valid["涨跌幅%"].min(),
}
if name == "main":
df = fetch_index_snapshot()
print(df.to_string(index=False))
temp = market_temperature(df)
print(f"\n红盘 {temp['红盘']} | 绿盘 {temp['绿盘']} | 平均 {temp['平均涨跌幅%']:+.2f}%")
print(f"最强 {temp['最强指数']} {temp['最大涨幅%']:+.2f}% | 最弱 {temp['最弱指数']} {temp['最大跌幅%']:+.2f}%")
运行结果示例:
代码 名称 现价 涨跌额 涨跌幅% 振幅% 成交额亿 时间
000001.SH 上证指数 3,905.71 5.36 0.14 0.59 4,180.59 10:06:36
399001.SZ 深证成指 14,210.90 100.78 0.71 1.21 4,925.40 10:06:33
399006.SZ 创业板指 3,551.99 36.44 1.04 1.31 2,383.82 10:06:33
...
红盘 8 | 绿盘 0 | 平均 +0.58%
最强 创业板指 +1.04% | 最弱 上证指数 +0.14%
八、与个股告警结合
指数快照不是孤立的。建议和你的个股告警脚本配合:
- 开盘前 5 分钟:先扫一遍指数,判断今天市场整体氛围。
- 个股触发告警时:同步看一眼相关指数。如果创业板指大跌,个股跌可能是系统性风险;如果指数平稳个股跌,才是个股自身问题。
- 尾盘 14:50:再扫一遍指数,决定仓位是否过夜。
你可以把指数监控和 #11 的 webhook 推送结合:当涨跌幅绝对值超过 2% 的指数数量 ≥3 个时,自动发消息到手机,提醒你「大盘异动,注意仓位」。
九、常见坑
- index_real_time 一次只能查一个指数
不能像 stock_ssjy_more 那样传逗号分隔的多个代码。需要循环调用,建议加 50ms 间隔。
- 指数代码带交易所后缀
上证指数是 000001.SH,深证成指是 399001.SZ,不要漏掉 .SH / .SZ。
- 成交额单位是元
cje 是元,不转换的话会是几千亿的长数字,除以 1e8 显示成「亿」更直观。
- 指数没有换手率、量比字段
指数接口返回的是指数自身行情,不是成分股细节。看板块资金需要调用板块/概念接口。
十、小结
本文把 8 大宽基指数实时行情汇总成一屏快照,帮你快速判断市场整体温度:
- 用 index_real_time 逐个拉取指数。
- 用 pandas 汇总成表格。
- 计算红盘数、平均涨跌幅、最强最弱指数。
- 加上异动阈值提醒,与个股告警联动。
这个脚本适合挂在开盘、收盘、午休前后跑一下,几秒钟就能知道「今天市场到底怎么样」。
本文为技术演示,不构成投资建议。文中示例数据仅供接口用法参考,不代表实时行情。
延伸阅读:
- 在线体验更多接口:https://mairuiapi.com/playground
- 查看完整 API 文档:https://mairuiapi.com/hszsdata
- SDK 文档与源码:https://github.com/MaiRuiApi/mairui

浙公网安备 33010602011771号