The shocks block¶
The shocks; block assigns each exogenous variable (varexo) a
deterministic, time-dependent path. Stochastic innovations have no
place here — continuo solves a perfect-foresight problem, in which the
realised exogenous values are the path the agents condition on.
Basic syntax¶
For each shock, repeat var <name>; followed by one or more path
assignments. A bare path = …; is shorthand for path at t = 0 = …
— “this path is the belief from t = 0 onward”:
shocks;
var z;
path = 1.1; // constant path: z(t) = 1.1
end;
The right-hand side of path is a symbolic expression in the reserved
time t, the parameters, and the shock-shape helpers (below). It is
evaluated at every grid node.
Time-dependent paths¶
Any expression in t is allowed. The simplest building block is
if(condition, then, else), with the comparison and logical operators
(<, <=, >, >=, ==, !=, &&, ||, !):
shocks;
var z;
path = if(t >= 5, 1.1, 1.0); // step at t = 5
end;
For common shapes, the helper functions below are clearer (and the parser sees the discontinuity locations explicitly).
Shock-shape helpers¶
The following helpers are available only inside ``shocks`` paths
(they are rejected as a CodegenError in model equations):
|
0 before |
|
1 on |
|
0 then linear 0→1 over |
|
Smooth (C-infinity) bump on |
|
0 before |
|
Logistic step at |
They scale and shift like any expression:
shocks;
var A;
path = 1.0 + 0.05 * pulse(t, 8, 12); // boom over [8, 12)
var z;
path = 1.0 + 0.05 * expdecay(t, 0, 3); // exp-decaying shock
end;
Note
The shape helpers are lowered to the same CasADi expressions you
would get by hand-writing them with if and arithmetic; their
present role is documentary. A future release will use their
explicit discontinuity arguments to auto-align the discretisation
grid; until then, a discontinuity that falls between nodes is
smeared by up to one dt.
Multi-revelation surprises¶
continuo supports beliefs that change over the simulation horizon, the
continuous-time analogue of MIT shocks. Each path at t = <reveal_time>
= <expression> declares that at the reveal time, agents adopt this
expression as their belief about the entire future path of the shock.
shocks;
var u;
path at t=0 = if(t >= 7, 0.01, 0); // initial belief
path at t=4 = if(t >= 7, 0.03, 0); // surprise at t = 4
path at t=10 = if(t >= 7, 0.025, 0); // another surprise at t = 10
end;
The reveal times partition [0, T] into segments; each segment is
solved as a complete perfect-foresight problem under the belief active
at its start, with the state carried continuously from the previous
segment and the jumps re-optimising at the reveal. Only the realised
slice [t_i, t_{i+1}) of each segment’s solve is kept; the agents’
counterfactual continuation beyond t_{i+1} is discarded.
Reveal times are sorted by the parser; duplicates on the same shock are
rejected, and mixing the bare path = … sugar with an explicit
path at t = 0 = … on the same shock is forbidden to keep the meaning
unambiguous.
Anticipated vs unanticipated¶
A useful idiom — used in many of the shipped examples — is the contrast between
an anticipated future change, written as a single belief with the step inside it, so the whole horizon is one segment:
shocks; var e; path = 0.05 * step(t, 10); // known from t=0, takes effect at t=10 end;
an unanticipated change at the same time, written as two beliefs:
shocks; var e; path at t=0 = 0; // belief until the reveal path at t=10 = 0.05; // learned only at t = 10 end;
The eventual realised paths are identical; the difference is what
agents expect, which shows up in the jump variables (they react at
t = 0 under anticipation, only at t = 10 under the surprise).