*! version 1.0.1 21aug2026

Title

gvar forecast -- point and conditional forecasts

Syntax

gvar forecast [, options]

options

step(#) horizon. Default 8.

variables(spec) which series to report. Default *:y.

bound(varlist) which variables get the lower bound. Default r lr.

rmin(#) the bound, in per-annum percent. Default 0.25.

nobound apply no bound.

condition(spec) conditioning paths, as condition(usa:r = .001 .001 ; euro:y = 4.7).

graph plot the forecasts.

name(name) graph name.

nosummary suppress the table.

saving(name) save the forecasts.

Description

gvar forecast produces ex-ante forecasts from the solved GVAR, with an
optional lower bound on the interest rates and optional conditioning paths for
chosen variables.

Options

step(#) the forecast horizon. Default 8.

variables(spec) restricts which series are reported.

bands(numlist) the coverage percentages for the interval. Default
68 90.

These bands carry no parameter uncertainty. They come from
Omega(h) = sum Phi_j Sigma_eta Phi_j' with the estimated system treated as
known. Integrating over a posterior instead roughly doubles them on the
shipped demo -- see gvar bforecast.

bound(spec), rmin(#) and nobound impose element-wise lower
bounds, which is how a nominal interest rate is kept from being forecast below
its floor. rmin() is the default floor applied to rate variables;
nobound switches the mechanism off entirely.

condition(spec) produces a conditional forecast: fix the path of some
variables and let the rest follow. The conditioning moves later horizons too,
through the cross-horizon covariance block, which is why the covariance is built
to max(H, H_bar) here rather than truncated -- see
gvar methods.

evaluate and holdout(#) score the forecast rather than reporting it:
hold back the last # observations, forecast them, and report the errors.

bgvar labels the error column as BGVAR's rmse() does. Despite the
name that function returns a per-cell absolute error, not a root mean square, so
the label follows the arithmetic rather than the function name.

vcov(spec), shrink and lambda(#) as in
gvar irf.

graph, fan, name(), saving() and nosummary.
fan shades every band rather than the outermost only.

Remarks

The bound is per-annum percent and is transformed. The Toolbox builds
rates as (1/freq) log(1 + R/100), so the floor is converted the same way:
for quarterly data and the default 0.25, it is 0.000624, not 0.25. Passing the
raw number would bind four hundred times too tightly. The bound is applied
before the forecast enters the lag stack, so it propagates.

Conditional forecasts carry no bound. The source computes the conditional
baseline with the bound switched off, and so does this. A conditioned path can
therefore go below the floor, and in the demo it does.

Conditioning beyond the restriction horizon. The information still moves
the forecast after the last restricted period, through the cross-horizon
covariance. The source's own indexing cannot handle a forecast horizon longer
than the restriction horizon; here the covariance is built out far enough that
it can.

Examples

. gvar forecast, step(8) variables(usa:y euro:y)
. gvar forecast, step(8) variables(*:r) rmin(0.25)
. gvar forecast, step(8) nobound
. gvar forecast, step(8) variables(usa:y) ///
condition(usa:r = 0.0002 0.0002 0.0002 0.0002)

Stored results

gvar forecast stores the following in r():

r(forecast) the reported series

r(full) forecasts for every variable

r(step) the horizon

r(nbound) series bounded

r(bound) the bound in model units

r(variables) the series reported

Source

Toolbox forecast_GVAR.m, con_forecast_GVAR.m.

Author

Dr Merwan Roudane

merwanroudane920@gmail.com

https://github.com/merwanroudane