VAR予測方法


19

資産の価格を予測するためにVARモデルを構築していますが、私の方法が統計的に適切かどうか、含めたテストが関連するかどうか、入力変数に基づいて信頼できる予測を確保するためにさらに必要な場合は知りたいと思います。

以下は、グレンジャーの因果関係を確認し、選択したVARモデルを予測する現在のプロセスです。

require("forecast")
require("vars")

#Read Data
da=read.table("VARdata.txt", header=T)
dac <- c(2,3) # Select variables
x=da[,dac]

plot.ts(x)
summary(x)

#Run Augmented Dickey-Fuller tests to determine stationarity and differences to achieve stationarity.
ndiffs(x[, "VAR1"], alpha = 0.05, test = c("adf"))
ndiffs(x[, "VAR2"], alpha = 0.05, test = c("adf"))

#Difference to achieve stationarity
d.x1 = diff(x[, "VAR1"], differences = 2)
d.x2 = diff(x[, "VAR2"], differences = 2)

dx = cbind(d.x1, d.x2)
plot.ts(dx)

#Lag optimisation
VARselect(dx, lag.max = 10, type = "both")

#Vector autoregression with lags set according to results of lag optimisation. 
var = VAR(dx, p=2)

#Test for serial autocorrelation using the Portmanteau test
#Rerun var model with other suggested lags if H0 can be rejected at 0.05
serial.test(var, lags.pt = 10, type = "PT.asymptotic")

#ARCH test (Autoregressive conditional heteroscedasdicity)
arch.test(var, lags.multi = 10)

summary(var)

#Granger Causality test
#Does x1 granger cause x2?
grangertest(d.x2 ~ d.x1, order = 2)

#Does x2 granger cause x1?
grangertest(d.x1 ~ d.x2, order = 2)

#Forecasting
prd <- predict(var, n.ahead = 10, ci = 0.95, dumvar = NULL)
print(prd)
plot(prd, "single")

この方法は適切ですか?


1
2番目の違いを使用していますか?これは少し珍しいことであり、モデルが必要以上に敏感になる可能性があります。また、システムでの共和分を期待できますか?また、確定的な時間トレンドや季節性についてはどうですか、それらについて確認しましたか?
リチャードハーディ

@Richard、定常性を達成するための違いは、adfテストによって決定される限り、私が理解している限りであり、その提案に従って調整されます。adfテストでそれが静止していると判断された場合(0を返すと、変数に差はありません)。共和分と季節性については考えていませんが、上記の方法が変数の傾向を処理するという印象を受けました。
-youjustreadthis

2
ADFテストはテストにすぎず、制限があります。生データ、最初の違い、最終的には2番目の違いをプロットすると、テストを実行するよりも有益な場合があります。また、ADFテストにはさまざまな仕様があります。(1)定数なし、傾向なし。(2)一定、傾向なし。(3)定数とトレンド。テストの遅れの順序の選択も重要な場合があります。したがって、盲目的に結果に頼らないでください。主題の観点から、資産価格は通常注文1のI(1)で統合されます。I(2)正当化することは困難であろう...
リチャード・ハーディ

@youjustreadthis私は以下の答えを含めました。その意味を考慮することを強くお勧めします
ジェイコブH

回答:


28

私はあなたがそれをかなり正しかったと思いますが、VARモデルを構築するとき、私は通常これらのステップに従うことを確認します:

1.変数を選択します

これは、モデルを構築する上で最も重要な部分です。資産の価格を予測する場合は、価格形成のメカニズムに関連する変数を含める必要があります。これを行う最良の方法は、理論モデルを使用することです。モデルに含まれる資産およびその他の変数については言及しなかったため、この項目についてはあまり説明できませんが、ここで資産価格モデルの概要を見つけることができます。

2.データを確認し、適切な調整を行います

変数を選択すると、モデルの推定と解釈を改善するデータを調整できます。要約統計を使用して系列のプロットを表示し、外れ値、欠落データ、およびその他の奇妙な動作を検出すると便利です。価格データを使用する場合、通常、人々は自然対数を使用します。これは分散安定化変換であり、適切な解釈があります(ログの価格差は継続的に複利になります)。モデルを推定する前にログを取得したかどうかはわかりませんが、資産価格で作業している場合はログを取ることをお勧めします。

3.データに非定常コンポーネントが含まれているかどうかを確認します

これで、ユニットルートテストを使用して、シリーズが静止しているかどうかを確認できます。@JacobHで指摘されているように、予測のみに関心がある場合、シリーズが非定常であってもVARをレベルで実行できますが、標準エラーは信頼できません。つまり、の値について推論することはできません。係数。これらのアプリケーションで非常に一般的に使用されるADFテストを使用して定常をテストしましたが、i)一定および傾向なしでテストを実行するかどうかを指定する必要があることに注意してください。ii)一定の傾向なし。iii)一定の傾向。通常、価格シリーズには確率的傾向があるため、線形傾向は正確ではありません。この場合、仕様を選択できますii。あなたのコードではndiffs予測パッケージの機能。違いの数を計算するために、この関数がこれらの3つの選択肢のどれを実装するのかわかりません(ドキュメントで見つけることができませんでした)。結果を確認するにur.dfは、「urca」パッケージの関数を使用できます。

adf <- ur.df(x[, "VAR1"], type = "drift", lags = 10, selectlags = "AIC")

このコマンドは、定数とAICコマンドによって選択されたラグ、最大10のラグでADFテストを実行することに注意してください。結果の解釈に問題がある場合は、この質問をご覧ください。シリーズがI(1)である場合、差を使用します。これは、連続的に複利されたリターンと等しくなります。テストがシリーズがI(2)であると示し、他のテスト、たとえばPhillips-Perronテスト(PP.testR)の関数。すべてのテストがシリーズがI(2)であることを確認した場合(テストを実行する前にシリーズのログを使用することを忘れないでください)、2番目の違いを取りますが、結果の解釈が変わることに注意してください。連続的に複利されたリターンの差。資産の価格は、ランダムウォークに近いため、通常I(1)です。これは、最初の差を適用するときのホワイトノイズです。

4.モデルの順序を選択します

これは、赤池、シュワルツ(BIC)、Hannan-Quinnなどの一般的に使用される基準を使用して実行できます。あなたはVARselect関数でそれをやった、それは正しいが、あなたがあなたの決定を下すのに使用した基準が何であるかを覚えている。通常、異なる基準はVARの異なる順序を示します。

5.共和関係があるかどうかを確認する

すべての系列がI(1)またはI(2)である場合、VARモデルを実行する前に、特に系列で共和分関係がないかどうかをチェックすることをお勧めします。特に、残差。これは、ヨハンセン検定またはEngle-Granger(2変量モデルのみ)を使用して実行できます。R ca.joでは、「urca」パッケージの機能を使用してJohansenテストを実行できます。このテストにも異なる仕様があることに注意してください。価格シリーズの場合、通常、次のコードを使用します(pレベル4のシリーズで実行されるアイテム4のラグの長さ)。

jo_eigen <- ca.jo(x, type = "eigen", ecdet = "const", K = p)
jo_trace <- ca.jo(x, type = "trace", ecdet = "const", K = p)

6.モデルを推定する

シリーズが統合されていない場合、VARコードで行われているように、コマンドを使用してモデルを簡単に推定できます。シリーズが統合されている場合、次のコードを使用してベクトルエラー修正モデルを推定することにより、長期的な関係を考慮する必要があります(k統合の順序は次のとおりです)。

vecm <- cajorls(joeigen, r = k)

7.診断テストを実行する

モデルが適切に指定されているかどうかをテストするには、残差のシリアル相関のテストを実行できます。コードでは、serial.test関数でPortmanteauテストを使用しました。この機能を使用したことはありませんが、大丈夫だと思います。また、関数で実行できるパッケージMTSに実装されたLjung-Boxテストの多変量バージョンもありますmq

8.予測する

モデルが適切に指定されていることを確認したらpredict、コードで行ったように関数を使用できます。インパルス応答関数をプロットして、irf関数を使用して特定の衝撃に変数がどのように応答するかを確認することもできます。

9.予測を評価する

予測を行ったら、それらを評価し、他のモデルと比較する必要があります。予測の精度を評価するいくつかの方法はここにありますが、リンクで説明されているように、トレーニングとテストセットでシリーズを分割することが重要です。


この詳細な回答をありがとうございます!共和分に対するヨハンセン検定に関して、3つ以上の変数が含まれる場合、実装は変わりますか?多統合はそれ自身の落とし穴を運ぶと私は読んだと信じています。これがそれ自体の質問により適している場合は申し訳ありません。
youjustreadthis

1
いいえ、上記と同じコードでそれを行うことができますが、この場合、複数の共和分ベクトルを見つけることができます。この種の唯一の制限はEngle-Grangerテストです。これは2変量シリーズにのみ適していますが、この場合は通常より良いです。
レジスA.エリー

1
このリンクはjohansennテストの実行と解釈に役立ちます。
レジスA.エリー

よくやった!いくつかのフォーマットとスペルを編集しました。バッククォート `のコード部分(関数名と同じくらい小さい)があると便利ですpredict。テキストを選択し、エディターウィンドウの上部にある[引用]ボタンをクリックすると、コードの大きな部分をコードとしてフォーマットできます。
リチャードハーディ

@ RichardHardy、VAR推定手順の概要。ただし、OPが予測したいという事実を無視したのではないかと思います。その結果、彼/彼女はレベルで推定したいと思うでしょう。
ジェイコブH

9

Regis A Elyにとてもいい答えを付け加えたいと思いました。彼の答えは間違っていませんが、VARを使用して予測することは、VARを使用して他のVARタイプの処理(IRF、FEVD、Historical Decompなど)を実行することとは異なります。その結果、Regis A Elyによって概説された手順の一部は、場合によっては予測に悪影響を及ぼします。

免責事項:

非定常データを参照する場合、シリーズに確率的傾向が含まれていることを意味します。データに時間/季節的傾向がある場合は、適切にフィルタリングする必要があります。

最初

一般的に、無制限のVARでは、スプリアス関係について心配する必要はありません。スプリアス回帰は、非定常シリーズ(Y)を別の非定常シリーズ(X)で回帰し、両方のシリーズが共積分されない場合に発生します。ただし、XとYのラグでYを回帰する場合、ラグYを含めるとエラーが定常的になることが保証されるため、回帰はスプリアスになりません。別の言い方をすれば、Yのラグは以前Xに誤って割り当てられた変動を拾います。無制限VARは基本的に各方程式に同数のラグとリグレッサが含まれるARDL回帰のシステムであるため、スプリアス回帰はしたがって、問題になる可能性はありません。別の言い方をすれば、データがすべてI(1)である場合、データが統合されているかどうかに関係なく、VARを実行できます。VECMは、変数間の短期および長期の実行/共積分関係をモデル化し、特定する場合にのみ必要です。問題は、VARをレベルで実行するか、最初の相違点で実行するかです。

第二

予測する場合、最初にI(1)データを差分する必要はありません。必要に応じて、驚くほど多くの開業医は気に入らないと思います。非定常系列がある場合でも、一貫した推定量を取得できることを忘れないでください。従属変数の単一の遅れがある回帰の場合、これは直感的です。シリーズがランダムウォーク(つまり、非定常)に従っている場合、次の期間が最終期間である(つまり、ベータが1である)場合の最適な推定値がわかります。ただし、非定常データを持つモデルから導出された推定値の標準誤差は異なります。これは、厳密に言えば、Tが無限大に近づくにつれて推定値の分散が無限大に近づくためです。ただし、これは予測の問題ではありません。予測は基本的に条件付きの予測であるため、モデルのパラメーター推定にのみ依存し、標準誤差には依存しません。さらに、予測の予測間隔は、エラーからブートストラップエラーによって直接取得されるか、経験的予測間隔を介して多くのデータがある場合(私のお気に入りです!)、これら3つのアプローチはすべて非定常データの影響を受けません繰り返しますが、上記の誤った回帰の説明に従って、エラーは定常的です。

どうして気にするの?

ADFテストは、特にシリーズがユニットルートに近い場合に低消費電力になりますが、そうではありません。別の言い方をすれば、ADFテストは、シリーズが実際にはそうではないのに、それが非定常であると誤って主張する傾向があります。

ADFテストでは、シリーズが非定常であることを誤って保証すると仮定します。必要な変換をすべて行い、VECMを推定すると、モデルが間違っているため、予測が間違っています。これが人々がレベルで予測する理由です。

グレンジャー因果関係はどうですか?

データがI(1)の場合、VARレベルでGCをテストすることもできます。それはおかしいと思う。通常、非定常データでは推論が不可能であることを知っています。ただし、GCなどの共同仮説をテストすることは可能です。これは、シムズ、ストック、ワトソン(1990)に基づいた戸田と山本(1995)に示されています。アプリケーションについては、http://davegiles.blogspot.com/2011/04/testing-for-granger-causality.htmlを参照してください。

最後のこと

ただし、予測以外の目的でVARを使用する場合は、注意してください。非定常系列と統合系列のレベルのVARは、奇妙な結果をもたらす可能性があります。たとえば、厳密に言えば、パラメーター行列が可逆的ではないため、VARの移動平均表現は存在しません。この事実にもかかわらず、IRFはまだ入手可能です。推論も実行可能ではありません(上記のように、結合仮説をテストできます)。

また、小さなサンプルの心配もありません。私が議論したことはすべて、大きなサンプルではうまく機能しますが、小さなサンプルでは奇妙なことが起こります。これは、特にI(1)データを使用するGCに当てはまります。


1
ytバツtyt=β0+β1yt1++βpytp+γバツtγ^OLSゼロに近づいた場合(それを行う?証拠はどこにあるのか?)、問題は次第に消えていきます。しかし、そのために必要なサンプルの大きさは?証拠が与えられるまで、私は偽りの関係を避け続けます。
リチャードハーディ

1
私は気にしないのはなぜ?、プロセスにユニットルートに非常に近いルートがある場合、ユニットルートプロセスとほぼ同じように動作します。したがって、予測するとき、ショックが永続的であると仮定することと、ショックが非常にゆっくり消えることを維持することとの間にほとんど違いはありません。かなり先まで予測しない限り、結果はほぼ同じになります。そのため、私はユニットルートテストがローカルの代替に対して低電力であることをあまり心配していません。
リチャードハーディ

1
Firstに関する別の小さなメモ:なぜ気にするの?でADFテストについて話すとき 、「モデルが間違っているため、予測が間違っている」と言います。まあ、これはFirstにも当てはまりますよね?左側が右側から分岐するモデルを使用した予測は、実際に上記の引用によって特徴付けられます。
リチャードハーディ

1
@Richardhardy私の最初の主張の証拠については、Hamilton 1994の第18章を参照してください。特に、セクション18.2、偽回帰の治療法。それは彼らが収束するようOLS推定量は、レートでもTの平方根効率的であることは注目に値する
ヤコブH

1
@RichardHardyあなたの2番目のコメントは公正なポイントです。私のレトルトは、間違ったモデルを潜在的に推定するためだけにデータを事前テストしてからフィルタリングするのに時間を費やす理由だと思った。予測については、レベルの指定は一般的に正しいです
ジェイコブH
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.