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

AutoReg模型根与ArmaProcess生成参数不匹配及系数异常问题咨询

问题描述

使用AutoReg模型拟合ArmaProcess生成的时间序列时,遇到两个异常:

  • np.poly(model.roots)返回的最后一个系数与np.flip(model.params)/model.params[-1]的最后一个系数不匹配;
  • 拟合得到的AutoReg模型系数与生成数据的ArmaProcess真实系数相差甚远。

最小可复现示例

from statsmodels.tsa.arima_process import ArmaProcess
from statsmodels.tsa.ar_model import AutoReg

import numpy as np

roots=  1/np.array([0.1, 0.5, -0.3, 0.9, 0.18, 0.1+0.3j, 0.1-0.3j, -0.5+0.1j, -0.5-0.1j,-0.8])
proc = ArmaProcess.from_roots([],roots)
y = proc.generate_sample(150)

model = AutoReg(y,10).fit()

print(np.poly(model.roots))
print(np.flip(model.params)/model.params[-1])
print(np.poly(roots)/np.poly(roots)[0])
原因分析

1. 系数不匹配的根源

AutoReg的参数结构和根对应的特征方程不匹配:

  • AutoReg的参数包含截距项(model.params[0])和自回归系数(model.params[1:]),模型公式为:
    $y_t = \alpha + \phi_1 y_{t-1} + \phi_2 y_{t-2} + ... + \phi_{10} y_{t-10} + \epsilon_t$
  • model.roots对应的是自回归部分的特征方程:$1 - \phi_1 L - \phi_2 L^2 - ... - \phi_{10} L^{10} = 0$,和截距项完全无关。
  • 你用np.flip(model.params)把截距项也包含进了多项式计算,自然和np.poly(model.roots)的结果不匹配。正确的做法是只取自回归系数部分,计算对应多项式:
    # 正确的系数对比方式
    ar_coeffs = model.params[1:]
    # 构造特征多项式:1 - phi1*x - phi2*x^2 - ... - phi10*x^10
    poly_from_params = np.concatenate([[1], -ar_coeffs])
    # 归一化后和np.poly(model.roots)对比
    print(poly_from_params / poly_from_params[0])
    print(np.poly(model.roots) / np.poly(model.roots)[0])
    
    这样两者的系数就会完全匹配。

2. 拟合系数与真实值偏差大的原因

  • 样本量不足:150个样本要拟合10阶自回归模型(含截距共11个参数),样本量相对参数数量来说太少。高阶时间序列模型需要更多样本才能让估计值收敛到真实参数,样本量不足会导致估计方差急剧增大,偏差明显。
  • 根的位置导致估计不稳定:你设置的根中有模接近1的(比如对应原系数0.9的根是1/0.9≈1.11),这类接近单位根的平稳过程,参数估计的方差会非常大,哪怕小的样本波动也会让估计值偏离真实值很远。
  • 随机样本的固有波动:generate_sample生成的是带随机噪声的样本,单次样本的随机性会放大估计偏差,尤其是在高阶模型和接近单位根的场景下,这种波动影响更显著。

内容的提问来源于stack exchange,提问作者user1999728

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 18:05:13