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