Rでar関数や残差分析などの復習 〜 続き

前回「Rでar関数や残差分析などの復習」の続き。
今回は、元データを前半と後半に分けて、前半のデータから後半のデータを予測してみる。

> f1min_20151112_Day_0900_1230<-read.csv("f1min_20151112_Day_0900_1230.csv")
> f1min_20151112_Day_0900_1230.close<-f1min_20151112_Day_0900_1230[,5]
> f1min_20151112_Day_0900_1230.close.ts<-as.ts(as.numeric(f1min_20151112_Day_0900_1230.close))
> f1min_20151112_Day_0900_1230.close.ts.arima<-auto.arima(f1min_20151112_Day_0900_1230.close.ts,max.p=100,stepwise=T)
> plot(forecast(f1min_20151112_Day_0900_1230.close.ts.arima))

とりあえず、前半データはこんな感じ。
※)forecast関数での予測もつけたが、無視。

ARモデルを求める。

> ar(f1min_20151112_Day_0900_1230.close.ts, aic=TRUE, order.max=25)

Call:
ar(x = f1min_20151112_Day_0900_1230.close.ts, aic = TRUE, order.max = 25)

Coefficients:
     1       2  
0.8588  0.1118  

Order selected 2  sigma^2 estimated as  77.38

Box-Ljung検定を実施する。

> f1min_20151112_Day_0900_1230.close.ts.ar<-ar(f1min_20151112_Day_0900_1230.close.ts, aic=TRUE, order.max=25)
> Box.test(f1min_20151112_Day_0900_1230.close.ts.ar$res, type="Ljung")

        Box-Ljung test

data:  f1min_20151112_Day_0900_1230.close.ts.ar$res
X-squared = 0.66436, df = 1, p-value = 0.415

ガーン。p値が小さくなっている。。。5%有意水準よりは上だけど。。。

arima関数からAR(2)を求める。

> f1min_20151112_Day_0900_1230.close.arima200<- arima(f1min_20151112_Day_0900_1230.close,orde=c(2,0,0))
> f1min_20151112_Day_0900_1230.close.arima200

Call:
arima(x = f1min_20151112_Day_0900_1230.close, order = c(2, 0, 0))

Coefficients:
         ar1     ar2   intercept
      0.8077  0.1676  19676.3703
s.e.  0.0707  0.0711     19.3293

sigma^2 estimated as 66.1:  log likelihood = -697.32,  aic = 1402.64

これに、Box-Ljung検定を実施する。

> Box.test(f1min_20151112_Day_0900_1230.close.arima200$res, type="Ljung")

        Box-Ljung test

data:  f1min_20151112_Day_0900_1230.close.arima200$res
X-squared = 0.02157, df = 1, p-value = 0.8832

p値が大きくなっている・・・。謎。

予測を実施する。

> (f1min_20151112_Day_0900_1230.close.arima200.predict<-predict(f1min_20151112_Day_0900_1230.close.arima200, n.ahead=10))
$pred
Time Series:
Start = 199 
End = 208 
Frequency = 1 
 [1] 19702.77 19701.65 19701.22 19700.68 19700.17 19699.66 19699.17 19698.69
 [9] 19698.22 19697.76

$se
Time Series:
Start = 199 
End = 208 
Frequency = 1 
 [1]  8.130097 10.450768 12.396022 13.989967 15.365915 16.577203 17.660250
 [8] 18.639152 19.531240 20.349453

プロットしてみる。

> ts.plot(f1min_20151112_Day_0900_1230.close)
> lines(f1min_20151112_Day_0900_1230.close.arima200.predict$pred, col="red")

最後に、全体のデータ、前半部分のデータ、予測データをプロットする。

> ts.plot(f1min_20151112_Day.close, col="blue")
> lines(f1min_20151112_Day_0900_1230.close, col="green")
> lines(f1min_20151112_Day_0900_1230.close.arima200.predict$pred, col="red")

150期間まで一気に予測してみると・・・。

>  (f1min_20151112_Day_0900_1230.close.arima200.predict<-predict(f1min_20151112_Day_0900_1230.close.arima200, n.ahead=150))
> ts.plot(f1min_20151112_Day.close, col="blue")
> lines(f1min_20151112_Day_0900_1230.close, col="green")
> lines(f1min_20151112_Day_0900_1230.close.arima200.predict$pred, col="red")

一気にやると誤差が大きくなる。また、残差の正規性の検定を実施していない。その結果を受けて、別のモデルを検討する必要が大いにある。