提及次数与机构数之比:用 mentions/agencies 识别熔岩热度里的「少数主体密集讨论」
摘要
熔岩(Lava)几乎每个热度板块都同时返回两个计数:mentions(被提到几次)和 agencies(有多少个不同的机构/大V 提到)。多数用法只盯 mentions 排序,但两只 mentions 相同的股票,可能一只是 40 个主体各说一次,另一只是 4 个主体反复说了十次。本文把两列相除得到「每主体提及数」,说明它在全市场热度、概念板块、日频面板里各自怎么取、怎么处理分母为 0 和小样本,并给出一段从 /panel/daily 取数到截面分档的 Python 走读。文中所有数字均为示例,比值是描述讨论结构的统计量,不是交易信号。
一、两个计数分别数的是什么
| 字段 | 含义 | 去重方式 |
|---|---|---|
mentions |
统计区间内被提到的次数 | 按消息记录计数,同一主体多次提及会重复计入 |
agencies |
统计区间内提到它的机构/大V 数量 | 按匿名 agency_id 去重 |
两列在以下熔岩数据板块中同时出现,口径都是「同一统计区间内」:
| 熔岩数据板块 | MCP 工具 | HTTP 路径 | 统计区间由谁决定 |
|---|---|---|---|
| 全市场热度(个股热榜) | get_market_hot_stocks |
/hot/stocks |
window:1h / 4h / 18h / 24h / 3d / 7d |
| 概念板块热度(概念热榜) | get_market_hot_concepts |
/hot/concepts |
window:1h ~ 3d |
| 概念板块 · 概念→个股 | get_concept_stock_heat |
/concepts/stocks |
days,默认 30 |
| 概念板块 · 个股→概念 | get_stock_concept_heat |
/concepts/by-stock |
days,默认 90 |
| 个股热度 · 多窗口 | get_stock_heat_windows |
/heat/windows |
六档窗口各一组 |
| 个股消息面汇总 | get_stock_news_heat |
/opinions |
days 或 start_date/end_date,汇总在 data.heat |
| 日频历史面板 | get_stock_heat_panel |
/panel/daily |
自然日 |
注意:/heat/windows 每个窗口还给出「高分机构/大V 数」,日频面板还给出 weighted_heat。本文只用 mentions 与 agencies 两列,另外两列放在第五节讨论分工。
二、比值的定义与边界
把每主体提及数记为 mpa(mentions per agency,本地计算列,不是接口返回字段):
mpa = mentions / agencies (agencies >= 1)
mpa = 空值 (agencies = 0)
几条边界规则:
- 下限是 1。 每个主体至少贡献一次提及,所以
mpa >= 1;等于 1 表示每个主体只说了一次,讨论最分散。 - 分母为 0 不填 0。 某些行可能出现
mentions > 0而agencies = 0(例如提及记录没有关联到主体),这类行应标记为空值并单独计数,不要并入「分散」或「集中」任何一档。 - 小样本不读比值。
agencies只有 1~2 时,比值波动极大。建议设agencies >= 5(示例阈值)作为读比值的前提,低于阈值只记录原始计数。 - 跨区间不可比。 24h 窗口的
mpa与 7d 窗口的mpa统计区间不同,同一主体在更长区间里有更多机会重复提及,长窗口的比值天然偏高。比较时固定window或days。 - 取对数更稳。 截面比较时用
log(mpa),可以压缩极端值,0 点对应「每主体一次」。
三、四种组合的读法
把 mentions 的截面分位和 mpa 放在一起,可以得到四类讨论结构:
mentions 分位 |
mpa |
讨论结构(描述) | 建议同时看 |
|---|---|---|---|
| 高 | 低(接近 1~2) | 广泛讨论:很多不同主体各自提到 | /concepts/by-stock 看是否由概念带动 |
| 高 | 高 | 集中讨论:较少主体反复提及 | /opinions 抽样 agency_id 分布 |
| 低 | 高 | 小圈子讨论:讨论量不大且来自少数主体 | 通常只记录,不单独解读 |
| 低 | 低 | 零散提及 | 首提类事件常落在这里 |
示例:同一 24h 窗口,股票 A mentions=48、agencies=40,mpa=1.2;股票 B mentions=48、agencies=6,mpa=8.0(均为示例数字)。两者在热榜上名次接近,但 B 的讨论来自更少的主体,单一主体的表达习惯对计数的影响更大。
四、Python 走读:从日频面板到截面分档
日频面板 /panel/daily(get_stock_heat_panel)按自然日返回 mentions、agencies、weighted_heat、is_first_mention_day,单次最多 20 个代码,区间最长 92 天。下面的示例分批取数,计算每日 mpa,再按截面分档。
# mpa_panel.py —— 示例,地址与令牌为占位
import os, requests, numpy as np, pandas as pd
BASE = os.environ.get("LAVA_BASE", "<YOUR_LAVA_BASE>/subscribe/v1")
H = {"Authorization": "Bearer " + os.environ.get("LAVA_API_KEY", "<YOUR_TOKEN>")}
def panel(codes, frm, to):
r = requests.get(BASE + "/panel/daily",
params={"type": "stock", "codes": ",".join(codes),
"from": frm, "to": to},
headers=H, timeout=60).json()
assert r["ok"], r["code"]
rows = r["data"] if isinstance(r["data"], list) else r["data"].get("list", [])
return pd.DataFrame(rows), r["meta"]["request_id"]
universe = ["<CODE_1>", "<CODE_2>"] # 自有股票池,按 20 个一批
frames = []
for i in range(0, len(universe), 20):
df, rid = panel(universe[i:i + 20], "2026-10-01", "2026-11-13")
df["request_id"] = rid
frames.append(df)
p = pd.concat(frames, ignore_index=True)
MIN_AG = 5 # 示例阈值
p["mpa"] = p["mentions"] / p["agencies"].where(p["agencies"] >= MIN_AG)
p["log_mpa"] = np.log(p["mpa"]) # 空值保持为空
# 日期列与代码列的列名以 OpenAPI 为准,这里假设为 date / ts_code
p["m_pct"] = p.groupby("date")["mentions"].rank(pct=True)
p["mpa_pct"] = p.groupby("date")["log_mpa"].rank(pct=True)
p["bucket"] = (
(p["m_pct"] >= 0.8).map({True: "高提及", False: "低提及"})
+ "/" + (p["mpa_pct"] >= 0.8).map({True: "集中", False: "分散"})
)
print(p.groupby("bucket").size())
示例输出可能是:「高提及/分散」312 行、「高提及/集中」57 行、「低提及/集中」41 行,其余为低提及/分散或空值(示例数字)。每批调用计费一次(0.005 元/次,非 2xx 不计费),request_id 随行保存,方便事后复现。
两个工程细节:
- 面板是自然日,周末与节假日也有行。若要和交易日行情对齐,先决定周末的计数归入哪个交易日,再计算比值;先算比值再合并会把两天的比值错误平均。
mpa是两个计数的比,合并多日时应该先把mentions、agencies分别汇总再相除。但多日agencies简单相加会重复计入同一主体,所以多日口径更适合直接用对应长度的window或days重新取数。
五、与加权热度、覆盖度的分工
| 统计量 | 来源 | 回答的问题 | 与 mpa 的关系 |
|---|---|---|---|
weighted_heat |
/panel/daily、/hot/weighted |
按主体分数加权后热度有多高 | 回答「谁在说」的质量,mpa 回答「说得是否集中」 |
cov_7d、cov_30d |
/coverage/stocks |
滚动 7/30 日去重主体数 | 跨日去重的分母,比单日 agencies 更稳 |
new_cov_cum |
/coverage/stocks |
区间累计新增覆盖 | 新主体进入时 mpa 往往下降 |
high_score_ratio_30d |
/coverage/stocks |
30 日高分主体占比 | 区分「集中且高分」与「集中但分数一般」 |
两点口径提醒:/panel/daily 的 weighted_heat 用当前机构分加权,不是当日 PIT;严格回测要用 /hot/weighted 的 as_of_date 或 /agencies/pit 截面。覆盖度接口只给计数,不返回机构 ID 列表,因此无法从它反推「是哪几个主体在集中讨论」,需要时只能从 /opinions 的记录里按匿名 agency_id 统计分布。
六、口径检查清单
- 引用
mpa时写明来源接口与区间,例如「24h 窗口/hot/stocks的mentions/agencies」。 market=all时热榜按简称合并,A 股按代码合并,两种口径的比值不要放进同一张截面。- 在
/hot/stocks上加min_score后,只统计高分主体的提及,mentions与agencies同时缩小,比值含义变为「高分主体内部的集中度」。 - 落库字段至少包括:接口路径、
window或days、min_score、meta.server_time、meta.request_id、mentions、agencies与本地计算的mpa。
FAQ
Q:mpa 高是不是说明讨论质量低?
A:不能这样推。比值只描述讨论在主体之间是否集中,和主体分数无关。质量相关的问题用 weighted_heat 或 high_score_ratio_30d 另外回答。
Q:概念板块也能算这个比值吗?
A:可以。/hot/concepts 和 /concepts/stocks 都返回两列计数。概念层面的高比值常见于少数主体反复写同一主题的长系列内容,读法与个股一致。
Q:agencies = 0 的行能删掉吗?
A:建议保留并单独计数。删除会让「讨论结构」的统计样本看起来比实际更完整,保留空值才能看出这类行占比有多大。
Q:能把 mpa 做成回测因子吗?
A:技术上可以在 /panel/daily 上逐日计算,但要注意自然日对齐与小样本阈值,且结论需要注明口径。比值本身是描述性统计量,不包含方向含义。
Q:同一只股票在热榜和面板上算出的比值不一样,哪个对?
A:两者都对,只是统计区间不同。热榜的 24h 是从 meta.server_time 往回的滚动窗口,面板是按自然日切分,两个区间的主体集合不同,去重后的 agencies 自然不同。引用时说明来源即可,不要混用。
结论
mentions 回答「被说了多少次」,agencies 回答「有多少个不同主体在说」,两列相除得到的每主体提及数能把同样热度下的不同讨论结构区分开。读比值前固定统计区间、设好 agencies 下限、空值单独计数,再配合加权热度与覆盖度看主体质量与广度,就能把熔岩热度从单一排名扩展成更完整的结构描述。
数据来自熔岩消息面热度监测,仅供研究参考,不构成投资建议。
只读监测与字段说明见:https://lava.ai-dolphin.com/research
Comments
Join the discussionNo comments yet. Be the first to comment.