Perfect foresight

Consider a series for the exogenous process (m_t)_{0 \leq t \leq T} given exogenously.

The perfect foresight problem consists in finding the path of optimal controls (x_t)_{0 \leq t \leq T} and corresponding states (s_t)_{0 \leq t \leq T} such that:

\begin{aligned} s_t & = & g\left(m_{t-1}, s_{t-1}, x_{t-1}, m_t \right) & \\ 0 & = & f\left(m_{t}, s_{t}, x_{t}, m_{t+1}, s_{t+1}, x_{t+1}\right) & \ \perp \ \underline{u} <= x_t <= \overline{u} \end{aligned}

Special conditions apply for the initial state and controls. Initial state ({m_0}, {s_0}) is given exogenously. Final states and controls are determined by assuming the exogenous process satisfies m_t=m_T for all t\geq T and optimality conditions are satisfied in the last period:

f(m_T, s_T, x_T, m_T, s_T, x_T) \perp \underline{u} \leq x_T \leq \overline{u}

We assume that \underline{u} and \overline{u} are constants. This is not a big restriction since the model can always be reformulated in order to meet that constraint, by adding more equations.

The stacked system of equations satisfied by the solution is:

Transitions Arbitrage
s_0 exogenous f(m_0, s_0, x_0, m_1, s_1, x_1) \perp \underline{u} <= x_0 <= \overline{u}
s_1 = g(m_0, s_0, x_0, m_1) f(s_1, x_1, s_2, x_2) \perp \underline{u} <= x_1 <= \overline{u}
.... ...
s_T = g(m_{T-1}, s_{T-1}, x_{T-1}, m_T) f(m_T, s_T, x_T, m_T, s_T, x_T) \perp \underline{u} <= x_T <= \overline{u}

The system is solved using a nonlinear solver.

function
dolo.algos.perfect_foresight.deterministic_solve(model, verbose=True, ignore_constraints=False, exogenous=None, s0=None, m0=None, T=100, maxit=100, initial_guess=None, solver='ncpsolve', keep_steady_state=False, s1=None, shocks=None, tol=1e-06)

Computes a perfect foresight simulation using a stacked-time algorithm.

Typical simulation exercises are: - start from an out-of-equilibrium exogenous and/or endogenous state: specify s0 and or m0. Missing values are taken from the calibration (model.calibration). - specify an exogenous path for shocks exogenous. Initial exogenous state m0 is then first value of exogenous values. Economy is supposed to have been at the equilibrium for t<0, which pins down initial endogenous state s0. x0 is a jump variable.

If s0 is not specified it is then set equal to the steady-state consistent with the first value

The initial state is specified either by providing a series of exogenous shocks and assuming the model is initially in equilibrium with the first value of the shock, or by specifying an initial value for the states.

Parameters
  • model (Model) Model to be solved
  • verbose (boolean) if True, the solver displays iterations
  • ignore_constraints (bool) if True, complementarity constraints are ignored.
  • exogenous (array-like, dict, or pandas.DataFrame) A specification for the path of exogenous variables (aka shocks). Can be any of the following (note by "declaration order" below we mean the order of model.symbols["exogenous"]):
    • A 1d numpy array-like specifying a time series for a single exogenous variable, or all exogenous variables stacked into a single array.
    • A 2d numpy array where each column specifies the time series for one of the shocks in declaration order. This must be an N by number of shocks 2d array.
    • A dict where keys are strings found in model.symbols["exogenous"] and values are a time series of values for that shock. For exogenous variables that do not appear in this dict, the shock is set to the calibrated value. Note that this interface is the most flexible as it allows the user to pass values for only a subset of the model shocks and it allows the passed time series to be of different lengths.
    • A DataFrame where columns map shock names into time series. The same assumptions and behavior that are used in the dict case apply here
    If nothing is given here, exogenous is set equal to the calibrated values found in model.calibration["exogenous"] for all periods.
    If the length of any time-series in shocks is less than T (see below) it is assumed that that particular shock will remain at the final given value for the duration of the simulation.
  • s0 (None or ndarray or dict) If vector with the value of initial states If an exogenous timeseries is given for exogenous shocks, s0 will be computed as the steady-state value that is consistent with its first value.
  • T (int) horizon for the perfect foresight simulation
  • maxit (int) maximum number of iteration for the nonlinear solver
  • keep_steady_state (bool) if True, initial steady-states and steady-controls are appended to the simulation with date -1.
  • tol (float) stopping criterium for the nonlinear solver
Returns (pandas dataframe)

a dataframe with T+1 observations of the model variables along the simulation (states, controls, auxiliaries). The simulation should return to a steady-state consistent with the last specified value of the exogenous shocks.