Page 1 of 1

using dynare for a solver for OSR and calibration

PostPosted: Fri Oct 17, 2014 10:21 am
by dominik
Hi

for my project i need to search for the optimal simple monetary policy rule and calibrate some moments using volatilities.
My initial approach for both types of problems was to use a solver like fmincon, since both are problems of the type
max f(x) for x element X
where x is a vector of parameters and f(x) is a subset of the dynare output.

Yet it seems you can not call dynare and access the dynare output inside a matlab function , at least i didnt manage.
Is there a way this can be done? If not is there a generic optimization function included in matlab?

Thanks
Dominik

Re: using dynare for a solver for OSR and calibration

PostPosted: Fri Oct 17, 2014 6:50 pm
by jpfeifer

Re: using dynare for a solver for OSR and calibration

PostPosted: Mon Oct 20, 2014 1:33 pm
by dominik
Hi,,
thanks for the reply, but i believe u posted the wrong link. it leads me to someone with a problem with initial values...
Dominik

Re: using dynare for a solver for OSR and calibration

PostPosted: Mon Oct 20, 2014 2:00 pm
by jpfeifer

Re: using dynare for a solver for OSR and calibration

PostPosted: Mon Oct 20, 2014 3:25 pm
by dominik
Thanks!
I found the example from your paper the most instructive. https://sites.google.com/site/pfeiferec ... edirects=0

Here is a quick and easy example for anyone who wants to optimize over some output of dynare:
(In this example I optimize over a scalar between 1.1 and 10 using fmincon)

At the end of your usual mod file write

Code: Select all
[fhat,xhat] = fmincon(@tominimize,1.5,[],[],[],[],1.1,10)


Furthermore save this matlab function in the current folder
Code: Select all
global oo_ M_ options_ % get Dynare structures; used to pass them on to resol.m

%% set parameter for use in Dynare
set_param_value('phi1',xopt(1));

[oo_.dr,info,M_,options_,oo_] = resol(0,M_,options_,oo_); %run model solution in Dynare

if info %solution was not successful
    fval=10e6+sum([xopt(1),xopt(2),xopt(3),log(xopt(4)) ].^2); %return with penalty
else
       % compute objective function
    fval=oo_.steady_state(1); %this is an arbitary choice; here you can have e.g. some value function for optimal policy or some model moment for SMM
end

Re: using dynare for a solver for OSR and calibration

PostPosted: Mon Oct 27, 2014 11:09 am
by dominik
Hi,

the above works fine for the OSR purpose (where all relevant statistics are in oo_.dr) if you want to do SMM you need to add some lines because resol doesnt update oo_ completely.
In particular the theoretical variance and mean are not recomputed.

Here is what you need to add to the above code after the resol comand to get the theoretical moments recomputed:

Code: Select all
if isempty(options_.qz_criterium)
    options_.qz_criterium = 1+1e-6;
end 
options_.noprint=1;
disp_th_moments(oo_.dr, M_.endo_names(1:M_.orig_endo_nbr, :));


Note that you cant change the shock variances with set_param_value. Hence write
var uA = sigma_A^2; by var uA=1 ;
and
uA by uA*sigma_A

Re: using dynare for a solver for OSR and calibration

PostPosted: Thu Oct 30, 2014 9:11 am
by jpfeifer
A more general version that also allows for IRF matching would be to use

Code: Select all
if isempty(options_.qz_criterium)
    options_.qz_criterium = 1+1e-6;
end
options_.noprint=1;
set_param_value('nu',nu);
% manually set the parameter that is looped over
info=stoch_simul(var_list_);
% get decision rules by directly calling Dynare routine directly instead of
% all of Dynare
if info~=0
    error('The model did not correctly solve')
end

Re: using dynare for a solver for OSR and calibration

PostPosted: Sun Nov 02, 2014 12:24 pm
by jpfeifer
In case of osr running osr with different starting values for a parameter nu, one would need inside of the loop:
Code: Select all
set_param_value('nu',nu);
oo_.osr = osr(var_list_,osr_params_,obj_var_,optim_weights_);