Macro Terminal 通过一条完全基于规则的流水线,把宏观环境归类为一组有限的、有名称的宏观状态(macro regime)——例如 goldilocks(金发女孩状态)、stagflation_risk(滞胀风险)、disinflation(通胀回落)或 soft_landing(软着陆)。20 项宏观经济与金融指标先被标准化为稳健 z 分数,再汇总进四个支柱(利率/流动性、信用压力、通胀/能源、增长/就业),最后与一套按优先级排序的状态定义逐条匹配。整个过程没有任何自由裁量的余地:相同的观测值必然得出相同的状态。本文描述的是当前生效的方法——输入、公式、阈值、维持结论稳定的平滑机制,以及我们认为重要到必须与结果一并公开的局限。
1. 设计原则
用规则,不用判断。 每一步都是确定性函数。没有分析师干预,也不做预测——分类器描述的是已经发布的数据所隐含的状态。
中性是一个真实的答案。 一个永远都有观点的分类器,其实已经不再携带信息。neutral(中性)是一等结果,且阈值取得足够保守,使它保持实质含义,而不是沦为四舍五入的产物。
可解释性优先于拟合度。 任何一次判定都必须能从支柱状态和首要驱动因子还原出来。凡是提升了历史拟合度、却让判定更难解释的改动,一律否决。
稳定性优先于反应速度。 宏观状态不会每天变化。多项平滑机制(见 3.4、4、9 节)的唯一存在目的,就是抑制频繁翻转。
2. 四个支柱
20 项指标被划分为四个支柱,每个支柱 5 个成员。支柱是分类的基本单位:状态定义完全以支柱状态书写,从不直接引用单个指标。
| 支柱 | 衡量什么 | 成员指标 |
|---|---|---|
rates_liquidity | 政策与融资立场——利率和流动性环境的紧缩程度 | yield-2y、curve-10y-2y、term-premium、bank-reserves-26w-change、sofr-iorb |
credit_stress | 信用在扩张还是收缩,以及以什么价格扩张或收缩 | nfci、hy-spread、sloos-tightening、ci-loans-yoy、ofr-funding |
inflation_energy | 持续性价格压力,兼顾已实现通胀与市场隐含通胀 | cpi-services-yoy、cpi-median-annualized、pce-trimmed-yoy、breakeven-5y5y、crude-inventory-26w-change |
growth_labor | 实体活动与劳动力需求 | gdpnow、initial-claims、unemployment-rate、housing-starts、payrolls-3m-change |
成员构成遵循三条规则。
用流量,不用带趋势的水平值。 有两个成员是衍生序列:bank-reserves-26w-change 和 crude-inventory-26w-change,各自取基础序列的 26 周绝对差分。对一条强趋势的水平序列计算稳健 z 分数,会把长期漂移读成永久性信号——持续数年的准备金回落,会在流量早已企稳之后仍被记为持续收紧。改用半年期差分,才能恢复本来要问的那个问题:现在是不是正在收紧? 原始水平值仍保留展示,但不参与投票。
冗余控制。 成员之间会做两两相关性筛查。两个高度相关的输入,实质上是拿同一条信息投出五票中的两票——单凭这一点就足以带动整个支柱——因此凡与在位成员相关性过高的候选指标,无论其独立价值如何都会被排除。
必须补足支柱真正缺失的信息。 如果一条序列只是已有成员经过平滑、滞后之后的回声,它增加的是时滞而不是信号,同样排除。
3. 从观测值到信号:稳健 z 分数
每项指标都会被转换为稳健 z 分数,用以衡量其最新观测值相对于自身历史有多异常。
3.1 公式
z = (x − median(window)) / (MAD(window) × 1.4826)
其中窗口是一段不包含当前点的滚动历史,MAD 为中位数绝对偏差。常数 1.4826 用于对 MAD 重新标定,使正态分布数据下的结果可与常规标准差 z 分数直接比较。
之所以用中位数和 MAD 取代均值和标准差,是因为宏观序列中存在真实的极端值——一个危机级别的读数就足以把标准差抬高到让此后数年的所有信号统统失声。稳健估计量既把极端值保留在记录中,又不让它破坏整体尺度。
3.2 窗口、下限与截断
| 参数 | 取值 | 用途 |
|---|---|---|
| 默认 z 分数窗口 | 2,520 行(约 10 个交易年度) | 足以覆盖一个完整周期 |
| 默认百分位窗口 | 1,260 行(约 5 个交易年度) | 用于展示上下文 |
| 最少观测数 | 30 | 低于此数,完全不输出 z 分数 |
| 缩尾处理上限 | ±4 | 最终 z 值被截断到 [−4, +4] |
| MAD 下限 | 按指标可选启用 | 防止除以接近零的离散度 |
低频序列采用与其发布节奏相匹配的更短窗口:季度频率的 gdpnow 用 40 行,月度就业和地产序列用 120 行,周度序列用 520 行。窗口按行数而非日历天数计算。
MAD 下限对那些长期贴近零值的利差序列尤为重要——此时接近零的 MAD 会让分母坍缩,把几个基点的噪声制造成巨大的 z 分数。启用时,该下限以序列自身单位表示(融资利差为 2 个基点),并在重新标定前以 max(MAD, 下限) 的形式生效。若离散度仍为零,计算会回退到常规的均值/标准差 z 分数;若这一步同样退化,则 z 分数报告为零,而非未定义。
3.3 符号约定
不同指标的经济方向并不一致:高收益利差上升意味着收紧,银行准备金上升则意味着宽松。每项指标都带有方向标记,被标记为 falling_is_tightening 的序列会对其 z 分数取反。完成归一化后,约定在全局统一:
z 为正表示更紧、更承压;z 为负表示更松、更有支撑。
3.4 信号分类与死区
每个 z 分数会落入以下四种信号之一:
| 信号 | 条件 |
|---|---|
pressure(承压) | z > +0.75 |
support(支撑) | z < −0.75 |
watch(观察) | −0.75 ≤ z ≤ +0.75,或 z 无法计算 |
stale(过期) | 观测值早于该指标的新鲜度容限 |
−0.75 到 +0.75 之间的区间即全局信号死区;落在其中的指标不投任何票。这是整条流水线的第一道平滑机制:一条序列历史分布中大约中间一半的区域被视为"什么也没说",而对一条贴近自身中位数的序列而言,这通常正是正确的读法。
少数成员带有更宽的成员级死区,仅对该成员覆盖全局阈值——两个 26 周流量成员使用 ±1.0。经过流量变换的序列,其 z 路径比水平序列更嘈杂,在全局阈值下会在低信息量时期产生可观测到的过量状态翻转。给更嘈杂的投票者设更高的门槛,是针对性的修正;全局阈值不受影响,未启用该可选配置的指标行为与此前完全一致。
3.5 新鲜度
过期观测值不是弱信号——它根本不是信号。每项指标依据其发布频率获得一个过期容限:
| 频率 | 容限 |
|---|---|
| 日度 | 14 天 |
| 周度 | 14 天 |
| 月度 | 45 天 |
| 季度 | 135 天 |
个别指标可以覆盖频率默认值——若干月度就业和地产序列采用 75 天而非 45 天,因为一条发布滞后数周的序列,否则每个月都会有一段时间被错误标记为过期。放宽容限属于方法论变更,而非便利之举:容限依据实际观测到的发布行为设定,绝不迁就分类器的需要。
4. 从信号到支柱状态
在每个支柱内部,票数被清点并轧差:
netScore = (承压信号数)−(支撑信号数)
只有新鲜成员参与投票。watch 成员计入有效数,但贡献为零。支柱状态由净分决定:
| 条件 | 支柱状态 |
|---|---|
| netScore ≥ +2 | pressure(承压) |
| netScore ≤ −2 | support(支撑) |
| 其他 | neutral(中性) |
要求净分达到 2 而非 1,是第二道主要平滑机制。在 5 个成员的设定下,±2 意味着至少两个成员方向一致且无反向票,或三个成员对一个成员形成压倒。单个指标永远无法独自带动支柱。这是刻意的保守:它接受部分真实拐点被识别得偏晚,以换取分类器不对任何单一读数做出反应。
支柱层面另有三项指标被一并报告:
- 有效性。 当 5 个成员中至少 3 个新鲜时,该支柱为有效。有效性不影响状态匹配——它影响置信度(8.1 节)和软着陆门槛(第 7 节)。
- 支柱置信度。 至少 4 个成员新鲜、且净分对所报状态具有决定性(方向性状态 |净分| ≥ 2,中性状态 |净分| ≤ 1)时为
high;新鲜成员少于 2 个时为low;其余为medium。 - 首要驱动因子——绝对 z 分数最大的新鲜成员,正是它让一次状态判定可以用一句话还原。
5. 状态分类体系
状态定义由 required(必须满足)的支柱状态,加上可选的 unless(除非)否决条件构成,并按优先级顺序评估,首个匹配生效。第一条满足全部条件的定义即为基线状态;若无一满足,结果为 neutral。
| 优先级 | 状态 | 必须满足 | 除非(否决) |
|---|---|---|---|
| 1 | stagflation_risk(滞胀风险) | 通胀 = 承压 且 增长 = 承压 | — |
| 2 | growth_scare(增长恐慌) | 增长 = 承压 且 信用 = 承压 | 通胀 = 承压 |
| 3 | goldilocks(金发女孩) | 通胀 = 支撑 且 增长 = 支撑 | 信用 = 承压 |
| 4 | overheating(过热) | 增长 = 支撑 且 通胀 = 承压 | — |
| 5 | reflation_watch(再通胀观察) | 通胀 = 承压 | 增长 = 承压 |
| 6 | disinflation(通胀回落) | 通胀 = 支撑 | 增长 = 承压 |
| — | neutral(中性) | 以上均不匹配时的兜底 | — |
这个排序遵循从更具体到更笼统的原则:overheating 要求 reflation_watch 的全部条件外加增长支撑,因此必须排在其之上,否则这个更具体的状态永远无法被触及。两个压力状态位居最前,是因为当增长承压时,"为什么承压"——通胀还是信用——才是主导问题。goldilocks 要求通胀支撑,因此与鹰派家族完全不会重叠。
overheating 之所以存在,是因为把所有通胀承压情形收进一个筐在语义上过于粗糙。需求拉动型的价格压力(通胀承压且增长支撑)与增长中性下的通胀承压,是性质迥异的两种环境;把二者合并,会导致单一状态吸收掉过大比例的分类时段,从而丧失区分能力。将增长支撑的格位拆分出来后,reflation_watch 只保留增长中性的情形。
请注意,rates_liquidity 没有出现在任何状态定义中。 这是有意为之:紧缩的政策利率几乎与所有宏观状态都能共存,包括良性状态,因此赋予该支柱否决权只会产生系统性的错误判定。利率证据通过另外两条通道进入结果——作为压低置信度的反向证据(8.1 节),以及 financial_tightening_watch 标签(8.2 节)。
6. 通胀动量覆盖规则
支柱状态是水平读数:它回答的是"通胀相对自身历史是否偏高",而不是"通胀是否正在下行"。一轮已经推进过半、但水平尚未回归正常的通胀回落,仍会被记为通胀承压——作为水平陈述这是正确的,作为对环境的描述则会误导。因此,另有一套通胀动量计算来补足这个缺失的维度。
6.1 构造
四条核心通胀序列在 6 个月的时间跨度上接受评估:cpi-services-yoy、cpi-median-annualized、pce-trimmed-yoy 和 breakeven-5y5y。对每条序列,将其相对六个月前的变化量与一个分项死区比较:
| 序列 | 死区(序列自身单位,百分点) |
|---|---|
cpi-services-yoy | 0.10 |
cpi-median-annualized | 0.10 |
pce-trimmed-yoy | 0.10 |
breakeven-5y5y | 0.05 |
当 6 个月变化量低于 −死区 时,该序列为减速;高于 +死区 时为加速;落在区间内则两者皆非。变化量必须严格越过死区边界;恰好落在边界上的移动不计入。
比较点的取值有边界约束:它必须落在精确六个月目标日期前后 45 天之内。若无此约束,稀疏的历史会让名义上的"6 个月动量"悄悄跨越九个月甚至十二个月。当不存在合格的比较点时,该分项报告为不可用,而不是给出一个具误导性的数字。
6.2 汇总
- 动量支撑要求 4 条核心序列中至少 3 条减速,且市场否决未触发。
- 动量承压是完全对称的镜像:至少 3 条加速。这种对称是刻意的——错过通胀上行的代价,与错过下行同样高昂。
- 市场否决是非对称的。 市场隐含通胀(
breakeven-5y5y)加速越过其死区时,会阻断动量支撑,因为市场正在向上定价通胀,这与通胀回落的判断相矛盾。持平或缺失的市场读数不会形成阻断,且该否决不约束承压一侧。 - 当核心分项缺失时,动量报告为
unavailable(不可用),但支撑和承压的优先级高于不可用:三条序列同向移动本身就是真实信号,即便第四条缺席。
6.3 对显示结论的影响
当基线状态为 reflation_watch 或 overheating、增长未处于承压、且动量读数为支撑时,显示的状态被覆盖为 disinflation。基线状态连同一个覆盖标记一并保留在数据体中,因此整个推导过程始终可审计。
两个鹰派基线共享这条覆盖规则。若把其中任何一个排除在外,就会出现一种病态结果:某段时期的水平读数为"通胀承压加增长支撑",于是显示出过热的叙事,而此时核心通胀实际正在减速——与真实读法完全相反。
7. 软着陆门槛
soft_landing 是一个仅由覆盖规则产生的状态:它没有自己的支柱定义,只能从 neutral 基线到达。
这道门槛完全建立在正面证据之上。用否定式条件拼出来的门槛会空洞地触发:在数据稀疏时,"没有任何东西处于承压"是平凡为真的,于是单个良性观测值就能把一个空洞的读数抬升为一次自信的软着陆判定。因此仅有中性并不够——以下五项条件必须全部成立:
- 基线状态为
neutral。(goldilocks、growth_scare和stagflation_risk被直接排除;真实的disinflation受到保护,绝不会被覆盖。) - 通胀动量按第 6 节规则读数为支撑。
growth_labor与credit_stress中承压信号分项数为零——按单个指标评估,而非按支柱评估。- 一道数据充分性下限:
growth_labor、credit_stress和inflation_energy各自至少有 3 个新鲜且 z 分数可计算的成员(新鲜但无 z 分数的成员不计入)。只有在数据足以让动荡显形时,"平静"才是可信的。 - 萨姆规则未触发。
萨姆规则
一个广为使用的衰退指标,仅由失业率计算得出:
sahm = mean(失业率, 最近 3 个月)
− min(过去 12 个窗口的 3 个月均值)
当 sahm ≥ 0.50 个百分点时触发
它需要 15 个月度观测值,且跨度不得超过 16 个日历月;历史更稀疏时直接拒绝,而不做近似。一旦触发,就与"经济是在着陆而非坠落"的判断相矛盾,无论通胀动量如何都会否决该覆盖规则。
8. 置信度与观察标签
8.1 置信度
每次状态判定都附带一个置信度等级,说明该判定得到多充分的支持。
| 等级 | 条件 |
|---|---|
high | 非中性,且有效支柱 ≥3 个,且处于方向性(非中性)状态的支柱 ≥3 个,且全部 20 个成员中新鲜比例 ≥75%,且反向证据 ≤1 项 |
medium | 有效支柱 ≥2 个,且方向性支柱 ≥2 个,且全部成员中新鲜比例 ≥60% |
low | 其余情形 |
反向证据是那些与判定相悖的分项:对基于定义的状态,指与某个必须满足的支柱状态方向相反的成员;对 disinflation,指越过死区重新加速的核心序列;对 soft_landing 和 goldilocks,指利率支柱中的承压分项。最后这一条正是那个不参与分类的利率支柱施加影响的方式——紧缩的利率不会否决一次良性判定,但两项及以上此类分项会把置信度封顶在 medium。
置信度对有名称的状态和对中性状态含义不同:对有名称的状态,它报告的是对该判定的信心;对 neutral,它报告的是数据充分性。一个低置信度的中性,是关于数据的陈述,而不是关于经济的陈述。
8.2 观察标签
观察标签是附加式的注记,用于在不惊动主结论的前提下呈现接近某状态的情形。它们之所以存在,是因为 ±2 这一保守的支柱阈值必然会丢弃那些正在形成、但尚未确认的状态所携带的信息。
| 标签 | 触发条件 |
|---|---|
growth_scare_watch | 增长与信用双双出现承压分项,通胀未处于承压,但状态尚未达到 growth_scare |
growth_deterioration_watch | 就业主导的恶化,且未获信用确认——增长支柱承压而通胀未承压,或萨姆规则触发(后者跳过通胀条件,并将严重度升级为 alert) |
financial_tightening_watch | 利率承压,信用未处于支撑,增长未处于承压,且当前状态属于鹰派家族(neutral、reflation_watch、overheating) |
soft_patch_watch | 主结论为中性,同时通胀支撑、增长承压、信用未承压 |
reflation_transition_watch | reflation_watch 在水平层面依然成立,但增长和信用都很平静——环境已越过单纯的通胀观察阶段 |
reacceleration_watch | 显示中的状态为 disinflation 或 soft_landing,而通胀动量已翻转为承压 |
reacceleration_watch 是对照已确认的主结论核对的,而非瞬时候选状态(见第 9 节):一个被保持住的通胀回落结论,与重新加速的动量并存,恰恰是必须向读者发出警示的时刻。
设计规则是:一个对解读有用、但强度不足以改变持仓的信号,应当做成标签而不是状态。标签是附加式的、向后兼容的;状态不是。
9. 确认机制:连续计数规则
上述分类为每个观测日期产出一个候选状态,它不会立即显示。一个新候选状态必须在 3 个不同的观测日期上都是瞬时分类结果,显示的主结论才会切换;在此之前,此前已确认的状态继续保持。
- 连续计数基于已存储的日度快照行,而非流水线运行次数,因此重算或缓存重建都无法虚增计数。
- 快照缺失的日期不会重置计数;要求是最近三个已存储行彼此一致。
- 不存在同族豁免,也不为高置信度候选状态提供快速通道。
- 冷启动、无此前已确认行时,首次分类立即确认。
代价是明确的:显示的状态最多可能落后数据两个观测点。 这一点被接受。状态历史的用途是推理持续性的环境,而一份充斥着两天来回翻转的历史,无法服务于这个目的。
10. 验证
方法论通过历史回放验证:在完全相同的规则下,让分类器在全部可用历史上重跑一遍,再检查所得状态路径的统计健康度与情景吻合度。任何候选改动在被采纳前,都必须与当前版本对照回放,并通过以下关卡:
| 关卡 | 要求 |
|---|---|
| 数据覆盖度 | 不得有任何覆盖度中止条件处于激活状态 |
| 非中性下限 | 分类器必须在相当比例的时段内给出方向性判定 |
| 稳定性——转换次数 | 转换次数 ≤(观测点总数 ÷ 3) |
| 稳定性——持续时长 | 平均状态持续时长 ≥ 2 个月 |
| 情景改善 | 相对当前版本,至少改善 2 个历史情景的结果 |
| 情景退化 | 不得下调任何当前已通过的情景 |
| 可解释性 | 每一个发生变化的情景,都必须能从支柱状态和首要驱动因子还原 |
情景关卡用具名的历史宏观环境来检验分类器——一次通胀冲击、一次紧缩顶点、一次增长冲击、一轮通胀回落和一次软着陆——选择它们,是因为这些情景在事后(ex post)判定明确,且分别对分类体系的不同部位形成压力。转换期窗口用作诊断和平手时的决胜依据,而非硬性关卡;某个候选方案若让转换期窗口更难解释(通常表现为快速翻转),即使通过了硬性关卡也会被标记出来。方向性判定占比过高属于定性评审风险,而非自动通过项:新增的非中性时段必须确实改善情景吻合度并保持可解释,而不是仅仅把中性转换成噪声。
每一份数据体都带有方法论版本戳。任何对打分、阈值、分类体系或平滑机制的改动,都需要一次完整的历史回放和一个新的版本字符串——不同版本下计算出的结果绝不会被静默混用。
11. 已知局限
我们公开这些内容,是因为只罗列优点的方法论页面算不上方法论页面。
基于水平的分类,只有一条动量通道。 只有通胀配备了显式的动量覆盖规则。一个正从低位快速改善的增长或信用环境,在水平本身回升之前仍会被读作承压。把动量处理扩展到其他支柱,是一个公认尚未解决的开放问题。
阈值的保守性是一项刻意的取舍。 ±2 的支柱净分和 ±0.75 的信号区间,意味着拐点被识别得偏晚。放宽到 ±1 已经过测试:它确实提升灵敏度、改善对急剧冲击的识别,但会把方向性判定的占比推高到 neutral 不再发挥有意义兜底作用的程度,且单个指标的移动就足以翻转一个支柱。当前校准宁可识别得晚,也不要虚假的确定性;需要更早预警的读者应关注 8.2 节的标签。
没有专门的冲击状态。 不连续的冲击——宏观状态变化速度快于月度和季度数据的描述能力——通过增长与信用观察标签来处理,因为宽到足以可靠捕捉冲击的阈值改动,会在所有普通时期都损害表现。其后果是:对突发冲击的识别依赖标签,而非主结论。
确认连续计数带来已知的时滞,最多两个观测点——这是换取稳定、可解读的状态历史所付的代价。
相关性输入被控制,但未被消除。 支柱内部的相关性经过筛查,但宏观指标天然相关;一个支柱仍可能因某个共同因子而整体移动。
数据修订。 宏观经济数据会被修订。z 分数使用的是当前可得的历史,因此今天重算出的状态路径,可能与分类器当时所显示的不同。历史回放描述的是方法论在当前数据上的表现——它不是模拟的实盘业绩记录。
新鲜度政策是一项真实的权衡。 设得过紧,支柱成员不足,分类器会漂向由数据驱动的中性;设得过松,过期证据会被当作当前证据呈现。
公开的历史有边界。 对外暴露的历史覆盖的是一个滚动的多年窗口,而非全部已计算的历史,因此极长期的状态分布无法被直接检视。
这是描述,不是预测。 分类器陈述的是已发布数据所隐含的状态。它不预测下一个状态,不估计转换概率,也不构成投资建议。
12. 术语表
| 术语 | 含义 |
|---|---|
| 宏观状态(macro regime) | 分类器产出的、有名称的宏观状态 |
| 支柱(pillar) | 四个指标分组之一;状态定义所使用的书写单位 |
| 稳健 z 分数(robust z-score) | (x − 中位数) / (MAD × 1.4826),基于不含当前点的滚动窗口。MAD = 中位数绝对偏差 |
| 信号(signal) | 单个指标的分类结果:pressure、support、watch 或 stale |
| 死区(dead-band) | 零值周围的中性区间,数值必须越过它才被计为信号 |
| 覆盖规则(overlay) | 覆盖基线状态、同时在数据体中保留该基线的规则 |
| 观察标签(watch tag) | 用于标示接近某状态情形的附加式注记 |
| 连续计数(streak) | 候选状态在被显示前必须连续保持的观测日期数 |
| 置信度(conviction) | high / medium / low——对有名称状态表示判定信心,对 neutral 表示数据充分性 |