Skip to content

Commit 5a13cd1

Browse files
committed
updates
1 parent a3214e1 commit 5a13cd1

File tree

1 file changed

+35
-8
lines changed

1 file changed

+35
-8
lines changed

lectures/gorman_heterogeneous_households.md

Lines changed: 35 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -379,6 +379,8 @@ $$
379379
\left[(s_t - b_t)^\top(s_t - b_t) + g_t^\top g_t\right]
380380
$$ (eq:planner_objective)
381381
382+
where $g_t = \sum_j \ell_{jt}$ is the aggregate "intermediate good" that represents total labor supply in the DLE formulation.
383+
382384
subject to technology constraints
383385
384386
$$
@@ -685,7 +687,9 @@ At time zero, household $j$ executes the following trades:
685687
2. Household $j$ purchases $\mu_j$ shares of all securities (equivalently, $\mu_j$ shares of a mutual fund holding the aggregate endowment).
686688
3. Household $j$ takes position $\hat{k}_{j0}$ in the one-period bond.
687689
688-
After this initial rebalancing, household $j$ holds the portfolio forever.
690+
After this initial rebalancing, household $j$ maintains a constant risky portfolio share $\mu_j$ forever, while using the one-period bond for dynamic rebalancing.
691+
692+
The bond position $\hat{k}_{jt}$ evolves each period according to the recursion derived below.
689693
690694
691695
The portfolio weight $\mu_j$ is not arbitrary: it is the unique weight that allows the limited-markets portfolio to replicate the Arrow-Debreu consumption allocation.
@@ -710,13 +714,17 @@ which is the aggregate endowment.
710714
711715
If household $j$ holds fraction $\theta_j$ of this fund, it receives $\theta_j d_t$ in dividends.
712716
713-
The proportional part of consumption $\mu_j c_t$ must be financed by the mutual fund and capital holdings. Since the aggregate resource constraint is
717+
The proportional part of consumption $\mu_j c_t$ must be financed by the mutual fund and capital holdings.
718+
719+
Using our calibration ($\Phi_c = \Phi_i = \theta_k = 1$, $\Gamma = \gamma_1$), the resource constraint becomes $c_t + i_t = \gamma_1 k_{t-1} + d_t$ and capital accumulation is $k_t = \delta_k k_{t-1} + i_t$.
720+
721+
Substituting $i_t = k_t - \delta_k k_{t-1}$ into the resource constraint gives:
714722
715723
$$
716-
c_t + i_t = (\delta_k + \gamma_1) k_{t-1} + d_t,
724+
c_t + k_t = (\delta_k + \gamma_1) k_{t-1} + d_t.
717725
$$
718726
719-
holding $\theta_j$ shares of aggregate output (capital income plus endowments) delivers $\theta_j [(\delta_k + \gamma_1)k_{t-1} + d_t]$.
727+
Holding $\theta_j$ shares of aggregate wealth (capital plus claims to endowments) delivers $\theta_j [(\delta_k + \gamma_1)k_{t-1} + d_t] = \theta_j (c_t + k_t)$.
720728
721729
For this to finance $\mu_j c_t$ plus reinvestment $\mu_j k_t$, we need $\theta_j = \mu_j$.
722730
@@ -736,6 +744,10 @@ $$
736744
737745
where $R := \delta_k + \gamma_1$ is the gross return.
738746
747+
```{note}
748+
The constant gross return $R = \delta_k + \gamma_1$ arises from our specific calibration ($\Phi_c = \Phi_i = \Theta_k = 1$, $\Gamma = \gamma_1$).
749+
```
750+
739751
Substituting the sharing rule by replacing $c_{jt}$ with $\mu_j c_t + \tilde{\chi}_{jt}$ gives:
740752
741753
$$
@@ -924,6 +936,8 @@ def compute_household_paths(econ, U_b_list, U_d_list, x0, x_path, γ_1, Λ, h0i=
924936
925937
η = np.zeros((n_h, T + 1))
926938
η[:, 0] = np.asarray(h0i).reshape(-1)
939+
# At t=0, assume η_{-1} = 0
940+
χ_tilde[j, 0] = (Π_inv @ b_tilde[:, 0]).squeeze()
927941
for t in range(1, T):
928942
χ_tilde[j, t] = (-Π_inv @ Λ @ η[:, t - 1] + Π_inv @ b_tilde[:, t]).squeeze()
929943
η[:, t] = (A_h @ η[:, t - 1] + B_h @ b_tilde[:, t]).squeeze()
@@ -939,14 +953,21 @@ def compute_household_paths(econ, U_b_list, U_d_list, x0, x_path, γ_1, Λ, h0i=
939953
# Capital share in mutual fund
940954
k_share[j] = (μ[j] * k[0]).squeeze()
941955
942-
# Solving initial bond position and path
956+
# Solve for bond path by backward iteration from terminal condition.
943957
if abs(R - 1.0) >= 1e-14:
944958
k_hat[j, -1] = χ_tilde[j, -1] / (R - 1.0)
945959
for t in range(T - 1, 0, -1):
946960
k_hat[j, t - 1] = (k_hat[j, t] + χ_tilde[j, t]) / R
947961
948962
a_total[j] = k_share[j] + k_hat[j]
949963
964+
# Validate that Gorman weights sum to 1 (required for sharing rule consistency)
965+
μ_sum = np.sum(μ)
966+
if abs(μ_sum - 1.0) > 1e-6:
967+
import warnings
968+
warnings.warn(f"Gorman weights μ sum to {μ_sum:.6f}, not 1.0. "
969+
"This may indicate calibration issues.")
970+
950971
return {
951972
"μ": μ,
952973
"χ_tilde": χ_tilde,
@@ -1519,8 +1540,13 @@ G = np.vstack([
15191540
econ.Ss,
15201541
])
15211542
1543+
# Extract dimensions for proper slicing
1544+
n_h = np.atleast_2d(econ.thetah).shape[0]
1545+
n_k = np.atleast_2d(econ.thetak).shape[0]
1546+
n_endo = n_h + n_k # endogenous state dimension
1547+
15221548
print(f"Shapes: A0 {A0.shape}, C {C.shape}, G {G.shape}")
1523-
print(f"max |A0[2:,2:] - A22| = {np.max(np.abs(A0[2:, 2:] - A22)):.2e}")
1549+
print(f"max |A0[{n_endo}:,{n_endo}:] - A22| = {np.max(np.abs(A0[n_endo:, n_endo:] - A22)):.2e}")
15241550
```
15251551
15261552
With the state space representation, we can compute impulse responses to show how shocks propagate through the economy.
@@ -1801,14 +1827,15 @@ def allocation_from_weights(paths, econ, U_b_list, weights, γ_1, Λ, h0i=None):
18011827
18021828
η = np.zeros((n_h, T + 1))
18031829
η[:, 0] = np.asarray(h0i).reshape(-1)
1804-
1830+
# At t=0, assume η_{-1} = 0
1831+
χ_tilde[j, 0] = (Π_inv @ b_tilde[:, 0]).squeeze()
18051832
for t in range(1, T):
18061833
χ_tilde[j, t] = (-Π_inv @ Λ @ η[:, t - 1] + Π_inv @ b_tilde[:, t]).squeeze()
18071834
η[:, t] = (A_h @ η[:, t - 1] + B_h @ b_tilde[:, t]).squeeze()
18081835
18091836
c_j[j] = (weights[j] * c_agg[0] + χ_tilde[j]).squeeze()
18101837
1811-
# Compute bond position
1838+
# Solve for bond path by backward iteration from terminal condition.
18121839
if abs(R - 1.0) >= 1e-14:
18131840
k_hat[j, -1] = χ_tilde[j, -1] / (R - 1.0)
18141841
for t in range(T - 1, 0, -1):

0 commit comments

Comments
 (0)