教程

用数据量化 A 股市场情绪

情绪不是感觉,是可以算的数:涨跌家数、涨停家数、成交额、风格轮动。三个免费接口就能拼出"今天市场什么温度",下面给出可运行代码与口径陷阱。

为什么用「涨跌家数」而不是「指数涨跌」

指数涨跌会被权重股带偏:指数涨 1% 但 3000 只股票下跌,是常事。涨跌家数(市场广度) 反映的是"多数股票怎么样",比指数更接近散户体感。

同理,涨停家数是情绪的直接读数(赚钱效应),成交额是参与度的读数。

第一步:拿当天的市场广度(免费)

`/v1/changedist` 是市场广度的推荐入口,返回当期口径(当日)。

Python(可直接运行,无需 Key)
import requests

r = requests.get("https://api.ashareapi.com/v1/changedist", timeout=10)
b = r.json()
rows = b.get("structured") or b["data"]

for row in rows:
    print(row)   # 涨跌家数 / 涨跌停家数 / 成交额 / 区间分布

⚠️ 口径陷阱:当期 vs T-1

  • `/v1/changedist` = 当期(今天)—— 判断今日情绪用这个
  • `/v1/market-overview?type=updown` = T-1(返回里会标数据日期,可能滞后一个交易日)—— 两者数值会不一样
  • 别把 T-1 的涨跌家数当今天的用 —— 这是最容易犯的错

第二步:市场画像与风格轮动(免费)

Python
# 大盘画像总评
print(requests.get("https://api.ashareapi.com/v1/market-overview",
                   params={"type": "summary"}, timeout=10).json()["data"])

# 风格轮动(大小盘 / 成长价值)
print(requests.get("https://api.ashareapi.com/v1/market-overview",
                   params={"type": "rotation"}, timeout=10).json()["data"])

# 估值分位(中证全指 PE/PB/PS 历史百分位)
print(requests.get("https://api.ashareapi.com/v1/market-overview",
                   params={"type": "valuation"}, timeout=10).json()["data"])
  • `type=summary` 画像总评 · `trade` 收盘 · `interval` 多周期 · `technical` 大盘技术
  • `type=margin` 两融 · `valuation` 估值分位 · `rotation` 风格轮动

第三步:看资金在追什么(免费)

热搜榜反映散户注意力。它和"涨跌家数"配合看:广度好 + 热搜集中 = 主线明确;广度差 + 热搜分散 = 情绪退潮。

Python
hot = requests.get("https://api.ashareapi.com/v1/hot",
                     params={"limit": 10}, timeout=10).json()
for row in hot.get("structured") or hot["data"]:
    print(row)   # 热搜榜:关注度排名 + 涨跌幅

把三个指标拼成「今日温度」

涨跌家数
市场广度
涨家数占比 > 60% = 普涨;< 40% = 普跌
涨停家数
赚钱效应
与近 20 日均值比,明显放大 = 情绪升温
成交额
参与度
放量上涨 = 增量资金;缩量上涨 = 存量博弈
风格轮动
资金去向
小盘占优 = 风险偏好高;大盘占优 = 防御
估值分位
位置
中证全指 PE 处于历史高位 ≠ 马上跌,但赔率变差

三个必须写下来的纪律

  • 单日情绪不预测次日 —— 情绪是"状态描述",不是"买卖信号"
  • 必须与历史比较 —— 涨停 80 家是多还是少?要和近 20 日均值比才知道
  • 放量/缩量要分开看 —— 同样是涨,放量涨和缩量涨是两件事

常见错误与边界

  • 把 T-1 当当期 → 用 `/v1/changedist` 取当期,别用 `market-overview?type=updown`
  • 只看涨停家数 → 不看炸板率会误判(高涨停 + 高炸板 = 情绪不稳)
  • `volume` 是手、`amount` 是元 → 算成交额时别混单位(见字段说明)
  • 匿名限流 5 次/分 → 本教程只用免费端点;批量取数请加 `time.sleep()` 或升级档位

常见问题

这些接口要 Key 吗?

都不用。`changedist` / `market-overview` / `hot` 都在 5 个免费端点里 —— 无需注册、无需 Key,直接调。

为什么我的涨跌家数和别的平台不一样?

先确认口径:我们 `/v1/changedist` 是当期;而 `/v1/market-overview?type=updown` 是 T-1(返回里会标数据日期)。另外不同平台对"涨跌"的统计范围(是否含 ST / 北交所 / 停牌)可能不同,对不上先核对这两点。

情绪好就该买吗?

不是。 情绪是状态描述,不是买卖信号。同一个"情绪好",在趋势初期和趋势末端含义完全相反 —— 判断方向需要结合价格位置与量能,本教程只讲"怎么把情绪算出来"。

成交额是元还是万元?

看返回里的字段名与量级:`amount` 类字段一般是元(如 `135160431.2` = 1.35 亿元)。拿一个熟悉的交易日对量级是最快的自检方法。

可以每天自动跑吗?

可以。定时任务里调这三个免费接口即可(无需 Key,也不消耗付费额度)。若要在盘中高频轮询,注意匿名限流是 5 次/分钟,建议间隔 ≥ 12 秒,或解一次 PoW 挑战提到 60 次/分。

最后更新: 2026-09-23

代码与口径取自线上真实返回(2026-09-23 验证:changedist 为当期口径,market-overview?type=updown 返回 T-1 数据日期)。字段单位与限流以端点文档为准。