时间序列2

使用python语言,实现实验要求,通过实验,理解并掌握ARMA模型的性质,掌握时间序列建模的方法步骤,能够进行模型的识别、参数的估计以及模型的检验。对给定的时间序列建立合适的ARMA模型、估计模型参数,并检验模型的有效性。

给定时间序列为xlsx格式,表名为:1950-2008年中国邮路及农村投递线路每年新增里程数序列,内容如下

年份 新增里程

1950 15.71

1951 24.43

1952 18.23

1953 22.5

1954 12.53

1955 9.94

1956 7.19

1957 41.13

1958 79.03

1959 119.32

1960 -12.1

1961 -89.71

1962 -52.26

1963 20.01

1964 19.92

1965 42.81

1966 18.78

1967 -0.75

1968 -1.08

1969 5.09

1970 26.39

1971 31.09

1972 19.78

1973 2.56

1974 12.95

1975 15.54

1976 3.97

1977 2.42

1978 0.31

1979 -5.1

1980 -7.52

1981 -7.69

1982 1.61

1983 4.46

1984 10.97

1985 15.15

1986 6

1987 -0.9

1988 -3.22

1989 -8.54

1990 6.76

1991 -0.83

1992 4.67

1993 11.68

1994 0.82

1995 8.54

1996 24.51

1997 28.91

1998 44.94

1999 11.16

2000 11.08

2001 15.75

2002 -0.31

2003 20.99

2004 6.5

2005 10.45

2006 -3.51

2007 23.42

2008 17.99

import pandas as pd
import matplotlib.pyplot as plt
from statsmodels.tsa.stattools import adfuller
from statsmodels.graphics.tsaplots import plot_acf, plot_pacf
from statsmodels.tsa.arima.model import ARIMA

# 中文显示
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']
plt.rcParams['axes.unicode_minus'] = False

# 读取xlsx文件
data = pd.read_excel('data.xlsx', 'Sheet1')

# 查看时间序列图形
plt.plot(data['年份'], data['新增里程'])
plt.xlabel('年份')
plt.ylabel('新增里程')
plt.title('时间序列图')
plt.show()

# 根据自相关图和偏自相关图确定AR和MA的阶数
plot_acf(data['新增里程'], lags=20)
plt.xlabel('滞后阶数')
plt.ylabel('自相关系数')
plt.title('自相关图')
plt.show()

plot_pacf(data['新增里程'], lags=20)
plt.xlabel('滞后阶数')
plt.ylabel('偏自相关系数')
plt.title('偏自相关图')
plt.show()

# 建立ARMA模型并估计模型参数
model = ARIMA(data['新增里程'], order=(1, 0, 0))
model_fit = model.fit()
print(model_fit.summary())

# 进行模型有效性检验
residuals = model_fit.resid
plot_acf(residuals, lags=20)
plt.xlabel('滞后阶数')
plt.ylabel('自相关系数')
plt.title('模型残差的自相关图')
plt.show()

plot_pacf(residuals, lags=20)
plt.xlabel('滞后阶数')
plt.ylabel('偏自相关系数')
plt.title('模型残差的偏自相关图')
plt.show()

# 进行残差的纯随机性检验
result = adfuller(residuals)

# 输出检验结果
print('ADF统计量:', result[0])
print('p值:', result[1])
print('滞后阶数:', result[2])
print('观测值数量:', result[3])
print('关键值:')
for key, value in result[4].items():
    print(key, value)