关于GDP的ARIMA模型

这是一个时间序列课程论文项目
做了个arima
数据来源是国家统计局的gdp数据
可自行下载

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import statsmodels.api as sm
from statsmodels.tsa.arima_model import ARMA
from statsmodels.tsa.arima_model import ARIMA
from statsmodels.graphics.tsaplots import acf,pacf,plot_acf,plot_pacf
import time

# 字体设置
font2 = {'family' : 'Times New Roman',
'weight' : 'normal',
'size'   : 20,
}

print(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())) 

首先,导入数据:

GDP_data=pd.read_excel('GDP年度数据.xls') 
# 切片出gdp数据
gdp_np=np.array(GDP_data.iloc[3,1:])[::-1]
# 创建时间序列
index=pd.date_range('1968','2021',freq='y')
gdp_serise=pd.Series(gdp_np,index=index)

做出GDP图像:

fig=plt.figure(figsize=(12,6))

plt.plot(gdp_serise)
plt.ylabel('GDP/(100 million yuan)',font2)
plt.xlabel('Year',font2)
plt.legend()
plt.locator_params(axis='x', nbins=12)
plt.tick_params(labelsize=16)
#plt.savefig('gdp.png', dpi=800, bbox_inches='tight')
plt.show()

在这里插入图片描述
对数据取ln,并创建时间序列:

gdp_np_log = []
for gdp in gdp_np:
    gdp_np_log.append(np.log(gdp))

gdp_series_log = pd.Series(data=np.array(gdp_np_log).ravel(),index=index)

做出ln(GDP)图像:

fig=plt.figure(figsize=(12,6))
plt.plot(gdp_series_log)
plt.ylabel('ln(GDP)',font2)
plt.xlabel('Year',font2)
plt.legend()
plt.locator_params(axis='x', nbins=12)
plt.tick_params(labelsize=16)
#plt.savefig('ln(gdp).png', dpi=800, bbox_inches='tight')
plt.show()

在这里插入图片描述肯定不平稳,可以做adf检验,可以用eviews做,这里因为python做出来的和eviews有区别,所以未展示python做法,差分:

d_gdp_series_log=gdp_series_log.diff()

做出差分后图像:

fig=plt.figure(figsize=(12,6))
plt.plot(d_gdp_series_log['1969':'2019'])
plt.ylabel('diff_ln(GDP)',font2)
plt.xlabel('Year',font2)
plt.legend()
plt.locator_params(axis='x', nbins=12)
plt.tick_params(labelsize=16)
#plt.savefig('diff_ln(gdp).png', dpi=800, bbox_inches='tight')
plt.show()

在这里插入图片描述
画ACF、PACF:

fig = plt.figure(figsize=(12, 8))
ax1 = fig.add_subplot(211)
fig = sm.graphics.tsa.plot_acf(d_gdp_series_log[1:],lags=24,ax=ax1)

在这里插入图片描述

fig = plt.figure(figsize=(12, 8))
ax1 = fig.add_subplot(211)
fig = sm.graphics.tsa.plot_pacf(d_gdp_series_log[1:],lags=24,ax=ax1)

在这里插入图片描述
ln(gdp)使用ARMA(1,0),即相当于对GDP使用ARIMA(1,1,0):

model = ARIMA(gdp_series_log,order=(1,1,0))
# 拟合模型
result=model.fit()
print(result.summary()) 
# 预测结果
pred = result.predict()

这个结果和eviews结果相同
由于pred为差分后的预测结果,故需要进行反向差分,再反向取ln:

# 反向差分
pred[0]=pred[0]+gdp_series_log[0]
for i in range(len(pred)-1):
    pred[i+1]=pred[i]+pred[i+1]
   
 # 反向ln
for i in range(len(pred)):
    pred[i]=np.exp(pred[i])

作图:

# 作图
fig=plt.figure(figsize=(12,6))
plt.plot(pred[1:],'r--',label='y_hat')
plt.plot(gdp_serise[1:],label='y')
plt.ylabel('GDP/(100 million yuan)',font2)
plt.xlabel('Year',font2)
plt.legend(fontsize='x-large')
plt.locator_params(axis='x', nbins=12)
plt.tick_params(labelsize=16)
#plt.savefig('arima预测.png', dpi=800, bbox_inches='tight')
plt.show()

在这里插入图片描述
定义预测精度评价指标,RMSE、MAE、MAPE:

from  sklearn import  metrics
def GetRMSE(y_hat,y_test):
    sum = np.sqrt(metrics.mean_squared_error(y_test, y_hat))
    return  sum

def GetMAE(y_hat,y_test):
    sum = metrics.mean_absolute_error(y_test, y_hat)
    return  sum

def GetMAPE(y_hat,y_test):
    sum = np.mean(np.abs((y_hat - y_test) / y_test)) * 100
    return sum

输出预测精度(样本内预测):

print(GetRMSE(pred[1:-2],gdp_serise[2:]))
print(GetMAE(pred[1:-2],gdp_serise[2:]))
print(GetMAPE(pred[1:-2],gdp_serise[2:]))

在这里插入图片描述
还可以用eviews做一个残差分析图。

over!

  • 7
    点赞
  • 115
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值