Этот пример показывает, как анализировать модель VAR.
Этот раздел содержит пример рабочего процесса, описанного в Создавании Моделей VAR. Пример использует три временных рядов: GDP, денежная масса M1 и 3-месячный уровень Казначейского векселя. Пример показывает:
Загрузка и преобразование данных для стационарности
Деля преобразованные данные в предварительную выборку, оценку и интервалы прогноза, чтобы поддержать эксперимент backtesting
Создание нескольких моделей
Подбор кривой моделям к данным
Решение, какая из моделей является лучшей
Создание прогнозов на основе лучшей модели
Файл Data_USEconModel
поставляется с программным обеспечением Econometrics Toolbox™. Файл содержит временные ряды от базы данных Federal Reserve Bank of St. Louis Economics Data (FRED) в табличном массиве. Этот пример использует три из временных рядов:
GDP (GDP
)
Денежная масса M1 (M1SL
)
3-месячный уровень Казначейского векселя (TB3MS
)
Загрузите набор данных. Создайте переменную для действительного GDP.
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
Действительный GDP и данные M1, кажется, растут экспоненциально, в то время как Казначейский вексель возвращается, не показывают экспоненциального роста. Чтобы противостоять трендам в действительном GDP и M1, возьмите различие логарифмов данных. Кроме того, стабилизируйте ряд Казначейского векселя путем взятия первого различия. Синхронизируйте ряд даты так, чтобы данные имели одинаковое число строк для каждого столбца.
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
Шкала первых двух столбцов приблизительно в 100 раз меньше, чем третье. Умножьте первые два столбца на 100 так, чтобы временные ряды были всеми примерно в той же шкале. Это масштабирование дает возможность строить весь ряд на том же графике. Что еще более важно, этот тип масштабирования делает оптимизацию более численно стабильной (например, максимизируя loglikelihoods).
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
Можно выбрать много различных моделей для данных. Этот пример использует четыре модели.
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
соответствует полным матрицам для авторегрессивных матриц.
Чтобы оценить качество моделей, создайте индексные векторы, которые делят данные об ответе на три периода: предварительная выборка, оценка и прогноз. Соответствуйте моделям к данным об оценке, использование преддемонстрационного периода, чтобы обеспечить изолировало данные. Сравните прогнозы подобранных моделей к данным о прогнозе. Период оценки находится в выборке, и период прогноза вне выборки (также известен backtesting).
Для двух моделей 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,:});
Объекты модели EstMdl
являются подобранными моделями.
Структуры EstSE
содержат стандартные погрешности подобранных моделей.
Значения logL
являются loglikelihoods подобранных моделей, которые вы используете, чтобы помочь выбрать лучшую модель.
Векторы 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
. Затем передайте различия в количестве предполагаемых параметров и loglikelihoods к 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
Результаты 1
показывают, что тест отношения правдоподобия отклонил обоих ограниченные модели в пользу соответствующих неограниченных моделей. Поэтому на основе этого теста, неограниченные модели VAR (2) и VAR (4) предпочтительны. Однако тест не отклоняет неограниченную модель VAR (2) в пользу неограниченной модели VAR (4). (Этот тест рассматривает модель VAR (2) как модель VAR (4) с ограничениями, что AR матриц авторегрессии (3) и AR (4) 0.) Поэтому кажется, что неограниченная модель VAR (2) является лучшей моделью.
Чтобы найти лучшую модель в наборе, минимизируйте Критерий информации о Akaike (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
Это теперь прямо, чтобы вычислить ошибку суммы квадратов между прогнозами и данными.
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')
Прогнозирующая производительность этих четырех моделей подобна.
Полная модель 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
Графики показывают экстраполяции синими пунктирными линиями в светло-сером горизонте прогноза и исходным рядом данных в чистом черном.
Посмотрите на последние несколько лет в этом графике получить смысл того, как прогнозы относятся к последним точкам данных.
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
Прогноз показывает увеличивающийся действительный GDP и 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
Графики показывают увеличивающийся рост в GDP, умеренном к небольшому росту в M1 и неуверенности по поводу направления уровней Казначейского векселя.
aicbic
| estimate
| forecast
| lratiotest
| simulate