AI 主题热度的五档窗口一致性检查:get_market_hot_concepts 从 1h 到 3d 的 15 项清单
摘要
熔岩(Lava)概念板块热度的入口是概念热榜 GET /hot/concepts(MCP 工具 get_market_hot_concepts),可选 window 为 1h、4h、18h、24h、3d 五档。以 AI 相关主题为例:同一个概念在 1h 窗口排前列、在 3d 窗口却排在中段,这种情况很常见,也最容易被误读为「突然爆发」或「热度退潮」。本文给出一份 15 项检查清单,把「取数参数是否一致、多窗口形态如何描述、下钻到成分股与日频序列时口径是否连贯、结果如何记录」逐项写清。清单面向量化研究脚本与 AI Agent,文中数字均为示例,所有字段都是描述性统计量。
一、为什么概念热度要做跨窗口检查
概念热榜有三个容易被忽略的特点:
- 窗口是滚动的。 1h 统计的是从
meta.server_time往回 1 小时,3d 是往回 72 小时。窗口越短,单条长文或一轮集中讨论的影响越大。 - 没有 7d 档。 个股热榜
/hot/stocks有 7d,概念热榜最长到 3d。需要周度概念序列时,应改用日频面板/panel/daily的type=concept。 - 已去掉泛词。 概念热榜在统计前去掉了过于宽泛的词,因此榜单上的概念名就是可以继续下钻的标准名;但被去掉的泛词也不会出现在任何窗口里,跨窗口对比时不必为它们找原因。
只看单一窗口时,这些特点不会造成问题;一旦把多个窗口的排名放在一起叙述,就必须先确认口径一致。
二、参数与口径速查
| 参数 / 字段 | 取值或含义 | 默认 | 备注 |
|---|---|---|---|
window |
1h / 4h / 18h / 24h / 3d |
24h |
无 7d |
min_score |
只统计机构/大V 分 ≥ 该值的提及 | 不设 | 分数约 450~1500,1000 左右为中等,1050 约前 10% |
limit |
1~200 | 50 | 无分页偏移 |
mentions |
窗口内被提到的次数 | — | 概念层面的计数 |
agencies |
窗口内提到它的去重机构/大V 数 | — | 按匿名 agency_id 去重 |
heat_chg_1d / heat_chg_3d / heat_z20 |
纯统计量 | — | 精确公式以 OpenAPI 为准 |
更新节奏:概念热榜约 2 分钟更新一次,概念成分提及排行 /concepts/stocks 约 10 分钟更新一次。两者时间戳不同步,是跨接口对比时最常见的「对不上」原因。
三、15 项检查清单
A. 取数一致性(1~4)
- 五个窗口在同一轮内连续取数。 五次调用间隔尽量短,并记录每次的
meta.server_time;跨轮混用会把「时间推移」误当成「窗口差异」。 min_score五档保持一致。 一档加门槛、一档不加,比较的就是两类主体。limit足够大。 目标概念在长窗口里可能排到 50 名以外,默认 50 会让它「消失」。研究 AI 主题时建议limit=200。- 概念名从榜单返回里取。 不要手写「人工智能」「AI」等别名;精确匹配以榜单返回为准,后续传给
/concepts/stocks的concept也用同一个字符串(≤30 字符)。
B. 多窗口形态(5~9)
- 先排列绝对计数,再看名次。 名次受其他概念影响,
mentions是概念自身的读数。 - 计算短窗占比。 例如
share_1h = mentions_1h / mentions_24h(本地计算列)。示例:AI 主题mentions_1h=36、mentions_24h=180,占比 0.2,意味着最近 1 小时占了一天讨论量的五分之一(示例数字)。 - 对照
agencies是否同步变化。 短窗mentions高但agencies很少,说明是少数主体集中发布;两列同步升高才是参与面扩大。 - 读
heat_z20时带上窗口。 写成「24h 窗口heat_z20」,不同窗口的 z 分不能互相比较。 - 用一个形态标签描述结果。 建议只用三种描述:短窗集中(1h/4h 占比高)、多窗同步(各窗口名次接近)、长窗累积(3d 名次明显高于短窗)。标签是描述,不推断后续走势。
C. 下钻连贯性(10~13)
- 成分股用
get_concept_stock_heat下钻。/concepts/stocks用days回看(默认 30,最大 365),不是滚动window;与 24h 概念热度对照时设days=1,与 3d 对照时设days=3,并在结果里注明。 - 检查成分集中度。 前 3 只成分股
mentions占概念合计的比例过高时,概念热度更像个股事件带动。 - 反查重点个股的概念归属。 用
get_stock_concept_heat(/concepts/by-stock)确认该股是否同时挂在多个 AI 相关概念下,避免重复计数。 - 需要多日序列时切到日频面板。
get_stock_heat_panel(type="concept", names=...)(/panel/daily)按自然日返回概念的mentions、agencies、weighted_heat,区间最长 92 天;它与滚动窗口口径不同,不要拼接到同一条曲线上。
D. 记录与复现(14~15)
- 每轮落库最少字段:
window、min_score、limit、meta.server_time、meta.request_id、概念名、mentions、agencies、heat_chg_1d、heat_chg_3d、heat_z20、名次。 - 记录费用。 五档窗口即五次调用,每次 0.005 元,非 2xx 不计费;用
get_account(/account,不扣费)定期核对余额。
四、窗口形态示例表
以下为某 AI 相关概念在同一轮取数中的示例读数(均为示例数字):
window |
mentions |
agencies |
名次 | 读法 |
|---|---|---|---|---|
| 1h | 36 | 9 | 2 | 短窗集中,参与主体较少 |
| 4h | 74 | 21 | 4 | 仍偏短窗 |
| 18h | 150 | 52 | 6 | 进入中段 |
| 24h | 180 | 63 | 7 | 与 18h 接近 |
| 3d | 410 | 118 | 11 | 长窗名次低于短窗 |
这张表的规范描述是:「该概念 1h 占 24h 讨论量约 20%,短窗名次高于长窗,形态为短窗集中」。不应写成「热度即将扩散」或任何方向判断。
五、一轮五窗取数脚本
# concept_windows.py —— 示例,地址与令牌为占位
import os, requests
BASE = os.environ.get("LAVA_BASE", "<YOUR_LAVA_BASE>/subscribe/v1")
H = {"Authorization": "Bearer " + os.environ.get("LAVA_API_KEY", "<YOUR_TOKEN>")}
TARGET = "<从榜单返回复制的概念标准名>"
snap = {}
for w in ("1h", "4h", "18h", "24h", "3d"):
r = requests.get(BASE + "/hot/concepts",
params={"window": w, "limit": 200},
headers=H, timeout=60).json()
assert r["ok"], r["code"]
rows = r["data"] if isinstance(r["data"], list) else r["data"].get("list", [])
# 概念名列名以 OpenAPI 为准,这里假设为 concept
hit = [(i + 1, x) for i, x in enumerate(rows) if x.get("concept") == TARGET]
snap[w] = {"server_time": r["meta"]["server_time"],
"request_id": r["meta"]["request_id"],
"rank": hit[0][0] if hit else None,
"mentions": hit[0][1].get("mentions") if hit else None,
"agencies": hit[0][1].get("agencies") if hit else None}
base = snap["24h"]["mentions"] or 0
share_1h = (snap["1h"]["mentions"] or 0) / base if base else None
print(snap, "share_1h:", share_1h)
rank 为空表示目标概念在该窗口前 200 名之外,应记为「未进入榜单前 200」,而不是 0。
六、与只读监测页的关系
熔岩站点上的 AI 板块热度监测页是只读展示,适合人工快速浏览主题热度的走势;本文的清单适合在 MCP 或 HTTP 层面复现同一主题的多窗口读数。两者的数据来源一致,但展示粒度与刷新时刻可能不同,引用页面上的读数时同样要注明查看时间。
七、常见误读对照表
| 误读 | 实际口径 | 规范写法(示例) |
|---|---|---|
| 「AI 主题 1h 排第 2,说明全市场都在讨论它」 | 1h 只代表最近 1 小时,且可能由少数主体贡献 | 「1h 窗口名次 2,agencies=9」 |
| 「3d 名次下降,热度在退」 | 长窗名次受其他概念累积量影响 | 「3d 窗口 mentions=410,名次 11」 |
| 「概念热榜和成分排行对不上,数据有问题」 | 前者约 2 分钟更新、滚动窗口;后者约 10 分钟更新、按 days 回看 |
注明两者时间戳与区间 |
| 「日频面板的概念序列可以接在 3d 窗口后面」 | 面板按自然日切分,窗口按 meta.server_time 滚动 |
两条曲线分开展示 |
「加了 min_score 名次更靠前,说明质量更高」 |
门槛改变了统计对象,只是另一种口径 | 「min_score=1050 口径下名次 3」 |
误读多数来自省略了参数。只要规范写法里带上窗口、门槛与绝对计数,读者就能自行判断读数的适用范围。
八、给 AI Agent 的执行模板
把清单压缩成一段系统提示词,Agent 每次被问到「某个主题最近热不热」时按固定顺序执行:
对目标概念执行五窗一致性检查:
1. 用 get_market_hot_concepts 依次取 window=1h/4h/18h/24h/3d,limit=200,min_score 保持一致
2. 每档记录名次、mentions、agencies、heat_z20 与 meta.server_time;未进前 200 记为「未进入」
3. 计算 share_1h = mentions_1h / mentions_24h,给出形态标签:短窗集中 / 多窗同步 / 长窗累积
4. 如需成分股,用 get_concept_stock_heat,days 与对照窗口匹配并注明
5. 回答只描述统计形态,不推断后续走势,不给任何操作含义
模板中的步骤 2 与步骤 5 最重要:前者保证读数可复现,后者保证输出停留在描述层面。
FAQ
Q:为什么 1h 排名很高,3d 却不在前 50?
A:3d 窗口累积的是 72 小时讨论量,长期稳定讨论的概念会占据前列;一个短时集中被讨论的概念在长窗口里分量被稀释。先把 limit 调到 200 再确认名次。
Q:概念热榜能按 market 筛选吗?
A:概念热榜没有 market 参数。需要区分市场时,下钻到成分股后按代码自行过滤。
Q:五档窗口的 heat_z20 能求平均吗?
A:不建议。各窗口的统计区间不同,z 分的含义也不同,平均后没有可解释的口径。
Q:清单能直接交给 AI Agent 执行吗?
A:可以把 A、B 两组写进系统提示词,要求回答时同时给出 window、min_score、mentions、agencies,并禁止把形态标签改写为方向判断。
Q:同一主题有多个相近概念名,要合并吗?
A:可以在本地维护别名映射后并列展示,但不要把多个概念的 mentions 直接相加,同一条消息可能同时命中多个概念,相加会重复计数。
结论
概念热度的多窗口读数各自成立,问题出在把它们放在一起叙述时口径不一致。按清单做到同轮取数、参数一致、先看绝对计数、下钻时显式换算 days、需要多日序列时切换到日频面板,并把每轮参数与 meta.server_time 落库,AI 主题的热度形态就能被准确描述和复现。
数据来自熔岩消息面热度监测,仅供研究参考,不构成投资建议。
只读监测与字段说明见:https://lava.ai-dolphin.com/monitor/board-ai-heat
Comments
Join the discussionNo comments yet. Be the first to comment.