Пример модели VAR

В этом примере показано, как анализировать модель VAR.

Обзор тематического исследования

Этот раздел содержит пример рабочего процесса, описанного в Рабочем процессе модели VAR. В примере используются три временных рядов: ВВП, M1 денежная масса и 3-месячная ставка T-векселя. Пример показывает:

  • Загрузка и преобразование данных для стационарности

  • Разбиение преобразованных данных на предварительные, оценочные и прогнозные интервалы для поддержки обратного тестирования эксперимента

  • Создание нескольких моделей

  • Подбор моделей к данным

  • Решение, какая из моделей лучше всего

  • Составление прогнозов на основе лучшей модели

Загрузка и преобразование данных

Файл Data_USEconModel поставляется с программным обеспечением Econometrics Toolbox™. Файл содержит временные ряды из базы данных Федерального резервного банка данных экономики Сент-Луиса (FRED) в табличном массиве. Этот пример использует три временных рядов:

  • ВВП (GDP)

  • M1 денежная масса (M1SL)

  • 3-месячная ставка T-векселя (TB3MS)

Загрузите набор данных. Создайте переменную для реального ВВП.

load Data_USEconModel
DataTable.RGDP = DataTable.GDP./DataTable.GDPDEF*100;

Постройте график данных для поиска трендов.

figure
subplot(3,1,1)
plot(DataTable.Time,DataTable.RGDP,'r');
title('Real GDP')
grid on
subplot(3,1,2);
plot(DataTable.Time,DataTable.M1SL,'b');
title('M1')
grid on
subplot(3,1,3);
plot(DataTable.Time,DataTable.TB3MS,'k')
title('3-mo T-bill')
grid on

Figure contains 3 axes. Axes 1 with title Real GDP contains an object of type line. Axes 2 with title M1 contains an object of type line. Axes 3 with title 3-mo T-bill contains an object of type line.

Реальный ВВП и M1 данные, по-видимому, растут в геометрической прогрессии, в то время как возвраты T-векселей не показывают экспоненциального роста. Чтобы противостоять трендам реального ВВП и M1, примите различие в логарифмах данных. Кроме того, стабилизируйте серию T-квитанций, взяв первое различие. Синхронизируйте ряд дат так, чтобы данные имели одинаковое число строк для каждого столбца.

rgdpg = price2ret(DataTable.RGDP);
m1slg = price2ret(DataTable.M1SL);
dtb3ms = diff(DataTable.TB3MS);
Data = array2timetable([rgdpg m1slg dtb3ms],...
    'RowTimes',DataTable.Time(2:end),'VariableNames',{'RGDP' 'M1SL' 'TB3MS'});

figure
subplot(3,1,1)
plot(Data.Time,Data.RGDP,'r');
title('Real GDP')
grid on
subplot(3,1,2);
plot(Data.Time,Data.M1SL,'b');
title('M1')
grid on
subplot(3,1,3);
plot(Data.Time,Data.TB3MS,'k'),
title('3-mo T-bill')
grid on

Figure contains 3 axes. Axes 1 with title Real GDP contains an object of type line. Axes 2 with title M1 contains an object of type line. Axes 3 with title 3-mo T-bill contains an object of type line.

Шкала первых двух столбцов примерно в 100 раз меньше третьего. Умножьте первые два столбца на 100, чтобы все временные ряды были примерно в одной шкале. Такое масштабирование облегчает построение графиков всех серий на одном графике. Что более важно, этот тип масштабирования делает оптимизации более численно стабильными (для примера, максимизации логарифмической правдоподобности).

Data{:,1:2} = 100*Data{:,1:2};
figure
plot(Data.Time,Data.RGDP,'r');
hold on
plot(Data.Time,Data.M1SL,'b'); 
datetick('x') 
grid on
plot(Data.Time,Data.TB3MS,'k');
legend('Real GDP','M1','3-mo T-bill'); 
hold off

Figure contains an axes. The axes contains 3 objects of type line. These objects represent Real GDP, M1, 3-mo T-bill.

Выбор и подбор моделей

Можно выбрать много различных моделей для данных. Этот пример использует четыре модели.

  • VAR (2) с диагональным авторегрессивом

  • VAR (2) с полным авторегрессивом

  • VAR (4) с диагональным авторегрессивом

  • VAR (4) с полным авторегрессивом

Удалите все отсутствующие значения из начала серии.

idx = all(~ismissing(Data),2);
Data = Data(idx,:);

Создайте четыре модели.

numseries = 3;
dnan = diag(nan(numseries,1));
seriesnames = {'Real GDP','M1','3-mo T-bill'};
VAR2diag = varm('AR',{dnan dnan},'SeriesNames',seriesnames);
VAR2full = varm(numseries,2);
VAR2full.SeriesNames = seriesnames;
VAR4diag = varm('AR',{dnan dnan dnan dnan},'SeriesNames',seriesnames);
VAR4full = varm(numseries,4);
VAR4full.SeriesNames = seriesnames;

Матрица dnan - диагональная матрица с NaN значения по его основной диагонали. В целом отсутствующие значения определяют наличие параметра в модели и указывают, что параметр должен соответствовать данным. MATLAB ® содержит отключенные диагональные элементы, 0, фиксированный во время оценки. Напротив, спецификации для VAR2full и VAR4full имеют матрицы, состоящие из NaN значения. Поэтому estimate подходит для полных матриц для авторегрессивных матриц.

Чтобы оценить качество моделей, создайте векторы индекса, которые разделяют данные отклика на три периода: предварительная выборка, оценка и прогноз. Подгонка моделей к данным оценки с использованием периода предварительного образца для предоставления отстающих данных. Сравните предсказания подобранных моделей с прогнозными данными. Период оценки находится в выборке, и период прогноза выходит из выборки (также известный как обратное тестирование).

Для двух моделей VAR (4) период предварительного образца является первыми четырьмя строками Data. Используйте тот же период предварительного образца для моделей VAR (2), чтобы все модели подходили к одним и тем же данным. Это необходимо для сравнения модели. Для обеих моделей прогнозный период является конечным 10% от строк Data. Период оценки для моделей переходит из строки 5 в строку 90%. Определите эти периоды данных.

idxPre = 1:4;
T = ceil(.9*size(Data,1));
idxEst = 5:T;
idxF = (T+1):size(Data,1);
fh = numel(idxF);

Теперь, когда модели и временные ряды существуют, вы можете легко подгонять модели к данным.

[EstMdl1,EstSE1,logL1,E1] = estimate(VAR2diag,Data{idxEst,:},...
    'Y0',Data{idxPre,:});
[EstMdl2,EstSE2,logL2,E2] = estimate(VAR2full,Data{idxEst,:},...
    'Y0',Data{idxPre,:});
[EstMdl3,EstSE3,logL3,E3] = estimate(VAR4diag,Data{idxEst,:},...
    'Y0',Data{idxPre,:});
[EstMdl4,EstSE4,logL4,E4] = estimate(VAR4full,Data{idxEst,:},...
    'Y0',Data{idxPre,:});
  • The EstMdl объектами модели являются подобранные модели.

  • The EstSE структуры содержат стандартные ошибки подобранных моделей.

  • The logL значения являются логарифмическая правдоподобность для подобранных моделей, которые вы используете, чтобы помочь выбрать лучшую модель.

  • The E векторы являются невязками, которые являются таким же размером, как и данные оценки.

Проверяйте адекватность модели

Можно проверить, являются ли предполагаемые модели стабильными и инвертируемыми, отобразив Description свойство каждого объекта. (В этих моделях нет членов MA, поэтому модели обязательно являются инвертируемыми.) Описания показывают, что все предполагаемые модели стабильны.

EstMdl1.Description
ans = 
"AR-Stationary 3-Dimensional VAR(2) Model"
EstMdl2.Description
ans = 
"AR-Stationary 3-Dimensional VAR(2) Model"
EstMdl3.Description
ans = 
"AR-Stationary 3-Dimensional VAR(4) Model"
EstMdl4.Description
ans = 
"AR-Stationary 3-Dimensional VAR(4) Model"

AR-Stationary появляется в выходе, указывающем, что авторегрессивные процессы стабильны.

Можно сравнить ограниченные (диагональные) модели AR с их неограниченными (полными) аналогами, используя lratiotest. Тест отклоняет или не отклоняет гипотезу о том, что ограниченные модели адекватны, с допуском по умолчанию 5%. Это тест в выборке.

Примените тесты коэффициента вероятности. Необходимо извлечь количество предполагаемых параметров из суммарной структуры, возвращенной summarize. Затем передайте различия в количестве предполагаемых параметров и логарифмической правдоподобности в lratiotest для выполнения тестов.

results1 = summarize(EstMdl1);
np1 = results1.NumEstimatedParameters;
results2 = summarize(EstMdl2);
np2 = results2.NumEstimatedParameters;
results3 = summarize(EstMdl3);
np3 = results3.NumEstimatedParameters;
results4 = summarize(EstMdl4);
np4 = results4.NumEstimatedParameters;

reject1 = lratiotest(logL2,logL1,np2 - np1)
reject1 = logical
   1

reject3 = lratiotest(logL4,logL3,np4 - np3)
reject3 = logical
   1

reject4 = lratiotest(logL4,logL2,np4 - np2)
reject4 = logical
   0

The 1 Результаты показывают, что тест коэффициента вероятности отклонил обе ограниченные модели в пользу соответствующих неограниченных моделей. Поэтому на основе этого теста предпочтительны неограниченные модели VAR (2) и VAR (4). Однако тест не отклоняет неограниченную модель VAR (2) в пользу неограниченной модели VAR (4). (Этот тест рассматривает модель VAR (2) как модель VAR (4) с ограничениями, что матрицы авторегрессии AR (3) и AR (4) равны 0.) Поэтому кажется, что неограниченная модель VAR (2) является лучшей моделью.

Чтобы найти лучшую модель в наборе, минимизируйте информационный критерий Акайке (AIC). Используйте данные в выборке для вычисления AIC. Вычислите критерий для четырех моделей.

AIC = aicbic([logL1 logL2 logL3 logL4],[np1 np2 np3 np4])
AIC = 1×4
103 ×

    1.4794    1.4396    1.4785    1.4537

Лучшая модель согласно этому критерию является неограниченной моделью VAR (2). Заметьте также, что неограниченная модель VAR (4) имеет более низкую информацию Akaike, чем любая из моделей с ограничениями. На основе этого критерия лучше всего использовать неограниченную модель VAR (2), а следующая в выбор - неограниченную модель VAR (4).

Чтобы сравнить предсказания четырех моделей с данными прогноза, используйте forecast. Эта функция возвращает и предсказание средних временных рядов, и ковариационную матрицу ошибки, которая дает доверительные интервалы о средствах. Это нерезультатное вычисление.

[FY1,FYCov1] = forecast(EstMdl1,fh,Data{idxEst,:});
[FY2,FYCov2] = forecast(EstMdl2,fh,Data{idxEst,:});
[FY3,FYCov3] = forecast(EstMdl3,fh,Data{idxEst,:});
[FY4,FYCov4] = forecast(EstMdl4,fh,Data{idxEst,:});

Оцените приблизительные 95% интервалы прогноза для лучшей модели аппроксимации.

extractMSE = @(x)diag(x)';
MSE = cellfun(extractMSE,FYCov2,'UniformOutput',false);
SE = sqrt(cell2mat(MSE));

YFI = zeros(fh,EstMdl2.NumSeries,2);
YFI(:,:,1) = FY2 - 2*SE;
YFI(:,:,2) = FY2 + 2*SE;

Этот график показывает предсказания лучшей модели аппроксимации в затененной области справа.

figure;
for j = 1:EstMdl2.NumSeries
    subplot(3,1,j);
    h1 = plot(Data.Time((end-49):end),Data{(end-49):end,j});
    hold on;
    h2 = plot(Data.Time(idxF),FY2(:,j));
    h3 = plot(Data.Time(idxF),YFI(:,j,1),'k--');
    plot(Data.Time(idxF),YFI(:,j,2),'k--');
    title(EstMdl2.SeriesNames{j});
    h = gca;
    fill([Data.Time(idxF(1)) h.XLim([2 2]) Data.Time(idxF(1))],...
        h.YLim([1 1 2 2]),'k','FaceAlpha',0.1,'EdgeColor','none');
    legend([h1 h2 h3],'True','Forecast','95% Forecast interval',...
        'Location','northwest')
    hold off;
end

Figure contains 3 axes. Axes 1 with title Real GDP contains 5 objects of type line, patch. These objects represent True, Forecast, 95% Forecast interval. Axes 2 with title M1 contains 5 objects of type line, patch. These objects represent True, Forecast, 95% Forecast interval. Axes 3 with title 3-mo T-bill contains 5 objects of type line, patch. These objects represent True, Forecast, 95% Forecast interval.

Теперь легко вычислить ошибку суммы квадратов между предсказаниями и данными.

Error1 = Data{idxF,:} - FY1;
Error2 = Data{idxF,:} - FY2;
Error3 = Data{idxF,:} - FY3;
Error4 = Data{idxF,:} - FY4;

SSerror1 = Error1(:)' * Error1(:);
SSerror2 = Error2(:)' * Error2(:);
SSerror3 = Error3(:)' * Error3(:);
SSerror4 = Error4(:)' * Error4(:);
figure
bar([SSerror1 SSerror2 SSerror3 SSerror4],.5)
ylabel('Sum of squared errors')
set(gca,'XTickLabel',...
    {'AR2 diag' 'AR2 full' 'AR4 diag' 'AR4 full'})
title('Sum of Squared Forecast Errors')

Figure contains an axes. The axes with title Sum of Squared Forecast Errors contains an object of type bar.

Прогнозирующие характеристики четырех моделей аналогичны.

Полная модель AR (2), кажется, лучшая и самая скупая подгонка. Его параметры модели следующие.

summarize(EstMdl2)
 
   AR-Stationary 3-Dimensional VAR(2) Model
 
    Effective Sample Size: 176
    Number of Estimated Parameters: 21
    LogLikelihood: -698.801
    AIC: 1439.6
    BIC: 1506.18
 
                     Value       StandardError    TStatistic      PValue  
                   __________    _____________    __________    __________

    Constant(1)       0.34832       0.11527          3.0217      0.0025132
    Constant(2)       0.55838        0.1488          3.7526     0.00017502
    Constant(3)      -0.45434       0.15245         -2.9803      0.0028793
    AR{1}(1,1)        0.26252       0.07397          3.5491     0.00038661
    AR{1}(2,1)      -0.029371      0.095485         -0.3076        0.75839
    AR{1}(3,1)        0.22324      0.097824          2.2821       0.022484
    AR{1}(1,2)      -0.074627      0.054476         -1.3699        0.17071
    AR{1}(2,2)         0.2531      0.070321          3.5992     0.00031915
    AR{1}(3,2)      -0.017245      0.072044        -0.23936        0.81082
    AR{1}(1,3)       0.032692      0.056182         0.58189        0.56064
    AR{1}(2,3)       -0.35827      0.072523           -4.94     7.8112e-07
    AR{1}(3,3)       -0.29179        0.0743         -3.9272     8.5943e-05
    AR{2}(1,1)        0.21378      0.071283          2.9991      0.0027081
    AR{2}(2,1)      -0.078493      0.092016        -0.85304        0.39364
    AR{2}(3,1)        0.24919      0.094271          2.6433      0.0082093
    AR{2}(1,2)        0.13137      0.051691          2.5415       0.011038
    AR{2}(2,2)        0.38189      0.066726          5.7233      1.045e-08
    AR{2}(3,2)       0.049403      0.068361         0.72269        0.46987
    AR{2}(1,3)       -0.22794      0.059203           -3.85     0.00011809
    AR{2}(2,3)     -0.0052932      0.076423       -0.069262        0.94478
    AR{2}(3,3)       -0.37109      0.078296         -4.7397     2.1408e-06

 
   Innovations Covariance Matrix:
    0.5931    0.0611    0.1705
    0.0611    0.9882   -0.1217
    0.1705   -0.1217    1.0372

 
   Innovations Correlation Matrix:
    1.0000    0.0798    0.2174
    0.0798    1.0000   -0.1202
    0.2174   -0.1202    1.0000

Прогнозные наблюдения

Вы можете делать предсказания или прогнозы, используя подобранную модель (EstMdl2) либо по:

  • Вызывающие forecast и прохождения последних нескольких строк YF

  • Симуляция нескольких временных рядов с simulate

В обоих случаях преобразуйте прогнозы, чтобы они были непосредственно сопоставимы с исходными временными рядами.

Сгенерируйте 10 предсказаний из подобранной модели, начиная в последнее время, используя forecast.

[YPred,YCov] = forecast(EstMdl2,10,Data{idxF,:});

Преобразуйте предсказания, отменяя масштабирование и дифференцирование, примененные к исходным данным. Убедитесь, что вставили последнее наблюдение в начале временных рядов перед использованием cumsum чтобы отменить дифференцирование. И, поскольку дифференцирование произошло после взятия логарифмов, вставьте логарифм перед использованием cumsum.

YFirst = DataTable(idx,{'RGDP' 'M1SL' 'TB3MS'}); 
EndPt = YFirst{end,:};
EndPt(:,1:2) = log(EndPt(:,1:2));
YPred(:,1:2) = YPred(:,1:2)/100;     % Rescale percentage
YPred = [EndPt; YPred];              % Prepare for cumsum
YPred(:,1:3) = cumsum(YPred(:,1:3));
YPred(:,1:2) = exp(YPred(:,1:2));
fdates = dateshift(YFirst.Time(end),'end','quarter',0:10); % Insert forecast horizon

figure
for j = 1:EstMdl2.NumSeries
    subplot(3,1,j)
    plot(fdates,YPred(:,j),'--b')
    hold on
    plot(YFirst.Time,YFirst{:,j},'k')
    grid on 
    title(EstMdl2.SeriesNames{j})
    h = gca;
    fill([fdates(1) h.XLim([2 2]) fdates(1)],h.YLim([1 1 2 2]),'k',...
        'FaceAlpha',0.1,'EdgeColor','none');
    hold off
end

Figure contains 3 axes. Axes 1 with title Real GDP contains 3 objects of type line, patch. Axes 2 with title M1 contains 3 objects of type line, patch. Axes 3 with title 3-mo T-bill contains 3 objects of type line, patch.

Графики показывают экстраполяции как синие штриховые линии в светло-сером прогнозном горизонте и исходный ряд данных в твердом черном цвете.

Посмотрите на последние несколько лет в этом графике, чтобы понять, как предсказания связаны с последними точками данных.

YLast = YFirst(170:end,:);

figure
for j = 1:EstMdl2.NumSeries
    subplot(3,1,j)
    plot(fdates,YPred(:,j),'b--')
    hold on
    plot(YLast.Time,YLast{:,j},'k')
    grid on
    title(EstMdl2.SeriesNames{j})
    h = gca;
    fill([fdates(1) h.XLim([2 2]) fdates(1)],h.YLim([1 1 2 2]),'k',...
        'FaceAlpha',0.1,'EdgeColor','none');
    hold off
end

Figure contains 3 axes. Axes 1 with title Real GDP contains 3 objects of type line, patch. Axes 2 with title M1 contains 3 objects of type line, patch. Axes 3 with title 3-mo T-bill contains 3 objects of type line, patch.

Прогноз показывает увеличение реального ВВП и M1, и незначительное снижение процентной ставки. Однако прогноз не имеет полос ошибок.

Кроме того, можно сгенерировать 10 предсказаний из подобранной модели, начиная в последнее время, используя simulate. Этот метод моделирует 2000 временных рядов, а затем генерирует средства и стандартные отклонения для каждого периода. Средства отклонений для каждого периода являются предсказаниями для этого периода.

Симулируйте временные ряды из подобранной модели, начиная с последнего времени.

rng(1); % For reproducibility
YSim = simulate(EstMdl2,10,'Y0',Data{idxF,:},'NumPaths',2000);

Преобразуйте предсказания, отменяя масштабирование и дифференцирование, примененные к исходным данным. Убедитесь, что вставили последнее наблюдение в начале временных рядов перед использованием cumsum чтобы отменить дифференцирование. И, поскольку дифференцирование произошло после взятия логарифмов, вставьте логарифм перед использованием cumsum.

EndPt = YFirst{end,:}; 
EndPt(1:2) = log(EndPt(1:2)); 
YSim(:,1:2,:) = YSim(:,1:2,:)/100; 
YSim = [repmat(EndPt,[1,1,2000]);YSim]; 
YSim(:,1:3,:) = cumsum(YSim(:,1:3,:)); 
YSim(:,1:2,:) = exp(YSim(:,1:2,:));

Вычислите среднее и стандартное отклонение каждой серии и постройте график результатов. График имеет среднее значение в чёрном цвете со стандартным отклонением +/-1 в красном цвете.

YMean = mean(YSim,3);
YSTD = std(YSim,0,3);

figure
for j = 1:EstMdl2.NumSeries
    subplot(3,1,j)
    plot(fdates,YMean(:,j),'k')
    grid on
    hold on
    plot(YLast.Time(end-10:end),YLast{end-10:end,j},'k')
    plot(fdates,YMean(:,j) + YSTD(:,j),'--r')
    plot(fdates,YMean(:,j) - YSTD(:,j),'--r')
    title(EstMdl2.SeriesNames{j})
    h = gca;
    fill([fdates(1) h.XLim([2 2]) fdates(1)],h.YLim([1 1 2 2]),'k',...
        'FaceAlpha',0.1,'EdgeColor','none');
    hold off
end

Figure contains 3 axes. Axes 1 with title Real GDP contains 5 objects of type line, patch. Axes 2 with title M1 contains 5 objects of type line, patch. Axes 3 with title 3-mo T-bill contains 5 objects of type line, patch.

Графики показывают рост ВВП, умеренный или незначительный рост M1 и неопределенность в отношении направления ставок T-векселей.

См. также

Объекты

Функции

Похожие темы