Period, Nest, and Calibration¶
Period Template¶
The five stages are wired by namespace matching — the branching stage's branch-keyed poststates match successor stages' prestate fields by name.
name: HousingTenurePeriod
stages:
- tenure_choice: !stage # branching: own vs rent
- owner_housing: !stage # own path: discrete H' choice
- owner_cons: !stage # own path: consumption (EGM)
- renter_housing: !stage # rent path: discrete S choice
- renter_cons: !stage # rent path: consumption (EGM)
| Connection | Namespace fields |
|---|---|
tenure_choice.own → owner_housing |
(a_o, H_o, y_o) match by name |
tenure_choice.rent → renter_housing |
(w_r, y_r) match by name |
owner_housing → owner_cons |
(w_oc, H_nxt, y_o) match by name |
renter_housing → renter_cons |
(w_rc, S, y_r) match by name |
Nest Structure¶
Every time slot uses the same period template. Both terminal stages produce poststates that map to the arrival \((a, H, y_{\text{pre}})\) via the same inter-period connector. Renters carry \(H_r = 0\), so no constant assignment is needed in the connector.
name: HousingTenureLifecycle
periods:
- housing_period: !period # index 0
- housing_period: !period # index 1
# ... (repeat for T periods)
- terminal: !period # index T
inter_connectors:
- {b_o: a, H_nxt: H, y_o: y_pre, b_r: a, H_r: H, y_r: y_pre}
- {b_o: a, H_nxt: H, y_o: y_pre, b_r: a, H_r: H, y_r: y_pre}
# ... (one per period boundary)
The connector maps both owner and renter exits to the same arrival perch: \(b_o \to a\), \(H_{\text{nxt}} \to H\) (owner), \(b_r \to a\), \(H_r \to H\) (renter, with \(H_r = 0\)).
Calibration¶
Following Fella (2014):
calibration:
# Preferences
beta: 0.93 # discount factor
gamma: 2.0 # CRRA risk aversion
rho: 0.58 # CES elasticity (0 → Cobb-Douglas)
theta: 0.77 # consumption weight
kappa: 0.075 # housing service scale
iota: 0.01 # housing service shift
# Prices
r: 0.06 # interest rate
phi: 0.07 # housing transaction cost
P_r: 0.1 # rental price per unit
# Housing grid (defines XH — these are parameters, not settings)
n_H: 7
H_min: 0.0
H_max: 5.0
# Rental grid (defines XS)
n_S: 7
S_min: 0.0
S_max: 5.0
# Income process
n_y: 48
Pi: !include Pi_matrix.yaml
z_vals: !include z_vals.yaml
# Horizon
T: 20
settings:
# Asset grids (numerical approximation — settings, not parameters)
n_w: 500 # owner cash-on-hand grid
w_min: 1.0e-10
w_max: 50.0
n_w_rent: 500 # renter cash-on-hand grid
w_rent_min: 1.0e-10
w_rent_max: 50.0
# FUES
m_bar: 1.0 # jump detection threshold (owner)
m_bar_rent: 1.0 # jump detection threshold (renter)
Key Points¶
- Five stages, two branches, CES utility. The branching stage (
tenure_choice) fans out to owner and renter paths, each comprising a discrete housing choice followed by continuous consumption. - FUES on both consumption stages. The discrete housing/rental grid creates non-concavities in the value function; FUES cleans the upper envelope on both paths. The CES inverse Euler requires numerical inversion.
- Uniform inter-period connector. The renter consumption stage outputs \(H_r = 0\) explicitly, so both owner and renter exits map to the same arrival \((a, H, y_{\text{pre}})\) via one connector dict — no constant assignment needed.