Я строю модель 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")
Это метод звука?
r
forecasting
modeling
var
youjustreadthis
источник
источник
Ответы:
Я думаю, вы поняли это правильно, но при построении модели VAR я обычно следую этим шагам:
1. Выберите переменные
Это самая важная часть построения вашей модели. Если вы хотите спрогнозировать цену актива, вам нужно включить переменные, которые связаны с механизмом формирования цены. Лучший способ сделать это через теоретическую модель. Поскольку вы не упомянули, что такое актив и каковы другие переменные, которые вы включили в свою модель, я действительно не могу сказать много об этом элементе, но вы можете найти краткое изложение моделей оценки активов здесь .
2. Проверьте данные и внесите необходимые коррективы
После выбора переменных вы можете внести некоторые коррективы в данные, которые улучшат оценку и интерпретацию модели. Полезно использовать сводную статистику и видеть график ряда, чтобы обнаружить выбросы, пропущенные данные и другие странные поведения. При работе с данными о ценах люди обычно берут натуральные журналы, что является преобразованием, стабилизирующим дисперсию, и также имеет хорошую интерпретацию (разница в ценах в журналах становится постоянно составной доходностью). Я не уверен, что вы взяли журналы перед оценкой модели, но это хорошая идея, если вы работаете с ценами на активы.
3. Проверьте, содержат ли данные нестационарные компоненты
Теперь вы можете использовать единичные корневые тесты, чтобы проверить, являются ли ваши серии стационарными. Если вас интересует только прогнозирование, как отмечает @JacobH, вы можете запускать VAR на уровнях, даже если ваши ряды нестационарны, но тогда вашим стандартным ошибкам нельзя доверять, что означает, что вы не можете сделать вывод о значении коэффициенты. Вы тестировали стационарно, используя тест ADF, который очень часто используется в этих приложениях, но учтите, что вы должны указать, хотите ли вы запускать тест с i) без константы и без тренда; II) постоянная и без тенденции; и iii) константа и тренд. Обычно ценовые ряды имеют стохастические тренды, поэтому линейный тренд не будет точным. В этом случае вы можете выбрать спецификацию ii. В своем коде вы использовали
ndiffs
Функция пакета прогноза. Я не уверен, какой из этих трех вариантов эта функция реализует для вычисления количества различий (я не смог найти это в документации). Чтобы проверить свой результат, вы можете использоватьur.df
функцию из пакета "urca":adf <- ur.df(x[, "VAR1"], type = "drift", lags = 10, selectlags = "AIC")
Обратите внимание, что эта команда запустит тест ADF с константой и с задержками, выбранными командой AIC, с максимальной задержкой 10. Если у вас есть проблемы с интерпретацией результатов, просто посмотрите на этот вопрос . Если ряды I (1), просто используйте разность, которая будет равна непрерывно составленным доходам. Если тест показывает, что серия I (2), и вы сомневаетесь в том, что вы можете использовать другие тесты, например, тест Филлипса-Перрона (
PP.test
функция в R). Если все тесты подтверждают, что ваша серия - это я (2) (не забудьте использовать журнал серии перед запуском тестов), тогда возьмите второе различие, но учтите, что ваша интерпретация результатов изменится, так как теперь вы работаете с Разница в непрерывно составленных доходах. Цены на активы обычно равны I (1), поскольку они близки к случайному блужданию, что является белым шумом при применении первой разницы.4. Выберите порядок модели
Это можно сделать с помощью обычно используемых критериев, таких как Akaike, Schwarz (BIC) и Hannan-Quinn. Вы сделали это с помощью
VARselect
функции, и это правильно, но помните, по какому критерию вы использовали свое решение. Обычно разные критерии указывают на разные заказы для VAR.5. Проверьте, существуют ли отношения коинтеграции
Если все ваши серии - это I (1) или I (2), перед запуском модели VAR, как правило, рекомендуется проверить, нет ли коинтеграционных отношений между сериями, особенно если вы хотите выполнить анализ импульсной характеристики с помощью невязки. Вы можете сделать это с помощью теста Йохансена или Энгла-Грейнджера (только для двумерных моделей). В R вы можете запустить тест Йохансена с
ca.jo
функцией пакета "urca". Обратите внимание, что этот тест также имеет разные характеристики. Для ценовых рядов я обычно использую следующий код (гдеp
длина лага пункта 4, выполненного с сериями в уровнях):6. Оцените модель
Если ваши серии не объединены, вы можете легко оценить модель с помощью
VAR
команды, как это делается в вашем коде. В случае, если ряды объединены, необходимо рассмотреть долгосрочные отношения, оценивая модель векторной коррекции ошибок с помощью следующего кода (гдеk
порядок коинтеграции):7. Запустите диагностические тесты
Чтобы проверить, правильно ли указана ваша модель, вы можете запустить тест последовательной корреляции по остаткам. В вашем коде вы использовали тест Portmanteau с
serial.test
функцией. Я никогда не использовал эту функцию, но думаю, что все в порядке. Существует также многомерная версия теста Ljung-Box, реализованная в пакете MTS, которую вы можете запустить с помощью функцииmq
.8. Делайте прогнозы
Убедившись, что ваша модель правильно указана, вы можете использовать эту
predict
функцию так же, как в коде. Вы можете даже построить функции импульсного отклика, чтобы проверить, как переменные реагируют на определенный шок, используяirf
функцию.9. Оценивайте прогнозы
После того, как вы сделали свои прогнозы, вы должны оценить их и сравнить с другими моделями. Некоторые методы оценки точности прогнозов можно найти здесь , но для этого крайне важно разделить свои серии на обучающие и тестовые наборы, как описано в ссылке.
источник
predict
. Большие фрагменты кода можно отформатировать как код, выделив текст и нажав кнопку «цитаты» в верхней части окна редактора.Я думал, что добавлю в Regis A Ely очень хороший ответ. Его ответ не является неправильным, но использование VAR для прогнозирования отличается от использования VAR для выполнения других операций типа VAR (например, IRF, FEVD, Historical Decomp. И т.д ...). Следовательно, некоторые из шагов, описанных Regis A Ely, в некоторых случаях могут негативно повлиять на ваш прогноз.
Отказ от ответственности:
Когда я имею в виду нестационарные данные, я имею в виду, что ряд содержит стохастический тренд. Если данные имеют временной / сезонный тренд, они должны быть соответствующим образом отфильтрованы.
Первый
Вообще говоря, в неограниченной VAR нет необходимости беспокоиться о ложных отношениях. Паразитная регрессия возникает, когда вы регрессируете нестационарный ряд (Y) в другой нестационарный ряд (X), и оба ряда не коинтегрированы. Однако, если вы регрессируете Y на X, а также запаздывает по Y, то регрессия не будет ложной, поскольку включение запаздывания Y гарантирует, что ошибки будут постоянными. Иными словами, лаги Y улавливают вариацию, которая ранее была ошибочно присвоена X. Поскольку неограниченная VAR - это, по сути, система регрессий ARDL, где каждое уравнение содержит одинаковое количество лагов и регрессоров, должно быть ясно, что ложная регрессия поэтому вряд ли будет проблемой. Иначе говоря, если ваши данные - это все I (1), независимо от того, являются ли они интегрированными, вы можете запустить VAR. VECM необходимы только в том случае, если вы хотите моделировать и определять взаимосвязь между переменными в краткосрочной и долгосрочной перспективе / совместной интеграции. Вопрос теперь в том, следует ли вам использовать VAR по уровням или по первым различиям.
второй
При прогнозировании нет необходимости сначала отличать данные I (1). Вы можете, если хотите, думали, что удивительно много практикующих этого не делают. Помните, когда у нас есть нестационарный ряд, мы все еще можем получить непротиворечивую оценку. Для регрессии с одним лагом зависимой переменной это интуитивно понятно. Если ряды следуют за случайным блужданием (то есть нестационарным), мы знаем, что наилучшая оценка того, где это будет следующим периодом, - это точно, где это был последний период (т.е. бета равен 1). Однако стандартные ошибки оценок, полученные из моделей с нестационарными данными, отличаются, поскольку, строго говоря, дисперсия оценки приближается к бесконечности, когда T приближается к бесконечности. Это, однако, не является проблемой для прогнозирования. Прогнозирование - это условное ожидание, поэтому оно основывается только на оценках параметров вашей модели, а не на стандартных ошибках. Кроме того, интервалы прогнозирования вашего прогноза будут получены либо непосредственно из ваших ошибок, путем ошибок начальной загрузки, либо, если у вас много данных через интервалы эмпирического прогнозирования (мой любимый!), На все эти три подхода не влияют нестационарные данные потому что опять ваши ошибки будут постоянными согласно нашему ложному регрессионному обсуждению выше.
Почему меня это волнует?
Тест ADF имеет низкое энергопотребление, особенно когда серия близка к тому, чтобы быть корневым модулем, но это не так. Сказанный другой тест ADF будет иметь тенденцию ошибочно утверждать, что ряд является нестационарным, когда это фактически не так.
Предположим, что ваш тест ADF ошибочно гарантирует, что серия не является стационарной. Если вы выполните все необходимые преобразования и оцените VECM, ваш прогноз будет неверным, потому что ваша модель неверна. Вот почему люди прогнозируют в уровнях.
Как насчет причинности Грейнджер ???
Вы даже можете проверить GC с VAR в уровнях, когда данные I (1). Я знаю, это звучит безумно. Мы знаем, что вывод не всегда возможен для нестационарных данных. Однако возможно проверить совместные гипотезы, например, GC. Это показано в работах Тоды и Ямамото (1995), в которых использованы Sims, Stock и Watson (1990). Для заявления см. Http://davegiles.blogspot.com/2011/04/testing-for-granger-causality.html .
Последняя вещь
Однако, если вы хотите использовать свой VAR для других целей, кроме прогнозирования, будьте осторожны. VAR в уровнях с нестационарными и совместно интегрированными рядами может дать некоторые странные результаты. Например, строго говоря, представление скользящей средней VAR не существует, поскольку матрица параметров не будет обратимой. Несмотря на это, IRF все еще можно получить. Вывод также неосуществим (гипотезы совместного мышления могут быть проверены, как обсуждалось выше).
Также следует беспокоиться о небольших образцах. Все, что я обсуждал, хорошо работает в больших выборках, но в небольших выборках все может получиться странным. Это особенно верно для GC с данными I (1).
источник