- 概要
- 平穩性
- 迴歸模型
- 自迴歸模型
- 滑動平均模型
- 自迴歸移動平均結合模型
- 差分法
- 差分移動平均自迴歸模型
- ARIMA計算步驟
1.概要
ARIMA模型由Box與Jenkins於上世紀七十年代提出,是一種著名的時間序列預測方法。ARIMA的含義是單積自迴歸移動平均過程,其含義爲:假設一個隨機過程含有d個單位根,其經過d次差分後可以變換爲一個平穩的自迴歸移動平均過程,則該隨機過程稱爲單積(整)自迴歸移動平均過程。
-
名稱解讀
AR: 自迴歸模型 Autoregressive model I : 差分 MA: 滑動平均模型 Moving average model
-
本質
線性迴歸,只不過是通過自身的歷史數據進行迴歸,適用於數據本身存在着較高並且穩定的相關性,特點是簡單、短期預測效果不錯。
2.平穩性
-
平穩性就是要求經由樣本時間序列所得到的擬合曲線,在未來的一段時間內仍能順着現有狀態“慣性”地延續下去;
-
平穩性要求序列的均值和方差不發生明顯變化;
平穩性要求序列的均值和方差不發生明顯變化;
s^2 = \frac{\sum_{i=1}^{N}(x_n-m)^2}{N}
s^2 總體方差 x變量 m 總體均值
3.迴歸模型
- 得一個線性模型以儘可能準確地預測實值輸出標記
y = w_1*x_1+w_2*x_2+w_3*x_3+...+w_i*x_i+e
y: 因變量 x:自變量
w和b根據樣本學得(最小二乘法或者最大似然估計或者神經網絡)之後,模型就得以確定。w直觀表達了各屬性在預測中的重要性
4.自迴歸模型(AR Autoregressive model)
- 和線性迴歸的區別
線性迴歸是由一個或者多個自變量推導預測因變量
自迴歸是由因變量之前的取值來推導預測本身,所以是自迴歸(受自身變化的影響)
- AR 模型
自變量不是影響因變量的外界因素,而是因變量本身
5.滑動平均模型 (MA moving average model)
- 假定預測對象有一種水平樣式,含有隨機波動成分,可以採用簡單指數平滑法進行短期預測
\text{}
下期預測值 是本期預測值與以a爲折扣的本期實際值與預測值誤差之和
- MA模型
6.自迴歸移動平均結合模型(ARMA )
- 只適合平穩時間序列的預測,實際問題中有各種趨勢性和季節性
可以看到 p=0 是移動平均模型 q=0 是自迴歸模型
7.差分法:時間序列在t與t-1時刻的差值 平穩數據
差分又名差分函數或差分運算,差分的結果反映了離散量之間的一種變化
差分操作實例
原數據 | 一階 | 一階差分 | 二階 | 二階差分 |
---|---|---|---|---|
1 | ||||
3 | 1 | 2 | ||
5 | 3 | 2 | 1 | 4 |
7 | 5 | 2 | 3 | 4 |
8. ARIMA(p,d,q) 差分移動平均自迴歸模型
- 可以描述任何齊次非平穩時間序列
- 差分到序列平穩以後使用ARMA模型預測
對於非平穩時間序列中若存在增長或下降趨勢,則需要進行差分處理然後進行平穩性檢驗直至平穩爲止。
自迴歸滑動平均差分模型
-
AR 自迴歸
-
MA 滑動平均
-
I 差分法
-
AIC 準則 赤池消息準則,衡量統計模型擬合好壞的標準,值越小越擬合
-
最小信息量準則(An Information Criterion) 指導思想:
似然函數值越大越好
未知參數的個數越少越好 -
ARMA模型要求數據平穩,當數據不平穩時,需要差分。如果d階差分後,序列平穩,叫做d階單整序列
如果差分很多次,還是不平穩。或者差分後已經失去研究意義了,那麼就放棄ARIMA模型。
- 相關博客
https://www.guofei.site/2017/07/10/arima.html
scala
val lines = scala.io.Source.fromFile("D://work//算法//時間序列預測//arima//spark-ts-examples-master//data//R_ARIMA_DataSet1.csv").getLines()
val ts = Vectors.dense(lines.map(_.toDouble).toArray)
/**
* ARIMA
*/
val arimaModel = ARIMA.fitModel(1, 0, 1, ts)
val arimaModel1 = ARIMA.autoFit(ts)
println("coefficients: " + arimaModel.coefficients.mkString(","))
val forecast = arimaModel.forecast(ts, 10)
val forecast1 = arimaModel1.forecast(ts,10)
println("forecast of next 20 observations: " + forecast.toArray.mkString(","))
println("forecast of next 20 observations: " + forecast1.toArray.mkString(","))
python
http://localhost:8889/notebooks/DataStructure/%E7%AE%97%E6%B3%95/timeseries/ARMA%E6%97%B6%E9%97%B4%E5%BA%8F%E5%88%97%E5%9B%9E%E5%BD%92.ipynb
import pandas as pd
import matplotlib.pyplot as plt
import statsmodels.api as sm
from statsmodels.tsa.arima_model import ARMA
from statsmodels.graphics.api import qqplot
import random
data = [ 5000+i*20+random.randint(200,700) if i%2==0 else 4500+i*20+random.randint(200,700) for i in range(99)]
data = pd.Series(data)
data_index = sm.tsa.datetools.dates_from_range('1901','1999')
# 繪製數據圖
data.index = pd.Index(data_index)
data.plot(figsize=(12,8))
plt.show()
# 創建模型 ARMA
arma = ARMA(data,(16,0)).fit()
print('AIC: %0.4lf'%arma.aic)
# 模型預測
predict_y = arma.predict('1941','2048')
# 預測結果繪製
fig,ax = plt.subplots(figsize=(12,8))
ax = data.ix['1901':].plot(ax=ax)
predict_y.plot(ax=ax)
plt.show()