ARMA时序分析

Time Series Analysis

AR

自回归模型,过去的观察值和现在的干扰值的联系组合预测

Xt=c+i=1pφiXti+εt

MA

滑动平均模型, 过去的感染治和现在的干扰值的线性组合预测

Xt=μ+εt+t=1qθiεti

ARMA

ARMA(Autoregressive–moving-average model)

Wiki

Xt=c+εt+i=1pφiXti+t=1qθiεti

c is a constant

ε is white noise

μ is the expectation of Xt

φ and θ are the parameters

ARIMA分析步骤

ARIMA(p,d,q) ,非平稳序列经过k阶差分后变成平稳序列运用ARMA模型

  1. 绘制时序图看看数据长什么样,猜测是平稳还是非平稳

  2. ADF(Augmented Dickey-Fuller unit root test)单位根平稳检验

    • p<a : 平稳序列,进入下一步
    • p>a : 非平稳序列,尝试进行K步差分回到步骤2继续进行平稳检验
  3. 随机序列(白噪声)检验

    方法:Q统计量、LB统计量

    • p<a : 平稳非白噪声序列,进入下一步
    • p>a : 白噪声序列,停止分析
  4. 绘制ACF(Autocorrelation)自相关图,自相关系数 ρk 具有k阶截尾性则是平稳序列

    AR(p) 模型具有拖尾性, MA(q) 具有q阶截尾性

  5. PACF(Partial Autocorrelation)偏自相关图,

    AR(p) 模型具有p阶截尾性, MA(q) 有拖尾性

  6. BIC信息量最小选择p,q

    p, q 阶数一般不超过length/10

  7. 模型检验和参数估计

  8. ARIMA模型预测

拖尾:始终有非零取值,不会在k大于某个常数后就恒等于零(或在0附近随机波动)

截尾:在大于某个常数k后快速趋于0为k阶截尾

Python

statsmodels

Time Series analysis

ARIMA

import statsmodels.api as sm
import pandas as pd
df = pd.DataFrame(data)
#dataframe
x = #LOAD YOUR DATA
index = pd.Index(sm.tsa.datetools.dates_from_range('1959Q1', '2009Q3'))
#or
dates = sm.tsa.datetools.dates_from_range('1980m1', length=nobs)

df = pd.DataFrame(X,colomns=['x'],index=index)

#plot
df.plot(df)
#ACF
sm.tsa.acf(df)
sm.graphics.tsa.plot_acf(df)
#PACF
sm.tsa.pacf(df)
sm.graphics.tsa.plot_pacf(df)
#ADF
sm.tsa.adfuller(df.x) #df.loc[:,'x'] | df.iloc[:,0]
#diff差分
pd.diff()
#diagnostic白噪声检验, 返回stats和p
sm.stats.diagnostic.acorr_ljungbox(df, lags=1)
#model
#from statsmodels.tsa.arima_model import ARIMA #ARMA
model = sm.tsa.ARIMA(df, order=(p,d,q))
model = sm.tsa.ARMA()
arma_res = model.fit(trend='nc', disp=-1)
#BIC
model.bic
#模型报告
model.summary2()
model.summary()
model.tail()
#拟合结果
model.predict()
#预测图
fig, ax = plt.subplots(figsize=(10,8))
fig = arma_res.plot_predict(start='1999m6', end='2001m5', ax=ax)
legend = ax.legend(loc='upper left')
#预测接下来5个数
model.forecast(5)

你可能感兴趣的:(数据科学)