var模型的matlab代码,摘自:https://sites.google.com/site/jnakajimaweb/var
%%--------------------------------------------------------%%
%% Estimation of standard VAR models %%
%%--------------------------------------------------------%%
%% coded by Jouchi Nakajima %%
%%--------------------------------------------------------%%
%% Last update: 2018/07/31 %%
%% http://sites.google.com/site/jnakajimaweb/ %%
%%--------------------------------------------------------%%
%% You may use and modify this code at your own risk %%
%%--------------------------------------------------------%%
%% OLS estimation of standard (time-invariant parameter)
%% VAR models with Cholesky-type identification to
%% produce impulse response and historical decomposition
clear all
close all
%% ------------------- load data ------------------------ %%
% specify file and sheet
mdata = xlsread('test.xlsx', 'SampleData');
% specify variable names
asvar = {'Inf', 'X', 'r', 'Q'};
%% ------------------- set options ---------------------- %%
%%%% model and series settings
vind = [1 2 3 4]; % select column index of data
% vind = [4 2 1 3]; % (eg: different ordering)
% vind = [3 2 1]; % (eg: sub-sets of data)
flc = 1; % constant term (1:yes, 0:no)
nl = 1; % # of lags
%%%% impulse response
vsign = [1 1 1 1]; % signs of shocks
% vsign = [1 -1 -1 1]; % (eg: negative shocks for some variables)
flsu = 0; % shock size (1:one unit, 0:one standard error)
dband = 1.96; % width of condidence intervals
% (one standard error times "dbands")
vac = [0 0 0 0]; % accumulated response (1: yes, 0: no)
% vac = [0 1 0 1]; % (eg: accumulated for some variables)
nimp = 60; % # of horizons to draw
flcum = 1; % label for accumulated responses (1:on, 0:off)
%%%% historical decomposition
vhd = [0 1 1 0]; % historical decomposition (1:yes, 0:no)
%%%% output files for figures
flout = 1; % output file (1: yes, 0: no)
%%%% simulation settings
nsim = 10^3; % simulation size for confidence intervals
% (0: no intervals)
irs = 7; % random seed
%% ------------------------------------------------------ %%
%% set variables %%
my = mdata(:, vind); % select data
asvar = asvar(vind);
[ns, nk] = size(my); % # of times, variables
nsl = ns - nl; % # of times to estimate
nb = flc + nk * nl; % # of coefficients
rand('seed', irs); % random seed
randn('seed', irs);
if size(vsign, 2) ~= nk
fprintf('\n%%%% ! The size of "vsign" should equal')
fprintf('\n%%%% the number of variables\n')
end
if size(vac, 2) ~= nk
fprintf('\n%%%% ! The size of "vac" should equal')
fprintf('\n%%%% the number of variables\n')
end
if sum(vhd) > 0 && size(vhd, 2) ~= nk
fprintf('\n%%%% ! The size of "vhd" should equal')
fprintf('\n%%%% the number of variables\n')
end
if size(vsign, 2) > nk
vsign = vsign(1:nk);
end
if size(vac, 2) > nk
vac = vac(1:nk);
end
if sum(vhd) > 0 && size(vhd, 2) > nk
vhd = vhd(1:nk);
end
%% estimate VAR %%
fprintf('\n%%%% [Estimate VAR]')
mx = [ones(ns-nl, flc), zeros(ns-nl, nk*nl)];
for j = 1 : nl
mx(:, (j-1)*nk+flc+1:j*nk+flc) = my(nl-j+1:ns-j,:);
end
mx2i = inv(mx' * mx);
mb = zeros(nb, nk);
me = zeros(nsl, nk);
vl = zeros(nk, 1);
for i = 1 : nk
vy = my(nl+1:end, i);
vb = mx2i * (mx' * vy);
ve = vy - mx * vb;
de2 = ve' * ve / nsl;
vl(i) = -0.5 * nsl * (log(2 * pi * de2) + 1);
mb(:, i) = vb;
me(:, i) = ve;
end
mes = me' * me;
mS = mes / (nsl - nb);
met = (chol(mS, 'lower') \ me')';
vaic = -2 * vl + 2 * nb;
vbic = -2 * vl + 2 * nb * log(nsl);
fprintf('\n%%%%')
fprintf('\n%%%% Lag:%2.0f', nl)
fprintf('\n%%%% Const: ')
if flc == 1, fprintf('on')
else, fprintf('off'), end
fprintf('\n%%%%')
fprintf('\n%%%% AIC: %7.1f', sum(vaic))
fprintf('\n%%%% BIC: %7.1f', sum(vbic))
fprintf('\n%%%%\n')
%% compute impulse response %%
mimp = zeros(nimp+1, nk^2);
mimpm = mimp;
mimps = mimp;
vbh = mb(:);
mW = inv(mes);
mid = reshape((1 : nk*nl), nl, nk)';
vid = mid(:)';
flac = sum(vac) > 0;
vack = kron(ones(1, nk), vac) > 0;
mbi = mb;
mSi = mS;
for ii = 0 : nsim
if ii > 0
mSi = inv(wishrnd(mW, nsl+nk));
mVi = kron(mSi, mx2i);
mVi = (mVi + mVi') / 2;
mbi = reshape(mvnrnd(vbh, mVi), nb, nk);
end
mbj = mbi(1+flc:end, :);
vbi = mbj(:);
mLi = chol(mSi, 'lower');
for j = 1 : nk
vshock = zeros(nk, 1);
vshock(j) = vsign(j);
for t = 1 : nimp+1
if t == 1
myt = zeros(nl, nk);
myt(1, :) = (mLi * vshock)';
else
vyt = myt(:)';
mxt = kron(eye(nk), vyt(vid));
vyt1 = (mxt * vbi)';
if nl > 1
myt = [vyt1; myt(1:end-1, :)];
else
myt = vyt1;
end
end
mimp(t, (j-1)*nk+(1:nk)) = myt(1, :);
end
end
if flac
mimp(:, vack) = cumsum(mimp(:, vack));
end
if ii == 0
mimph = mimp;
else
mimpm = mimpm + mimp;
mimps = mimps + mimp.^2;
end
end
if nsim > 0
mimpm = mimpm / nsim;
mimps = real(sqrt(mimps / nsim - mimpm.^2));
mimpu = mimph + mimps * dband;
mimpl = mimph - mimps * dband;
end
%% plot
if flsu == 1
ves = sqrt(diag(mS));
else
ves = ones(nk, 1);
end
if flout == 1
mout = zeros(nimp+1, nk^2*3);
end
figure
for i = 1 : nk
for j = 1 : nk
kk = (i-1)*nk + j;
subplot(nk, nk, (j-1)*nk+i)
hold on
if nsim > 0
plot(0:nimp, mimph(:, kk) / ves(i), 'b-')
plot(0:nimp, mimpu(:, kk) / ves(i), 'r--')
plot(0:nimp, mimpl(:, kk) / ves(i), 'r--')
else
plot(mimph(:, kk) / ves(i), '-')
end
vax = axis;
axis([0 nimp vax(3:4)])
if vax(3) * vax(4) < 0
line([0, nimp], [0, 0], 'Color', ones(1,3)*0.6)
end
if vac(j) == 1 && flcum == 1
sac = '(cum)';
else
sac = '';
end
title(['Response of ', char(asvar(j)), sac, ...
' to ', char(asvar(i))], 'Fontsize', 9)
hold off
if nsim > 0 && flout == 1
mout(:, (kk-1)*3 + (1:3)) ...
= [mimpl(:, kk) mimph(:, kk) mimpu(:, kk)] / ves(i);
end
end
end
%% output file
if flout == 1
flb = nsim ~= 0;
if ~flb
mout = mimph;
end
if isequal(exist('var_imp.xlsx', 'file'), 2)
delete('var_imp.xlsx');
end
asl = cell(3, nk^2*3+1);
asl{1, 1} = 'Response:';
asl{2, 1} = 'Shock:';
asb = {'low', 'mean', 'high'};
ii = 2;
for i = 1 : nk
for j = 1 : nk
for k = 1 : 1 + flb * 2
if vac(j) == 1 && flcum == 1
sac = ' (cum)';
else
sac = '';
end
if k == 1
asl{1, ii} = [asvar{j}, sac];
asl{2, ii} = asvar{i};
end
asl{3, ii} = asb{k+~flb};
ii = ii + 1;
end
end
end
xlswrite('var_imp.xlsx', asl, 'Sheet1', 'A1');
xlswrite('var_imp.xlsx', [(0:nimp)', mout], 'Sheet1', 'A4');
end
%% compute historical decomposition %%
if sum(vhd) > 0
if flc == 1
vc = mb(1, :)';
end
mbj = mb(1+flc:end, :);
vbi = mbj(:);
mLi = chol(mS, 'lower');
myh = zeros(ns, (nk+flc)*nk);
for i = 1-flc : nk
myt = zeros(nl, nk);
for t = nl+1 : ns
if ~i
vet = vc;
else
vshock = zeros(nk, 1);
vshock(i) = met(t-nl, i);
vet = mLi * vshock;
end
vyt = myt(:)';
mxt = kron(eye(nk), vyt(vid));
vyt1 = (mxt * vbi + vet)';
if nl > 1
myt = [vyt1; myt(1:end-1, :)];
else
myt = vyt1;
end
myh(t, (0:nk-1)*(flc+nk)+i+flc) = vyt1;
end
end
asleg = {'Data'};
if flc == 1
asleg = [asleg, {'const'}];
end
asleg = [asleg, asvar];
for i = 1 : nk
if vhd(i) == 1
figure
plot(my(:, i), '-')
hold on
plot(nl+1:ns, myh(nl+1:end, (1:flc+nk)+(i-1)*(flc+nk)), ...
'--')
hold off
vax = axis;
axis([1 ns vax(3:4)])
if vax(3) * vax(4) < 0
line([1, ns], [0, 0], 'Color', ones(1,3)*0.6)
end
legend(asleg)
title(['Historical decomposition of' asvar(i)], ...
'FontSize', 12)
end
end
if flout == 1
if isequal(exist('var_hd.xlsx', 'file'), 2)
delete('var_hd.xlsx');
end
asl = cell(2, nk*(nk+flc)+1);
asl{1, 1} = 'Explained:';
asl{2, 1} = 'Shock:';
ii = 2;
for i = 1 : nk
for j = 1 : nk+flc
asl{1, ii} = asleg{i+2};
asl{2, ii} = asleg{j+1};
ii = ii + 1;
end
end
xlswrite('var_hd.xlsx', asl, 'Sheet1', 'A1');
xlswrite('var_hd.xlsx', [(1:ns)', myh], 'Sheet1', 'A3');
end
end
运行效果如下:
![VAR模型的matlab代码插图 VAR模型的matlab代码插图](http://www.gongju128.cn/wp-content/uploads/2023/02/image.png)
![VAR模型的matlab代码插图1 VAR模型的matlab代码插图1](http://www.gongju128.cn/wp-content/uploads/2023/02/image-1.png)