10實現金融數據的時間序列分析及建模

ARIMA模型

自回歸移動平均模型(ARIMA)包含一個確定(explicit)的統計模型用于處理時間序列的不規則部分,它允許不規則部分可以自相關。
數據準備

> library(zoo)
> library(xts)
> library(TTR)
> kings <- scan("http://robjhyndman.com/tsdldata/misc/kings.dat",skip=3)
Read 42 items
> kingstimeseries <- ts(kings)
> plot.ts(kingstimeseries)

image.png

數據差分
如果從一個非平穩的時間序列開始, 那么首先就需要做時間序列差分直到得到一個平穩時間序列。如果必須對時間序列做 d 階差分才能得到一個平穩序列,那么就使用 ARIMA(p,d,q) 模型,其中 d 是差分的階數。

> kingstimeseriesdiff1 <- diff(kingstimeseries, differences=1)
> plot.ts(kingstimeseriesdiff1)

image.png

從一階差分的圖中可以看出,數據已經是平穩的。如果不平穩就需要繼續差分。所以對于英國國王去世年齡時間序列選擇 ARIMA(p,1,q) 的模型。
尋找 ARIMA 模型
通常我們需要檢查平穩時間序列的自相關圖和偏相關圖,也就是尋找 ARIMA(p,d,q) 中合適的 p 值和 q 值。

> acf(kingstimeseriesdiff1, lag.max=20)
> acf(kingstimeseriesdiff1, lag.max=20, plot=F)

Autocorrelations of series ‘kingstimeseriesdiff1’, by lag

     0      1      2      3      4      5      6      7      8      9     10 
 1.000 -0.360 -0.162 -0.050  0.227 -0.042 -0.181  0.095  0.064 -0.116 -0.071 
    11     12     13     14     15     16     17     18     19     20 
 0.206 -0.017 -0.212  0.130  0.114 -0.009 -0.192  0.072  0.113 -0.093 
image.png

可以看出在滯后 1 階的自相關值超出了置信邊界,但是其他所有在滯后1-20 階的自相關值都沒有超出置信邊界。

> pacf(kingstimeseriesdiff1, lag.max=20)
> pacf(kingstimeseriesdiff1, lag.max=20, plot=F)

Partial autocorrelations of series ‘kingstimeseriesdiff1’, by lag

     1      2      3      4      5      6      7      8      9     10     11 
-0.360 -0.335 -0.321  0.005  0.025 -0.144 -0.022 -0.007 -0.143 -0.167  0.065 
    12     13     14     15     16     17     18     19     20 
 0.034 -0.161  0.036  0.066  0.081 -0.005 -0.027 -0.006 -0.037 
image.png

顯示在滯后 1,2 和 3 階時的偏自相關系數超出了置信邊界,為負值,且在等級上隨著滯后階數的增加而緩慢減少。

> library(forecast)
> kings.arima <- arima(kingstimeseries, order=c(1, 2, 3))
> summary(kings, arima)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  13.00   44.00   56.00   55.29   67.75   86.00 

模型預測

> kingsarimaforecast <- forecast(kings.arima, h=5)
> kingsarimaforecast
   Point Forecast    Lo 80    Hi 80    Lo 95     Hi 95
43       66.86843 47.05546 86.68139 36.56711  97.16974
44       69.46189 48.05746 90.86632 36.72664 102.19714
45       69.33508 47.11732 91.55285 35.35594 103.31423
46       69.79963 46.62460 92.97466 34.35648 105.24278
47       70.13562 46.03435 94.23689 33.27591 106.99533
> plot(kingsarimaforecast)

image.png

模型誤差檢驗
在指數平滑模型下, 觀察 ARIMA 模型的預測誤差是否服從零均值、方差不變的正態分布,同時也可以觀察連續預測誤差是否(自)相關。 同時對國王去世年齡使用 ARIMA(1,1,3) 模型后所產生的預測誤差做(自)相關圖,和 Ljung-Box 檢驗

acf(kingsarimaforecast$residuals, lag.max=20)
image.png
> Box.test(kingsarimaforecast$residuals, lag=20, type="Ljung-Box")

    Box-Ljung test

data:  kingsarimaforecast$residuals
X-squared = 10.141, df = 20, p-value = 0.9655

ARIMA 模型自動預測

> kings.arima1 <- auto.arima(kingstimeseries)
> summary(kings.arima1)
Series: kingstimeseries 
ARIMA(0,1,1) 

Coefficients:
          ma1
      -0.7218
s.e.   0.1208

sigma^2 estimated as 236.2:  log likelihood=-170.06
AIC=344.13   AICc=344.44   BIC=347.56

Training set error measures:
                    ME     RMSE      MAE       MPE    MAPE      MASE       ACF1
Training set 0.9712931 14.99836 11.92162 -10.40664 29.5176 0.7496724 0.05350284
> kings.arima_new <- arima(kingstimeseries, order=c(0, 1, 1))
> summary(kings.arima_new)

Call:
arima(x = kingstimeseries, order = c(0, 1, 1))

Coefficients:
          ma1
      -0.7218
s.e.   0.1208

sigma^2 estimated as 230.4:  log likelihood = -170.06,  aic = 344.13

Training set error measures:
                    ME     RMSE      MAE       MPE    MAPE      MASE       ACF1
Training set 0.9712931 14.99836 11.92162 -10.40664 29.5176 0.7496724 0.05350284
> kingsarimaforecast <- forecast(kings.arima_new, h=5)
> kingsarimaforecast
   Point Forecast    Lo 80    Hi 80    Lo 95     Hi 95
43       67.75063 48.29647 87.20479 37.99806  97.50319
44       67.75063 47.55748 87.94377 36.86788  98.63338
45       67.75063 46.84460 88.65665 35.77762  99.72363
46       67.75063 46.15524 89.34601 34.72333 100.77792
47       67.75063 45.48722 90.01404 33.70168 101.79958
> plot(kingsarimaforecast)
image.png
> acf(kingsarimaforecast$residuals, lag.max=20)
image.png
> Box.test(kingsarimaforecast$residuals, lag=20, type="Ljung-Box")

    Box-Ljung test

data:  kingsarimaforecast$residuals
X-squared = 13.584, df = 20, p-value = 0.8509

指數平滑模型

它對時間序列上面連續的值之間相關性沒有要求,指數平滑法可以用于時間序列數據的短期預測。
簡單指數平滑法
適用于沒有季節性變化且處于恒定水平以及沒有明顯趨勢的時間序列的預測。
獲取數據(數據來源為倫敦每年降雨量),通過 ts 函數轉換為時間序列.。

> rain <- scan("http://robjhyndman.com/tsdldata/hurst/precip1.dat", skip=1)
Read 100 items
> rainseries <- ts(rain, start=c(1813))
> plot.ts(rainseries)
image.png
> rainseriesHW <- HoltWinters(rainseries, beta=F, gamma=F)
> plot(rainseriesHW)
image.png

預測未來 5 年的降水量

> library(forecast)
> rainseriesforecasts <- forecast(rainseriesHW, h=5)
> plot(rainseriesforecasts)
image.png

藍線是預測 1913-1920 間的降雨量,深灰色陰影區域為 80% 的預測區間,淺灰色陰影區域為 95% 的預測區間。 forecast 提供了預測誤差的統計指標(residuals),來評估預測是否有改進的可能性:如果預測誤差是相關的,則很可能是簡單指數平滑預測可以被另外一種預測技術優化。

> acf(rainseriesforecasts$residuals[!is.na(rainseriesforecasts$residuals)], lag.max=20, plot=T)
image.png

可以發現自相關系數在第 3 期的時候達到了置信界限。為了驗證在滯后 1-20 階時非 0 自相關屬性是否顯著,可以借助 Box.test() 的 Ljung-Box檢驗。

> Box.test(rainseriesforecasts$residuals, lag=20, type="Ljung-Box")

    Box-Ljung test

data:  rainseriesforecasts$residuals
X-squared = 17.401, df = 20, p-value = 0.6268

統計量為 17.4,并且 P 值是 0.626 這樣的值不足以拒絕預測誤差在 1-20 階是非零自相關。
霍爾特指數平滑法
霍爾特指數平滑法可以用于非恒定水平,沒有季節性可相加模型的時間序列預測。 霍爾特指數平滑法是估計當前時間的水平和斜率。其平滑水平是由兩個參數控制,alpha:估計當前點水平,beta:估計當前點趨勢部分斜率。兩個參數都介于 0-1 之間,當參數越接近 0,大部分近期的觀測值的權值將較小。 數據來源是 1866 年到 1911 年每年女士裙子直徑,將數據通過 ts 函數轉換為時間序列,并畫出時序圖。

> skirts <- scan("http://robjhyndman.com/tsdldata/roberts/skirts.dat",skip=5)
Read 46 items
> skirtsseries <- ts(skirts, start=c(1866))
> plot.ts(skirtsseries)
image.png
> skirtsseriesHW <- HoltWinters(skirtsseries, gamma=F)
> skirtsseriesHW
Holt-Winters exponential smoothing with trend and without seasonal component.

Call:
HoltWinters(x = skirtsseries, gamma = F)

Smoothing parameters:
 alpha: 0.8383481
 beta : 1
 gamma: FALSE

Coefficients:
        [,1]
a 529.308585
b   5.690464
> plot(skirtsseriesHW)
image.png

相關預測值中 alpha 值為 0.8383,beta預測值為 1.0,這些都是非常高的值,充分顯示了無論是水平上還是趨勢的斜率上,當前值對時間序列上的最近的觀測值的依賴關系比較重,這樣的結果也符合我們的預期,因為時間序列的水平和斜率在整個時間段內發生了巨大的變化。 總體來看,預測的效果也還不錯(紅色為預測值)。
預測未來 5 年的數據值,并畫出預測結果。

> skirtsseriesforecasts <- forecast(skirtsseriesHW, h=5)
> plot(skirtsseriesforecasts)
image.png

為了檢驗預測效果,我們同樣檢驗延遲 1-20 階中的預測誤差是否非零自相關,繼續采用 Ljung-Box 檢驗。

> acf(skirtsseriesforecasts$residuals[!is.na(skirtsseriesforecasts$residuals)], lag.max=20, plot=T)
image.png

相關圖呈現樣本內預測誤差在滯后 5 階時超過置信邊界,其他都沒有超過,我們認為存在一定的偶爾因素。

> Box.test(skirtsseriesforecasts$residuals, lag=20, type="Ljung-Box")

    Box-Ljung test

data:  skirtsseriesforecasts$residuals
X-squared = 19.731, df = 20, p-value = 0.4749

p =0.4749,意味著置信度只有 53% 這樣的值不足以拒絕預測誤差在 1-20 階是非零自相關,則我們接受預測誤差在 1-20 階是非零自相關的。
Holt-Winters 指數平滑法
有增長或者降低趨勢并且存在季節性波動的時間序列的預測方法。 Holt-Winters 算法中提供了 alpha、beta 和 gamma 來分別對應當前點的水平、趨勢部分和季節部分,參數的去執法范圍都是 0-1 之間,并且參數接近 0 時,近期的觀測值的影響權重就越小。 數據來源是澳大利亞昆士蘭州海濱紀念商品的月度銷售日子做為分析對象,將數據通過 ts 函數轉換為時間序列,并畫出時序圖。

> souvenir <- scan("http://robjhyndman.com/tsdldata/data/fancy.dat")
Read 84 items
> souvenirtimeseries <- ts(souvenir, frequency=12, start=c(1987, 1))
> plot.ts(souvenirtimeseries)
image.png

可以通過取對數來減少極值帶來的影響,消除方差不齊。

> logsouvenirtimeseries <- log(souvenirtimeseries)
> plot.ts(logsouvenirtimeseries)
image.png
> souvenirtimeseriesHW <- HoltWinters(logsouvenirtimeseries)
> plot(souvenirtimeseriesHW)
image.png

通過 forecast 包來預測未來 12 個月的銷售數據,并畫出預測結果

> souvenirtimeseriesforecasts <- forecast(souvenirtimeseriesHW, h=12)
> plot(souvenirtimeseriesforecasts)
image.png

模型非常成功得預測了季節峰值,峰值大約發生在每年的 12 月份。 還可以通過畫相關圖和進行 Ljung-Box 檢驗來檢查樣本內預測誤差在延遲 1-20 階時否是非零自相關的,并以此確定預測模型是否可以再被優化。

> acf(souvenirtimeseriesforecasts$residuals[!is.na(souvenirtimeseriesforecasts$residuals)], lag.max=20, plot=T)
image.png

相關圖顯示出在滯后 1-20 階中樣本自相關值都沒有超出顯著(置信)邊界。

> Box.test(souvenirtimeseriesforecasts$residuals, lag=20, type="Ljung-Box")

    Box-Ljung test

data:  souvenirtimeseriesforecasts$residuals
X-squared = 17.53, df = 20, p-value = 0.6183

Ljung-Box 檢驗的 p 值為 0.6183,所以我們推斷在滯后 1-20 階中沒有明顯證據說明預測誤差是非零自相關的。

?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,572評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,071評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,409評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,569評論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,360評論 6 404
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,895評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 42,979評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,123評論 0 286
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,643評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,559評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,742評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,250評論 5 356
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 43,981評論 3 346
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,363評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,622評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,354評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,707評論 2 370

推薦閱讀更多精彩內容

  • 時間序列分析研究的是按時間順序收集的數據。相鄰的觀測數據通常相互依賴。因此,時間序列分析的技術需要處理這種相依性。...
    Jachin111閱讀 1,011評論 0 0
  • 來源:yv.l1.pnn - kesci.com原文鏈接:時間序列分析入門,看這一篇就夠了 點擊以上鏈接?? 不用配...
    91160e77b9d6閱讀 1,799評論 0 2
  • 久違的晴天,家長會。 家長大會開好到教室時,離放學已經沒多少時間了。班主任說已經安排了三個家長分享經驗。 放學鈴聲...
    飄雪兒5閱讀 7,538評論 16 22
  • 創業是很多人的夢想,多少人為了理想和不甘選擇了創業來實現自我價值,我就是其中一個。 創業后,我由女人變成了超人,什...
    亦寶寶閱讀 1,834評論 4 1
  • 今天感恩節哎,感謝一直在我身邊的親朋好友。感恩相遇!感恩不離不棄。 中午開了第一次的黨會,身份的轉變要...
    迷月閃星情閱讀 10,588評論 0 11