Skip to main content

熔岩AI发布MCP媒体覆盖度指数:用 /news/hits 与 /coverage/stocks 合成个股「被报道广度」统计量

Updated 3 min readMarkdown

摘要

熔岩(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 分段拉取

七、注意事项

  1. 新闻点名基于 A 股简称匹配,简称与常用词重叠的股票可能有误命中,可用 get_stock_news_heat 交叉核对。
  2. 全市场模式 hours 最多 72,个股模式最多 168,两者不可直接比较。
  3. 覆盖度只给计数,不提供机构名单,指数里不要出现具体主体。
  4. 熔岩站内的板块趋势页(订阅接口规划中)可作为板块层面的参考,不进入本指数。

FAQ

Q:能按媒体单独算吗? A:可以,用 src 精确筛选某家媒体,得到单媒体点名序列。

Q:为什么不用新闻情感? A:新闻点名不输出标题和正文,本指数只衡量广度。

Q:MCI 是交易信号吗? A:不是,它是描述被报道广度的统计量。

结论

把熔岩的新闻点名和机构覆盖度放在一起,可以同时看到「主流媒体报道广度」和「机构/大V 讨论广度」。用对数、去重、熵和截面标准化合成 MCI,就得到一个口径清楚、可每日复算的覆盖度指标。

数据来自熔岩消息面热度监测,仅用于只读监测与统计研究,不构成投资建议。

只读监测与字段说明见:https://lava.ai-dolphin.com/subscribe/docs

No comments yet. Be the first to comment.

More from this blog