ARMA 模型是研究时间序列的重要方法,由 AR 模型与 MA 模型混合而成。总的来说,AR 模型(自回归模型)是通过分析研究历史数据对当前数据的影响进行建模。MA 模型(移动平均模型)是用过去各个时期的随机干扰或预测误差的线性组合来得到当前预测值。要将 ARMA 模型运用到一组时间序列数据上,大致需要以下几步:
检验数据平稳性,不平稳的数据没法得到较好的预测结果,如果检验输出的 p-value 较大,就表明数据不具有平稳性。
import pandas as pd
import statsmodels.api as sm
from statsmodels.graphics.tsaplots import acf,pacf,plot_acf,plot_pacf
from statsmodels.tsa.arima_model import ARMA, ARIMA
def adf_test(ts):
adftest = adfuller(ts)
adf_res = pd.Series(adftest[0:4], index=['Test Statistic','p-value','Lags Used','Number of Observations Used'])
for key, value in adftest[4].items():
adf_res['Critical Value (%s)' % key] = value
return adf_res
如果数据不具有平稳性,需要先做平稳化处理,常用方法有差分法和对数法。
# 一阶差分
def ts_diff(ts):
return ts.diff(1).dropna(how=any)
# 自然对数
def ts_log(ts):
return np.log(ts)
找出精度最高时 AR 模型与 MA 模型的阶数。一般用 ACF(自相关函数)和 PACF (偏自相关函数)为AR和MA模型定阶, 用 EACF 为 ARMA模型进行定阶。
def get_pdq(ts):
plot_acf(time_series)
plot_pacf(time_series)
plt.show()
r,rac,Q = sm.tsa.acf(time_series, qstat=True)
prac = pacf(time_series,method='ywmle')
table_data = np.c_[range(1,len(r)), r[1:],rac,prac[1:len(rac)+1],Q]
table = pd.DataFrame(table_data, columns=['lag', "AC","Q", "PAC", "Prob(>Q)"])
print(table)
输入时间序列数据,及通过定阶得到的模型参数,输出预测结果。
def ts_arma(ts, p, q):
arma = ARMA(ts, order=(p, q)).fit(disp = -1)
ts_predict_arma = arma.predict()
return ts_predict_arma
# 加入差分的 ARMA 模型
def ts_arima(ts,p,d,q):
arima = ARIMA(ts,(0,1)).fit(disp=-1,maxiter=100)
ts_predict_arima = arima.predict(start=str(1979), end=str(2010+3), dynamic = False)
return ts_predict_arima
如果事先对输入数据做了平稳化处理,那么最后需要先对输出结果做一下平稳化处理的逆操作。
def ts_log_rvs(ts):
return np.exp(ts)
def ts_diff_rvs(ts):
return np.cumsum(ts)
从上面的简单描述可以看出,ARMA模型可以对一组平稳的时间序列数据进行预测,不过一般情况下,我们想要处理的数据都是不平稳的,很多时候就算经过平稳化处理,也很难得到理想的预测结果。要想提高模型预测的准确度,就不得不提到协整,具体内容以后再讨论。