В этом примере показано, как протестировать одномерные модели временных рядов на стационарность. В нем показано, как моделировать данные из четырех типов моделей: тренд стационарный, разностный стационарный, стационарный (AR (1)) и гетероскедастическая, случайная модель ходьбы. Это также показывает, что тесты дают ожидаемые результаты.
Симулируйте четыре временных рядов.
T = 1e3; % Sample size t = (1:T)'; % Time multiple rng(142857); % For reproducibility y1 = randn(T,1) + .2*t; % Trend stationary Mdl2 = arima('D',1,'Constant',0.2,'Variance',1); y2 = simulate(Mdl2,T,'Y0',0); % Difference stationary Mdl3 = arima('AR',0.99,'Constant',0.2,'Variance',1); y3 = simulate(Mdl3,T,'Y0',0); % AR(1) Mdl4 = arima('D',1,'Constant',0.2,'Variance',1); sigma = (sin(t/200) + 1.5)/2; % Std deviation e = randn(T,1).*sigma; % Innovations y4 = filter(Mdl4,e,'Y0',0); % Heteroscedastic
Постройте график первых 100 точек в каждой серии.
y = [y1 y2 y3 y4]; figure; plot1 = plot(y(1:100,:)); plot1(1).LineWidth = 2; plot1(3).LineStyle = ':'; plot1(3).LineWidth = 2; plot1(4).LineStyle = ':'; plot1(4).LineWidth = 2; title '{\bf First 100 Periods of Each Series}'; legend('Trend Stationary','Difference Stationary','AR(1)',... 'Heteroscedastic','location','northwest');
Все модели кажутся нестационарными и ведут себя аналогично. Поэтому вам может быть трудно различить, какая серия происходит из какой модели, просто посмотрев на их начальные сегменты.
Постройте график всего набора данных.
plot2 = plot(y); plot2(1).LineWidth = 2; plot2(3).LineStyle = ':'; plot2(3).LineWidth = 2; plot2(4).LineStyle = ':'; plot2(4).LineWidth = 2; title '{\bf Each Entire Series}'; legend('Trend Stationary','Difference Stationary','AR(1)',... 'Heteroscedastic','location','northwest');
Различия между сериями здесь яснее:
Тренд стационарного ряда имеет небольшое отклонение от среднего тренда.
Различия стационарный и гетероскедастический ряды имеют постоянные отклонения от линии тренда.
Серия AR (1) демонстрирует длительное стационарное поведение; остальные растут линейно.
Сходными кажутся различия стационарный и гетероскедастический ряды. Однако, что гетероскедастический ряд имеет гораздо более локальную изменчивость около периода 300 и гораздо менее близкий период 900. Отклонение модели максимально, когда , в момент времени . Отклонение модели минимально, когда , в момент времени . Поэтому визуальная изменчивость соответствует модели.
Используйте тест Augmented Dicky-Fuller на трех растущих сериях (y1
, y2
, и y4
), чтобы оценить, имеет ли серия модуля корень. Поскольку серия растет, уточняйте, что есть тренд. В этом случае нулевая гипотеза является и альтернативная гипотеза . Установите количество лагов равным 2 в демонстрационных целях.
hY1 = adftest(y1, 'model','ts', 'lags',2)
hY1 = logical
1
hY2 = adftest(y2, 'model','ts', 'lags',2)
hY2 = logical
0
hY4 = adftest(y4, 'model','ts', 'lags',2)
hY4 = logical
0
hY1 = 1
указывает на наличие достаточных доказательств, позволяющих предположить, что y1
является трендом стационарным. Это правильное решение, потому что y1
- тренд стационарный по конструкции.
hY2 = 0
указывает, что недостаточно доказательств, чтобы предположить, что y2
является трендом стационарным. Это правильное решение с тех пор, как y2
- различие стационарная по конструкции.
hY4 = 0
указывает, что недостаточно доказательств, чтобы предположить, что y4
является трендом стационарным. Это правильное решение, однако тест Дикки-Фуллера не подходит для гетероскедастической серии.
Используйте тест Дополненного Дикки-Фуллера на серии AR (1) (y3
), чтобы оценить, имеет ли серия модуля корень. Поскольку серия не растет, укажите, что серия является авторегрессивной с термином дрейфа. В этом случае нулевая гипотеза является и альтернативная гипотеза . Установите количество лагов равным 2 в демонстрационных целях.
hY3 = adftest(y3, 'model','ard', 'lags',2)
hY3 = logical
1
hY3 = 1
указывает, что существует достаточно доказательств, чтобы предположить, что y3
- стационарный, авторегрессивный процесс с дрейфующим термином. Это правильное решение, потому что y3
является авторегрессивным процессом с дрейфующим сроком по конструкции.
Используйте тест KPSS, чтобы оценить, являются ли серии модуля корневыми нестационарными. Укажите, что есть тренд в растущей серии (y1
, y2
, и y4
). Тест KPSS принимает следующую модель:
где является стационарным процессом и является независимым и идентично распределенным процессом со средним 0 и отклонением . Существует ли тренд в модели, нулевая гипотеза (ряд является трендом стационарным) и альтернативная гипотеза (не тренд стационарный). Установите количество лагов равным 2 в демонстрационных целях.
hY1 = kpsstest(y1, 'lags',2, 'trend',true)
hY1 = logical
0
hY2 = kpsstest(y2, 'lags',2, 'trend',true)
hY2 = logical
1
hY3 = kpsstest(y3, 'lags',2)
hY3 = logical
1
hY4 = kpsstest(y4, 'lags',2, 'trend',true)
hY4 = logical
1
Все это тесты приводят к правильному решению.
Используйте тест коэффициента отклонения для al четырех серий, чтобы оценить, являются ли серии случайными ходами. Нулевая гипотеза : является постоянным, и альтернативная гипотеза является : не является постоянным. Укажите, что нововведения являются независимыми и идентично распределены для всех, кроме y1
. Тестирование y4
оба пути.
hY1 = vratiotest(y1)
hY1 = logical
1
hY2 = vratiotest(y2,'IID',true)
hY2 = logical
0
hY3 = vratiotest(y3,'IID',true)
hY3 = logical
0
hY4NotIID = vratiotest(y4)
hY4NotIID = logical
0
hY4IID = vratiotest(y4, 'IID',true)
hY4IID = logical
0
Все тесты приводят к правильным решениям, кроме hY4_2 = 0
. Этот тест не отвергает гипотезу о том, что гетероскедастический процесс является случайной прогулкой по IID. Это несоответствие может быть связано со случайным seed.
Также можно оценить стационарность с помощью pptest
Этот пример показов, как протестировать одномерные временные ряды для корня модуля. Он использует данные о заработной плате (1900-1970 годы) в обрабатывающей промышленности. Серия находится в наборе данных Нельсона-Плоссера.
Загрузка данных Нельсона-Плоссера. Извлечение данных о номинальной заработной плате.
load Data_NelsonPlosser
wages = DataTable.WN;
Обрезка NaN
значения из ряда и соответствующие даты (этот шаг необязателен, потому что тест игнорирует NaN
значения).
wDates = dates(isfinite(wages)); wages = wages(isfinite(wages));
Постройте график данных для поиска трендов.
plot(wDates,wages)
title('Wages')
График предполагает экспоненциальный рост.
Преобразуйте данные с помощью функции log, чтобы линеаризировать ряд.
logWages = log(wages);
plot(wDates,logWages)
title('Log Wages')
График предполагает, что временные ряды имеют линейный тренд.
Протестируйте нулевую гипотезу об отсутствии модуля корня (тренд стационарный) против альтернативной гипотезы о том, что ряд является модулем корневым процессом с трендом (различие стационарный). Задайте 'Lags',7:2:11
, как предложено в Kwiatkowski et al., 1992.
[h1,pValue1] = kpsstest(logWages,'Lags',7:2:11)
h1 = 1x3 logical array
0 0 0
pValue1 = 1×3
0.1000 0.1000 0.1000
kpsstest
не может отклонить нулевую гипотезу о том, что серия зарплат тренда является стационарной.
Проверьте нулевую гипотезу о том, что ряд является модулем корневым процессом (различие стационарным) против альтернативной гипотезы о том, что ряд тренда является стационарным.
[h2,pValue2] = adftest(logWages,'Model','ts')
h2 = logical
0
pValue2 = 0.8327
adftest
не может отклонить нулевую гипотезу о том, что серия зарплат является модулем корневым процессом.
Поскольку результаты двух тестов противоречивы, неясно, что серия зарплат имеет модуль корень. Это типичный результат тестов на многих макроэкономических рядах.
kpsstest
имеет ограниченный набор вычисленных критических значений. Когда он вычисляет тестовую статистику, которая находится вне этой области значений, тест сообщает значение p в соответствующей конечной точке. Итак, в данном случае pValue
отражает ближайшее табличное значение. Когда тестовая статистика лежит внутри диапазона табличных значений, kpsstest
линейно интерполирует p-значение.
В этом примере показано, как оценить, являются ли временные ряды случайной ходьбой. Он использует рыночные данные для ежедневных возвратов акций и денежных средств (денежный рынок) за период с 1 января 2000 года по 7 ноября 2005 года.
Загрузите данные.
load CAPMuniverse
Извлеките две серии для тестирования. Первый столбец данных - это ежедневный возврат технологического запаса. Последний (14-й) столбец - дневной возврат наличности (дневной курс денежного рынка).
tech1 = Data(:,1); money = Data(:,14);
Возвраты являются журналами коэффициентов значений в конце дня по значениям в начале дня.
Преобразуйте данные в цены (значения) вместо возвратов. vratiotest
принимает цены как входы, в отличие от возвратов.
tech1 = cumsum(tech1); money = cumsum(money);
Постройте график данных, чтобы увидеть, являются ли они стационарными.
subplot(2,1,1) plot(Dates,tech1); title('Log(relative stock value)') datetick('x') hold on subplot(2,1,2); plot(Dates,money) title('Log(accumulated cash)') datetick('x') hold off
Наличность имеет небольшую изменчивость и, по-видимому, имеет долгосрочные тренды. Серия акций имеет хорошую изменчивость и не имеет определенного тренда, хотя, по-видимому, увеличивается ближе к концу.
Проверьте, соответствует ли серия запасов случайной ходьбе.
[h,pValue,stat,cValue,ratio] = vratiotest(tech1)
h = logical
0
pValue = 0.1646
stat = -1.3899
cValue = 1.9600
ratio = 0.9436
vratiotest
не отвергает гипотезу о том, что случайная прогулка является разумной моделью для ряда запасов.
Проверьте, является ли i.i.d. случайная прогулка является разумной моделью для серии запасов.
[h,pValue,stat,cValue,ratio] = vratiotest(tech1,'IID',true)
h = logical
1
pValue = 0.0304
stat = -2.1642
cValue = 1.9600
ratio = 0.9436
vratiotest
отвергает гипотезу о том, что i.i.d. случайная прогулка является разумной моделью для tech1
запас серии на уровне 5%. Таким образом, vratiotest
указывает, что наиболее подходящая модель tech1
series - гетероскедастическая случайная прогулка.
Проверьте, соответствует ли серия денежных средств случайной прогулке.
[h,pValue,stat,cValue,ratio] = vratiotest(money)
h = logical
1
pValue = 4.6093e-145
stat = 25.6466
cValue = 1.9600
ratio = 2.0006
vratiotest
решительно отвергает гипотезу о том, что случайная прогулка является разумной моделью для денежного ряда (pValue = 4.6093e-145
). Удаление тренда из серии не влияет на полученную статистику.
[1] Квятковский, Д., П. К. Б. Филлипс, П. Шмидт и Я. Шин. «Проверка нулевой гипотезы стационарности против альтернативы единичного корня». Журнал эконометрики. Том 54, 1992, стр. 159-178.
adftest
| kpsstest
| pptest
| vratiotest