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?
r
forecasting
modeling
var
Anda dapat membaca ini
sumber
sumber
Jawaban:
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 menggunakan
ndiffs
fungsi 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 menggunakanur.df
fungsi 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.test
fungsi 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
VARselect
fungsi 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.jo
fungsi paket "urca". Perhatikan bahwa tes ini juga memiliki spesifikasi yang berbeda. Untuk seri harga, saya biasanya menggunakan kode berikut (di manap
panjang lag item 4, dilakukan dengan seri di level):6. Perkirakan model
Jika seri Anda tidak terkointegrasi, Anda dapat dengan mudah memperkirakan model dengan
VAR
perintah, 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 manak
urutan kointegrasi):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.test
fungsi. 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 fungsinyamq
.8. Buat prediksi
Setelah Anda yakin model Anda ditentukan dengan baik, Anda dapat menggunakan
predict
fungsi seperti yang Anda lakukan dalam kode Anda. Anda bahkan dapat memplot fungsi respons impuls untuk memeriksa bagaimana variabel merespons kejutan tertentu menggunakanirf
fungsi 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.
sumber
predict
. Potongan kode yang lebih besar dapat diformat sebagai kode dengan memilih teks dan mengklik tombol "kutipan" di bagian atas jendela editor.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).
sumber