跳转至

消费者信心 —— 当纵向轴是「信息」而不是「时间」

studies/consumer_confidence/ · reference: true · Path C(包装 ConsumerSim 管线)

给定一个固定人群池和某一时点可得的新闻,能否预测该月的美国消费者信心? 以及——当信息在同一个目标月内不断累积时,预测如何随之更新?后半句才是 这个案例值得抄的地方:面板的纵向轴不是日历时间,而是 as_of 信息截止日。 每一步都用一个严格更大、且点时安全(point-in-time safe)的信息集,对同一个 目标月重新预测一次。这是把一个天生「单发」的模拟器,改造成一个诚实的纵向 故事的通用手法。

P / E / B

是什么 来自哪里
P 12 个合成分层 persona,us-demo-0001us-demo-0012,每人占据 region × age × income × education × location 的一个互异格。interaction: none、propagation independent——受访者之间互不交谈,这对调查工具而言是正确的。 population/population.jsonmaterialized_count: 12
E 只有两层,且没有 scheduled events、没有 broadcasts(见下表)。provider 为 consumersim.envregion: US、3 个 target_months(都是 2026-06)、3 个 as_of_dates environment/environment.json
B decision consumersim.decision:被抽中的 core agent 产出 kind 为 survey_response 的 Action,用 positive / neutral / negative 回答 5 个 UMich 式问题。非核心 agent 产出 not_sampled,随后被贝叶斯扩展改写为 expanded_response adapter/decision.pyadapter/providers.py
layer modality scope dynamics 内容
consumer_information information macro scheduled 目标月的点时新闻 + 指标快照,随 as_of 推进每步重建
consumer_demographics physical local static ConsumerSim 所消费的固定人群人口学属性

没有事件的环境,依然是动态环境

scheduled_eventsbroadcasts 都是空的。E 仍然每步都在变——因为信息层 是按新的 as_of 截止日重建的。动态性并不要求有一次干预。

设计的另一半是 core / expansion 切分。core_ratio: 0.5 意味着每步由 LLM 直接 预测的是 12 人中的 6 人;另外 6 人由分层贝叶斯小域模型,从核心样本的群体 后验扩展得到。三步下来,覆盖整个人群池只花了 18 次模拟层 LLM 调用

一步是什么,跑多久

一步 = 同一目标月内的一个 as_of 截止日:同样这 12 个 agent,面对「该日期 及之前发布的一切」被重新调查一次。n_steps: 3seed: 42interaction_rounds: 1

step as_of 目标月
1 2026-06-13 2026-06
2 2026-06-20 2026-06
3 2026-07-01 2026-06

step 0 是一行空的热身记录(无 as_of、无分数)——人群已存在,但尚未预测。

结果

step as_of raw_score corrected_score news_count
0 0
1 2026-06-13 128.33 129.83 4
2 2026-06-20 138.33 139.83 5
3 2026-07-01 121.67 123.17 10

population_size 恒为 12、core_size 恒为 6——面板确实是固定的,变的只有信息。

预测走出一条「倒 V」:它跟随信息环境,而不是随时间漂移。combined_score 为 0.0563 → 0.0900 → 0.0675,修正后总分与之同形。注意新闻数量单调上升 (4 → 5 → 10),而净情绪在中间那个截止日见顶,随后被更晚、更混杂的标题稀释。 新闻更多 ≠ 情绪更好——这正是点时安全信息集要让你看见的东西。

报告自己写明的两条 caveat

  • indicator_count 每步都是 0:随附的指标观测日期晚于各步 as_of 截止日,被点时过滤器正确地滤掉了。因此 combined_score 全靠新闻情绪撑着。
  • 绝对水平(~120–140)未经校准。同月经过 grounding 的真实读数是 Conference Board CCI 91.2、UMich ICS 44.8。这个模板要读的是 「信息累积下的方向」与分项结构,而不是绝对点位。

被包装的引擎在完整规模下是另一幅图景。下面是 ConsumerSim 自己的 2020–2026 历史回测(来自外部管线,不是这个 12 人 study):逐月 CCI 预测对照真实值与 经典基线,跨过 COVID、通胀冲击与 2025 年的关税冲击:

ConsumerSim 的历史回测:对照真实值与 ARIMA/SARIMAX、ridge 等基线,2020–2026

Grounding

5 条 sourced 事实、3 条声明的假设、2 条建模参考。

条目 basis 作用
Conference Board CCI 2026-06 = 91.2(1985=100) sourced 本研究输出明确不去对标的水平线
其分项:Present Situation 116.4、Expectations 74.4 sourced 实证上的「当期弱 / 远期强」分裂
UMich ICS 2026-06 = 44.8(FRED,经 SocioVerse Event 服务) sourced 第二套量纲,用于看方向
UMich 2026-07 = 54.4,五个分项全部改善 sourced 可用于样本外检验的后续走势
宏观背景:CPI 同比 +3.9%、失业率 4.2%、汽油 $3.831/加仑 sourced 6 月新闻快照背后的驱动因素
展示运行把 core_ratio 调高于管线默认值 assumed 用默认值时,12 格人群池的分层核心会塌缩成 1 人
把纵向轴解读为 as_of 信息累积 assumed 对手上已有数据的可辩护用法,而非编造未来月份
把输出视为 Conference-Board 式指数量纲 assumed 由管线自身的修正锚点推断得到,上游文档未明述

建模参考:Statistics Canada(Survey Methodology, 2002)关于多项式小域数据的 分层贝叶斯不可忽略无响应模型——core → expansion 设计的依据;以及密歇根大学 Surveys of Consumers 方法论——决策模型所回答的五问题骨架。

最后那条假设值得细读:量纲映射是从数据文件推断出来的,所以它被声明为 assumption 而非引用来源。sourced / proxy / assumed 各自的承诺见 真实世界锚定与溯源

可以 fork 什么

参数 它打开的问题
region 同一套信息集,作用在不同区域的人群池上会同向移动吗?
target_months 等 7 月新闻齐备后加一步 2026-07,检验 grounding 里记录的回升到 54.4。
as_of_dates 更密的截止日会把「倒 V」变成一条真正的信息累积曲线。
news / indicator / history 输入 抽掉利好油价新闻做反事实:6 月预测里有多少来自「油价叙事」?或换入截止日之前的指标,让 indicator_count 不再为 0。
core_ratio 在 LLM 预算与扩展方差之间取舍;n=12 时单个核心样本的翻转就能撬动头条分。
prediction provider 换掉回答调查问题的模型,直接 diff 两条轨迹。

最自然的第一个 fork 是规模:更大的人群池配更低的 core_ratio,可以在 LLM 预算不变的前提下平滑头条分。复用永远是 fork 而非原地修改——见 迭代、版本与报告