Hodrick–Prescott(HP)滤波
HP滤波是双边滤波,无法预测未来。但可以提取出周期信息,减少相位,从而作为探针去筛选其他有预测性的指标。
Hodrick–Prescott 滤波(Hodrick–Prescott filter,简称 HP 滤波)是宏观经济学中最常见的趋势—周期分解方法之一。它把一个观测时间序列拆分为缓慢变化的趋势项和围绕趋势波动的周期项:
\[y_t = \tau_t + c_t,\]其中:
- $y_t$ 是观测序列;
- $\tau_t$ 是平滑趋势;
- $c_t$ 是周期或趋势偏离。
HP 滤波的优势是目标函数透明、计算简单、结果直观,而且不需要事先指定趋势为直线、指数曲线或某个固定次数的多项式。它的局限也同样明确:结果高度依赖平滑参数 $\lambda$,标准形式是双边滤波,样本端点容易修订,并且机械去趋势可能制造或放大并不存在于原始数据生成过程中的周期关系。
HP 滤波要解决什么问题
许多宏观经济序列同时包含长期增长和短期波动。例如,实际 GDP、工业增加值、消费、投资、货币供应量以及长期资产价格都可能写成:
\[y_t = \tau_t + c_t.\]研究者通常关心两个不同问题:
- 经济的长期路径如何变化,即 $\tau_t$;
- 当前经济活动相对长期路径偏高还是偏低,即 $c_t$。
如果直接用线性趋势:
\[\tau_t = a+bt,\]就等于假设整个样本期的长期增长率不变。这对经历生产率变化、人口结构变化、制度改革或长期增长减速的经济体通常过于僵硬。
如果使用高阶多项式趋势,虽然可以增加弯曲程度,但趋势在样本端点可能出现不稳定的外推,而且多项式次数缺少清晰的经济解释。
HP 滤波采取折中方案:趋势可以随时间改变,但趋势的斜率不能变化得过于剧烈。换言之,HP 趋势不是固定直线,而是一条受到“曲率惩罚”的平滑曲线。
目标函数
给定长度为 $T$ 的序列 $y_1,\ldots,y_T$,标准 HP 滤波通过求解以下优化问题估计趋势:
\[\min_{\tau_1,\ldots,\tau_T} \left\{ \sum_{t=1}^{T}(y_t-\tau_t)^2 + \lambda\sum_{t=2}^{T-1} \left[ (\tau_{t+1}-\tau_t)-(\tau_t-\tau_{t-1}) \right]^2 \right\}.\]第二项也可以写成趋势的二阶差分:
\[\Delta^2\tau_t = \tau_t-2\tau_{t-1}+\tau_{t-2}.\]因此,目标函数可简写为:
\[\min_{\tau} \{\sum_{t=1}^{T}(y_t-\tau_t)^2 + \lambda\sum_{t=3}^{T}(\Delta^2\tau_t)^2 \}.\]这个目标函数由两部分组成。
1. 数据拟合项
\[\sum_{t=1}^{T}(y_t-\tau_t)^2\]它要求趋势不要离原始数据太远。如果只有这一项,最优解就是:
\[\tau_t=y_t,\]此时趋势完全复制原序列,周期项处处为零,因而没有完成任何平滑。
2. 趋势平滑项
\[\lambda\sum_{t=3}^{T}(\Delta^2\tau_t)^2\]一阶差分 $\Delta\tau_t$ 表示趋势的局部斜率;若对数序列被滤波,它还可以近似解释为趋势增长率。二阶差分 $\Delta^2\tau_t$ 则表示斜率的变化,即趋势增长率是否在加速或减速。
惩罚二阶差分意味着:
- 趋势水平可以变化;
- 趋势斜率也可以变化;
- 但斜率不能频繁、剧烈地变化。
这正是 HP 趋势“平滑但非固定直线”的来源。
平滑参数
$\lambda$ 决定数据拟合与趋势平滑之间的权衡。
1. $\lambda=0$
目标函数只剩数据拟合项,因此:
\[\hat\tau_t=y_t, \qquad \hat c_t=0.\]没有任何滤波效果。
2. $\lambda$ 较小
趋势能够快速追随原始数据,更多短期波动被吸收到趋势中,周期项振幅较小。
3. $\lambda$ 较大
趋势更加平滑,更多中短期变化被归入周期项,周期项振幅通常更大、持续时间更长。
4. $\lambda\rightarrow\infty$
为了使二阶差分趋近于零,趋势最终接近一条直线:
\[\Delta^2\tau_t\approx 0.\]因此,$\lambda$ 不是一个无关紧要的技术参数。它实际上定义了研究者所说的“长期”和“周期”分别对应什么时间尺度。
矩阵形式与闭式解
HP 滤波可以写成标准的惩罚最小二乘问题。
令:
\[\mathbf y= \begin{bmatrix} y_1\\ y_2\\ \vdots\\ y_T \end{bmatrix}, \qquad \boldsymbol\tau= \begin{bmatrix} \tau_1\\ \tau_2\\ \vdots\\ \tau_T \end{bmatrix}.\]构造二阶差分矩阵:
\[\mathbf D= \begin{bmatrix} 1 & -2 & 1 & 0 & \cdots & 0\\ 0 & 1 & -2 & 1 & \cdots & 0\\ \vdots & & \ddots & \ddots & \ddots & \vdots\\ 0 & \cdots & 0 & 1 & -2 & 1 \end{bmatrix}.\]于是:
\[\mathbf D\boldsymbol\tau = \begin{bmatrix} \tau_1-2\tau_2+\tau_3\\ \tau_2-2\tau_3+\tau_4\\ \vdots\\ \tau_{T-2}-2\tau_{T-1}+\tau_T \end{bmatrix}.\]目标函数写为:
\[Q(\boldsymbol\tau) = (\mathbf y-\boldsymbol\tau)'(\mathbf y-\boldsymbol\tau) + \lambda(\mathbf D\boldsymbol\tau)'(\mathbf D\boldsymbol\tau).\]对 $\boldsymbol\tau$ 求一阶条件:
\[-2(\mathbf y-\boldsymbol\tau) +2\lambda\mathbf D'\mathbf D\boldsymbol\tau =0.\]整理得到:
\[(\mathbf I+\lambda\mathbf D'\mathbf D) \boldsymbol\tau = \mathbf y.\]因此:
\[\boxed{ \hat{\boldsymbol\tau} = (\mathbf I+\lambda\mathbf D'\mathbf D)^{-1}\mathbf y }\]周期项为:
\[\boxed{ \hat{\mathbf c} = \mathbf y-\hat{\boldsymbol\tau} }\]实际编程时不应显式计算矩阵逆。更稳定、更高效的做法是直接求解线性方程组:
\[(\mathbf I+\lambda\mathbf D'\mathbf D) \hat{\boldsymbol\tau} = \mathbf y.\]由于 $\mathbf D$ 极其稀疏,使用稀疏矩阵和稀疏线性求解器可以在很长的时间序列上快速计算。这也是 statsmodels 实现标准 HP 滤波的基本方法。
双边滤波
矩阵解可以写成:
\[\hat{\boldsymbol\tau}=\mathbf S_\lambda\mathbf y,\]其中:
\[\mathbf S_\lambda =(\mathbf I+\lambda\mathbf D'\mathbf D)^{-1}\]是平滑矩阵。
在样本中部,某个时点的趋势估计通常可以表示为过去、当前和未来观测值的加权和:
\[\hat\tau_t = \sum_{j=1}^{T}s_{tj}y_j.\]因此,全样本标准 HP 滤波不是实时因果滤波器。它在估计历史时点 $t$ 的趋势时使用了 $t$ 之后的数据。
这并不是程序错误,而是标准双边 HP 滤波的定义。它适合事后历史分解,但如果直接用于回测或实时决策,就会引入未来信息。
频率域解释
忽略有限样本边界,在无限样本的近似下,趋势项的频率响应为:
\[H_\tau(\omega) = \frac{1} {1+\lambda\left(2-2\cos\omega\right)^2} = \frac{1} {1+16\lambda\sin^4(\omega/2)}.\]周期项的频率响应为:
\[H_c(\omega)=1-H_\tau(\omega).\]当 $\omega$ 接近零时,代表变化很慢的低频成分:
\[H_\tau(\omega)\approx 1, \qquad H_c(\omega)\approx 0.\]因此,低频变化主要进入趋势。
当 $\omega$ 较高时:
\[H_\tau(\omega)\rightarrow 0, \qquad H_c(\omega)\rightarrow 1.\]因此,高频变化主要进入周期。
从这个意义上说:
- HP 趋势是低通输出;
- HP 周期是高通输出;
- 它不是理想的“砖墙式”滤波器,而是在不同频率之间平滑过渡。
若用趋势增益 $H_\tau(\omega_c)=0.5$ 定义一个便于理解的分界频率,则:
\[16\lambda\sin^4(\omega_c/2)=1.\]因此:
\[\omega_c = 2\arcsin\left( \frac{1}{2\lambda^{1/4}} \right).\]当 $\omega$ 较小时,可以使用近似:
\[\omega_c\approx\lambda^{-1/4}.\]对应周期长度约为:
\[P_c \approx 2\pi\lambda^{1/4}.\]以季度数据和 $\lambda=1600$ 为例:
\[P_c\approx 2\pi\times1600^{1/4} \approx 39.7\text{ 个季度},\]即约 10 年。这个计算帮助解释了为什么 $\lambda$ 必须随数据频率变化:同一个数值的 $\lambda$ 用在年度、季度和月度数据上,会对应完全不同的经济时间尺度。
需要注意,$P_c$ 只是根据增益等于 0.5 定义的近似分界,不表示 HP 滤波会把所有短于该周期的波动完整归入周期、把所有长于该周期的波动完整归入趋势。
如何选择平滑参数 $\lambda$
1. 经典季度参数:1600
Hodrick 和 Prescott 在季度宏观数据的应用中使用了:
\[\lambda_{\text{quarterly}}=1600.\]该数值后来成为季度数据的事实标准,但它不是由某条普适统计定理唯一确定的参数。
2. Ravn–Uhlig 四次方频率缩放
Ravn 和 Uhlig(2002)提出:当观测频率改变时,$\lambda$ 应按频率比的四次方调整。
以季度数据每年 4 个观测、基准参数 1600 为起点,若新频率每年有 $m$ 个观测,则:
\[\lambda_m = 1600 \left(\frac{m}{4}\right)^4.\]由此得到常用参数:
| 数据频率 | 每年观测数 $m$ | 常用 $\lambda$ |
|---|---|---|
| 年度 | 1 | 6.25 |
| 季度 | 4 | 1,600 |
| 月度 | 12 | 129,600 |
月度参数的计算为:
\[1600\left(\frac{12}{4}\right)^4 =1600\times3^4 =129600.\]3. 为什么不能机械套用默认值
默认参数只是一种可复现的起点。合理的 $\lambda$ 还取决于:
- 研究对象的经济周期长度;
- 序列是水平值、对数值还是增长率;
- 趋势是否存在结构变化;
- 样本长度;
- 数据是否经过季节调整;
- 研究目的是历史描述、政策监测还是预测。
2026 年一项针对季度宏观序列的 Monte Carlo 研究,在其特定的数据生成假设和美国实际增加值校准下,发现较合适的 $\lambda$ 可能是传统 1600 的约 7 至 12 倍。这个结果不应被解释为新的通用默认值,但它进一步说明:1600 并非适合所有季度序列的自然常数。
4. 推荐的敏感性分析
不要只展示单一参数。至少比较:
\[\lambda\in \{0.25\lambda_0,\lambda_0,4\lambda_0\},\]其中 $\lambda_0$ 是基准值。
如果主要结论在不同 $\lambda$ 下方向一致,结果更可信;如果结论随着参数轻微变化就发生反转,应明确说明趋势—周期分解缺乏稳健性。
5. 日频数据没有统一标准值
把四次方规则机械延伸到交易日频率会得到极大的 $\lambda$,而且日历日、交易日、节假日和金融市场周期的定义并不统一。对日频金融数据,应先明确目标周期,例如希望过滤数周、数月还是数年的变化,再依据频率响应和样本外目标选择参数,而不是宣称存在一个通用的“日频 HP 参数”。
为什么常对正值序列先取对数
对于具有长期复合增长特征的正值序列,常先定义:
\[x_t=\ln Y_t,\]再对 $x_t$ 使用 HP 滤波:
\[x_t=\tau_t+c_t.\]这样做有三个主要理由。
1. 把乘法增长转化为加法增长
若:
\[Y_t=Y_0e^{gt},\]则:
\[\ln Y_t=\ln Y_0+gt.\]指数趋势被转换为线性趋势,更符合 HP 对平滑斜率的处理方式。
2. 缓解尺度随水平增长的问题
原始 GDP 从 100 增长到 110,与从 1000 增长到 1010,在绝对量上变化相同,但经济意义不同。对数更接近相对变化尺度。
3. 周期项可近似解释为百分比偏离
若:
\[c_t=\ln Y_t-\tau_t,\]并定义趋势水平:
\[Y_t^{\text{trend}}=e^{\tau_t},\]则精确百分比偏离为:
\[100\left(e^{c_t}-1\right)\%.\]当 $c_t$ 较小时:
\[100c_t\%\]是一个良好的近似。
对数变换只适用于严格为正的数据。含零或负值的序列不能直接取对数,也不应为了使用对数而随意加常数,因为加常数会改变相对变化的经济含义。
数据预处理
1. 保证时间顺序正确
数据必须按日期升序排列,并处理重复日期。
2. 处理缺失值
标准 HP 滤波通常要求输入是连续的一维数值序列。直接删除中间缺失值会把不相邻时期错误地拼接在一起。
更合理的做法是:
- 先将数据重采样到明确频率;
- 判断缺失是发布缺口还是数据错误;
- 根据研究目的决定插值、保留缺失或缩短样本;
- 记录所有插值规则。
3. 先处理季节性
HP 滤波不是专门的季节调整工具。对未季调月度或季度宏观数据直接使用 HP,季节波动可能进入周期项,甚至影响趋势端点。
通常应优先使用官方季调序列,或先进行独立的季节调整,再做趋势—周期分解。
4. 不要把不同频率的数据直接混用
月度 M2、季度 GDP 和日度股价具有不同的信息集和时间尺度。即使最后都使用 HP 滤波,它们的 $\lambda$、样本长度、发布时滞和实时修订性质也不同。
端点偏差与实时修订
1. 为什么端点最不稳定
在样本中部,趋势估计可以同时利用左侧和右侧观测值。在样本末端,没有未来观测值,平滑器只能使用当前及过去数据来满足拟合与曲率约束。
因此,最后若干期的隐含权重与样本中部不同。新增数据后,原来的样本末端变成内部点,其趋势和周期估计可能显著修订。
2. “全样本历史图”与“当时可得估计”不同
设研究者在时间 $t$ 只拥有:
\[\{y_1,\ldots,y_t\}.\]当时计算得到的末端趋势为:
\[\hat\tau_{t|t}.\]多年后使用完整样本重新计算,同一时期的趋势可能变成:
\[\hat\tau_{t|T},\qquad T>t.\]两者通常不相等。
因此,使用全样本 HP 周期做历史回测时,不能把 $\hat c_{t|T}$ 当成当时能够观察到的信号。严格回测应逐期扩展样本并重新计算,只保存每次的末端估计。
3. 新文献对实时不确定性的补充
Hamilton(2018)强调了 HP 端点估计和伪动态问题。2025 年一项直接比较 HP 与 Hamilton 趋势分解修订性质的研究发现,两者的实时修订轮廓不同:HP 在新增数据初期的修订可能更差,而 Hamilton 方法的修订可能随预测跨度逐渐恶化。这个结果并没有消除 HP 的端点问题,而是说明“哪种方法更好”取决于研究者更不能接受哪一种修订形态。
HP 周期不等于真实经济周期
HP 滤波产生的是一个数学分解:
\[\hat c_t=y_t-\hat\tau_t.\]它不自动等于:
- 结构模型中的产出缺口;
- 可观测的供需缺口;
- 资产价格的合理估值偏离;
- 未来衰退概率;
- 因果意义上的商业周期冲击。
HP 滤波没有使用生产函数、通胀、失业率、产能利用率、金融条件或预期等经济信息。它只使用单变量序列本身和一个平滑惩罚。
因此,HP 周期最稳妥的名称是“相对 HP 平滑趋势的偏离”,而不是不加限定地称为“真实周期”或“泡沫”。
状态空间解释
标准 HP 目标函数可以与一个简单的统计模型联系起来:
\[y_t=\tau_t+\varepsilon_t,\] \[\Delta^2\tau_t=\eta_t,\]其中:
\[\varepsilon_t\sim N(0,\sigma_\varepsilon^2), \qquad \eta_t\sim N(0,\sigma_\eta^2).\]在这一解释下:
- $\varepsilon_t$ 是观测值相对趋势的短期扰动;
- $\eta_t$ 是趋势斜率变化的冲击;
- 趋势的二阶差分是随机的,而不是严格为零。
对应的平滑参数为:
\[\lambda = \frac{\sigma_\varepsilon^2} {\sigma_\eta^2}.\]如果观测扰动相对于趋势斜率冲击很大,则 $\lambda$ 较大,趋势应更平滑;如果趋势增长率本身经常变化,则 $\sigma_\eta^2$ 较大,$\lambda$ 较小,趋势应更灵活。
这个解释为 $\lambda$ 提供了信号—噪声比含义,但标准 HP 的常见实践通常直接固定 $\lambda$,而不是从每个具体序列估计两个方差。
主要批评与使用边界
1. 可能制造伪周期和伪动态关系
Harvey 和 Jaeger(1993)以及 Hamilton(2018)都指出,机械去趋势可能使研究者在周期项中发现原始数据生成过程并不支持的动态规律。
原因在于:HP 周期不是被动地“读出”真实周期,而是由预设的频率权重和样本边界共同构造出来。
2. 对结构突变敏感
如果序列存在永久水平跳变或增长制度变化,标准 HP 会在突变前后用一条平滑曲线过渡。结果可能把结构突变的一部分解释为持续数期的周期偏离。
因此,重大制度变迁、战争、疫情、统计口径重构和一次性永久冲击应单独分析。
3. 周期项不保证平稳
从序列中减去 HP 趋势,并不能自动保证剩余项满足协方差平稳性。单位根、长记忆、结构突变和时变波动仍可能保留在周期项中。
如后续模型要求平稳性,仍需进行单位根、结构突变和稳定性诊断。
4. 参数敏感性
不同 $\lambda$ 对应不同的趋势定义。只报告一个参数而不说明选择依据,会把主观的时间尺度选择伪装成客观事实。
5. 不适合直接外推预测
标准双边 HP 是样本内平滑器,不是预测模型。趋势的末端斜率可以被用于朴素外推,但这种做法没有自动获得可靠的概率预测性质。
十四、标准 HP 的合理使用场景
HP 滤波更适合以下任务:
- 对季调后的宏观序列进行事后描述性趋势—周期分解;
- 在同一数据频率和同一参数下比较多个序列的历史波动;
- 构造对模型结论的稳健性检查;
- 教学中展示惩罚最小二乘、平滑矩阵和频率响应;
- 在明确承认端点修订的前提下,作为多个趋势估计方法之一。
不宜把标准 HP 单独用于:
- 无未来信息约束的实时交易信号;
- 不经实时递归重算的历史回测;
- 对结构突变频繁序列的唯一趋势估计;
- 把周期项直接解释为因果冲击或精确产出缺口;
- 通过调节 $\lambda$ 最大化样本内预测收益后,再把结果视为稳健规律。
十五、实践工作流
一个可复现的标准 HP 分析可以按以下顺序进行。
步骤 1:明确研究问题
先说明要估计的是长期增长路径、商业周期偏离,还是仅仅为了图形平滑。不同问题不一定应该使用同一个参数。
步骤 2:确定数据频率和样本
检查日期、频率、缺失值、重复值和样本长度。
步骤 3:决定是否取对数
对严格为正且具有乘法增长特征的水平序列,通常先取自然对数。
步骤 4:处理季节性
优先使用官方季调数据。
步骤 5:选择基准 $\lambda$
年度、季度和月度数据可以分别从 6.25、1600 和 129600 开始。
步骤 6:计算趋势和周期
\[\hat c_t=y_t-\hat\tau_t.\]步骤 7:做参数敏感性分析
至少比较较小、基准和较大的三个参数。
步骤 8:检查端点修订
对实时应用,逐期扩展样本并保存每期的末端估计。
步骤 9:检查经济解释
确认所谓“周期”不是季节性、结构突变、数据修订或异常值造成的机械结果。
步骤 10:完整报告
报告数据来源、变换、样本区间、频率、季调状态、$\lambda$、是否使用全样本以及是否进行实时递归计算。
十六、Python 实现说明
与本文配套的 hp_filter_standard.py 只实现普通 HP 滤波,包含两种完全等价的计算路径:
- 使用
statsmodels.tsa.filters.hp_filter.hpfilter; - 根据矩阵公式,使用 SciPy 稀疏矩阵直接求解:
第二种实现不是另一种滤波器,而是标准 HP 的透明复现。代码会比较两种方法的最大绝对误差,正常情况下应接近浮点数计算误差。
代码还会输出:
- 原始或对数变换后的分析序列;
- HP 趋势;
- HP 周期;
- 若使用对数变换,则输出精确的趋势百分比偏离;
- 趋势图;
- 周期图;
- 可选的扩展样本末端估计,用于展示实时修订问题。
对于月度 Shiller 标普 500 数据,可以使用:
1
2
3
4
5
6
7
python hp_filter_standard.py \
--input shiller_sp500_monthly_1871_present.csv \
--date-col CalendarDate \
--value-col P \
--frequency monthly \
--log-transform \
--realtime-demo
月度默认参数为:
\[\lambda=129600.\]若要使用自定义参数:
1
2
3
4
5
6
python hp_filter_standard.py \
--input data.csv \
--date-col date \
--value-col value \
--lambda-value 200000 \
--log-transform
十七、结论
标准 HP 滤波可以概括为一个受到二阶差分惩罚的最小二乘平滑器:
\[\boxed{ \min_{\tau} \sum_t(y_t-\tau_t)^2 + \lambda\sum_t(\Delta^2\tau_t)^2 }\]它的核心并不是“自动发现真实趋势”,而是在拟合原始数据与限制趋势曲率之间做出由 $\lambda$ 控制的权衡。
正确使用 HP 滤波需要同时理解四件事:
- $\lambda$ 定义了趋势的时间尺度;
- 标准 HP 是双边滤波,历史结果使用未来数据;
- 样本端点会随着新增数据而修订;
- HP 周期是相对某条数学平滑趋势的偏离,不是自动成立的经济结构变量。
因此,HP 滤波最适合作为透明、可复现的描述性分解工具,而不是无需诊断即可接受的真实趋势估计器。
参考文献
- Hodrick, R. J., & Prescott, E. C. (1997). “Postwar U.S. Business Cycles: An Empirical Investigation.” Journal of Money, Credit and Banking, 29(1), 1–16.
- Harvey, A. C., & Jaeger, A. (1993). “Detrending, Stylized Facts and the Business Cycle.” Journal of Applied Econometrics, 8(3), 231–247.
- Ravn, M. O., & Uhlig, H. (2002). “On Adjusting the Hodrick–Prescott Filter for the Frequency of Observations.” The Review of Economics and Statistics, 84(2), 371–376. DOI: 10.1162/003465302317411604.
- McElroy, T. (2008). “Exact Formulas for the Hodrick–Prescott Filter.” The Econometrics Journal, 11(1), 209–217.
- Hamilton, J. D. (2018). “Why You Should Never Use the Hodrick–Prescott Filter.” The Review of Economics and Statistics, 100(5), 831–843. DOI: 10.1162/rest_a_00706.
- Phillips, P. C. B., & Shi, Z. (2021). “Boosting: Why You Can Use the HP Filter.” International Economic Review, 62(2), 521–570. 本文只将其作为标准 HP 后续研究背景,不实现 boosted HP。
- Jönsson, K. (2025). “Comparing Real-Time Uncertainty of the Hodrick–Prescott and Hamilton Trend/Cycle Decompositions.” Empirical Economics, 69, 1335–1361. DOI: 10.1007/s00181-025-02765-6.
- Franke, R., Kukacka, J., & Sacht, S. (2026). “A Data-Driven Method to Determine the Smoothing Parameter in the Hodrick–Prescott Filter.” Computational Economics. DOI: 10.1007/s10614-026-11378-9.
- statsmodels Developers.
statsmodels.tsa.filters.hp_filter.hpfilter, statsmodels 0.14.6/0.15 development documentation.
