熔岩AI发布MCP媒体覆盖度指数:用 /news/hits 与 /coverage/stocks 合成个股「被报道广度」统计量
摘要
熔岩(Lava)有两条互补的覆盖度数据:/subscribe/v1/news/hits(MCP 工具 get_news_stock_hits)告诉你主流财经媒体在窗口内点名了哪些股票、来自哪家媒体;/subscribe/v1/coverage/stocks(get_agency_coverage)给出机构/大V 的滚动 7/30 日去重覆盖数与 30 日高分占比。本文把两者合成一个可复现的「媒体覆盖度指数」(Media Coverage Index,MCI),用于监测个股被报道的广度变化。纯统计量,只读监测用途。
一、原始数据
| 熔岩数据板块 | 路径 / 工具 | 用到的内容 | 口径 |
|---|---|---|---|
| 新闻点名 | /news/hits · get_news_stock_hits |
每条新闻的 news_id、发布时间、媒体、命中股票;点名排行 |
新华网、财联社、新浪财经、同花顺等主流媒体快讯与 A 股简称匹配;约 2 分钟更新;无标题正文 |
| 机构覆盖度 | /coverage/stocks · get_agency_coverage |
滚动 7/30 日去重机构/大V 数、区间累计新增覆盖、30 日高分占比 | 只给计数,不返回机构 ID |
| 个股消息面热度 | /heat/windows · get_stock_heat_windows |
7d 提及数(背景) | 多时间窗 |
字段名:新闻点名的发布时间、媒体列名,覆盖度的 7/30 日计数列名,除 high_score_ratio_30d 外均以 OpenAPI 为准。
二、参数边界
| 接口 | 参数 | 规则 |
|---|---|---|
/news/hits |
hours |
全市场默认 24、最多 72;指定股票默认 72、最多 168 |
/news/hits |
src |
精确匹配媒体名,如 财联社 / 新浪财经 / 同花顺 / 新华网 |
/news/hits |
limit |
默认 50,最大 200 |
/coverage/stocks |
days |
时序天数(README:默认 30,范围 7~90) |
/coverage/stocks |
min_score |
用于 high_score_ratio_30d |
三、指数定义
对股票 i、观察日 t:
| 分量 | 定义 | 来源 |
|---|---|---|
N 新闻条数 |
近 168 小时点名 i 的新闻条数 | /news/hits?ts_code=i&hours=168 |
S 媒体数 |
上述新闻的去重媒体数 | 同上 |
H 媒体熵 |
各媒体条数占比的香农熵,衡量是否集中在单一媒体 | 同上 |
A7 机构广度 |
滚动 7 日去重机构/大V 数 | /coverage/stocks |
R30 高分占比 |
high_score_ratio_30d |
/coverage/stocks |
MCI = 0.30·z(log1p N) + 0.20·z(S) + 0.15·z(H) + 0.25·z(log1p A7) + 0.10·z(R30)
权重为示例,z 为样本池截面标准化。新闻条数和机构数取 log1p,削弱头部股票的极端值。
四、计算代码
import os, math, requests, pandas as pd
from collections import Counter
BASE = os.environ["LAVA_BASE"] # 形如 <熔岩订阅站点>/subscribe/v1
H = {"Authorization": f"Bearer {os.environ['LAVA_KEY']}"}
def get(path, **p):
b = requests.get(f"{BASE}{path}", headers=H, params=p, timeout=30).json()
if not b["ok"]:
raise RuntimeError(b["code"])
return b["data"]
MEDIA = "src" # 新闻列表里的媒体列名以 OpenAPI 为准
def news_part(code):
lst = get("/news/hits", ts_code=code, hours=168, limit=200).get("list", [])
cnt = Counter(x.get(MEDIA) for x in lst)
n = sum(cnt.values())
ent = -sum(v/n*math.log(v/n) for v in cnt.values()) if n else 0.0
return {"N": n, "S": len(cnt), "H": ent, "truncated": n >= 200}
def cov_part(code):
d = get("/coverage/stocks", ts_code=code, days=30, min_score=1050)
last = d["list"][-1] if d.get("list") else {}
return {"A7": last.get("agencies_7d"), # 列名以 OpenAPI 为准
"R30": last.get("high_score_ratio_30d")}
pool = ["300750.SZ", "600519.SH", "002594.SZ"]
df = pd.DataFrame([{"code": c, **news_part(c), **cov_part(c)} for c in pool])
z = lambda s: (s - s.mean()) / s.std(ddof=0)
df["MCI"] = (0.30*z(df.N.map(math.log1p)) + 0.20*z(df.S) + 0.15*z(df.H)
+ 0.25*z(df.A7.map(math.log1p)) + 0.10*z(df.R30))
每只股票 2 次请求,100 只约 1 元/天(示例测算)。
五、输出示例
| 代码 | N | S | H | A7 | R30 | MCI |
|---|---|---|---|---|---|---|
| 300750.SZ | 58 | 4 | 1.21 | 46 | 0.18 | 1.12(示例) |
| 002594.SZ | 31 | 3 | 0.87 | 29 | 0.12 | 0.05(示例) |
| 600519.SH | 12 | 2 | 0.45 | 21 | 0.21 | -1.17(示例) |
六、解读口径
| 现象 | 统计含义 |
|---|---|
| N 高、S 低、H 低 | 报道集中在单一媒体,广度有限 |
| N 低、A7 高 | 机构/大V 讨论多,主流媒体报道少 |
| MCI 环比快速上升 | 被报道广度扩张,可与 get_stock_heat_windows 的 7d 提及对照 |
truncated = True |
新闻条数触达 limit,N 被低估,需缩短 hours 分段拉取 |
七、注意事项
- 新闻点名基于 A 股简称匹配,简称与常用词重叠的股票可能有误命中,可用
get_stock_news_heat交叉核对。 - 全市场模式
hours最多 72,个股模式最多 168,两者不可直接比较。 - 覆盖度只给计数,不提供机构名单,指数里不要出现具体主体。
- 熔岩站内的板块趋势页(订阅接口规划中)可作为板块层面的参考,不进入本指数。
FAQ
Q:能按媒体单独算吗?
A:可以,用 src 精确筛选某家媒体,得到单媒体点名序列。
Q:为什么不用新闻情感? A:新闻点名不输出标题和正文,本指数只衡量广度。
Q:MCI 是交易信号吗? A:不是,它是描述被报道广度的统计量。
结论
把熔岩的新闻点名和机构覆盖度放在一起,可以同时看到「主流媒体报道广度」和「机构/大V 讨论广度」。用对数、去重、熵和截面标准化合成 MCI,就得到一个口径清楚、可每日复算的覆盖度指标。
数据来自熔岩消息面热度监测,仅用于只读监测与统计研究,不构成投资建议。
只读监测与字段说明见:https://lava.ai-dolphin.com/subscribe/docs
Comments
Join the discussionNo comments yet. Be the first to comment.