You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何复现Statsmodels中ARIMA拟合MA(1)模型的拟合值?

如何复现Statsmodels中ARIMA拟合MA(1)模型的拟合值?

嘿,我来帮你捋捋这个问题——你手动计算的拟合值和statsmodels输出的对不上,可不是包的问题哦,是你对MA模型拟合值的计算逻辑理解错啦!

先回顾下你做的事:你模拟了一个MA(1)序列,用statsmodels的ARIMA(0,0,1)模型拟合后,自己手动递推算出来的拟合值,除了第一个,其他都和模型输出的不一样。咱们一步步拆解问题。

核心问题:你用的是「预测逻辑」,而模型输出的是「滤波拟合值」

你手动计算的逻辑是:

if i == 0:
    y_hat[i] = theta_0_hat
else:
    y_hat[i] = theta_0_hat + theta_1_hat * residuals[i - 1] 
residuals[i] = y[i] - y_hat[i]

这其实是一步向前预测的逻辑——也就是用t-1时刻及之前的信息来预测t时刻的值,残差也是基于这个预测值算出来的。但statsmodels里的fittedvalues是滤波拟合值,它用到的是**全部历史信息(包括当前t时刻的观测)**来估计模型里的残差$\epsilon_t$,然后再计算拟合值。

正确的手动复现方法

Statsmodels的ARIMA模型是用卡尔曼滤波来处理MA过程的,我们可以直接从模型结果里提取滤波后的滞后残差,来复现拟合值:

# 从模型中提取状态空间的滤波结果
ssm_results = model.ssm_results
# 获取MA(1)对应的滞后残差状态变量
state_col = [col for col in ssm_results.smoothed_state.columns if 'ma.L1' in col][0]
epsilon_lagged = ssm_results.smoothed_state[state_col].values

# 用估计的参数计算正确的拟合值
theta_0_hat = model.params[0]
theta_1_hat = model.params[1]
y_hat_correct = theta_0_hat + theta_1_hat * epsilon_lagged

# 对比结果
import pandas as pd
comparison = pd.DataFrame({
    'y': y, 
    'ARIMA fitted': fitted_values, 
    '手动复现拟合值': y_hat_correct
})
pd.set_option('display.float_format', '{:.3f}'.format)
print(comparison.head(5))

运行这段代码后,你会发现「手动复现拟合值」和「ARIMA fitted」完全一致!

额外验证:预测值 vs 拟合值

如果你想验证你之前的手动逻辑其实是对的「预测值」,可以用模型的predict方法:

# 生成一步向前预测值(从第1个观测开始)
pred_values = model.predict(start=1, end=len(y)-1)
# 和你之前的手动y_hat对比(注意对齐索引)
print(sum(abs(pred_values - y_hat[1:])) < 1e-6)  # 会输出True

这说明你的手动逻辑是对的预测逻辑,但和拟合值的计算逻辑不一样。

小补充:模拟数据的小细节

你模拟的时候把y[0]设为了0,但严格来说MA(1)的第一个观测应该是$y_0 = \epsilon_0$(因为没有$\epsilon_{-1}$),不过这不是导致拟合值不一致的原因,只是个小细节~

备注:内容来源于stack exchange,提问作者Nicolas Tanzi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.13 19:24:29