More Related Content Similar to Rで計量時系列分析~CRANパッケージ総ざらい~ (20) More from Takashi J OZAKI (16) Rで計量時系列分析~CRANパッケージ総ざらい~ 2. 一応、自己紹介を…
尾崎 隆 (Takashi J. OZAKI, Ph.D.)
“J”に深い意味はありません
学者だった頃に同業界にT. Ozakiさんがいたので
と思ってJをつけたら、別業界にT. J. Ozakiさんが…
2013/8/31 2
4. 一応、自己紹介を…
こういうキャリアをたどっております
1997~2001年 東京大学工学部計数工学科
(※情報工学系)
2001~2006年 東京大学大学院新領域創成科学研究科
修士&博士課程(脳科学)
2006~2011年 理化学研究所脳科学総合研究センター
研究員(脳科学)
2011~2012年 東京大学教養学部 特任研究員(心理学)
2012年4月 慶應義塾大学医学部 特任助教(産学連携)
※30代のうちにポスドク問題を乗り切ることは
事実上不可能と判断して、キャリアチェンジに
打って出ることを決心
2012年6月 株式会社サイバーエージェント
2013年7月 株式会社リクルートコミュニケーションズ
2013/8/31 4
8. お品書き
なぜ計量時系列分析なのか?
{forecast}: 単変量時系列データをモデリング&予測
{vars}:多変量時系列をモデリング・予測・因果性の推定
{tseries}:単位根と見せかけの回帰
{urca}:共和分関係のモデリング
{fGarch}:「ばらつき」の時系列モデリング
{tsDyn}:閾値に基づく状態変化の推定
{MSwM}:単変量時系列のマルコフ転換モデル
{MSBVAR}:多変量時系列のマルコフ転換モデル
2013/8/31 8
16. 下準備
2013/8/31 16
サンプルデータとして{RFinanceYJ}で株価時系列を取ってくる
> library("RFinanceYJ", lib.loc="C:/Program Files/R/R-3.0.1/library")
> st1<-quoteStockTsData('4751.t',since='2012-01-01',date.end='2013-07-31')
> st2<-quoteStockTsData('2432.t',since='2012-01-01',date.end='2013-07-31')
> st3<-quoteStockTsData('3632.t',since='2012-01-01',date.end='2013-07-31')
> st4<-quoteStockTsData('4755.t',since='2012-01-01',date.end='2013-07-31')
> st5<-quoteStockTsData('3793.t',since='2012-01-01',date.end='2013-07-31')
> stock1<-ts(st1$adj_close)
> stock2<-ts(st2$adj_close)
> stock3<-ts(st3$adj_close)
> stock4<-ts(st4$adj_close)
> stock5<-ts(st5$adj_close)
20. {forecast}: 単変量時系列データをモデリング&予測
> stock2.arima<-auto.arima(stock2,stepwise=T,trace=T) stock2でやってみる
ARIMA(2,1,2) with drift : 4527.339
ARIMA(0,1,0) with drift : 4522.234
ARIMA(1,1,0) with drift : 4524.252
ARIMA(0,1,1) with drift : 4523.96
ARIMA(1,1,1) with drift : 4523.357
ARIMA(0,1,0) : 4520.285
ARIMA(1,1,0) : 4522.258
ARIMA(0,1,1) : 4521.99
ARIMA(1,1,1) : 4521.293
Best model: ARIMA(0,1,0) コレが推定したARIMA次数
> summary(stock2.arima)
Series: stock2
ARIMA(0,1,0)
sigma^2 estimated as 6633: log likelihood=-2263.54
AIC=4529.07 AICc=4529.08 BIC=4533.04
Training set error measures:
ME RMSE MAE MPE MAPE MASE
Training set -1.099251 81.34009 56.14177 -0.116207 2.420135 0.9975403
ACF1
Training set 0.02796017
ARIMA次数&係数推定はauto.arima(){forecast}で、結果はsummary()で
22. {forecast}: 単変量時系列データをモデリング&予測
2013/8/31 22
> stock3.arima<-auto.arima(stock3,stepwise=T,trace=T) stock3でやってみる
ARIMA(2,1,2) with drift : 4250.818
ARIMA(0,1,0) with drift : 4256.823
ARIMA(1,1,0) with drift : 4259.72
ARIMA(0,1,1) with drift : 4258.84
ARIMA(1,1,2) with drift : 4258.254
ARIMA(3,1,2) with drift : 4254.108
ARIMA(2,1,1) with drift : 4252.85
ARIMA(2,1,3) with drift : 4252.74
ARIMA(1,1,1) with drift : 4258.666
ARIMA(3,1,3) with drift : 4253.691
ARIMA(2,1,2) : 4250.415
ARIMA(1,1,2) : 4257.478
ARIMA(3,1,2) : 4253.126
ARIMA(2,1,1) : 4251.824
ARIMA(2,1,3) : 4252.478
ARIMA(1,1,1) : 4257.959
ARIMA(3,1,3) : 4252.888
Best model: ARIMA(2,1,2) コレがARIMA次数、ただし…
Warning message:
In auto.arima(stock3, stepwise = T, trace = T) :
Unable to fit final model using maximum likelihood. AIC value approximated
26. {vars}:多変量時系列をモデリング・予測・因果性の推定
とりあえず株価3系列のVARモデルを推定してみる
※ある程度スパイクの少ない3系列に限定しました
2013/8/31 26
> vstock<-cbind(stock2,stock3,stock4) 株価3系列のマトリクスを組む
> VARselect(vstock,lag.max=5) VAR次数pを推定
$selection
AIC(n) HQ(n) SC(n) FPE(n)
1 1 1 1 VAR次数p = 1ということに
$criteria
1 2 3 4 5
AIC(n) 2.245074e+01 2.247979e+01 2.249565e+01 2.252026e+01 2.251009e+01
HQ(n) 2.249960e+01 2.256531e+01 2.261782e+01 2.267908e+01 2.270557e+01
SC(n) 2.257395e+01 2.269543e+01 2.280370e+01 2.292071e+01 2.300296e+01
FPE(n) 5.626414e+09 5.792362e+09 5.885075e+09 6.031926e+09 5.971320e+09
> vstock.var<-VAR(vstock,p=1) VAR(){vars}関数で次数p=1を与えて係数推定
27. {vars}:多変量時系列をモデリング・予測・因果性の推定
2013/8/31 27
> summary(vstock.var)
VAR Estimation Results:
=========================
Endogenous variables: stock2, stock3, stock4
Deterministic variables: const
Sample size: 389
Log Likelihood: -6010.006
Roots of the characteristic polynomial:
0.9926 0.9926 0.9615
Call:
VAR(y = vstock, p = 1)
Estimation results for equation stock2:
=======================================
stock2 = stock2.l1 + stock3.l1 + stock4.l1 + const
Estimate Std. Error t value Pr(>|t|)
stock2.l1 0.96768 0.01167 82.953 < 2e-16 ***
stock3.l1 -0.01560 0.01005 -1.552 0.121417
stock4.l1 -0.08362 0.02780 -3.008 0.002800 **
const 172.01591 48.83806 3.522 0.000479 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 80.51 on 385 degrees of freedom
Multiple R-Squared: 0.953, Adjusted R-squared: 0.9526
F-statistic: 2601 on 3 and 385 DF, p-value: < 2.2e-16 (以下省略)
VAR係数の概要はsummary()で
31. {vars}:多変量時系列をモデリング・予測・因果性の推定
2013/8/31 31
VARモデルの因果性:Granger因果性検定はcausality()で
> dstock<-diff(vstock,lag=1) Granger因果性検定なので1階階差を取る
> VARselect(dstock,lag.max=5)
> dstock.var<-VAR(dstock,p=1)
> causality(dstock.var,cause="stock2")
$Granger
Granger causality H0: stock2 do not Granger-cause stock3 stock4
data: VAR object dstock.var
F-Test = 1.8703, df1 = 2, df2 = 1152, p-value = 0.1545
$Instant
H0: No instantaneous causality between: stock2 and stock3 stock4
data: VAR object dstock.var
Chi-squared = 124.7876, df = 2, p-value < 2.2e-16
35. {tseries}:単位根と見せかけの回帰
2013/8/31 35
> adf.test(stock2)
Augmented Dickey-Fuller Test
data: stock2
Dickey-Fuller = -2.3332, Lag order = 7, p-value = 0.4365
alternative hypothesis: stationary
> pp.test(stock2)
Phillips-Perron Unit Root Test
data: stock2
Dickey-Fuller Z(alpha) = -10.0733, Truncation lag parameter = 5,
p-value = 0.5466
alternative hypothesis: stationary
株価時系列2を単位根検定してみる
36. {tseries}:単位根と見せかけの回帰
2013/8/31 36
> xrw<-cumsum(rnorm(390)) ただのランダムウォーク
> summary(lm(stock2~xrw))
Call:
lm(formula = stock2 ~ xrw)
Residuals:
Min 1Q Median 3Q Max
-879.89 -185.61 -5.68 218.59 698.09
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 1992.457 23.798 83.72 <2e-16 ***
xrw -40.543 2.111 -19.20 <2e-16 *** 何じゃこりゃ!!!
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 264.8 on 388 degrees of freedom
Multiple R-squared: 0.4873, Adjusted R-squared: 0.486 あり得ない!!!
F-statistic: 368.8 on 1 and 388 DF, p-value: < 2.2e-16
適当なランダムウォークで株価時系列2を線形回帰してみると…
41. {urca}:共和分関係のモデリング
2013/8/31 41
> data(finland)
> sjf <- finland
> sjf.vecm <- ca.jo(sjf, ecdet = "none", type="eigen", K=2, spec="longrun", season=4)
> summary(sjf.vecm)
######################
# Johansen-Procedure #
######################
Test type: maximal eigenvalue statistic (lambda max) , with linear trend
Eigenvalues (lambda):
[1] 0.30932660 0.22599561 0.07308056 0.02946699
Values of teststatistic and critical values of test:
test 10pct 5pct 1pct
r <= 3 | 3.11 6.50 8.18 11.65
r <= 2 | 7.89 12.91 14.90 19.19 ここは5%棄却域を割っている
r <= 1 | 26.64 18.90 21.07 25.75 ここは5%棄却域を超えている(つまりr = 2)
r = 0 | 38.49 24.78 27.14 32.14
(以下省略)
共和分関係の推定はca.jo()で、共和分ランクの確認はsummary()で
42. {urca}:共和分関係のモデリング
2013/8/31 42
> sjf.vec2var<-vec2var(sjf.vecm,r=2)
> print(sjf.vec2var)
Coefficient matrix of lagged endogenous variables:
A1:
lrm1.l1 lny.l1 lnmr.l1 difp.l1
lrm1 0.855185363 -0.28226832 -0.09298924 -0.1750511
lny 0.036993826 0.33057494 -0.06731145 -0.1946863
lnmr -0.156875074 -0.01067717 0.76861874 0.4247362
difp 0.001331951 0.02850137 0.02361709 0.2063468
(以下省略)
> sjf.prd<-predict(sjf.vec2var,n.ahead=25,ci=0.95)
> sjf.irf<-irf(sjf.vec2var,n.ahead=25,ci=0.95)
得られたVECMは、vec2var(){vars}に共和分ランクrの値を
与えることで{vars}各関数に対応するvarest形式に直せる
47. {fGarch}:「ばらつき」の時系列モデリング
2013/8/31 47
> stock3.garch<-garchFit(~garch(1,1),data=stock3,trace=F)
> plot(stock3.garch)
Make a plot selection (or 0 to exit):
1: Time Series
2: Conditional SD
3: Series with 2 Conditional SD Superimposed
4: ACF of Observations
5: ACF of Squared Observations
6: Cross Correlation
7: Residuals
8: Conditional SDs
9: Standardized Residuals
10: ACF of Standardized Residuals
11: ACF of Squared Standardized Residuals
12: Cross Correlation between r^2 and r
13: QQ-Plot of Standardized Residuals
Selection: 2
garchFit()でGARCHモデルを推定、plot()で詳細を可視化できる
51. {tsDyn}:閾値に基づく状態変化の推定
「状態変化を伴うモデル」とは?
平たく言えばARIMA (or VAR)次数・係数ごと時間とともに
変化するようなモデルのこと
閾値モデル
何かしらの閾値を変数としておき、そこから上下のどちらに動いた
かで状態を区別する
SETARモデルが使いやすく、setar(){tsDyn}で実践できる
平滑推移モデル
複数状態のモデルがある推移関数の均衡和に従って時間的に
変動するものと仮定する
LSTARモデルが使いやすく、lstar(){tsDyn}で実践できる
2013/8/31 51
54. {tsDyn}:閾値に基づく状態変化の推定
2013/8/31 54
> stock1.lstar<-lstar(stock1,m=2) # AR次数は2
Using maximum autoregressive order for low regime: mL = 2
Using maximum autoregressive order for high regime: mH = 2
Using default threshold variable: thDelay=0
Performing grid search for starting values...
Starting values fixed: gamma = 100 , th = 178026 ; SSE = 16511207226
Grid search selected lower/upper bound gamma (was: 1 100 ]).
Might try to widen bound with arg: 'starting.control=list(gammaInt=c(1,200))'
Optimization algorithm converged
Problem: singular hessian
Optimized values fixed for regime 2 : gamma = 100 , th = 178026 ; SSE = 16511207226
> par(mfrow=c(2,1))
> plot(stock1)
> plot(regime(stock1.lstar)) # レジームをプロット
LSTARモデルの推定はlstar()で、まとめてAR次数を与える
64. {MSBVAR}:多変量時系列のマルコフ転換モデル
2013/8/31 64
> data(IsraelPalestineConflict)
> xm <- msbvar(IsraelPalestineConflict, p=3, h=2, lambda0=0.8, lambda1=0.15,
+ lambda3=1, lambda4=1, lambda5=0, mu5=0, mu6=0, qm=12,
+ alpha.prior=matrix(c(10,5,5,9), 2, 2))
Initial Log Likelihood Value: -12573.35
Starting blockwise optimization over 40 block optimizations...
Completed iteration 1 of 40. Log Likelihood Value: -12389.76
Completed iteration 2 of 40. Log Likelihood Value: -12360.08
# 中略
Completed iteration 40 of 40. Log Likelihood Value: -12358.54
> N1 <- 1000
> N2 <- 2000
> x1 <- gibbs.msbvar(xm, N1=N1, N2=N2, permute=TRUE)
Burn-in iteration : 1000
Final iteration : 1000
Final iteration : 2000
> plotregimeid(x1, type="all")
> x2 <- gibbs.msbvar(xm, N1=N1, N2=N2, permute=FALSE, Beta.idx=c(7,1))
Burn-in iteration : 1000
Final iteration : 1000
Final iteration : 2000
> plot.SS(x2)
ヘルプにあるgibbs.msbvar()のサンプル通りにやるとこんな感じ