# 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，文中数字均为示例，所有字段都是描述性统计量。

## 一、为什么概念热度要做跨窗口检查

概念热榜有三个容易被忽略的特点：

1. **窗口是滚动的。** 1h 统计的是从 `meta.server_time` 往回 1 小时，3d 是往回 72 小时。窗口越短，单条长文或一轮集中讨论的影响越大。
2. **没有 7d 档。** 个股热榜 `/hot/stocks` 有 7d，概念热榜最长到 3d。需要周度概念序列时，应改用日频面板 `/panel/daily` 的 `type=concept`。
3. **已去掉泛词。** 概念热榜在统计前去掉了过于宽泛的词，因此榜单上的概念名就是可以继续下钻的标准名；但被去掉的泛词也不会出现在任何窗口里，跨窗口对比时不必为它们找原因。

只看单一窗口时，这些特点不会造成问题；一旦把多个窗口的排名放在一起叙述，就必须先确认口径一致。

## 二、参数与口径速查

| 参数 / 字段 | 取值或含义 | 默认 | 备注 |
| --- | --- | --- | --- |
| `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）

1. **五个窗口在同一轮内连续取数。** 五次调用间隔尽量短，并记录每次的 `meta.server_time`；跨轮混用会把「时间推移」误当成「窗口差异」。
2. **`min_score` 五档保持一致。** 一档加门槛、一档不加，比较的就是两类主体。
3. **`limit` 足够大。** 目标概念在长窗口里可能排到 50 名以外，默认 50 会让它「消失」。研究 AI 主题时建议 `limit=200`。
4. **概念名从榜单返回里取。** 不要手写「人工智能」「AI」等别名；精确匹配以榜单返回为准，后续传给 `/concepts/stocks` 的 `concept` 也用同一个字符串（≤30 字符）。

### B. 多窗口形态（5～9）

5. **先排列绝对计数，再看名次。** 名次受其他概念影响，`mentions` 是概念自身的读数。
6. **计算短窗占比。** 例如 `share_1h = mentions_1h / mentions_24h`（本地计算列）。示例：AI 主题 `mentions_1h=36`、`mentions_24h=180`，占比 0.2，意味着最近 1 小时占了一天讨论量的五分之一（示例数字）。
7. **对照 `agencies` 是否同步变化。** 短窗 `mentions` 高但 `agencies` 很少，说明是少数主体集中发布；两列同步升高才是参与面扩大。
8. **读 `heat_z20` 时带上窗口。** 写成「24h 窗口 `heat_z20`」，不同窗口的 z 分不能互相比较。
9. **用一个形态标签描述结果。** 建议只用三种描述：短窗集中（1h/4h 占比高）、多窗同步（各窗口名次接近）、长窗累积（3d 名次明显高于短窗）。标签是描述，不推断后续走势。

### C. 下钻连贯性（10～13）

10. **成分股用 `get_concept_stock_heat` 下钻。** `/concepts/stocks` 用 `days` 回看（默认 30，最大 365），不是滚动 `window`；与 24h 概念热度对照时设 `days=1`，与 3d 对照时设 `days=3`，并在结果里注明。
11. **检查成分集中度。** 前 3 只成分股 `mentions` 占概念合计的比例过高时，概念热度更像个股事件带动。
12. **反查重点个股的概念归属。** 用 `get_stock_concept_heat`（`/concepts/by-stock`）确认该股是否同时挂在多个 AI 相关概念下，避免重复计数。
13. **需要多日序列时切到日频面板。** `get_stock_heat_panel(type="concept", names=...)`（`/panel/daily`）按自然日返回概念的 `mentions`、`agencies`、`weighted_heat`，区间最长 92 天；它与滚动窗口口径不同，不要拼接到同一条曲线上。

### D. 记录与复现（14～15）

14. **每轮落库最少字段：** `window`、`min_score`、`limit`、`meta.server_time`、`meta.request_id`、概念名、`mentions`、`agencies`、`heat_chg_1d`、`heat_chg_3d`、`heat_z20`、名次。
15. **记录费用。** 五档窗口即五次调用，每次 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%，短窗名次高于长窗，形态为短窗集中」。不应写成「热度即将扩散」或任何方向判断。

## 五、一轮五窗取数脚本

```python
# 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 每次被问到「某个主题最近热不热」时按固定顺序执行：

```text
对目标概念执行五窗一致性检查：
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
