Metodologi peramalan VAR

19

Saya sedang membangun model VAR untuk memperkirakan harga suatu aset dan ingin tahu apakah metode saya baik secara statistik, apakah tes yang saya sertakan relevan atau tidak, dan jika lebih banyak diperlukan untuk memastikan perkiraan yang andal berdasarkan variabel input saya.

Di bawah ini adalah proses saya saat ini untuk memeriksa kausalitas Granger dan memperkirakan model VAR yang dipilih.

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")

Apakah metode ini masuk akal?

Anda dapat membaca ini
sumber
1
Apakah Anda menggunakan perbedaan kedua? Ini sedikit tidak biasa dan bisa membuat model lebih sensitif daripada yang seharusnya. Juga, dapatkah Anda mengharapkan kointegrasi dalam sistem Anda? Dan bagaimana dengan tren waktu deterministik dan / atau musiman, sudahkah Anda memeriksanya?
Richard Hardy
@ Richard, perbedaan untuk mencapai stasioneritas sejauh yang saya mengerti ditentukan oleh tes ADF, dan akan disesuaikan sesuai dengan sarannya. Jika tes ADF menentukan itu stasioner (kembali 0 saya tidak akan membedakan variabel). Saya belum memikirkan kointegrasi dan musiman, tetapi mendapat kesan bahwa metode di atas akan menangani setiap tren dalam variabel.
membaca ini
2
Tes ADF hanyalah tes, ia datang dengan keterbatasannya. Merencanakan data mentah, perbedaan pertama dan akhirnya perbedaan kedua mungkin lebih informatif daripada hanya menjalankan tes. Juga, tes ADF memiliki spesifikasi yang berbeda: (1) tidak ada konstan, tidak ada tren; (2) konstan, tidak ada tren; (3) konstan dan tren; pemilihan lag order untuk tes juga mungkin tidak trivial. Karenanya, jangan membabi buta mengandalkan hasil. Dari perspektif subjek, harga aset biasanya terintegrasi dari pesanan satu, I (1). Saya (2) akan sulit dibenarkan ...
Richard Hardy
@youjustreadthis saya memasukkan jawaban di bawah ini. Saya sangat menyarankan Anda mempertimbangkan beberapa implikasinya
Jacob H

Jawaban:

28

Saya pikir Anda sudah benar, tetapi ketika membangun model VAR, saya biasanya memastikan saya mengikuti langkah-langkah ini:

1. Pilih variabel

Ini adalah bagian terpenting dari membangun model Anda. Jika Anda ingin memperkirakan harga suatu aset, Anda perlu memasukkan variabel yang terkait dengan mekanisme pembentukan harga. Cara terbaik untuk melakukan ini adalah melalui model teoretis. Karena Anda tidak menyebutkan aset apa dan variabel apa yang Anda masukkan dalam model Anda, saya benar-benar tidak bisa mengatakan banyak tentang item ini, tetapi Anda dapat menemukan ringkasan model penetapan harga aset di sini .

2. Periksa data dan lakukan penyesuaian yang tepat

Setelah memilih variabel, Anda dapat membuat beberapa penyesuaian pada data yang akan meningkatkan estimasi dan interpretasi model. Sangat berguna untuk menggunakan statistik ringkasan dan melihat plot dari seri untuk mendeteksi pencilan, data yang hilang dan perilaku aneh lainnya. Ketika bekerja dengan data harga, orang biasanya mengambil log alami, yang merupakan transformasi penstabilan varian dan juga memiliki interpretasi yang baik (perbedaan harga dalam log menjadi pengembalian berulang secara terus-menerus). Saya tidak yakin apakah Anda telah mengambil log sebelum memperkirakan model, tetapi itu ide yang baik untuk melakukannya jika Anda bekerja dengan harga aset.

3. Periksa apakah data mengandung komponen yang tidak stasioner

Sekarang Anda dapat menggunakan tes root unit untuk memeriksa apakah seri Anda stasioner. Jika Anda hanya tertarik pada peramalan, seperti dicatat oleh @JacobH, Anda dapat menjalankan level VAR bahkan ketika seri Anda tidak stasioner, tetapi kemudian kesalahan standar Anda tidak dapat dipercaya, artinya Anda tidak dapat membuat kesimpulan tentang nilai dari koefisien. Anda telah menguji stasioner menggunakan tes ADF, yang sangat umum digunakan dalam aplikasi ini, tetapi perhatikan bahwa Anda harus menentukan jika Anda ingin menjalankan tes dengan i) tidak ada konstan dan tidak ada tren; ii) tren konstan dan tidak ada; dan iii) konstan dan tren. Biasanya seri harga memiliki tren stokastik, sehingga tren linier tidak akan akurat. Dalam hal ini Anda dapat memilih spesifikasi ii. Dalam kode Anda, Anda menggunakanndiffsfungsi dari paket perkiraan. Saya tidak yakin yang mana dari tiga alternatif yang mengimplementasikan fungsi ini untuk menghitung jumlah perbedaan (saya tidak dapat menemukannya dalam dokumentasi). Untuk memeriksa hasil Anda, Anda mungkin ingin menggunakan ur.dffungsi dalam paket "urca":

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

Perhatikan bahwa perintah ini akan menjalankan tes ADF dengan konstanta dan kelambatan yang dipilih oleh perintah AIC, dengan kelambatan maksimum 10. Jika Anda memiliki masalah menafsirkan hasil, lihat saja pertanyaan ini . Jika seri I (1) gunakan saja perbedaannya, yang akan sama dengan pengembalian yang terus menerus ditambah. Jika tes menunjukkan bahwa seri ini I (2) dan Anda ragu tentang itu Anda dapat menggunakan tes lain, misalnya tes Phillips-Perron (PP.testfungsi dalam R). Jika semua tes mengkonfirmasi bahwa seri Anda adalah I (2) (ingat untuk menggunakan log seri sebelum menjalankan tes) maka ambil perbedaan kedua, tetapi perhatikan bahwa interpretasi Anda terhadap hasil akan berubah, karena sekarang Anda bekerja dengan perbedaan pengembalian yang terus bertambah. Harga aset biasanya I (1) karena mereka dekat dengan jalan acak, yang merupakan white noise saat menerapkan perbedaan pertama.

4. Pilih urutan model

Ini dapat dilakukan dengan kriteria yang umum digunakan seperti Akaike, Schwarz (BIC) dan Hannan-Quinn. Anda telah melakukannya dengan VARselectfungsi dan itu benar, tetapi ingat kriteria apa yang Anda gunakan untuk membuat keputusan. Biasanya kriteria yang berbeda menunjukkan pesanan yang berbeda untuk VAR.

5. Periksa apakah ada hubungan kointegrasi

Jika semua seri Anda I (1) atau I (2), sebelum menjalankan model VAR, biasanya ide yang baik untuk memeriksa apakah tidak ada hubungan kointegrasi antara seri, khususnya jika Anda ingin membuat analisis respon impuls dengan residu. Anda dapat melakukannya menggunakan tes Johansenn atau Engle-Granger (hanya untuk model bivariat). Di R Anda dapat menjalankan tes Johansen dengan ca.jofungsi paket "urca". Perhatikan bahwa tes ini juga memiliki spesifikasi yang berbeda. Untuk seri harga, saya biasanya menggunakan kode berikut (di mana ppanjang lag item 4, dilakukan dengan seri di level):

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

6. Perkirakan model

Jika seri Anda tidak terkointegrasi, Anda dapat dengan mudah memperkirakan model dengan VARperintah, seperti yang dilakukan dalam kode Anda. Jika seri terkointegrasi, Anda perlu mempertimbangkan hubungan jangka panjang dengan memperkirakan model Koreksi Kesalahan Vektor dengan kode berikut (di mana kurutan kointegrasi):

vecm <- cajorls(joeigen, r = k)

7. Jalankan tes diagnostik

Untuk menguji apakah model Anda ditentukan dengan baik, Anda dapat menjalankan uji korelasi serial pada residu. Dalam kode Anda, Anda menggunakan tes Portmanteau dengan serial.testfungsi. Saya tidak pernah menggunakan fungsi ini tapi saya pikir itu OK. Ada juga versi multivarian dari tes Ljung-Box yang diimplementasikan dalam paket MTS yang dapat Anda jalankan dengan fungsinya mq.

8. Buat prediksi

Setelah Anda yakin model Anda ditentukan dengan baik, Anda dapat menggunakan predictfungsi seperti yang Anda lakukan dalam kode Anda. Anda bahkan dapat memplot fungsi respons impuls untuk memeriksa bagaimana variabel merespons kejutan tertentu menggunakan irffungsi tersebut.

9. Mengevaluasi prediksi

Setelah Anda membuat prediksi, Anda harus mengevaluasi dan membandingkannya dengan model lain. Beberapa metode untuk mengevaluasi keakuratan ramalan dapat ditemukan di sini , tetapi untuk melakukan itu sangat penting bagi Anda untuk membagi seri Anda dalam pelatihan dan satu set tes, seperti yang dijelaskan dalam tautan.

Regis A. Ely
sumber
Terima kasih banyak atas jawaban terperinci ini! Sehubungan dengan tes Johansen untuk kointegrasi, apakah implementasi berubah ketika lebih dari 2 variabel dimasukkan? Percaya saya membaca bahwa mulitcointegration membawa jebakan sendiri. Maaf jika ini lebih cocok untuk pertanyaannya sendiri.
membaca ini
1
Tidak, Anda dapat melakukannya dengan kode yang sama seperti di atas, tetapi Anda mungkin menemukan lebih dari satu vektor kointegrasi dalam kasus ini. Satu-satunya batasan jenis ini adalah dengan tes Engle-Granger, yang hanya cocok untuk seri bivariat, tetapi biasanya lebih baik dalam hal ini.
Regis A. Ely
1
Tautan ini dapat membantu menjalankan dan menginterpretasikan tes johansenn.
Regis A. Ely
Kerja bagus! Saya telah mengedit beberapa pemformatan dan ejaan. Perhatikan bahwa senang memiliki kepingan kode (bahkan sekecil nama fungsi) di backticks `, mis predict. Potongan kode yang lebih besar dapat diformat sebagai kode dengan memilih teks dan mengklik tombol "kutipan" di bagian atas jendela editor.
Richard Hardy
@ RichardHardy, garis besar prosedur estimasi VAR yang bagus. Namun, saya pikir Anda mungkin telah mengabaikan fakta bahwa OP ingin meramalkan. Akibatnya, dia kemungkinan ingin memperkirakan dalam level.
Jacob H
9

Saya pikir saya akan menambahkan ke Regis A Ely jawaban yang sangat bagus. Jawabannya tidak salah, tetapi menggunakan VAR untuk ramalan berbeda dari menggunakan VAR untuk melakukan hal-hal tipe VAR lainnya (yaitu IRF, FEVD, Historical Decomp, dll ...). Akibatnya, beberapa langkah yang digariskan oleh Regis A Ely akan berdampak negatif pada perkiraan Anda dalam beberapa kasus.

Penolakan:

Ketika saya merujuk pada data yang tidak stasioner, maksud saya seri ini mengandung tren stokastik. Jika data memiliki tren waktu / musiman, maka harus disaring dengan tepat.

Pertama

Secara umum, dalam VAR tidak terbatas tidak perlu khawatir tentang hubungan palsu. Regresi palsu terjadi ketika Anda mundur seri non-stasioner (Y) pada seri non-stasioner (X) lainnya dan kedua seri tidak terkointegrasi. Namun, jika Anda mundur Y pada X serta kelambatan Y maka regresi tidak akan palsu karena dimasukkannya lag Y memastikan bahwa kesalahan akan stasioner. Dengan kata lain, kelambatan Y mengambil variasi yang sebelumnya salah ditugaskan ke X. Karena VAR tidak terbatas pada dasarnya adalah sistem regresi ARDL di mana setiap persamaan berisi jumlah lag dan regressor yang sama, harus jelas bahwa regresi spurious adalah karena itu tidak akan menjadi masalah. Mengatakan dengan cara lain jika data Anda adalah semua I (1), terlepas dari apakah itu tidak terintegrasi, Anda dapat menjalankan VAR. VECM hanya diperlukan ketika Anda ingin kedua model dan mengidentifikasi hubungan jangka pendek dan panjang / co-integrasi antar variabel. Pertanyaannya sekarang adalah, apakah Anda harus menjalankan VAR di level atau di perbedaan pertama.

Kedua

Saat melakukan peramalan, data I (1) perbedaan pertama tidak diperlukan. Anda bisa jika suka, pikir sejumlah praktisi yang mengejutkan tidak. Ingat ketika kita memiliki seri non-stasioner, kita masih bisa mendapatkan estimator yang konsisten. Untuk regresi dengan lag tunggal dari variabel dependen ini intuitif. Jika seri mengikuti jalan acak (mis. Non-stasioner) kita tahu estimasi terbaik dari di mana ia akan menjadi periode berikutnya adalah persis apakah itu periode terakhir (yaitu beta adalah 1). Kesalahan standar estimasi yang berasal dari model dengan data non-stasioner, bagaimanapun, berbeda karena secara tegas varian estimasi mendekati infinity ketika T mendekati infinity. Namun, ini bukan masalah untuk perkiraan. Peramalan pada dasarnya adalah harapan bersyarat dan oleh karena itu hanya bergantung pada estimasi parameter model Anda dan bukan kesalahan standar. Selanjutnya, interval prediksi ramalan Anda akan diperoleh langsung dari kesalahan Anda, dengan kesalahan bootstrap, atau jika Anda memiliki banyak data melalui interval prediksi empiris (favorit saya!), Ketiga pendekatan ini tidak terpengaruh oleh data non-stasioner. karena sekali lagi kesalahan Anda akan diam sesuai diskusi regresi palsu kami di atas.

Kenapa saya peduli?

Tes ADF memiliki daya rendah, terutama ketika seri hampir menjadi root unit, tetapi tidak. Mengatakan lain tes ADF akan cenderung keliru menyatakan bahwa seri adalah non-stasioner padahal sebenarnya tidak.

Asumsikan bahwa tes ADF Anda salah memastikan bahwa seri ini tidak stasioner. Jika Anda melakukan semua transformasi yang diperlukan dan memperkirakan VECM, perkiraan Anda akan salah, karena model Anda salah. Inilah sebabnya mengapa orang memperkirakan di tingkat.

Bagaimana dengan Granger Causality ???

Anda bahkan dapat menguji GC dengan VAR di tingkat ketika data I (1). Saya tahu itu terdengar gila. Kita tahu bahwa kesimpulan biasanya tidak mungkin dengan data yang tidak stasioner. Namun dimungkinkan untuk menguji hipotesis bersama, misalnya GC. Ini ditunjukkan dalam Toda dan Yamamoto (1995) yang mengacu pada Sims, Stock dan Watson (1990). Untuk aplikasi, lihat http://davegiles.blogspot.com/2011/04/testing-for-granger-causality.html .

Hal terakhir

Namun, jika Anda ingin menggunakan VAR Anda untuk hal-hal selain perkiraan, berhati-hatilah. VAR dalam level dengan seri non-stasioner dan co-integrated dapat menghasilkan beberapa hasil aneh. Misalnya, secara tegas, representasi Moving Average dari VAR tidak ada karena matriks parameter tidak akan dapat dibalik. Meskipun demikian, IRF masih bisa diperoleh. Inferensi juga tidak layak (pemikiran hipotesis bersama dapat diuji seperti dibahas di atas).

Juga khawatir sampel kecil. Semua yang saya bahas bekerja dengan baik dalam sampel besar, tetapi hal-hal kecil bisa menjadi aneh. Ini terutama berlaku untuk GC dengan data I (1).

Yakub H
sumber
1
Mengenai Pertama , bisakah Anda mencadangkan klaim Anda dengan referensi? Saya tidak yakin dengan argumentasi Anda. Jika dan x t jalan-jalan acak independen model y tytxtyt=β0+β1yt-1+...+βhalyt-hal+γxtγ^HAIL.Smendekati nol (bukan? di mana buktinya?), masalahnya berangsur-angsur hilang. Tetapi seberapa besar sampel yang dibutuhkan untuk itu? Sampai bukti diberikan, saya akan terus menghindari hubungan palsu.
Richard Hardy
1
Tentang Mengapa Saya Peduli? , jika proses memiliki root yang sangat dekat dengan unit root, ia berperilaku sangat mirip dengan proses unit-root. Ketika meramalkan, ada sedikit perbedaan antara asumsi bahwa guncangan itu permanen dan mempertahankan guncangan itu hilang dengan sangat lambat. Kecuali jika Anda memperkirakan sangat jauh ke masa depan, hasilnya akan hampir sama. Itu sebabnya saya tidak terlalu khawatir tentang uji root unit yang memiliki daya rendah untuk alternatif lokal.
Richard Hardy
1
Catatan kecil lain tentang Pertama : ketika berbicara tentang tes ADF di Mengapa saya peduli? , Anda mengatakan "perkiraan Anda akan salah, karena model Anda salah". Nah, ini berlaku untuk Pertama juga, bukan? Peramalan menggunakan model di mana sisi kiri menyimpang dari sisi kanan memang ditandai dengan kutipan di atas.
Richard Hardy
1
@ Richardhardy Untuk bukti pernyataan pertama saya, lihat Bab 18 di Hamilton 1994. Khususnya, bagian 18.2, Obat untuk Regresi Palsu. Perlu dicatat bahwa penaksir OLS juga efisien karena mereka bertemu pada tingkat sqrt dari T.
Jacob H
1
@RichardHardy komentar kedua Anda adalah poin yang adil. Pemikiran retort saya adalah mengapa menghabiskan waktu pra-pengujian dan kemudian menyaring data hanya untuk memperkirakan model yang salah. Untuk perkiraan, spesifikasi level umumnya akan benar
Jacob H