From 2fed0fbd79d39bbc8a336a207a66bc11e48ce158 Mon Sep 17 00:00:00 2001 From: shlff Date: Wed, 18 Oct 2023 14:38:34 +1100 Subject: [PATCH 01/11] [arellano] use namedtuple --- lectures/arellano.md | 113 +++++++++++++++++++------------------------ 1 file changed, 51 insertions(+), 62 deletions(-) diff --git a/lectures/arellano.md b/lectures/arellano.md index 6f66b1d0..7a9d6518 100644 --- a/lectures/arellano.md +++ b/lectures/arellano.md @@ -77,6 +77,7 @@ import random import jax import jax.numpy as jnp +from collections import namedtuple ``` Let's check the GPU we are running @@ -365,55 +366,43 @@ The output process is discretized using a [quadrature method due to Tauchen](htt As we have in other places, we accelerate our code using Numba. -We define a class that will store parameters, grids and transition +We define a namedtuple to store parameters, grids and transition probabilities. ```{code-cell} ipython3 -:hide-output: false +Arellano = namedtuple('Arellano', ('β', 'γ', 'r', 'ρ', 'η', 'θ', \ + 'B_size', 'y_size', \ + 'P', 'B_grid', 'y_grid', 'def_y')) +``` -class Arellano_Economy: - " Stores data and creates primitives for the Arellano economy. " - - def __init__(self, - B_grid_size=251, # Grid size for bonds - B_grid_min=-0.45, # Smallest B value - B_grid_max=0.45, # Largest B value - y_grid_size=51, # Grid size for income - β=0.953, # Time discount parameter - γ=2.0, # Utility parameter - r=0.017, # Lending rate - ρ=0.945, # Persistence in the income process - η=0.025, # Standard deviation of the income process - θ=0.282, # Prob of re-entering financial markets - def_y_param=0.969): # Parameter governing income in default - - # Save parameters - self.β, self.γ, self.r, = β, γ, r - self.ρ, self.η, self.θ = ρ, η, θ - - # Set up grids - self.y_grid_size = y_grid_size - self.B_grid_size = B_grid_size - B_grid = jnp.linspace(B_grid_min, B_grid_max, B_grid_size) - mc = qe.markov.tauchen(y_grid_size, ρ, η) - y_grid, P = jnp.exp(mc.state_values), mc.P - - # Put grids on the device - self.B_grid = jax.device_put(B_grid) - self.y_grid = jax.device_put(y_grid) - self.P = jax.device_put(P) - - # Output received while in default, with same shape as y_grid - self.def_y = jnp.minimum(def_y_param * jnp.mean(self.y_grid), self.y_grid) - - def params(self): - return self.β, self.γ, self.r, self.ρ, self.η, self.θ - - def sizes(self): - return self.B_grid_size, self.y_grid_size - - def arrays(self): - return self.P, self.B_grid, self.y_grid, self.def_y +```{code-cell} ipython3 +def create_arellano(B_size=251, # Grid size for bonds + B_min=-0.45, # Smallest B value + B_max=0.45, # Largest B value + y_size=51, # Grid size for income + β=0.953, # Time discount parameter + γ=2.0, # Utility parameter + r=0.017, # Lending rate + ρ=0.945, # Persistence in the income process + η=0.025, # Standard deviation of the income process + θ=0.282, # Prob of re-entering financial markets + def_y_param=0.969): # Parameter governing income in default + # Set up grids + B_grid = jnp.linspace(B_min, B_max, B_size) + mc = qe.markov.tauchen(y_size, ρ, η) + y_grid, P = jnp.exp(mc.state_values), mc.P + + # Put grids on the device + B_grid = jax.device_put(B_grid) + y_grid = jax.device_put(y_grid) + P = jax.device_put(P) + + # Output received while in default, with same shape as y_grid + def_y = jnp.minimum(def_y_param * jnp.mean(y_grid), y_grid) + + return Arellano(β=β, γ=γ, r=r, ρ=ρ, η=η, θ=θ, B_size=B_size, \ + y_size=y_size, P=P, B_grid=B_grid, y_grid=y_grid, \ + def_y=def_y) ``` Here is the utility function. @@ -519,7 +508,6 @@ def bellman(v_c, v_d, q, params, sizes, arrays): # Return new_v_c[i_B, i_y, i_Bp] val = jnp.where(c > 0, u(c, γ) + β * continuation_value, -jnp.inf) return val - ``` ```{code-cell} ipython3 @@ -558,11 +546,11 @@ def update_values_and_prices(v_c, v_d, params, sizes, arrays): return new_v_c, new_v_d ``` -We can now write a function that will use the `Arellano_Economy` class and the +We can now write a function that will use the `Arellano` namedtuple and the functions defined above to compute the solution to our model. One of the jobs of this function is to take an instance of -`Arellano_Economy`, which is hard for the JIT compiler to handle, and strip it +`Arellano`, which is hard for the JIT compiler to handle, and strip it down to more basic objects, which are then passed out to jitted functions. ```{code-cell} ipython3 @@ -570,14 +558,16 @@ down to more basic objects, which are then passed out to jitted functions. def solve(model, tol=1e-8, max_iter=10_000): """ - Given an instance of Arellano_Economy, this function computes the optimal + Given an instance of Arellano, this function computes the optimal policy and value functions. """ # Unpack - params = model.params() - sizes = model.sizes() - arrays = model.arrays() - B_size, y_size = sizes + + β, γ, r, ρ, η, θ, B_size, y_size, P, B_grid, y_grid, def_y = model + + params = β, γ, r, ρ, η, θ + sizes = B_size, y_size + arrays = P, B_grid, y_grid, def_y # Initial conditions for v_c and v_d v_c = jnp.zeros((B_size, y_size)) @@ -605,7 +595,7 @@ Let's try solving the model. ```{code-cell} ipython3 :hide-output: false -ae = Arellano_Economy() +ae = create_arellano() ``` ```{code-cell} ipython3 @@ -631,13 +621,13 @@ def simulate(model, T, v_c, v_d, q, B_star, key): """ Simulates the Arellano 2008 model of sovereign debt - Here `model` is an instance of `Arellano_Economy` and `T` is the length of + Here `model` is an instance of `Arellano` and `T` is the length of the simulation. Endogenous objects `v_c`, `v_d`, `q` and `B_star` are assumed to come from a solution to `model`. """ # Unpack elements of the model - B_size, y_size = model.sizes() + B_size, y_size = model.B_size, model.y_size B_grid, y_grid, P = model.B_grid, model.y_grid, model.P B0_idx = jnp.searchsorted(B_grid, 1e-10) # Index at which B is near zero @@ -697,8 +687,7 @@ Let’s start by trying to replicate the results obtained in {cite}`Are08`. In what follows, all results are computed using Arellano’s parameter values. -The values can be seen in the `__init__` method of the `Arellano_Economy` -shown above. +The values can be seen in the `create_arellano` method shown above. For example, `r=0.017` matches the average quarterly rate on a 5 year US treasury over the period 1983–2001. @@ -716,7 +705,7 @@ values of output $ y $. - $ y_H $ is 5% above the mean of the $ y $ grid values -The grid used to compute this figure was relatively fine (`y_grid_size, B_grid_size = 51, 251`), which explains the minor differences between this and +The grid used to compute this figure was relatively fine (`y_size, B_size = 51, 251`), which explains the minor differences between this and Arrelano’s figure. The figure shows that @@ -766,7 +755,7 @@ Periods of relative stability are followed by sharp spikes in the discount rate To the extent that you can, replicate the figures shown above -- Use the parameter values listed as defaults in `Arellano_Economy`. +- Use the parameter values listed as defaults in `Arellano`. - The time series will of course vary depending on the shock draws. ```{exercise-end} @@ -785,7 +774,7 @@ Compute the value function, policy and equilibrium prices ```{code-cell} ipython3 :hide-output: false -ae = Arellano_Economy() +ae = create_arellano() v_c, v_d, q, B_star = solve(ae) ``` @@ -796,7 +785,7 @@ Compute the bond price schedule as seen in figure 3 of Arellano (2008) # Unpack some useful names B_grid, y_grid, P = ae.B_grid, ae.y_grid, ae.P -B_size, y_size = ae.sizes() +B_size, y_size = ae.B_size, ae.y_size r = ae.r # Create "Y High" and "Y Low" values as 5% devs from mean From 8a1f149c1a50c80c7ef1b07ecc4f9d211346c867 Mon Sep 17 00:00:00 2001 From: shlff Date: Mon, 4 Mar 2024 12:04:15 +1100 Subject: [PATCH 02/11] further_edits --- lectures/arellano.md | 38 +++++++++++++++++++------------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/lectures/arellano.md b/lectures/arellano.md index 7a9d6518..1917d76d 100644 --- a/lectures/arellano.md +++ b/lectures/arellano.md @@ -4,7 +4,7 @@ jupytext: extension: .md format_name: myst format_version: 0.13 - jupytext_version: 1.14.5 + jupytext_version: 1.15.2 kernelspec: display_name: Python 3 (ipykernel) language: python @@ -370,9 +370,9 @@ We define a namedtuple to store parameters, grids and transition probabilities. ```{code-cell} ipython3 -Arellano = namedtuple('Arellano', ('β', 'γ', 'r', 'ρ', 'η', 'θ', \ - 'B_size', 'y_size', \ - 'P', 'B_grid', 'y_grid', 'def_y')) +Arellano_Economy = namedtuple('Arellano_Economy', ('β', 'γ', 'r', 'ρ', 'η', 'θ', \ + 'B_size', 'y_size', \ + 'P', 'B_grid', 'y_grid', 'def_y')) ``` ```{code-cell} ipython3 @@ -400,9 +400,9 @@ def create_arellano(B_size=251, # Grid size for bonds # Output received while in default, with same shape as y_grid def_y = jnp.minimum(def_y_param * jnp.mean(y_grid), y_grid) - return Arellano(β=β, γ=γ, r=r, ρ=ρ, η=η, θ=θ, B_size=B_size, \ - y_size=y_size, P=P, B_grid=B_grid, y_grid=y_grid, \ - def_y=def_y) + return Arellano_Economy(β=β, γ=γ, r=r, ρ=ρ, η=η, θ=θ, B_size=B_size, \ + y_size=y_size, P=P, B_grid=B_grid, y_grid=y_grid, \ + def_y=def_y) ``` Here is the utility function. @@ -462,6 +462,7 @@ def T_d(v_c, v_d, params, sizes, arrays): β, γ, r, ρ, η, θ = params B_size, y_size = sizes P, B_grid, y_grid, def_y = arrays + B0_idx = jnp.searchsorted(B_grid, 1e-10) # Index at which B is near zero current_utility = u(def_y, γ) @@ -546,11 +547,11 @@ def update_values_and_prices(v_c, v_d, params, sizes, arrays): return new_v_c, new_v_d ``` -We can now write a function that will use the `Arellano` namedtuple and the -functions defined above to compute the solution to our model. +We can now write a function that will use an instance of `Arellano_Economy` and +the functions defined above to compute the solution to our model. One of the jobs of this function is to take an instance of -`Arellano`, which is hard for the JIT compiler to handle, and strip it +`Arellano_Economy`, which is hard for the JIT compiler to handle, and strip it down to more basic objects, which are then passed out to jitted functions. ```{code-cell} ipython3 @@ -558,7 +559,7 @@ down to more basic objects, which are then passed out to jitted functions. def solve(model, tol=1e-8, max_iter=10_000): """ - Given an instance of Arellano, this function computes the optimal + Given an instance of `Arellano_Economy`, this function computes the optimal policy and value functions. """ # Unpack @@ -621,7 +622,7 @@ def simulate(model, T, v_c, v_d, q, B_star, key): """ Simulates the Arellano 2008 model of sovereign debt - Here `model` is an instance of `Arellano` and `T` is the length of + Here `model` is an instance of `Arellano_Economy` and `T` is the length of the simulation. Endogenous objects `v_c`, `v_d`, `q` and `B_star` are assumed to come from a solution to `model`. @@ -629,6 +630,7 @@ def simulate(model, T, v_c, v_d, q, B_star, key): # Unpack elements of the model B_size, y_size = model.B_size, model.y_size B_grid, y_grid, P = model.B_grid, model.y_grid, model.P + B0_idx = jnp.searchsorted(B_grid, 1e-10) # Index at which B is near zero # Set initial conditions @@ -685,9 +687,7 @@ def simulate(model, T, v_c, v_d, q, B_star, key): Let’s start by trying to replicate the results obtained in {cite}`Are08`. -In what follows, all results are computed using Arellano’s parameter values. - -The values can be seen in the `create_arellano` method shown above. +In what follows, all results are computed using parameter values of `Arellano_Economy` created by `create_arellano`. For example, `r=0.017` matches the average quarterly rate on a 5 year US treasury over the period 1983–2001. @@ -695,7 +695,7 @@ Details on how to compute the figures are reported as solutions to the exercises. The first figure shows the bond price schedule and replicates Figure 3 of -Arellano, where $ y_L $ and $ Y_H $ are particular below average and above average +{cite}`Are08`, where $ y_L $ and $ Y_H $ are particular below average and above average values of output $ y $. ![https://python-advanced.quantecon.org/_static/lecture_specific/arellano/arellano_bond_prices.png](https://python-advanced.quantecon.org/_static/lecture_specific/arellano/arellano_bond_prices.png) @@ -755,7 +755,7 @@ Periods of relative stability are followed by sharp spikes in the discount rate To the extent that you can, replicate the figures shown above -- Use the parameter values listed as defaults in `Arellano`. +- Use the parameter values listed as defaults in `Arellano_Economy` created by `create_arellano`. - The time series will of course vary depending on the shock draws. ```{exercise-end} @@ -778,7 +778,7 @@ ae = create_arellano() v_c, v_d, q, B_star = solve(ae) ``` -Compute the bond price schedule as seen in figure 3 of Arellano (2008) +Compute the bond price schedule as seen in figure 3 of {cite}`Are08` ```{code-cell} ipython3 :hide-output: false @@ -800,7 +800,7 @@ x = [] q_low = [] q_high = [] for i, B in enumerate(B_grid): - if -0.35 <= B <= 0: # To match fig 3 of Arellano + if -0.35 <= B <= 0: # To match fig 3 of Arellano (2008) x.append(B) q_low.append(q[i, iy_low]) q_high.append(q[i, iy_high]) From 762521e34e7cf8a700fc8f4c66f83f4565039f09 Mon Sep 17 00:00:00 2001 From: Shu Date: Tue, 5 Mar 2024 08:51:23 +1100 Subject: [PATCH 03/11] fix --- lectures/arellano.md | 39 ++++++++++++++++++++++++--------------- 1 file changed, 24 insertions(+), 15 deletions(-) diff --git a/lectures/arellano.md b/lectures/arellano.md index 1917d76d..158c30a2 100644 --- a/lectures/arellano.md +++ b/lectures/arellano.md @@ -370,16 +370,25 @@ We define a namedtuple to store parameters, grids and transition probabilities. ```{code-cell} ipython3 -Arellano_Economy = namedtuple('Arellano_Economy', ('β', 'γ', 'r', 'ρ', 'η', 'θ', \ - 'B_size', 'y_size', \ - 'P', 'B_grid', 'y_grid', 'def_y')) +ArellanoEconomy = namedtuple('ArellanoEconomy', ('β', # Time discount parameter + 'γ', # Utility parameter + 'r', # Lending rate + 'ρ', # Persistence in the income process + 'η', # Standard deviation of the income process + 'θ', # Prob of re-entering financial markets + 'B_size', # Grid size for bonds + 'y_size', # Grid size for income + 'P', # Markov matrix governing the income process + 'B_grid', # Bond unit grid + 'y_grid', # State values of the income process + 'def_y')) # Default income process ``` ```{code-cell} ipython3 -def create_arellano(B_size=251, # Grid size for bonds - B_min=-0.45, # Smallest B value - B_max=0.45, # Largest B value - y_size=51, # Grid size for income +def create_arellano(B_size=251, # Grid size for bonds + B_min=-0.45, # Smallest B value + B_max=0.45, # Largest B value + y_size=51, # Grid size for income β=0.953, # Time discount parameter γ=2.0, # Utility parameter r=0.017, # Lending rate @@ -400,8 +409,8 @@ def create_arellano(B_size=251, # Grid size for bonds # Output received while in default, with same shape as y_grid def_y = jnp.minimum(def_y_param * jnp.mean(y_grid), y_grid) - return Arellano_Economy(β=β, γ=γ, r=r, ρ=ρ, η=η, θ=θ, B_size=B_size, \ - y_size=y_size, P=P, B_grid=B_grid, y_grid=y_grid, \ + return ArellanoEconomy(β=β, γ=γ, r=r, ρ=ρ, η=η, θ=θ, B_size=B_size, + y_size=y_size, P=P, B_grid=B_grid, y_grid=y_grid, def_y=def_y) ``` @@ -547,11 +556,11 @@ def update_values_and_prices(v_c, v_d, params, sizes, arrays): return new_v_c, new_v_d ``` -We can now write a function that will use an instance of `Arellano_Economy` and +We can now write a function that will use an instance of `ArellanoEconomy` and the functions defined above to compute the solution to our model. One of the jobs of this function is to take an instance of -`Arellano_Economy`, which is hard for the JIT compiler to handle, and strip it +`ArellanoEconomy`, which is hard for the JIT compiler to handle, and strip it down to more basic objects, which are then passed out to jitted functions. ```{code-cell} ipython3 @@ -559,7 +568,7 @@ down to more basic objects, which are then passed out to jitted functions. def solve(model, tol=1e-8, max_iter=10_000): """ - Given an instance of `Arellano_Economy`, this function computes the optimal + Given an instance of `ArellanoEconomy`, this function computes the optimal policy and value functions. """ # Unpack @@ -622,7 +631,7 @@ def simulate(model, T, v_c, v_d, q, B_star, key): """ Simulates the Arellano 2008 model of sovereign debt - Here `model` is an instance of `Arellano_Economy` and `T` is the length of + Here `model` is an instance of `ArellanoEconomy` and `T` is the length of the simulation. Endogenous objects `v_c`, `v_d`, `q` and `B_star` are assumed to come from a solution to `model`. @@ -687,7 +696,7 @@ def simulate(model, T, v_c, v_d, q, B_star, key): Let’s start by trying to replicate the results obtained in {cite}`Are08`. -In what follows, all results are computed using parameter values of `Arellano_Economy` created by `create_arellano`. +In what follows, all results are computed using parameter values of `ArellanoEconomy` created by `create_arellano`. For example, `r=0.017` matches the average quarterly rate on a 5 year US treasury over the period 1983–2001. @@ -755,7 +764,7 @@ Periods of relative stability are followed by sharp spikes in the discount rate To the extent that you can, replicate the figures shown above -- Use the parameter values listed as defaults in `Arellano_Economy` created by `create_arellano`. +- Use the parameter values listed as defaults in `ArellanoEconomy` created by `create_arellano`. - The time series will of course vary depending on the shock draws. ```{exercise-end} From f0a5874b71dadba6ca1d074640828cc7ed6efc4e Mon Sep 17 00:00:00 2001 From: shlff Date: Wed, 18 Oct 2023 14:38:34 +1100 Subject: [PATCH 04/11] [arellano] use namedtuple --- lectures/arellano.md | 113 +++++++++++++++++++------------------------ 1 file changed, 51 insertions(+), 62 deletions(-) diff --git a/lectures/arellano.md b/lectures/arellano.md index d3e27c26..42201345 100644 --- a/lectures/arellano.md +++ b/lectures/arellano.md @@ -77,6 +77,7 @@ import random import jax import jax.numpy as jnp +from collections import namedtuple ``` Let's check the GPU we are running @@ -365,55 +366,43 @@ The output process is discretized using a [quadrature method due to Tauchen](htt As we have in other places, we accelerate our code using Numba. -We define a class that will store parameters, grids and transition +We define a namedtuple to store parameters, grids and transition probabilities. ```{code-cell} ipython3 -:hide-output: false - -class Arellano_Economy: - " Stores data and creates primitives for the Arellano economy. " - - def __init__(self, - B_grid_size=251, # Grid size for bonds - B_grid_min=-0.45, # Smallest B value - B_grid_max=0.45, # Largest B value - y_grid_size=51, # Grid size for income - β=0.953, # Time discount parameter - γ=2.0, # Utility parameter - r=0.017, # Lending rate - ρ=0.945, # Persistence in the income process - η=0.025, # Standard deviation of the income process - θ=0.282, # Prob of re-entering financial markets - def_y_param=0.969): # Parameter governing income in default - - # Save parameters - self.β, self.γ, self.r, = β, γ, r - self.ρ, self.η, self.θ = ρ, η, θ - - # Set up grids - self.y_grid_size = y_grid_size - self.B_grid_size = B_grid_size - B_grid = jnp.linspace(B_grid_min, B_grid_max, B_grid_size) - mc = qe.markov.tauchen(y_grid_size, ρ, η) - y_grid, P = jnp.exp(mc.state_values), mc.P - - # Put grids on the device - self.B_grid = jax.device_put(B_grid) - self.y_grid = jax.device_put(y_grid) - self.P = jax.device_put(P) - - # Output received while in default, with same shape as y_grid - self.def_y = jnp.minimum(def_y_param * jnp.mean(self.y_grid), self.y_grid) - - def params(self): - return self.β, self.γ, self.r, self.ρ, self.η, self.θ - - def sizes(self): - return self.B_grid_size, self.y_grid_size +Arellano = namedtuple('Arellano', ('β', 'γ', 'r', 'ρ', 'η', 'θ', \ + 'B_size', 'y_size', \ + 'P', 'B_grid', 'y_grid', 'def_y')) +``` - def arrays(self): - return self.P, self.B_grid, self.y_grid, self.def_y +```{code-cell} ipython3 +def create_arellano(B_size=251, # Grid size for bonds + B_min=-0.45, # Smallest B value + B_max=0.45, # Largest B value + y_size=51, # Grid size for income + β=0.953, # Time discount parameter + γ=2.0, # Utility parameter + r=0.017, # Lending rate + ρ=0.945, # Persistence in the income process + η=0.025, # Standard deviation of the income process + θ=0.282, # Prob of re-entering financial markets + def_y_param=0.969): # Parameter governing income in default + # Set up grids + B_grid = jnp.linspace(B_min, B_max, B_size) + mc = qe.markov.tauchen(y_size, ρ, η) + y_grid, P = jnp.exp(mc.state_values), mc.P + + # Put grids on the device + B_grid = jax.device_put(B_grid) + y_grid = jax.device_put(y_grid) + P = jax.device_put(P) + + # Output received while in default, with same shape as y_grid + def_y = jnp.minimum(def_y_param * jnp.mean(y_grid), y_grid) + + return Arellano(β=β, γ=γ, r=r, ρ=ρ, η=η, θ=θ, B_size=B_size, \ + y_size=y_size, P=P, B_grid=B_grid, y_grid=y_grid, \ + def_y=def_y) ``` Here is the utility function. @@ -519,7 +508,6 @@ def bellman(v_c, v_d, q, params, sizes, arrays): # Return new_v_c[i_B, i_y, i_Bp] val = jnp.where(c > 0, u(c, γ) + β * continuation_value, -jnp.inf) return val - ``` ```{code-cell} ipython3 @@ -558,11 +546,11 @@ def update_values_and_prices(v_c, v_d, params, sizes, arrays): return new_v_c, new_v_d ``` -We can now write a function that will use the `Arellano_Economy` class and the +We can now write a function that will use the `Arellano` namedtuple and the functions defined above to compute the solution to our model. One of the jobs of this function is to take an instance of -`Arellano_Economy`, which is hard for the JIT compiler to handle, and strip it +`Arellano`, which is hard for the JIT compiler to handle, and strip it down to more basic objects, which are then passed out to jitted functions. ```{code-cell} ipython3 @@ -570,14 +558,16 @@ down to more basic objects, which are then passed out to jitted functions. def solve(model, tol=1e-8, max_iter=10_000): """ - Given an instance of Arellano_Economy, this function computes the optimal + Given an instance of Arellano, this function computes the optimal policy and value functions. """ # Unpack - params = model.params() - sizes = model.sizes() - arrays = model.arrays() - B_size, y_size = sizes + + β, γ, r, ρ, η, θ, B_size, y_size, P, B_grid, y_grid, def_y = model + + params = β, γ, r, ρ, η, θ + sizes = B_size, y_size + arrays = P, B_grid, y_grid, def_y # Initial conditions for v_c and v_d v_c = jnp.zeros((B_size, y_size)) @@ -605,7 +595,7 @@ Let's try solving the model. ```{code-cell} ipython3 :hide-output: false -ae = Arellano_Economy() +ae = create_arellano() ``` ```{code-cell} ipython3 @@ -631,13 +621,13 @@ def simulate(model, T, v_c, v_d, q, B_star, key): """ Simulates the Arellano 2008 model of sovereign debt - Here `model` is an instance of `Arellano_Economy` and `T` is the length of + Here `model` is an instance of `Arellano` and `T` is the length of the simulation. Endogenous objects `v_c`, `v_d`, `q` and `B_star` are assumed to come from a solution to `model`. """ # Unpack elements of the model - B_size, y_size = model.sizes() + B_size, y_size = model.B_size, model.y_size B_grid, y_grid, P = model.B_grid, model.y_grid, model.P B0_idx = jnp.searchsorted(B_grid, 1e-10) # Index at which B is near zero @@ -697,8 +687,7 @@ Let’s start by trying to replicate the results obtained in {cite}`Are08`. In what follows, all results are computed using Arellano’s parameter values. -The values can be seen in the `__init__` method of the `Arellano_Economy` -shown above. +The values can be seen in the `create_arellano` method shown above. For example, `r=0.017` matches the average quarterly rate on a 5 year US treasury over the period 1983–2001. @@ -716,7 +705,7 @@ values of output $ y $. - $ y_H $ is 5% above the mean of the $ y $ grid values -The grid used to compute this figure was relatively fine (`y_grid_size, B_grid_size = 51, 251`), which explains the minor differences between this and +The grid used to compute this figure was relatively fine (`y_size, B_size = 51, 251`), which explains the minor differences between this and Arrelano’s figure. The figure shows that @@ -763,7 +752,7 @@ Periods of relative stability are followed by sharp spikes in the discount rate To the extent that you can, replicate the figures shown above -- Use the parameter values listed as defaults in `Arellano_Economy`. +- Use the parameter values listed as defaults in `Arellano`. - The time series will of course vary depending on the shock draws. ```{exercise-end} @@ -778,7 +767,7 @@ Compute the value function, policy and equilibrium prices ```{code-cell} ipython3 :hide-output: false -ae = Arellano_Economy() +ae = create_arellano() v_c, v_d, q, B_star = solve(ae) ``` @@ -789,7 +778,7 @@ Compute the bond price schedule as seen in figure 3 of Arellano (2008) # Unpack some useful names B_grid, y_grid, P = ae.B_grid, ae.y_grid, ae.P -B_size, y_size = ae.sizes() +B_size, y_size = ae.B_size, ae.y_size r = ae.r # Create "Y High" and "Y Low" values as 5% devs from mean From ff86e0fd39571a8a7965cd8f9c588d44310d538e Mon Sep 17 00:00:00 2001 From: shlff Date: Mon, 4 Mar 2024 12:04:15 +1100 Subject: [PATCH 05/11] further_edits --- lectures/arellano.md | 38 +++++++++++++++++++------------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/lectures/arellano.md b/lectures/arellano.md index 42201345..8afc6953 100644 --- a/lectures/arellano.md +++ b/lectures/arellano.md @@ -4,7 +4,7 @@ jupytext: extension: .md format_name: myst format_version: 0.13 - jupytext_version: 1.14.5 + jupytext_version: 1.15.2 kernelspec: display_name: Python 3 (ipykernel) language: python @@ -370,9 +370,9 @@ We define a namedtuple to store parameters, grids and transition probabilities. ```{code-cell} ipython3 -Arellano = namedtuple('Arellano', ('β', 'γ', 'r', 'ρ', 'η', 'θ', \ - 'B_size', 'y_size', \ - 'P', 'B_grid', 'y_grid', 'def_y')) +Arellano_Economy = namedtuple('Arellano_Economy', ('β', 'γ', 'r', 'ρ', 'η', 'θ', \ + 'B_size', 'y_size', \ + 'P', 'B_grid', 'y_grid', 'def_y')) ``` ```{code-cell} ipython3 @@ -400,9 +400,9 @@ def create_arellano(B_size=251, # Grid size for bonds # Output received while in default, with same shape as y_grid def_y = jnp.minimum(def_y_param * jnp.mean(y_grid), y_grid) - return Arellano(β=β, γ=γ, r=r, ρ=ρ, η=η, θ=θ, B_size=B_size, \ - y_size=y_size, P=P, B_grid=B_grid, y_grid=y_grid, \ - def_y=def_y) + return Arellano_Economy(β=β, γ=γ, r=r, ρ=ρ, η=η, θ=θ, B_size=B_size, \ + y_size=y_size, P=P, B_grid=B_grid, y_grid=y_grid, \ + def_y=def_y) ``` Here is the utility function. @@ -462,6 +462,7 @@ def T_d(v_c, v_d, params, sizes, arrays): β, γ, r, ρ, η, θ = params B_size, y_size = sizes P, B_grid, y_grid, def_y = arrays + B0_idx = jnp.searchsorted(B_grid, 1e-10) # Index at which B is near zero current_utility = u(def_y, γ) @@ -546,11 +547,11 @@ def update_values_and_prices(v_c, v_d, params, sizes, arrays): return new_v_c, new_v_d ``` -We can now write a function that will use the `Arellano` namedtuple and the -functions defined above to compute the solution to our model. +We can now write a function that will use an instance of `Arellano_Economy` and +the functions defined above to compute the solution to our model. One of the jobs of this function is to take an instance of -`Arellano`, which is hard for the JIT compiler to handle, and strip it +`Arellano_Economy`, which is hard for the JIT compiler to handle, and strip it down to more basic objects, which are then passed out to jitted functions. ```{code-cell} ipython3 @@ -558,7 +559,7 @@ down to more basic objects, which are then passed out to jitted functions. def solve(model, tol=1e-8, max_iter=10_000): """ - Given an instance of Arellano, this function computes the optimal + Given an instance of `Arellano_Economy`, this function computes the optimal policy and value functions. """ # Unpack @@ -621,7 +622,7 @@ def simulate(model, T, v_c, v_d, q, B_star, key): """ Simulates the Arellano 2008 model of sovereign debt - Here `model` is an instance of `Arellano` and `T` is the length of + Here `model` is an instance of `Arellano_Economy` and `T` is the length of the simulation. Endogenous objects `v_c`, `v_d`, `q` and `B_star` are assumed to come from a solution to `model`. @@ -629,6 +630,7 @@ def simulate(model, T, v_c, v_d, q, B_star, key): # Unpack elements of the model B_size, y_size = model.B_size, model.y_size B_grid, y_grid, P = model.B_grid, model.y_grid, model.P + B0_idx = jnp.searchsorted(B_grid, 1e-10) # Index at which B is near zero # Set initial conditions @@ -685,9 +687,7 @@ def simulate(model, T, v_c, v_d, q, B_star, key): Let’s start by trying to replicate the results obtained in {cite}`Are08`. -In what follows, all results are computed using Arellano’s parameter values. - -The values can be seen in the `create_arellano` method shown above. +In what follows, all results are computed using parameter values of `Arellano_Economy` created by `create_arellano`. For example, `r=0.017` matches the average quarterly rate on a 5 year US treasury over the period 1983–2001. @@ -695,7 +695,7 @@ Details on how to compute the figures are reported as solutions to the exercises. The first figure shows the bond price schedule and replicates Figure 3 of -Arellano, where $ y_L $ and $ Y_H $ are particular below average and above average +{cite}`Are08`, where $ y_L $ and $ Y_H $ are particular below average and above average values of output $ y $. ```{figure} _static/lecture_specific/arellano/arellano_bond_prices.png @@ -752,7 +752,7 @@ Periods of relative stability are followed by sharp spikes in the discount rate To the extent that you can, replicate the figures shown above -- Use the parameter values listed as defaults in `Arellano`. +- Use the parameter values listed as defaults in `Arellano_Economy` created by `create_arellano`. - The time series will of course vary depending on the shock draws. ```{exercise-end} @@ -771,7 +771,7 @@ ae = create_arellano() v_c, v_d, q, B_star = solve(ae) ``` -Compute the bond price schedule as seen in figure 3 of Arellano (2008) +Compute the bond price schedule as seen in figure 3 of {cite}`Are08` ```{code-cell} ipython3 :hide-output: false @@ -793,7 +793,7 @@ x = [] q_low = [] q_high = [] for i, B in enumerate(B_grid): - if -0.35 <= B <= 0: # To match fig 3 of Arellano + if -0.35 <= B <= 0: # To match fig 3 of Arellano (2008) x.append(B) q_low.append(q[i, iy_low]) q_high.append(q[i, iy_high]) From 520add02c0bd51f64e923147fff6f04a669dce3d Mon Sep 17 00:00:00 2001 From: shlff Date: Tue, 5 Mar 2024 16:39:12 +1100 Subject: [PATCH 06/11] Merge branch 'use_namedtuple_arellano' of https://github.com/QuantEcon/lecture-jax into use_namedtuple_arellano --- .github/workflows/cache.yml | 2 +- .github/workflows/ci.yml | 2 +- .github/workflows/publish.yml | 2 +- _notebook_repo/README.md | 7 ++ _notebook_repo/environment.yml | 7 ++ environment.yml | 2 +- lectures/_config.yml | 6 ++ .../arellano/arellano_bond_prices.png | Bin 0 -> 14308 bytes .../arellano/arellano_bond_prices_2.png | Bin 0 -> 13314 bytes .../arellano/arellano_default_probs.png | Bin 0 -> 11079 bytes .../arellano/arellano_time_series.png | Bin 0 -> 78111 bytes .../arellano/arellano_value_funcs.png | Bin 0 -> 16646 bytes .../lecture_specific/successive_approx.py | 38 +++++----- lectures/_static/lecture_specific/vfi.py | 3 +- .../_static/quantecon-logo-transparent.png | Bin 0 -> 50790 bytes lectures/arellano.md | 66 +++++++++++------- lectures/cake_eating_numerical.md | 5 +- lectures/ifp_egm.md | 5 +- lectures/intro.md | 4 +- lectures/inventory_dynamics.md | 4 -- lectures/kesten_processes.md | 4 -- lectures/markov_asset.md | 66 +++++++++--------- lectures/mle.md | 4 -- lectures/opt_invest.md | 27 +++---- lectures/opt_savings.md | 27 ++++--- 25 files changed, 141 insertions(+), 140 deletions(-) create mode 100644 _notebook_repo/README.md create mode 100644 _notebook_repo/environment.yml create mode 100644 lectures/_static/lecture_specific/arellano/arellano_bond_prices.png create mode 100644 lectures/_static/lecture_specific/arellano/arellano_bond_prices_2.png create mode 100644 lectures/_static/lecture_specific/arellano/arellano_default_probs.png create mode 100644 lectures/_static/lecture_specific/arellano/arellano_time_series.png create mode 100644 lectures/_static/lecture_specific/arellano/arellano_value_funcs.png create mode 100644 lectures/_static/quantecon-logo-transparent.png diff --git a/.github/workflows/cache.yml b/.github/workflows/cache.yml index 75d18d43..575a9d2b 100644 --- a/.github/workflows/cache.yml +++ b/.github/workflows/cache.yml @@ -27,7 +27,7 @@ jobs: needs: deploy-runner runs-on: [self-hosted, cml-gpu] container: - image: docker://mmcky/quantecon-lecture-python:cuda-12.1.0-anaconda-2023-09-py311 + image: docker://mmcky/quantecon-lecture-python:cuda-12.3.1-anaconda-2024-02-py311 options: --gpus all steps: - uses: actions/checkout@v3 diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index c128c304..35651a51 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -24,7 +24,7 @@ jobs: needs: deploy-runner runs-on: [self-hosted, cml-gpu] container: - image: docker://mmcky/quantecon-lecture-python:cuda-12.1.0-anaconda-2023-09-py311 + image: docker://mmcky/quantecon-lecture-python:cuda-12.3.1-anaconda-2024-02-py311 options: --gpus all steps: - uses: actions/checkout@v3 diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index e5ff9b81..f5a5788f 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -28,7 +28,7 @@ jobs: needs: deploy-runner runs-on: [self-hosted, cml-gpu] container: - image: docker://mmcky/quantecon-lecture-python:cuda-12.1.0-anaconda-2023-09-py311 + image: docker://mmcky/quantecon-lecture-python:cuda-12.3.1-anaconda-2024-02-py311 options: --gpus all steps: - name: Checkout diff --git a/_notebook_repo/README.md b/_notebook_repo/README.md new file mode 100644 index 00000000..e7e8fe93 --- /dev/null +++ b/_notebook_repo/README.md @@ -0,0 +1,7 @@ +# lecture-jax.notebooks + +[![Binder](https://mybinder.org/badge_logo.svg)](https://mybinder.org/v2/gh/QuantEcon/lecture-jax.notebooks/master) + +Notebooks for https://jax.quantecon.org + +**Note:** This README should be edited [here](https://github.com/quantecon/lecture-jax/_notebook_repo) diff --git a/_notebook_repo/environment.yml b/_notebook_repo/environment.yml new file mode 100644 index 00000000..f5e16c38 --- /dev/null +++ b/_notebook_repo/environment.yml @@ -0,0 +1,7 @@ +name: lecture-jax +channels: + - default +dependencies: + - python=3.11 + - anaconda + diff --git a/environment.yml b/environment.yml index d3a2c680..f979352c 100644 --- a/environment.yml +++ b/environment.yml @@ -8,7 +8,7 @@ dependencies: - pip: - jupyter-book==0.15.1 - docutils==0.17.1 - - quantecon-book-theme==0.6.0 + - quantecon-book-theme==0.7.1 - sphinx-tojupyter==0.3.0 - sphinxext-rediraffe==0.2.7 - sphinx-exercise==0.4.1 diff --git a/lectures/_config.yml b/lectures/_config.yml index d6c14f68..fb896570 100644 --- a/lectures/_config.yml +++ b/lectures/_config.yml @@ -68,6 +68,12 @@ sphinx: html_theme: quantecon_book_theme html_static_path: ['_static'] html_theme_options: + authors: + - name: Thomas J. Sargent + url: http://www.tomsargent.com/ + - name: John Stachurski + url: https://johnstachurski.net/ + dark_logo: quantecon-logo-transparent.png header_organisation_url: https://quantecon.org header_organisation: QuantEcon repository_url: https://github.com/QuantEcon/lecture-jax diff --git a/lectures/_static/lecture_specific/arellano/arellano_bond_prices.png b/lectures/_static/lecture_specific/arellano/arellano_bond_prices.png new file mode 100644 index 0000000000000000000000000000000000000000..27073d43f31708768584eab86330dee0b52dbdd8 GIT binary patch literal 14308 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 CR_#;( literal 0 HcmV?d00001 diff --git a/lectures/_static/lecture_specific/arellano/arellano_bond_prices_2.png b/lectures/_static/lecture_specific/arellano/arellano_bond_prices_2.png new file mode 100644 index 0000000000000000000000000000000000000000..1b15208a02a8dc7d6caf8994a246d8d29f65621e GIT binary patch literal 13314 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 CI>(Rz literal 0 HcmV?d00001 diff --git a/lectures/_static/lecture_specific/arellano/arellano_default_probs.png b/lectures/_static/lecture_specific/arellano/arellano_default_probs.png new file mode 100644 index 0000000000000000000000000000000000000000..c395ed6d9c59083e53371d9213de57bfd5763401 GIT binary patch literal 11079 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 literal 0 HcmV?d00001 diff --git a/lectures/_static/lecture_specific/arellano/arellano_time_series.png b/lectures/_static/lecture_specific/arellano/arellano_time_series.png new file mode 100644 index 0000000000000000000000000000000000000000..036b96f792d52414caf7a67a197f9cc9baf39cbb GIT binary patch literal 78111 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%0A1t3pTjkLP3ERNYtJvY|9e+}d@N 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%0A@Vi;-+`h_MTMyg(r40z1cL((Q%siR z?7W6WPFNLjdkM*vmVd8UoU)$$&p|@J#}O#S6$B%O`11sgCuhDj5Hn53Uv#%YmvVZC zxS|U&`${?Fvs=%bByBE&4H0m4CdXT4l&wDvW_mE)Py0{K#Jd~0n!-tl=l>)Ek*1h7 z4MW`DlWpfo5DKCg$Yi$RK;FxWqAov&Ot*N|?Hn9%{OL5~;pFsJxyO6u<@^^90Qe6U z2tWtg{_pPQKbX%MP&I-8M(uN-v|)wi{FDz6f6+SKK%j@f)+z(mx;@wU3vVB+b<>kE zbE=GZAO@Q?RzOL~(J!1QLgYyWL_+ib&MCN#uQ}Q2f^=WmbgVG`d%pQU(ToYzZSu`R zK~+a`fCRAH>e=mk1egto|J;R6U~Q~sdKlS{kU86h@P)KFr`9E)j1wUgLWb0De~H>! zn)%R~&msR{;JfsYGW1<`R=-H0G|~RQqJ<#OT$?vU{4YSf!YQO4y?y&(!O(o{RGuH4 z)i&TzFR})0uSc2PLe%q2c`bTM)=#Cr=R{e6hjaONnu2kM_J7(t^LVK9KaPK9Mo5Jr ziA2pNp;AeAj_s@bNHRIPs7xx9qii&!u_}{_W*b@L2(vQEk+X8lreacQmAgCQ8XQ`j;D<6oK;@9Tr+J*^|8;ah&222T5N+W zGFsG>fW8)!CtW5nMz#r=Ns~4Z*4~R5gJ_ikeJrr348V)K?`vxgj;Tuu1O4HWt$be2 zbDps}_8B*h`5Rv|(nh!a&K@^f=^;)>U0xU+F1N@Az1_jLX*?MDADhL#7g^lX9!mAK z@009i^f(0j*W@*>SKucB#%_6d$Nu7VFXz7mcyS=nVnyX`PhrnS!9K{EuI-98F8WWN zJG%y^89nk@GPUshU4;ix527{Isw\Byg+MZhfSCzc)Q(Yh(DR4-)?*P5$(pwaI7 zT6#>|TIQ2P{U`t&TOHd%z~HA_f}bR@PN5aYVkeyF#*jjB`Q(x&Ie0ky<2?U z{j{Ty_aKxEt&Pp5Z7}rFFMwdFBPsXZ#-QhIrPF@Ea3uD%@79XDHv2;TLMKRUTi%og z#a9H;^%;G>66#?|qQJ*3A?DaYAESH-`oIO@ss^OG=j2D{j4U$@N~n(y`WXhS2EL_2 zX#JHM*w+SVUX=q5n=Un;O3Vmdc<7+<3o{pGO>&`sZ+r%>|Iy1hq7#; z!`(xN-kelv=O)vh+aTyY2{o>7;rscSIme&9nS|LKd~OOq(7`>KkibN}(m@HTSJHp| zP@x({SlUoqHC2~%C^!A-m}rMV bsOB=H?WEWvJ>ISRBm)pjBc{;&Q0R;D=+4Q&}gO+0hj-O01IBBYNqhm5QuriNf5;-j%-RXgnso(X#sEZKnbao;)Ln z@&T0IuLhi_c37d|GXsNhlEN-FRWUcOE|o2F{gsm<%i{OR-g9F2DucAX>gLpyKYcZ! zz1Y$#BJ@{t=c|xyFUQvvJ#>WH0jLD@DpyqaiDqoUG$S!?6NVGt?)jsMsg9~(ZJJSI zoCPoi>t01pSf2rgeZ#49I$aZ>#w)fnAIW~3*$ce` z&YuYS*K!2kKW1y`zP}z(nLgb(1%$!ticc8P{rs{FHOBi3e$v~ZnXa7YAIyozXQgQZ zeTU22@3zo965K3j4o_MP-K4&v+wS+90!H+X1boAs5vM;fz9{G9_~gkHBQE+;5FDeY zz_LSKl0t_D+IdRlwXrG9a1&r>IA<=!UdA_~4=)Q~)VX{d2EUL3n2LD_B-H^P$1H1m z*jBu+sAoT6%`fbzyb-z_ql@WvxQEdH3$-ISHLnK~EOSvz!5J9VRd@&D=g6&QG&Y4% z?6u~os`2}_vvU(dlmwU#h8b}7;ez^3?;FflECsA7h3i%BT?A5Pz`^Ti<6WRD7b{Z^;?jS-~MH*_2_a;aABY+n(~u8tIt0mg6S%U z12tSXz?AQsb*NEQ&a*fmVrg@Z5&+Hsgs!-5X9(@2>aFudYjXlKcITr?M6)2Uc*&U5-ZSPXBerr}?9N}dGAPxbh zZTrr7>kpJ0ay)4At%x!@p}+$?wX%LeUke(|p>`zOf8#|dh6-r+w{A46v-{88==c4r z48nOO$xevTYpL!(9L2lwjsN_qsy&W_Ve`iqKG5l`fAG^ERlZk4D)xNWgJe646@SRx ze`gj@J3t}3Oc1)GrUgAdXRhW-JiX<~9v{BHyuTEwH?j?dX>(d5hF(;SNPt5S(rX5n zOOX}GpiA}D9iaE!O{hOwY!W*LF`aQs@>r@sRwCf`RR62kR9A#A2dlyfS2hwZ$KzE@ z6v?(Ak%U{cNXGlMByLPxn5TgO%9B&i1xM@d(JA-0vrm+ zbroAOP>8{j193}cwb#Kqq6ud60_WZ+O%&TFNqoxR2-y+%zkED}Nj2_Z65@|fXsGo9 z{PU*|g9-XZ{MvG&ro@|mrcYg}={Z|Ao4k@jv1(8^(xn7HYIAffgjlnjHe)q>N%0RJ z^grO%ddDnD-Wbs{kJ?ed^j_V#FP*BBy}f)R_O29Yy-e42*Z0MX&~zK~7&~)Qf*SG+ zYcYsJLM!u>ZdgZAb$IPOCqX95twr_Vn*%)93TbO9}qg+Pxc37auWV3=!g!liR9EQnKuxBhdAE zCFP8k`yp{6`YR9mTP%m4=-qKspoh)zaGcwSDkcz-bcO55X=O5`)?S81@zFLs2bl zMg*Z&Xz8Ysd9Q&J2Nj7;>PL{8?j3N5uQ@9J{DlOzj%dj<39<^wGwtq)Ulfh6-UaAM z_H5B!6EAczHREq-h@S%t=lQN>+MHYFJ&j6X1aANmM}$*vmlvwBL%(Fd0SS)dkE6Qb z@tN%c8XgYnIwIoc^pU-nBNjP3WIGZ5SFm}?~SGSqyO!)BP{G7UFn zR;j5VX<#h(u-^V0#gD8N7r*(Pba__O5>cEY<*@y+OScA{x9JsYQIsDYZ@s|uFY8kS zv0O1rkbrWR)89b!T_`mpdtBI+COApn`D=W3Fb3i zn5SHLo2f_o8K&9?9GkPXIRRNa%ePL#1P-Vb4PU2r(7Q9wb(&yDiT%@n$x==7CGx7w zQ?STs#jf~eNbTOF-J2X*bGYytk-SZ6H=urP!K8#Tj4;$c0Z?AiYMrlX&7;(#4}sA3 zRS~+S)j7dig!)epbb0VrNK?T-VhM|0`mSi8=S%Sj92-pg2T9(nb0Z-k^ULY{)4*B- z>N4=<493<@0&4CQIIG>tYKvt%^-`I@TB{x3S|n)XU(KG%fRRul-)!=~hI2a?$%dd? z<+t)bu>V%%_*T>d!!w= z8n9ice-@)6I`10)MZR2kO#s?KctiA@$g>B^o}(R$xs=eq0TpxEQT*P@$zj0aGdnE? z@8L+gPaU-pF56sVsjjudWAhkYy!=zkoT{^azm@yjhXs2q%X8J?yez6KrX9Z7T$3=Y zNzIFaGoNAh?~!mhk<1>{>fQsWyGt&Go+rGdK!oq5c*z~AM%<@8BO_Ago-s>YSxcf+ zO5+vd$xK7TLq%@@&AB61^V+ex>XH)lPKgx{eS#S?c^1xFi=vW(mOibxQ@bCfMcB@! z5S!DH+7|N>`-Ux$Z09x5Uyi<#Edr>a!%B|LPOJzuTO%N?+MCbR?slr;0zq|gsGo4W zwxk@E=jE9SlnIxmGSbhLZ&kzuJJ2A(JETmW0kLM*l50}H(IgKnVJsc?6Ll~;&N|CCOK zW8PHB19`2*HD}AlbVW-bsL3?c0-E*QCsNRB$7v9!LKIWv$u}#4P;S&kt;-UgxV@7H zCLoQ##d|7yQ4w(#qTM(p&5+aP%*FQVGSZ3d#0=C7%Xy{tL+j+pwz~L*-K-#?P2$pU zO6idrQojT^%BVc=M{37DR6*)z4@3nc$T&afGIjxF)Q)xq(&PlZ$_;<5&3QJTv5g!l zDO}tAz67~XWz9uCs9)-c`7tD&HtGbmiMU7(*K`{4sq8zVaDVX&((VTj9f6)UF$4I^ zWykjsmZl4o!>Rh{F|*7N$(LB(+qr_0u)P%GXqhvc+Ja&gS<4B-e3`~qZG>TI M=_V}g``thO7Z`hPtpET3 literal 0 HcmV?d00001 diff --git a/lectures/_static/lecture_specific/arellano/arellano_value_funcs.png b/lectures/_static/lecture_specific/arellano/arellano_value_funcs.png new file mode 100644 index 0000000000000000000000000000000000000000..02b5ffaa5a9246de993c6e4122a7649a2a3b4c1b GIT binary patch literal 16646 zcmeIaXH-*N*Djn;RoWdD5fD&{7(fu|-GX3(fCiLa6zRS9rZ*5!Ktlkfql6+zmtKOP zC=fa#J%BVR0V$z#R(S6B9nW~qH{KuT*LTJ^KO9@L_g-tRx#qm)T-Ti2$opFAOs6P=mrl;tsBkI}ini9IsgMW{>jEf@L|&tC8&v#vzG<2NkjGkWAUHXPGyRErpq zbz4%^i;OF;?}_~Ip+Ux0`*&7n??zQ&(eG@8VQtJvOUW6*m>H=bqEVQt$kTVC`0=S= zMCuYHa_q!k5ZhNR_aRo-)`L=?^L4E6Tg~pBIZ1pT(RCUwz>mQ2M{C~6WOxPsmVKJK z99*#U|L;OkLA@sIHSd#$nTzM0VLhi|IehO*yFcAUiHqOR5b}quRl?Ss)og<=@-nNp zlv53C)}!aYhy7&WA-%zqM>t_*GoKXHa5^d}6~*x;myFHI`v$p+SXIZX^YV(?9-UYX z!=jFUB})EEbi1_mxwVY8;11?*s38V&NcD!HZt>P_RY?dB%X!td@7`sp@{t>&6SJ zEnVs@_Apl=UN6;_UGz5T2E%G%_3IV07w8|O_L}WV&Ir|jt9pCMu(fqQ)Ad2Vsdm_! zVD;b_H;hwlLxlrI?-p33-r~Pr?~D*SM`weu6vKHiZ(m=P;7dA!6-(eYgswsM8O*s? znThpyvDrOkm^g#a>22O($aX8s<4+TB;~Q)FPaMgv3S@9^bF97{^&f}qpLS74+G-Uh)K7co zVdak;mfp#D#USnpI8=%zYg-~D%mhORE3Y> zed0QgJKsbqtVAxBy!#Q0vPRmfteOyi81HpKkCbs6Pul9oI!Glr zPA{Y@PSd@bn1}5(o149NI;NcxPYQ*h86L&S>f&&F;bLQOvdol2CDsZn7Blx%tovF#sRBKplSd=Z}yz>3L4G1{;x^W>A54( zBYb5-ya_YAF%V%je-tv0$%k%RSG8ZYrDk+5XwuI4JWNKlB@p(2X#+C%E!*>MFZO9j zLRQM?{;YL~!P6H+Q6HLZK|Gw;2nqHJOWX;}NECT_D9%S^<+R%z3st!z{m%c51Am2l z7fNi8TQ3f^Yle5mXll!SS!L#jq*EPwI{AI)d#`xFL;bOOxRGkV5snjVU9A|vJ40K) zulPcTt~Bs#B3}2#AAZro@FRNf#@x^VSKn*@!{yDRd8)QAb-wE;dwcuLc7U5T9}-Rd z7JQJlL79tJ9?{JsdWVPGvNe-WnS_HeAKqzcxHWjcBjxiYfVDGCK&k(Bk?W@I9~@No z_g7F-QVJ8DN$T(K?;aiP*jVUeFo^=MXNlinyAN)=&vs;f`V^18;vwgYfcNzD+ypDSGIT*;Hz|MNQc48U0g0%Rqb7Hr;kHsZc ze>AFe>rx^!Dvj6qN|49A&7i_yOd%(_`RkQd1P(9KI027`KpJ=R8{0_xouso>LI_OO z)Qq&(ovG>Ijj6xuR)P=ax%8Hba&yfINm33I4XGxzUOm0NpLaJGp+3Y=`t9F(ji>Mt zD*KNcHgIAO3=HHhc_K0Vnyhp-C9czIX+gWT%6mgyf1;fOs6#3$q|b?&DtZuz#EeM; z4F5@LkDjXGyKAb$RjzzI2lMJXErQB7b#%@^#OgOrD|jstCnI=fN2}dM3`(=iH-T)C z-sQCs%k;HFLB;vqxU)*s<@)u0QUe16io5ggZ#z<6Yuu}CZ0GVGZ5nJm^o-$Bc!WPC zfavv67#ZoZkI*WaHfI}Q@p514-?^12X?Z^53(tNN&uX4_V3a|b71Jljk&0;Tpg(bt zy4BAN0rR(cgmir|{I(Yu8845^2Ze*Ff4UYYkF|EbLUH^~H&BXBJ~!yrhcP@X4)N5Y z1&XckCp(QF9g^LF;#Y~!Sxo!M@kIfa^Xn7a(Gzc$dcjV~%6k1)9C7FCDB}7(YfQr5 zH&ZRPn{@agl4r4uF*M|~e(+!t-fZzWMASl9ukh(yXKI+}Z4l1m-0P{A6h~8&+eZmK zD`_uw+4>*3>xf<}GSzK=DI{~Eih|;pEV!M^wUWx|j{D~0flHFlpEvhix6*y+Ha%td zL*#q5mBp(jd#)OA7IXMy_4md)AJYedr$#GSpQ?33-PZ4q2DqG`qo`> z2o#L{!o4L0S1+5jiIw*`?B~U=zR&)E;bbE`CSc^jQY~+O?7MzBnIc6VUMppR>r{sV zvzPnqJ6rbRCx-AZQTfKHu2r&pgKdP_%Qbg>%9cI4EMI>F z8-1*T0y{n<@ilFrDcff_tnAN$<_c;P2bJzG;H5s9YqI@jO7+h;*#=6p;YRzF=2}uP z(L>>XjeXK(H$VmKM(3^dCMT`5h5Fn^oa<%##Qu_syqNg))CBQ(tVu`=TAP}O#xHaX z-<6G(cMpt(^3c$DC9p9DoQaZn4qOZj+LR4p&FNcl3m`%x29E3HY>nnbZIo)8t_f^ z7H8^MXslX`CSDtAA0mLS0zdbTf0~q4G-HRj93-N*OI$Zf|giNa%b<4zer3~GP z+vi;_J(hk=`VH_6n{$cVw{ z4L^c50X22sX>FoHSmdy_*dpBjdSV2Iu^YB_)x775No)?bA*puOHG^mSb68HaTOh~I zMP4haSZWpNukzef+*CHUw$*>W=&{4o?sCdF{d&)Ha3y`aMbO5sEy(&O0RHZ~AWNS4 z)v*)gW&C(;qPJS2y88Q<;F$t`YM`M*VXzs`@$@0&Y)Q%bMlOB%sZuK58M+}2-A`tXPP|(IOk{@yB zDezNk#urCUh8Rb2J(*@ORUtq1M!agvUWj@q$Z@RIJp!4wpQ!G05Al9p3}I7K26+jq z{-H-@j1$ya4TQ}{T06JR`T-lZ=@YLcn()1s>$R24EmY;i0Q@8 z--Ab(J<6u<%UG+Y?CU*%8Iz_|Ol}U*+7KmfNUc6yc`;dy?QMqRmSJm_=JZ4TG1|sI zL-}}>Spr0H<$3q-X#YJ{>%D$RZcO)Isg9uM30QsC(72P_2*3XjAX8(B=%G<E9#{VRRAA%D{n;zaD&B7wjarLJzgN1=AiY*b4d$=&BRIU-t{y7j+hw%jlsMeZUN(jLPWxwwb3Z#tc@j9&mYO2srsCYi+;7H1v z_8{Fk__%I0GkbloG+^98NLcZk>dY6gWYk*?xNFv)qS3Iz5D<8fCH;xHix1ZK(Wc}N zX-oIFgVF;Jj3nwq29RNtu$RZUxyABlcTxwK$mVVLw|wSb_6@+*2t?`0D`k=`$3x13 zC~7nkp?$Q-d461c`ty}_g61a0c4OXm^jfk5ixzrtJLl+=cgf6+IhN)2(O%g&PlD&@ zsBTx3Z_ITK3rosWf2Sz+B_}8JeA#+#!j^idr}OZ8lE9~e_UP-i7U3R_;Aq6J`I!27 zq*AL^8BU3T;3(K>+CS0%D)q3kuzEc3EzXs4TCt5N<0G*T1WiJ&#Z5;|sBnB+EQsY!Bu3hPhwN5_#{dABTheIBQPPQi^BV@^Q}LY3A|f zd%$JMhglJAc7F1ySXWtm?;fl_DRlP29PJ zX9-*19BiW~xa7eEys>!tK3h?_WyD*LbWT%+bY`H2W2PM1{)U7md6l>`{ z&$X~JIZ&ZR8TadJ9mbdX5Lxd>tcwXh+%?>Rf(B4hgywr$D2h!iTnB#aJN?ZTJp9Mb zpAEQK_%5&cz_X#z((-ZI5Y$^hT3{q^4OS}yf0~M~(DJ&ll%3;jp6jgk&~jy?(GTd| zqJjZ}EB&R{z@Jxu!~P7O5-Fc4y{m0;cQiw18S-}L*=r_oYLPTMq@V;d4u1FnZMkoEfzan;epL9Y8t=j}1JtB`_Z zxl|)}_qWa)G&c}>k10cCg*LS$t81?VJp#v*>-Sxw!n3YhmlRf~86_X_lA1%M{Kx{pAV;ZqMl$Msj-St`k1zB_MnwAUN{m>hQ?Bnv$35q^Sd0YU(nl1rFZ@wgo?fVb2=D0 zN*^G`TS)&QWcrL@Ie+}CGuD2-pOiQ)gO=~h98fn;Gq_tnWCC0CxaUH)g4AskOsE#Z z6hN0tm)3ExKH(0>Md%<$0AYq_F3saguPUZiR}J9aHb&Z>S&hK+sI^F!eq80g;J6#k z5067VF>4)iP18FX7GG*h$sGY~1eL+A71?&28lh6=y24V{7zy*f2Ql@7r;_B)e<0{TH?@6fBfB-W217~29rqa68f$<0hL8R^O z5&mKkkK7mG>YWb3PR1_l!Zg#S;q0aPB~QX;N8y(G-~7>ENii7RDGE#jR1qVoeE&gh zlCsE^))nwLcy=T~+NJrO+)9@S!U9BxtkeCz6^V%eCVYbh6<9nau02s+$LzA--jfhZ zmuUy{Vg*5*iATR5Q*sy&#t`-thTNAV**Ya7Ll)Tx-=if5%Q7mmi^Gt;X91FC!GC|| z#fwO$*UjIL12CE-;91~oOH9CdcI3S^#Ulms$| zyofkTthqC9OoC7{9iYFD^zw2OGP3=Z85Kz*h8+46z4*2rQ7UZKcPk(wZ;xkTY$Dk@ zBB{>ndndcbT<6n+Qo0|N{e8MB&D|mhS_*+jB@e8Num{v~gz$w=h#?p0{b4h07 z!GGR8*W|F)bKNVYb25`2R7w)aQ>Cnf(Ql7_$Tc@PaVwSLOPy&v%mfBIdpAA;lZbta ztqrgxiUqXGPN?81bi}Yf=IXM^#s(AP=GDCP*POOa8P!eCHTm;WC?@bXgSw6Lur~%| zHUx)I z4gtkv8l&Ox9BWnl=8IVub$jYXBaYm3un>NeG^im8vAE3hbfihtG+>biWD#x+&OTb} zA85;}-+PL38Zr?uStTGL5|TThe(s?1lkmb{d-cy@=L@eceP!o!oQ895U_?OLFzDm> zZ9jlKU+5%wvd(M%tk{xLQ~RE_TcNkCWTj;1ub3azqdoG8JMN5N%*s~CRoga>^Y;M# z1@>6b*LDKY`BHY2l8$+cblqD2Z0Ozfia#10SF+%i;8?vlZ)^I~|5@TzTGjmdz|DThssGbCf0l5yXX3UxXk^blNL!{j10kKAwb@u zi$x(pP!DIDkZ;Nk6qNJL_Re)4U$R@#S58zgnk)4v%mf2cY8Fw*k;pQ|qaP;Th;!dT!tP2R5{$m{rx80NUI@2vF z&x8SX1h!^Ne11c$m~(pw6f+7*;>2k@WK|fBYvh{QsiaD$whIX&vgshj?jhGuCqc45 zjRP8S(x!LjR#NI$&iCWsG~}$Z_vITDOL3$OnhFNR$KfsDxI^@|BT<~#gRVNc4L4^h zrrCa^YMhSZsQR^Y#JwGj?VV661>HT(LwzVo_B~^e(U74u=#>}Dyzi*G&wL*`s`Q!` zsq+9CDHD@23smXjNKqN^Qkh zIT1h}(g;v_@lQjv;L#j5VrVpdC<}z7$#(g%6duFHRIutBsgUUvv>$RU#^z5B_~lgf$Z+*fGz?6zlh7L2yGH z-PqcDyt#4eN2R1o*9YGMQ^{5?Nq&St-V&AMDtiWp&vkP1!T-ScoZR*$vhY6P=)Ua~ z6|Tz+!tl({7?)yY&htX|=2qJxQ^kl{z0T<^OD0h|EPs66`Lw2t$a1i_a@)Raz*WqA ztj&p~*!hA?Y@gSYZ5~I8dv$$K1GeK~TE-v$2JHjKm1lN)p3Qf=5Srk@8VCRbq`7Zp z6n?s8yl84#Vq2!fzv=){@1m5s@4zEV!GVb8sZm$G=RTu0X@&TuQp@FX<)*P}F*rrk z>Pfk2xGO#EQ~afh(H&>(M!i*V%}$)#@>tzSZj~Dykmzp!V7g*D^v$H5GcS1|hyZK@ zpnO~R&LPwkV6L^d_bQ-OL`A~hfY1>w%u#JUpjep}2hL!W(eA=a=C;|>g4SibNOCtp zW)6vGZE^$w#@~|9KB52m$6h!G7%>uRDC9b(6sTBR`#i^sYtDSGI&+Hx&g2iiqeJqE z1_MFDulQ{X_VeKJ8DP&qOi}|Vk#HwZ7LHhuqkoM7{`y$i31~E zQm^s%u^V(v8xKq=EE~Eh2&1go+e9T69M-jZUhywD0xZ=r);6oSxJq9eQ?~dmFLR6b zlT_VejqhlE>FeFMfPuM>$?63RL3Zu|m-WtJp@m{)t%c1^^MUeH(&e2q>V?Uz0LYc* zRWVs7fnu^>QI3D3{?AB_K`$#~(%J3I#DmX~YMhk4MbkBovym$Z)B-?zof`oB0*<0B z6l-&yr;R(5`>H(@An6Z%s~_yjscuqA7C+Y-~Ns4KP_xEJ6}48z3W7Bed62Q`ISX9^5jAMjGUyO8IQXu6N$Q2ll}#PF*gE z@Y|*H@$#mh82A1AcB&FYSC^(zEVG}cnFY+d5c@6xzd|^Cah9^p6A;+ zTG8B(vq~}|#I%R&ZyqiuCh;S1pVNQGWr0Mo;*2$eN%&WTz3=V;)^o2j)PAjdt&6vy40setF6t+@ag)==Nyk;D4a<<3oN1f+6`?Cu-fft`XA?N7(p?#UUTKWz`qwoK}Py-CDMQW zD>D}yLOY^Pkm=$;)u`vn2M8C86}G0$JGBUNJ^S2fp!A{-iFh#&FZbM=xry}lo)iE@#Ky>-_&>X&-gv( zW}kkr^sKzhpHv%pSYK+{SEyYcIPNN*5C7HGFIF)06CCG>=X}a=4(b=8Jv+XLJQP@6 z#`b#RE8Szko4S{QRAN!+^hmVl4N}-wEQ;!h;yCC;AYf6!E0gXw+zSuxAs67K7Xt-Y zAi*hn`>~>Lr8_0$G zsv_r)O2Om01yMpbaWTgGTv-%r*5yPp9jW5#RC~nPUgnM^1(`EWp?Y%%ld`M zr$N#nKZ_sVZXodiz3}QfxMv6&tJbmjoZVi-_72(mL>9eXX1ul1XvS4EOc858TNPB? zzQ7(RX^D~9&6!u9s@9!`rE{(+`-e_YD|5h>VXiub2kWqsOWs4yP|(m)8^S|S0+mYC z+bh4}7x?zQ%`H{;4Uh|VBON9WkhTM?yM|(YhwgmJB*^%lmmR3^_x4K(P^w>t=o7^3 zTZ6nnvOkZoI0hha&^j!GctH4~?917{J=|uAH?5vENY( zK1RRKx*Cn%4(5BJmbnP51`~Dt2KBF5#YX0RYhq%k32g24=SLKCaMQyA&MJ+H8Pdoi z3FV<3XBuUPX&WED1uyls2>mdT<)*8Mbwd)xKx42 z!aHC(4wNomH`}k6rNanV3HP>4^{23-;RQ}`N2vS>S7-xKlQ;o7e6p!18sul4I{|1V z`YPsmsMjxLWy5a(i!l6GdLc}TRCNg`dA<2t;D@Z&KuI}RX|@_VaMxDyi!wbZ1tWxn zz-bP{4`=!R#RU|j_@??`B@(<9sx5lF@016}&%-97(S5MBw*l#56mz-n1?BKLt)GlC zq_2Z2CfJjp$|n`wqPswc28#VkEhH7SYlX~HA+O41$PETv2CYN}uR8a3C`)Al!;7tn z6P-_O2Y@weiuau|!Ki@6K$3TuZz|h(Z;tOt^FSJ9jlFtaeBE%|L%n(X`g?m_(KE-=2hPY+ zQSjVEf1Vwg&T#!apN~^sKdS>|M6;=Z;wkk<_1$ z%BG=Ag_4sClw{~|6vMBX+-MtqfBM`QqXvnp!T8&$7vP8rJQItf8KV!sz5czvIWWHO zanIG_4J{i(mI3!uk7ji#H4=o76uc=?$-vynpIeKIVltb}<`puo-_9Eh$#Vp8b%uu=6yC`}~Nc4|Kbe^IIaf)Jjo+5Iu?)7f^h)Vq7+$8?;ypqJIjQ>pvC&wpQ_zeAd zz~D257DId~JW{+6Ks%iFoH{wP(YmUr0?yE(LHc{wGJF_f2wrBH*3`m)nERQ|Gpjo6)k?WfAoO!-J@=7l8zxs!_N}(@+qYdeod@SL>Yc`iz?-((x|C8 z)47Qx214cSfr4l8x%KV?B(!{G3pk~tx!Pd+$GJh^f zEj}6&ktBOClLhfkG6HH%) z&EmY-lQwTtB+Lt7WX8WZT-c^b1dgpH(ajQ3`IL`9FMX5r zcCukO8wNNO2EF%4ElS$}f>;7F5!HR^)$^-Yx~T&I1nyN8p!HAfUnvfLW*^UwNaUE0 zXf9%ol_aNft>oKtGZQ=sVfhaPKK?shFc?JVBgFeCdeSn8XIqMxKWzs36?QLC2fEm3 zRA{^JWxu%X9timB=I#On>c1#~bV1dYSZaC{vM78#2e_atczk|fa)CW?E`0B|Q7L}( zPmDuQnPepL`VIA#%8)znJ(NHd$ZjR6H8hCG;9IwHkLXHl{pxdY8-E*e_3BlNK#~&3!Am9?yl?UE_f#N9pHD(5%K`Gc5xL-1n7xv)hMD#pk`A`PYxx(T&r!jas=ZFvfGaWH z4y`(u3lc*}kO;2)zdJOp320z+seqjVL+cJ`@CV>=GGT1_)(y>*Aj;?<6UQw1aQ%L7 zx6<3^`~X_VoxTuwmEz}Vg_8|(FWfVCxK{cK;J76!09Q%o@TN5x^9cz6G~RAi&Rd@+ zU(fDZrk%)zQ_9Ae@dj+hG{GUu_sHF)!lKIghoVh2XF@$SM*?S()C|P{dp{vgYAt;a zo3)7OavhcU5kXzGN^3K1 zsdWh=Hg9{6Ls4Eo<3>}a-s6eB?uL_ee(qdQhQX(qz6&Pzm2xsHkvj1dX;9Z>Uum|3 z1(nxB0<8fMm?Ua;>HD#Dq!?9k;7(IYthOJJCu5d7)RM?5EOWIHd%*SrlM=_M%jVb$ zRP)YKHYEv(dUnRY^!4mP*JlbE%Dn*Qxx{sU(3mm^CFI%)%{#P%A(W_dVi_yDk`lva z6TF|k@8rf^)s&@#hcCa~a;SdvTSp{|fYyu&2b+Y;#{xca+iG#K;r10W9}ofXIC9gX zN%Q`L2VmUmlyURAJJZ7}<{p!DTsEXcm04Fi9kj}FsE~J>i&VjxKC_XHxegmP`cd+sxta#qaCQwjv;&muX3Ov<$fzv6yOqSEu)Qbf;rEwsp z@GV8XYi`+mm3r%aE^Z{3y_ew*{SeIdv^(xY}>&qrM-P=Fd?dxI7hJ3gj3zt9nWw z?b+?8U19A$(D5t*ZaYQUm6{YRahr39nPV@#J=@;6yGkgzZ}boIn+Imarv)^XDU&4r zc4(*A^Vt+RwtE%dJ|8l{EUm1Bn9qHO_$G2fcTYAo8hN5X@{jW&T&Xu`^#YoBbfUv#vd#)I2>2XC z(k|UD@i?t1-kFMnCX+&bcw0uK>h4--_m0eYp9beNEG3S6fBRn6?SGkK0<#YEOxko< zNhn3aJlvjn#q+P@JovX3&C8qZZtF>;(6{akKtmY4|LhWYiB=;9Q+q>#v8Y{~aNSoi z>PDIkYBO#4!ElS7D8jNJM?vA&ua7+V$g$>SiCHT?!bj5I;g(_f+9(4!C=)B5R7^nq zjzv$${QzX)Q+I)jJVDO_oyYgQ&Fv>?z>bLCYW zSXGLy?%4`0gk{eEM-()f5eR~Ae*|3xqw6tRcQY}%F``R@b#wm3B=&iw)Ws9}0m21U zY)R5S-y*Y~ftqz-WGpl|Y0kZnew-E7h>*5BxQkr);#zbM)As!>B?~nQ1_@O7$f8lH zMHT=={G2j&1Kr6z5TLfosJ@-LHE$N6I2H%E#$qeYvyV7R6?XVJF92V5& z{~^N_C)6-VV>6cWMzH(MBO#-eJ;%A!5$sKEU4{U%*9Po#4tAvxqy&m50w6vlnhQ1aX7o?B z3fA%GgV&<2B5*}y#wGuA!tx)Xb283W82F_?S2Yo)agS=j&L5@>_` z_J!lJPG6ISM3{b8OCFJ7;>lC`$dTaG0qRmxub9li=MSJGl2XZ+CtDkJEeD?Rt8t5d z9X2yV{@hz@?x%T47@Oq^7(!62SkEb|Pa+49ruv|BBHU^3#O+O++TyYzDQR)^81dqT zAv*sC21hYQ?VdNvXA;Izubyx)o;k~e5Fh|Ys;L3F_s2OPe9H1SDLRoFIR*m3+fP0t ztCSKWq6>=zNAi8U$i#X3=H;?k&?c}`f6YHA^Fv(LGYVRTRTzL-d~%_e&-%y^+MTpe@bL+UCkgOCeE_02+IBy$*G~ZV{6wYJB#p!|Y3YW@i-?FWtv{rNoQu zB!JkWKQ{@0=`L2WFUsrk>e1ifep8l9Spotqp;x!Zn|XW}TDQaRvBKkI7Qj$Y!;?@D zfo%M!(W|5l63*8;67;=X>^8$;a2M1?^8 zN>i3Y5)X5`AKn#ubTBvhO`38>a$G@HtpwRrj|3(Qhr(?60pz8iJQ#yCD&UQhRI4F{r^mGY`4S3yv4WYTY#4f*?tboBrPx3Fw^ke4Uyw~q z>qvj50<{}JHxrq4z8@YylnQ2-@pLr}o=7LGV)^4fR zalk;+kj$wEi#{CFfnw2Ul3I&>_1>X%SgxmH^d`wyb^o#Ig=n;6oXNBg2pD%-7GY~v zs{8E^cKLV@EeeA*R13sZQ>Psn$@PFGj7G1+*6v=iOF3atMG8*Zb00qq>r!pG8kXx` z7d_d)^KEQh7*+!39XCMBw~h>~__ug^tG3)w4Y0Ys*auRl#O&ac0SY(|uGQty>GmCK zynP&MpoOzNFr9uy13pGIda6#0S6a(7^2`$v@)*m$9dbdN6=#ek#MGC~Cj&ufJ1ZkA`KBM_Ye4K1Vp_n}J zjX0Xayx^DQ14m*4w)Z2xHKa@1?)4e-m*l|7nhCl?FE`=Sm`-sl{;G+I(<)BWp94nAOm{L`{^Zn zq1rP(61Z|fTt7oVW02C;8T5a*ws%jsdy(CGV&?Y;Ev*_mSE z^}z#r;$TP<;)DIW=!FLNzDK5)_AYNcMK0`o7k0h%aMBVngA*bqchGWaL zSI{p?dWfXVHNTy z^}dhleqaV&ZZ!G`bOtV*6!JBG*&G-f@UauU%{{dL^Br^dwCe;+JXJ(7_!4eo?u_p5 zDvmA{61B zxV(T4vi^!c^(xNTCyjpp06h=#v@cn@xja*6V|q8Fh)tt&EL3Lo8_%%4pub@jixOVd z!Fxw3DaJNEBq{LD&Z(tEqS>GFu_*}V<4;~s*kdL(QWXKd!}+v*@?D_$(|>qfOjJc; z(L$v~Lq#TTgu#&X@5^6HVDmNCzF3|D?vnTp*pO;DB$zpXAGe_fr8s0Y>0vd=`j=Ny z9#!_P7z@Q&Uv^yScAXm(IvP;Delw#3GClwh+{{m%>wY6uud(v6h z-B2@LqrfAM)fsH>7TQOam%GzsYY@*3==VlQqyDQWtv&iH3cTm;s4A=mQy+n3!`P_m z!$gDlq3@B(4ZhVO2BR9*+)-DFuX~3P_=-{a1mM=c(09Ugde4)L?tFc&3lK3&@n5v= ze}2#i!sh>0yZg6q9(C@k?wi3}uXv-sf)9?_s&zU*8#X1k*Xffdn&Gfcw1xCPWBa1T|x+*E&|>j0)ye7<10@YzUGgAZ5t+f z1B0zh4)y1oI=BI9h1_rlz{)8bt6n)?68r+-UQyhXgXI5xm&4$=i@y?H`rW1h|0e+i NaYswF@Rs?r{{>owzGMIZ literal 0 HcmV?d00001 diff --git a/lectures/_static/lecture_specific/successive_approx.py b/lectures/_static/lecture_specific/successive_approx.py index 18ddbf4d..5d64d82f 100644 --- a/lectures/_static/lecture_specific/successive_approx.py +++ b/lectures/_static/lecture_specific/successive_approx.py @@ -1,21 +1,21 @@ -def successive_approx(T, # Operator (callable) - x_0, # Initial condition - tolerance=1e-6, # Error tolerance - max_iter=10_000, # Max iteration bound - print_step=25, # Print at multiples - verbose=False): - x = x_0 - error = tolerance + 1 - k = 1 - while error > tolerance and k <= max_iter: - x_new = T(x) +def successive_approx_jax(x_0, # Initial condition + constants, + sizes, + arrays, + tolerance=1e-6, # Error tolerance + max_iter=10_000): # Max iteration bound + + def body_fun(k_x_err): + k, x, error = k_x_err + x_new = T(x, constants, sizes, arrays) error = jnp.max(jnp.abs(x_new - x)) - if verbose and k % print_step == 0: - print(f"Completed iteration {k} with error {error}.") - x = x_new - k += 1 - if error > tolerance: - print(f"Warning: Iteration hit upper bound {max_iter}.") - elif verbose: - print(f"Terminated successfully in {k} iterations.") + return k + 1, x_new, error + + def cond_fun(k_x_err): + k, x, error = k_x_err + return jnp.logical_and(error > tolerance, k < max_iter) + + k, x, error = jax.lax.while_loop(cond_fun, body_fun, (1, x_0, tolerance + 1)) return x + +successive_approx_jax = jax.jit(successive_approx_jax, static_argnums=(2,)) diff --git a/lectures/_static/lecture_specific/vfi.py b/lectures/_static/lecture_specific/vfi.py index d4f1f7b7..e96a048f 100644 --- a/lectures/_static/lecture_specific/vfi.py +++ b/lectures/_static/lecture_specific/vfi.py @@ -2,8 +2,7 @@ def value_iteration(model, tol=1e-5): constants, sizes, arrays = model - _T = lambda v: T(v, constants, sizes, arrays) vz = jnp.zeros(sizes) - v_star = successive_approx(_T, vz, tolerance=tol) + v_star = successive_approx_jax(vz, constants, sizes, arrays, tolerance=tol) return get_greedy(v_star, constants, sizes, arrays) diff --git a/lectures/_static/quantecon-logo-transparent.png b/lectures/_static/quantecon-logo-transparent.png new file mode 100644 index 0000000000000000000000000000000000000000..e9ead46c4e0d229ddd015e28e4382aafda3737c8 GIT binary patch literal 50790 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 literal 0 HcmV?d00001 diff --git a/lectures/arellano.md b/lectures/arellano.md index 158c30a2..ab780288 100644 --- a/lectures/arellano.md +++ b/lectures/arellano.md @@ -5,6 +5,7 @@ jupytext: format_name: myst format_version: 0.13 jupytext_version: 1.15.2 + jupytext_version: 1.15.2 kernelspec: display_name: Python 3 (ipykernel) language: python @@ -371,17 +372,17 @@ probabilities. ```{code-cell} ipython3 ArellanoEconomy = namedtuple('ArellanoEconomy', ('β', # Time discount parameter - 'γ', # Utility parameter - 'r', # Lending rate - 'ρ', # Persistence in the income process - 'η', # Standard deviation of the income process - 'θ', # Prob of re-entering financial markets - 'B_size', # Grid size for bonds - 'y_size', # Grid size for income - 'P', # Markov matrix governing the income process - 'B_grid', # Bond unit grid - 'y_grid', # State values of the income process - 'def_y')) # Default income process + 'γ', # Utility parameter + 'r', # Lending rate + 'ρ', # Persistence in the income process + 'η', # Standard deviation of the income process + 'θ', # Prob of re-entering financial markets + 'B_size', # Grid size for bonds + 'y_size', # Grid size for income + 'P', # Markov matrix governing the income process + 'B_grid', # Bond unit grid + 'y_grid', # State values of the income process + 'def_y')) # Default income process ``` ```{code-cell} ipython3 @@ -401,6 +402,10 @@ def create_arellano(B_size=251, # Grid size for bonds mc = qe.markov.tauchen(y_size, ρ, η) y_grid, P = jnp.exp(mc.state_values), mc.P + # Put grids on the device + B_grid = jax.device_put(B_grid) + y_grid = jax.device_put(y_grid) + P = jax.device_put(P) # Put grids on the device B_grid = jax.device_put(B_grid) y_grid = jax.device_put(y_grid) @@ -472,6 +477,7 @@ def T_d(v_c, v_d, params, sizes, arrays): B_size, y_size = sizes P, B_grid, y_grid, def_y = arrays + B0_idx = jnp.searchsorted(B_grid, 1e-10) # Index at which B is near zero current_utility = u(def_y, γ) @@ -575,6 +581,12 @@ def solve(model, tol=1e-8, max_iter=10_000): β, γ, r, ρ, η, θ, B_size, y_size, P, B_grid, y_grid, def_y = model + params = β, γ, r, ρ, η, θ + sizes = B_size, y_size + arrays = P, B_grid, y_grid, def_y + + β, γ, r, ρ, η, θ, B_size, y_size, P, B_grid, y_grid, def_y = model + params = β, γ, r, ρ, η, θ sizes = B_size, y_size arrays = P, B_grid, y_grid, def_y @@ -605,6 +617,7 @@ Let's try solving the model. ```{code-cell} ipython3 :hide-output: false +ae = create_arellano() ae = create_arellano() ``` @@ -638,8 +651,10 @@ def simulate(model, T, v_c, v_d, q, B_star, key): """ # Unpack elements of the model B_size, y_size = model.B_size, model.y_size + B_size, y_size = model.B_size, model.y_size B_grid, y_grid, P = model.B_grid, model.y_grid, model.P + B0_idx = jnp.searchsorted(B_grid, 1e-10) # Index at which B is near zero # Set initial conditions @@ -705,15 +720,17 @@ exercises. The first figure shows the bond price schedule and replicates Figure 3 of {cite}`Are08`, where $ y_L $ and $ Y_H $ are particular below average and above average +{cite}`Are08`, where $ y_L $ and $ Y_H $ are particular below average and above average values of output $ y $. -![https://python-advanced.quantecon.org/_static/lecture_specific/arellano/arellano_bond_prices.png](https://python-advanced.quantecon.org/_static/lecture_specific/arellano/arellano_bond_prices.png) - +```{figure} _static/lecture_specific/arellano/arellano_bond_prices.png +``` - $ y_L $ is 5% below the mean of the $ y $ grid values - $ y_H $ is 5% above the mean of the $ y $ grid values +The grid used to compute this figure was relatively fine (`y_size, B_size = 51, 251`), which explains the minor differences between this and The grid used to compute this figure was relatively fine (`y_size, B_size = 51, 251`), which explains the minor differences between this and Arrelano’s figure. @@ -727,7 +744,8 @@ The figure shows that The next figure plots value functions and replicates the right hand panel of Figure 4 of {cite}`Are08`. -![https://python-advanced.quantecon.org/_static/lecture_specific/arellano/arellano_value_funcs.png](https://python-advanced.quantecon.org/_static/lecture_specific/arellano/arellano_value_funcs.png) +```{figure} _static/lecture_specific/arellano/arellano_value_funcs.png +``` We can use the results of the computation to study the default probability $ \delta(B', y) $ @@ -735,8 +753,8 @@ defined in {eq}`equation13_4`. The next plot shows these default probabilities over $ (B', y) $ as a heat map. -![https://python-advanced.quantecon.org/_static/lecture_specific/arellano/arellano_default_probs.png](https://python-advanced.quantecon.org/_static/lecture_specific/arellano/arellano_default_probs.png) - +```{figure} _static/lecture_specific/arellano/arellano_default_probs.png +``` As anticipated, the probability that the government chooses to default in the following period increases with indebtedness and falls with income. @@ -745,19 +763,15 @@ Next let’s run a time series simulation of $ \{y_t\} $, $ \{B_t\} $ and $ q(B_ The grey vertical bars correspond to periods when the economy is excluded from financial markets because of a past default. -![https://python-advanced.quantecon.org/_static/lecture_specific/arellano/arellano_time_series.png](https://python-advanced.quantecon.org/_static/lecture_specific/arellano/arellano_time_series.png) - +```{figure} _static/lecture_specific/arellano/arellano_time_series.png +``` One notable feature of the simulated data is the nonlinear response of interest rates. Periods of relative stability are followed by sharp spikes in the discount rate on government debt. -+++ - ## Exercises -+++ - ```{exercise-start} :label: arellano_ex1 ``` @@ -770,23 +784,21 @@ To the extent that you can, replicate the figures shown above ```{exercise-end} ``` -+++ - ```{solution-start} arellano_ex1 :class: dropdown ``` -Solution to this [exercise](https://python-advanced.quantecon.org/arellano.html#arella_ex1). - Compute the value function, policy and equilibrium prices ```{code-cell} ipython3 :hide-output: false +ae = create_arellano() ae = create_arellano() v_c, v_d, q, B_star = solve(ae) ``` +Compute the bond price schedule as seen in figure 3 of {cite}`Are08` Compute the bond price schedule as seen in figure 3 of {cite}`Are08` ```{code-cell} ipython3 @@ -795,6 +807,7 @@ Compute the bond price schedule as seen in figure 3 of {cite}`Are08` # Unpack some useful names B_grid, y_grid, P = ae.B_grid, ae.y_grid, ae.P B_size, y_size = ae.B_size, ae.y_size +B_size, y_size = ae.B_size, ae.y_size r = ae.r # Create "Y High" and "Y Low" values as 5% devs from mean @@ -809,6 +822,7 @@ x = [] q_low = [] q_high = [] for i, B in enumerate(B_grid): + if -0.35 <= B <= 0: # To match fig 3 of Arellano (2008) if -0.35 <= B <= 0: # To match fig 3 of Arellano (2008) x.append(B) q_low.append(q[i, iy_low]) diff --git a/lectures/cake_eating_numerical.md b/lectures/cake_eating_numerical.md index c537f170..adaf0405 100644 --- a/lectures/cake_eating_numerical.md +++ b/lectures/cake_eating_numerical.md @@ -25,7 +25,7 @@ In addition to what's in Anaconda, this lecture will need the following librarie ```{code-cell} ipython3 :tags: [hide-output] -!pip install interpolation quantecon +!pip install quantecon ``` We will use the following imports. @@ -324,7 +324,6 @@ for the purpose of comparing the results of JAX implementation. ```{code-cell} ipython3 import numpy as np from numba import prange, njit -from interpolation import interp from quantecon.optimize import brent_max ``` @@ -360,7 +359,7 @@ def state_action_value_numba(c, x, v_array, cem): * v_array: value function array guess, 1-D array * cem: Cake Eating Numba Model instance """ - return u_numba(c, cem) + cem.β * interp(cem.x_grid, v_array, x - c) + return u_numba(c, cem) + cem.β * np.interp(x - c, cem.x_grid, v_array) ``` ```{code-cell} ipython3 diff --git a/lectures/ifp_egm.md b/lectures/ifp_egm.md index cfe9c559..7a19b707 100644 --- a/lectures/ifp_egm.md +++ b/lectures/ifp_egm.md @@ -33,7 +33,7 @@ We will use the following libraries and imports. ```{code-cell} ipython3 :tags: [hide-output] -!pip install --upgrade quantecon interpolation +!pip install --upgrade quantecon ``` ```{code-cell} ipython3 @@ -43,7 +43,6 @@ import numpy as np import jax import jax.numpy as jnp -from interpolation import interp from numba import njit, float64 from numba.experimental import jitclass ``` @@ -483,7 +482,7 @@ def K_egm_nb(a_in, σ_in, ifp): # Linear interpolation of policy using endogenous grid def σ(a, z): - return interp(a_in[:, z], σ_in[:, z], a) + return np.interp(a, a_in[:, z], σ_in[:, z]) # Allocate memory for new consumption array σ_out = np.zeros_like(σ_in) diff --git a/lectures/intro.md b/lectures/intro.md index 3e9efcbc..4ddb3ad3 100644 --- a/lectures/intro.md +++ b/lectures/intro.md @@ -12,9 +12,7 @@ kernelspec: # Quantitative Economics with JAX This website presents a set of lectures on quantitative economic modeling -using GPUs and [Google JAX](https://jax.readthedocs.io). The lectures -are designed and written by [Thomas J. Sargent](http://www.tomsargent.com/) and -[John Stachurski](https://johnstachurski.net/). +using GPUs and [Google JAX](https://jax.readthedocs.io). ```{tableofcontents} diff --git a/lectures/inventory_dynamics.md b/lectures/inventory_dynamics.md index 188a976b..96e1f7e6 100644 --- a/lectures/inventory_dynamics.md +++ b/lectures/inventory_dynamics.md @@ -27,10 +27,6 @@ kernelspec: ```{index} single: Markov process, inventory ``` -```{contents} Contents -:depth: 2 -``` - ## Overview This lecture explores JAX implementations of the exercises in the lecture on [inventory dynamics](https://python.quantecon.org/inventory_dynamics.html). diff --git a/lectures/kesten_processes.md b/lectures/kesten_processes.md index f58d361c..f67d933c 100644 --- a/lectures/kesten_processes.md +++ b/lectures/kesten_processes.md @@ -24,10 +24,6 @@ kernelspec: ```{index} single: Linear State Space Models ``` -```{contents} Contents -:depth: 2 -``` - ```{include} _admonition/gpu.md ``` diff --git a/lectures/markov_asset.md b/lectures/markov_asset.md index 06ca809d..6403b6c9 100644 --- a/lectures/markov_asset.md +++ b/lectures/markov_asset.md @@ -4,7 +4,7 @@ jupytext: extension: .md format_name: myst format_version: 0.13 - jupytext_version: 1.14.5 + jupytext_version: 1.16.1 kernelspec: display_name: Python 3 (ipykernel) language: python @@ -13,6 +13,8 @@ kernelspec: # An Asset Pricing Problem +```{include} _admonition/gpu.md +``` ## Overview @@ -31,12 +33,10 @@ you can jump to [](eq:ntecx2). The code outputs below are generated by machine connected to the following GPU - ```{code-cell} ipython3 !nvidia-smi ``` - In addition to what's in Anaconda, this lecture will need the following libraries: ```{code-cell} ipython3 @@ -410,7 +410,7 @@ def create_model(N=100, # size of state space for Markov chain σ=0.01, # persistence parameter for Markov chain β=0.98, # discount factor γ=2.5, # coefficient of risk aversion - μ_c=0.01, # mean growth of consumtion + μ_c=0.01, # mean growth of consumption μ_d=0.01, # mean growth of dividends σ_c=0.02, # consumption volatility σ_d=0.04): # dividend volatility @@ -431,14 +431,14 @@ Here's a function that does this using loops. ```{code-cell} ipython3 def compute_K_loop(model): - # Setp up + # unpack P, S, β, γ, μ_c, μ_d, σ_c, σ_d = model N = len(S) K = np.empty((N, N)) a = μ_d - γ * μ_c for i, x in enumerate(S): for j, y in enumerate(S): - e = jnp.exp(a + (1 - γ) * x + (σ_d**2 + γ**2 * σ_c**2) / 2) + e = np.exp(a + (1 - γ) * x + (σ_d**2 + γ**2 * σ_c**2) / 2) K[i, j] = β * e * P[i, j] return K ``` @@ -447,24 +447,24 @@ To exploit the parallelization capabilities of JAX, let's also write a vectorize ```{code-cell} ipython3 def compute_K(model): - # Setp up + # unpack P, S, β, γ, μ_c, μ_d, σ_c, σ_d = model N = len(S) # Reshape and multiply pointwise using broadcasting - x = jnp.reshape(S, (N, 1)) + x = np.reshape(S, (N, 1)) a = μ_d - γ * μ_c - e = jnp.exp(a + (1 - γ) * x + (σ_d**2 + γ**2 * σ_c**2) / 2) + e = np.exp(a + (1 - γ) * x + (σ_d**2 + γ**2 * σ_c**2) / 2) K = β * e * P return K ``` -These two functions produce the saem output: +These two functions produce the same output: ```{code-cell} ipython3 model = create_model(N=10) K1 = compute_K(model) K2 = compute_K_loop(model) -jnp.allclose(K1, K2) +np.allclose(K1, K2) ``` Now we can compute the price-dividend ratio: @@ -492,9 +492,9 @@ def price_dividend_ratio(model, test_stable=True): test_stability(K) # Compute v - I = jnp.identity(N) - ones_vec = jnp.ones(N) - v = jnp.linalg.solve(I - K, K @ ones_vec) + I = np.identity(N) + ones_vec = np.ones(N) + v = np.linalg.solve(I - K, K @ ones_vec) return v ``` @@ -504,7 +504,7 @@ Here's a plot of $v$ as a function of the state for several values of $\gamma$. ```{code-cell} ipython3 model = create_model() S = model.S -γs = jnp.linspace(2.0, 3.0, 5) +γs = np.linspace(2.0, 3.0, 5) fig, ax = plt.subplots() @@ -701,7 +701,7 @@ def create_sv_model(β=0.98, # discount factor bar_σ=0.01, # volatility scaling parameter ρ_z=0.9, # persistence parameter for z σ_z=0.01, # persistence parameter for z - μ_c=0.001, # mean growth of consumtion + μ_c=0.001, # mean growth of consumption μ_d=0.005): # mean growth of dividends mc = qe.tauchen(I, ρ_c, σ_c) @@ -763,7 +763,7 @@ def sv_pd_ratio(sv_model, test_stable=True): price-dividend ratio """ - # Setp up + # unpack P, hc_grid, Q, hd_grid, R, z_grid, β, γ, bar_σ, μ_c, μ_d = sv_model I, J, K = len(hc_grid), len(hd_grid), len(z_grid) N = I * J * K @@ -862,12 +862,12 @@ def compute_A_jax(sv_model, shapes): I, J, K = shapes N = I * J * K # Reshape and broadcast over (i, j, k, i', j', k') - hc = np.reshape(hc_grid, (I, 1, 1, 1, 1, 1)) - hd = np.reshape(hd_grid, (1, J, 1, 1, 1, 1)) - z = np.reshape(z_grid, (1, 1, K, 1, 1, 1)) - P = np.reshape(P, (I, 1, 1, I, 1, 1)) - Q = np.reshape(Q, (1, J, 1, 1, J, 1)) - R = np.reshape(R, (1, 1, K, 1, 1, K)) + hc = jnp.reshape(hc_grid, (I, 1, 1, 1, 1, 1)) + hd = jnp.reshape(hd_grid, (1, J, 1, 1, 1, 1)) + z = jnp.reshape(z_grid, (1, 1, K, 1, 1, 1)) + P = jnp.reshape(P, (I, 1, 1, I, 1, 1)) + Q = jnp.reshape(Q, (1, J, 1, 1, J, 1)) + R = jnp.reshape(R, (1, 1, K, 1, 1, K)) # Compute A and then reshape to create a matrix a = μ_d - γ * μ_c b = bar_σ**2 * (jnp.exp(2 * hd) + γ**2 * jnp.exp(2 * hc)) / 2 @@ -896,7 +896,7 @@ def sv_pd_ratio_jax(sv_model, shapes): price-dividend ratio """ - # Setp up + # unpack P, hc_grid, Q, hd_grid, R, z_grid, β, γ, bar_σ, μ_c, μ_d = sv_model I, J, K = len(hc_grid), len(hd_grid), len(z_grid) shapes = I, J, K @@ -971,13 +971,13 @@ def A(g, sv_model, shapes): P, hc_grid, Q, hd_grid, R, z_grid, β, γ, bar_σ, μ_c, μ_d = sv_model I, J, K = shapes # Reshape and broadcast over (i, j, k, i', j', k') - hc = np.reshape(hc_grid, (I, 1, 1, 1, 1, 1)) - hd = np.reshape(hd_grid, (1, J, 1, 1, 1, 1)) - z = np.reshape(z_grid, (1, 1, K, 1, 1, 1)) - P = np.reshape(P, (I, 1, 1, I, 1, 1)) - Q = np.reshape(Q, (1, J, 1, 1, J, 1)) - R = np.reshape(R, (1, 1, K, 1, 1, K)) - g = np.reshape(g, (1, 1, 1, I, J, K)) + hc = jnp.reshape(hc_grid, (I, 1, 1, 1, 1, 1)) + hd = jnp.reshape(hd_grid, (1, J, 1, 1, 1, 1)) + z = jnp.reshape(z_grid, (1, 1, K, 1, 1, 1)) + P = jnp.reshape(P, (I, 1, 1, I, 1, 1)) + Q = jnp.reshape(Q, (1, J, 1, 1, J, 1)) + R = jnp.reshape(R, (1, 1, K, 1, 1, K)) + g = jnp.reshape(g, (1, 1, 1, I, J, K)) a = μ_d - γ * μ_c b = bar_σ**2 * (jnp.exp(2 * hd) + γ**2 * jnp.exp(2 * hc)) / 2 κ = jnp.exp(a + (1 - γ) * z + b) @@ -991,12 +991,10 @@ that acts directly on the linear operator `A`. ```{code-cell} ipython3 def sv_pd_ratio_linop(sv_model, shapes): - - # Setp up P, hc_grid, Q, hd_grid, R, z_grid, β, γ, bar_σ, μ_c, μ_d = sv_model I, J, K = shapes - ones_array = np.ones((I, J, K)) + ones_array = jnp.ones((I, J, K)) # Set up the operator g -> (I - A) g J = lambda g: g - A(g, sv_model, shapes) # Solve v = (I - A)^{-1} A 1 diff --git a/lectures/mle.md b/lectures/mle.md index 1432e6c8..9194465d 100644 --- a/lectures/mle.md +++ b/lectures/mle.md @@ -13,10 +13,6 @@ kernelspec: # Maximum Likelihood Estimation -```{contents} Contents -:depth: 2 -``` - ```{include} _admonition/gpu.md ``` diff --git a/lectures/opt_invest.md b/lectures/opt_invest.md index 20f1e6fa..ca01135c 100644 --- a/lectures/opt_invest.md +++ b/lectures/opt_invest.md @@ -4,14 +4,13 @@ jupytext: extension: .md format_name: myst format_version: 0.13 - jupytext_version: 1.14.5 + jupytext_version: 1.16.1 kernelspec: display_name: Python 3 (ipykernel) language: python name: python3 --- - # Optimal Investment ```{include} _admonition/gpu.md @@ -76,14 +75,6 @@ We will use 64 bit floats with JAX in order to increase the precision. jax.config.update("jax_enable_x64", True) ``` - -We need the following successive approximation function. - -```{code-cell} ipython3 -:load: _static/lecture_specific/successive_approx.py -``` - - Let's define a function to create an investment model using the given parameters. ```{code-cell} ipython3 @@ -113,7 +104,6 @@ def create_investment_model( return constants, sizes, arrays ``` - Let's re-write the vectorized version of the right-hand side of the Bellman equation (before maximization), which is a 3D array representing @@ -183,7 +173,6 @@ def compute_r_σ(σ, constants, sizes, arrays): compute_r_σ = jax.jit(compute_r_σ, static_argnums=(2,)) ``` - Define the Bellman operator. ```{code-cell} ipython3 @@ -194,7 +183,6 @@ def T(v, constants, sizes, arrays): T = jax.jit(T, static_argnums=(2,)) ``` - The following function computes a v-greedy policy. ```{code-cell} ipython3 @@ -205,7 +193,6 @@ def get_greedy(v, constants, sizes, arrays): get_greedy = jax.jit(get_greedy, static_argnums=(2,)) ``` - Define the $\sigma$-policy operator. ```{code-cell} ipython3 @@ -236,7 +223,6 @@ def T_σ(v, σ, constants, sizes, arrays): T_σ = jax.jit(T_σ, static_argnums=(3,)) ``` - Next, we want to computes the lifetime value of following policy $\sigma$. This lifetime value is a function $v_\sigma$ that satisfies @@ -285,8 +271,7 @@ def L_σ(v, σ, constants, sizes, arrays): L_σ = jax.jit(L_σ, static_argnums=(3,)) ``` -Now we can define a function to compute $v_{\sigma}$ - +Now we can define a function to compute $v_{\sigma}$ ```{code-cell} ipython3 def get_value(σ, constants, sizes, arrays): @@ -306,6 +291,11 @@ def get_value(σ, constants, sizes, arrays): get_value = jax.jit(get_value, static_argnums=(2,)) ``` +We use successive approximation for VFI. + +```{code-cell} ipython3 +:load: _static/lecture_specific/successive_approx.py +``` Finally, we introduce the solvers that implement VFI, HPI and OPI. @@ -355,7 +345,6 @@ print(out) print(f"OPI completed in {elapsed} seconds.") ``` - Here's the plot of the Howard policy, as a function of $y$ at the highest and lowest values of $z$. ```{code-cell} ipython3 @@ -377,7 +366,6 @@ ax.legend(fontsize=12) plt.show() ``` - Let's plot the time taken by each of the solvers and compare them. ```{code-cell} ipython3 @@ -403,6 +391,7 @@ print(f"VFI completed in {vfi_time} seconds.") ```{code-cell} ipython3 :tags: [hide-output] + opi_times = [] for m in m_vals: print(f"Running optimistic policy iteration with m={m}.") diff --git a/lectures/opt_savings.md b/lectures/opt_savings.md index de1fd9f2..7468fe93 100644 --- a/lectures/opt_savings.md +++ b/lectures/opt_savings.md @@ -4,7 +4,7 @@ jupytext: extension: .md format_name: myst format_version: 0.13 - jupytext_version: 1.14.5 + jupytext_version: 1.16.1 kernelspec: display_name: Python 3 (ipykernel) language: python @@ -65,20 +65,13 @@ where $$ u(c) = \frac{c^{1-\gamma}}{1-\gamma} $$ -+++ - -We use successive approximation for VFI. - -```{code-cell} ipython3 -:load: _static/lecture_specific/successive_approx.py -``` ## Model primitives First we define a model that stores parameters and grids ```{code-cell} ipython3 -def create_consumption_model(R=1.01, # Gross interest rate +def create_consumption_model(R=1.01, # Gross interest rate β=0.98, # Discount factor γ=2, # CRRA parameter w_min=0.01, # Min wealth @@ -140,8 +133,6 @@ which is defined as the vector $$ r_\sigma(w, y) := r(w, y, \sigma(w, y)) $$ - - ```{code-cell} ipython3 def compute_r_σ(σ, constants, sizes, arrays): """ @@ -187,9 +178,9 @@ def T_σ(v, σ, constants, sizes, arrays): Q = jnp.reshape(Q, (1, y_size, y_size)) # Calculate the expected sum Σ_jp v[σ[i, j], jp] * Q[i, j, jp] - Ev = jnp.sum(V * Q, axis=2) + EV = jnp.sum(V * Q, axis=2) - return r_σ + β * Ev + return r_σ + β * EV ``` and the Bellman operator $T$ @@ -260,7 +251,7 @@ def L_σ(v, σ, constants, sizes, arrays): return v - β * jnp.sum(V * Q, axis=2) ``` -Now we can define a function to compute $v_{\sigma}$ +Now we can define a function to compute $v_{\sigma}$ ```{code-cell} ipython3 def get_value(σ, constants, sizes, arrays): @@ -291,6 +282,12 @@ T_σ = jax.jit(T_σ, static_argnums=(3,)) L_σ = jax.jit(L_σ, static_argnums=(3,)) ``` +We use successive approximation for VFI. + +```{code-cell} ipython3 +:load: _static/lecture_specific/successive_approx.py +``` + ## Solvers Now we define the solvers, which implement VFI, HPI and OPI. @@ -353,7 +350,7 @@ print("Starting VFI.") start_time = time.time() out = value_iteration(model) elapsed = time.time() - start_time -print(f"VFI(jax not in succ) completed in {elapsed} seconds.") +print(f"VFI completed in {elapsed} seconds.") ``` ```{code-cell} ipython3 From 3a3d23a7cd06231fc216ea048c5e8ae8c33d929e Mon Sep 17 00:00:00 2001 From: shlff Date: Tue, 5 Mar 2024 16:49:47 +1100 Subject: [PATCH 07/11] tidyup --- lectures/arellano.md | 82 -------------------------------------------- 1 file changed, 82 deletions(-) diff --git a/lectures/arellano.md b/lectures/arellano.md index b6665f69..83ea7e90 100644 --- a/lectures/arellano.md +++ b/lectures/arellano.md @@ -5,10 +5,6 @@ jupytext: format_name: myst format_version: 0.13 jupytext_version: 1.15.2 -<<<<<<< HEAD - jupytext_version: 1.15.2 -======= ->>>>>>> ff86e0fd39571a8a7965cd8f9c588d44310d538e kernelspec: display_name: Python 3 (ipykernel) language: python @@ -374,7 +370,6 @@ We define a namedtuple to store parameters, grids and transition probabilities. ```{code-cell} ipython3 -<<<<<<< HEAD ArellanoEconomy = namedtuple('ArellanoEconomy', ('β', # Time discount parameter 'γ', # Utility parameter 'r', # Lending rate @@ -394,18 +389,6 @@ def create_arellano(B_size=251, # Grid size for bonds B_min=-0.45, # Smallest B value B_max=0.45, # Largest B value y_size=51, # Grid size for income -======= -Arellano_Economy = namedtuple('Arellano_Economy', ('β', 'γ', 'r', 'ρ', 'η', 'θ', \ - 'B_size', 'y_size', \ - 'P', 'B_grid', 'y_grid', 'def_y')) -``` - -```{code-cell} ipython3 -def create_arellano(B_size=251, # Grid size for bonds - B_min=-0.45, # Smallest B value - B_max=0.45, # Largest B value - y_size=51, # Grid size for income ->>>>>>> ff86e0fd39571a8a7965cd8f9c588d44310d538e β=0.953, # Time discount parameter γ=2.0, # Utility parameter r=0.017, # Lending rate @@ -422,24 +405,16 @@ def create_arellano(B_size=251, # Grid size for bonds B_grid = jax.device_put(B_grid) y_grid = jax.device_put(y_grid) P = jax.device_put(P) -<<<<<<< HEAD # Put grids on the device B_grid = jax.device_put(B_grid) y_grid = jax.device_put(y_grid) P = jax.device_put(P) -======= ->>>>>>> ff86e0fd39571a8a7965cd8f9c588d44310d538e # Output received while in default, with same shape as y_grid def_y = jnp.minimum(def_y_param * jnp.mean(y_grid), y_grid) -<<<<<<< HEAD return ArellanoEconomy(β=β, γ=γ, r=r, ρ=ρ, η=η, θ=θ, B_size=B_size, y_size=y_size, P=P, B_grid=B_grid, y_grid=y_grid, -======= - return Arellano_Economy(β=β, γ=γ, r=r, ρ=ρ, η=η, θ=θ, B_size=B_size, \ - y_size=y_size, P=P, B_grid=B_grid, y_grid=y_grid, \ ->>>>>>> ff86e0fd39571a8a7965cd8f9c588d44310d538e def_y=def_y) ``` @@ -501,10 +476,7 @@ def T_d(v_c, v_d, params, sizes, arrays): B_size, y_size = sizes P, B_grid, y_grid, def_y = arrays -<<<<<<< HEAD -======= ->>>>>>> ff86e0fd39571a8a7965cd8f9c588d44310d538e B0_idx = jnp.searchsorted(B_grid, 1e-10) # Index at which B is near zero current_utility = u(def_y, γ) @@ -589,11 +561,7 @@ def update_values_and_prices(v_c, v_d, params, sizes, arrays): return new_v_c, new_v_d ``` -<<<<<<< HEAD We can now write a function that will use an instance of `ArellanoEconomy` and -======= -We can now write a function that will use an instance of `Arellano_Economy` and ->>>>>>> ff86e0fd39571a8a7965cd8f9c588d44310d538e the functions defined above to compute the solution to our model. One of the jobs of this function is to take an instance of @@ -605,11 +573,7 @@ down to more basic objects, which are then passed out to jitted functions. def solve(model, tol=1e-8, max_iter=10_000): """ -<<<<<<< HEAD Given an instance of `ArellanoEconomy`, this function computes the optimal -======= - Given an instance of `Arellano_Economy`, this function computes the optimal ->>>>>>> ff86e0fd39571a8a7965cd8f9c588d44310d538e policy and value functions. """ # Unpack @@ -619,15 +583,12 @@ def solve(model, tol=1e-8, max_iter=10_000): params = β, γ, r, ρ, η, θ sizes = B_size, y_size arrays = P, B_grid, y_grid, def_y -<<<<<<< HEAD β, γ, r, ρ, η, θ, B_size, y_size, P, B_grid, y_grid, def_y = model params = β, γ, r, ρ, η, θ sizes = B_size, y_size arrays = P, B_grid, y_grid, def_y -======= ->>>>>>> ff86e0fd39571a8a7965cd8f9c588d44310d538e # Initial conditions for v_c and v_d v_c = jnp.zeros((B_size, y_size)) @@ -656,10 +617,6 @@ Let's try solving the model. :hide-output: false ae = create_arellano() -<<<<<<< HEAD -ae = create_arellano() -======= ->>>>>>> ff86e0fd39571a8a7965cd8f9c588d44310d538e ``` ```{code-cell} ipython3 @@ -692,15 +649,8 @@ def simulate(model, T, v_c, v_d, q, B_star, key): """ # Unpack elements of the model B_size, y_size = model.B_size, model.y_size -<<<<<<< HEAD - B_size, y_size = model.B_size, model.y_size B_grid, y_grid, P = model.B_grid, model.y_grid, model.P - -======= - B_grid, y_grid, P = model.B_grid, model.y_grid, model.P - ->>>>>>> ff86e0fd39571a8a7965cd8f9c588d44310d538e B0_idx = jnp.searchsorted(B_grid, 1e-10) # Index at which B is near zero # Set initial conditions @@ -757,11 +707,7 @@ def simulate(model, T, v_c, v_d, q, B_star, key): Let’s start by trying to replicate the results obtained in {cite}`Are08`. -<<<<<<< HEAD In what follows, all results are computed using parameter values of `ArellanoEconomy` created by `create_arellano`. -======= -In what follows, all results are computed using parameter values of `Arellano_Economy` created by `create_arellano`. ->>>>>>> ff86e0fd39571a8a7965cd8f9c588d44310d538e For example, `r=0.017` matches the average quarterly rate on a 5 year US treasury over the period 1983–2001. @@ -770,10 +716,6 @@ exercises. The first figure shows the bond price schedule and replicates Figure 3 of {cite}`Are08`, where $ y_L $ and $ Y_H $ are particular below average and above average -<<<<<<< HEAD -{cite}`Are08`, where $ y_L $ and $ Y_H $ are particular below average and above average -======= ->>>>>>> ff86e0fd39571a8a7965cd8f9c588d44310d538e values of output $ y $. ```{figure} _static/lecture_specific/arellano/arellano_bond_prices.png @@ -784,10 +726,6 @@ values of output $ y $. The grid used to compute this figure was relatively fine (`y_size, B_size = 51, 251`), which explains the minor differences between this and -<<<<<<< HEAD -The grid used to compute this figure was relatively fine (`y_size, B_size = 51, 251`), which explains the minor differences between this and -======= ->>>>>>> ff86e0fd39571a8a7965cd8f9c588d44310d538e Arrelano’s figure. The figure shows that @@ -834,11 +772,7 @@ Periods of relative stability are followed by sharp spikes in the discount rate To the extent that you can, replicate the figures shown above -<<<<<<< HEAD - Use the parameter values listed as defaults in `ArellanoEconomy` created by `create_arellano`. -======= -- Use the parameter values listed as defaults in `Arellano_Economy` created by `create_arellano`. ->>>>>>> ff86e0fd39571a8a7965cd8f9c588d44310d538e - The time series will of course vary depending on the shock draws. ```{exercise-end} @@ -854,18 +788,10 @@ Compute the value function, policy and equilibrium prices :hide-output: false ae = create_arellano() -<<<<<<< HEAD -ae = create_arellano() -======= ->>>>>>> ff86e0fd39571a8a7965cd8f9c588d44310d538e v_c, v_d, q, B_star = solve(ae) ``` Compute the bond price schedule as seen in figure 3 of {cite}`Are08` -<<<<<<< HEAD -Compute the bond price schedule as seen in figure 3 of {cite}`Are08` -======= ->>>>>>> ff86e0fd39571a8a7965cd8f9c588d44310d538e ```{code-cell} ipython3 :hide-output: false @@ -873,10 +799,6 @@ Compute the bond price schedule as seen in figure 3 of {cite}`Are08` # Unpack some useful names B_grid, y_grid, P = ae.B_grid, ae.y_grid, ae.P B_size, y_size = ae.B_size, ae.y_size -<<<<<<< HEAD -B_size, y_size = ae.B_size, ae.y_size -======= ->>>>>>> ff86e0fd39571a8a7965cd8f9c588d44310d538e r = ae.r # Create "Y High" and "Y Low" values as 5% devs from mean @@ -892,10 +814,6 @@ q_low = [] q_high = [] for i, B in enumerate(B_grid): if -0.35 <= B <= 0: # To match fig 3 of Arellano (2008) -<<<<<<< HEAD - if -0.35 <= B <= 0: # To match fig 3 of Arellano (2008) -======= ->>>>>>> ff86e0fd39571a8a7965cd8f9c588d44310d538e x.append(B) q_low.append(q[i, iy_low]) q_high.append(q[i, iy_high]) From 90bf9c7cc0244e0e4d689776b95a25d2abe91005 Mon Sep 17 00:00:00 2001 From: shlff Date: Tue, 5 Mar 2024 17:08:27 +1100 Subject: [PATCH 08/11] further_tidyup --- lectures/arellano.md | 121 +++++++++++++++++++++---------------------- 1 file changed, 59 insertions(+), 62 deletions(-) diff --git a/lectures/arellano.md b/lectures/arellano.md index 83ea7e90..fddfb97d 100644 --- a/lectures/arellano.md +++ b/lectures/arellano.md @@ -53,8 +53,8 @@ including - high volatility of consumption relative to output -Notably, long recessions caused by bad draws in the income process increase the government’s -incentive to default. +Notably, long recessions caused by bad draws in the income process increase +the government’s incentive to default. This can lead to @@ -100,8 +100,8 @@ In this section we describe the main features of the model. ### Output, Consumption and Debt -A small open economy is endowed with an exogenous stochastically fluctuating potential output -stream $ \{y_t\} $. +A small open economy is endowed with an exogenous stochastically fluctuating +potential output stream $ \{y_t\} $. Potential output is realized only in periods in which the government honors its sovereign debt. @@ -122,21 +122,22 @@ Here - $ u $ is an increasing and strictly concave utility function -Consumption sequences enjoyed by households are affected by the government’s decision to borrow or -lend internationally. +Consumption sequences enjoyed by households are affected by the government’s +decision to borrow or lend internationally. The government is benevolent in the sense that its aim is to maximize {eq}`equation13_1`. The government is the only domestic actor with access to foreign credit. -Because households are averse to consumption fluctuations, the government will try to smooth -consumption by borrowing from (and lending to) foreign creditors. +Because households are averse to consumption fluctuations, the government will +try to smooth consumption by borrowing from (and lending to) foreign creditors. +++ ### Asset Markets -The only credit instrument available to the government is a one-period bond traded in international credit markets. +The only credit instrument available to the government is a one-period bond +traded in international credit markets. The bond market has the following features @@ -144,19 +145,19 @@ The bond market has the following features - A purchase of a bond with face value $ B' $ is a claim to $ B' $ units of the consumption good next period. - To purchase $ B' $ next period costs $ q B' $ now, or, what is equivalent. -- For selling $ -B' $ units of next period goods the seller earns $ - q B' $ of today’s - goods. - - If $ B' < 0 $, then $ -q B' $ units of the good are received in the current period, - for a promise to repay $ -B' $ units next period. - - There is an equilibrium price function $ q(B', y) $ that makes $ q $ depend on both - $ B' $ and $ y $. +- For selling $ -B' $ units of next period goods the seller earns $ - q B' $ of + today’s goods. + - If $ B' < 0 $, then $ -q B' $ units of the good are received in the current + period, for a promise to repay $ -B' $ units next period. + - There is an equilibrium price function $ q(B', y) $ that makes $ q $ depend + on both $ B' $ and $ y $. -Earnings on the government portfolio are distributed (or, if negative, taxed) lump sum to -households. +Earnings on the government portfolio are distributed (or, if negative, taxed) +lump sum to households. -When the government is not excluded from financial markets, the one-period national budget -constraint is +When the government is not excluded from financial markets, the one-period +national budget constraint is $$ c = y + B - q(B', y) B' @@ -177,8 +178,8 @@ Foreign creditors - are risk neutral - know the domestic output stochastic process $ \{y_t\} $ and observe $ y_t, y_{t-1}, \ldots, $ at time $ t $ -- can borrow or lend without limit in an international credit market at a constant international - interest rate $ r $ +- can borrow or lend without limit in an international credit market + at a constant international interest rate $ r $ - receive full payment if the government chooses to pay - receive zero if the government defaults on its one-period debt due @@ -201,8 +202,8 @@ Next we turn to how the government in effect chooses the default probability $ \ At each point in time $ t $, the government chooses between 1. defaulting -1. meeting its current obligations and purchasing or selling an optimal quantity of one-period - sovereign debt +1. meeting its current obligations and purchasing or selling an optimal quantity + of one-period sovereign debt Defaulting means declining to repay all of its current obligations. @@ -220,8 +221,8 @@ But a sovereign default has two consequences: ### Reentering International Credit Market -While in a state of default, the economy regains access to foreign credit in each subsequent -period with probability $ \theta $. +While in a state of default, the economy regains access to foreign credit +in each subsequent period with probability $ \theta $. +++ @@ -234,16 +235,16 @@ sequence of government default decisions and an implied flow of household consum 1. The government maximizes household utility taking into account - the resource constraint - the effect of its choices on the price of bonds - - consequences of defaulting now for future net output and future borrowing and lending - opportunities + - consequences of defaulting now for future net output and future borrowing + and lending opportunities 1. The interest rate on the government’s debt includes a risk-premium sufficient to make foreign creditors expect on average to earn the constant risk-free international interest rate. To express these ideas more precisely, consider first the choices of the government, which -1. enters a period with initial assets $ B $, or what is the same thing, initial debt to be - repaid now of $ -B $ +1. enters a period with initial assets $ B $, or what is the same thing, + initial debt to be repaid now of $ -B $ 1. observes current output $ y $, and 1. chooses either 1. to default, or @@ -253,14 +254,14 @@ To express these ideas more precisely, consider first the choices of the governm In a recursive formulation, - state variables for the government comprise the pair $ (B, y) $ -- $ v(B, y) $ is the optimum value of the government’s problem when at the beginning of a - period it faces the choice of whether to honor or default +- $ v(B, y) $ is the optimum value of the government’s problem when + at the beginning of a period it faces the choice of whether to honor or default - $ v_c(B, y) $ is the value of choosing to pay obligations falling due - $ v_d(y) $ is the value of choosing to default -$ v_d(y) $ does not depend on $ B $ because, when access to credit is eventually regained, -net foreign assets equal $ 0 $. +$ v_d(y) $ does not depend on $ B $ because, when access to credit is +eventually regained, net foreign assets equal $ 0 $. Expressed recursively, the value of defaulting is @@ -300,8 +301,8 @@ $$ \delta(B', y) := \int \mathbb 1\{v_c(B', y') < v_d(y') \} p(y, y') dy' $$ (equation13_4) -Given zero profits for foreign creditors in equilibrium, we can combine {eq}`equation13_3` and {eq}`equation13_4` -to pin down the bond price function: +Given zero profits for foreign creditors in equilibrium, we can combine +{eq}`equation13_3` and {eq}`equation13_4` to pin down the bond price function: $$ q(B', y) = \frac{1 - \delta(B', y)}{1 + r} @@ -315,17 +316,17 @@ An *equilibrium* is - a pricing function $ q(B',y) $, - a triple of value functions $ (v_c(B, y), v_d(y), v(B,y)) $, -- a decision rule telling the government when to default and when to pay as a function of the state - $ (B, y) $, and -- an asset accumulation rule that, conditional on choosing not to default, maps $ (B,y) $ into - $ B' $ +- a decision rule telling the government when to default and when to pay as + a function of the state $ (B, y) $, and +- an asset accumulation rule that, conditional on choosing not to default, + maps $ (B,y) $ into $ B' $ such that - The three Bellman equations for $ (v_c(B, y), v_d(y), v(B,y)) $ are satisfied -- Given the price function $ q(B',y) $, the default decision rule and the asset accumulation - decision rule attain the optimal value function $ v(B,y) $, and +- Given the price function $ q(B',y) $, the default decision rule and the asset + accumulation decision rule attain the optimal value function $ v(B,y) $, and - The price function $ q(B',y) $ satisfies equation {eq}`equation13_5` +++ @@ -370,18 +371,19 @@ We define a namedtuple to store parameters, grids and transition probabilities. ```{code-cell} ipython3 -ArellanoEconomy = namedtuple('ArellanoEconomy', ('β', # Time discount parameter - 'γ', # Utility parameter - 'r', # Lending rate - 'ρ', # Persistence in the income process - 'η', # Standard deviation of the income process - 'θ', # Prob of re-entering financial markets - 'B_size', # Grid size for bonds - 'y_size', # Grid size for income - 'P', # Markov matrix governing the income process - 'B_grid', # Bond unit grid - 'y_grid', # State values of the income process - 'def_y')) # Default income process +ArellanoEconomy = namedtuple('ArellanoEconomy', + ('β', # Time discount parameter + 'γ', # Utility parameter + 'r', # Lending rate + 'ρ', # Persistence in the income process + 'η', # Standard deviation of the income process + 'θ', # Prob of re-entering financial markets + 'B_size', # Grid size for bonds + 'y_size', # Grid size for income + 'P', # Markov matrix governing the income process + 'B_grid', # Bond unit grid + 'y_grid', # State values of the income process + 'def_y')) # Default income process ``` ```{code-cell} ipython3 @@ -402,12 +404,6 @@ def create_arellano(B_size=251, # Grid size for bonds y_grid, P = jnp.exp(mc.state_values), mc.P # Put grids on the device - B_grid = jax.device_put(B_grid) - y_grid = jax.device_put(y_grid) - P = jax.device_put(P) - # Put grids on the device - B_grid = jax.device_put(B_grid) - y_grid = jax.device_put(y_grid) P = jax.device_put(P) # Output received while in default, with same shape as y_grid @@ -537,7 +533,8 @@ def get_greedy(v_c, v_d, q, params, sizes, arrays): return jnp.argmax(vals, axis=2) ``` -Let's make JIT-compiled versions of these functions, with the sizes of the arrays declared as static (compile-time constants) in order to help the compiler. +Let's make JIT-compiled versions of these functions, with the sizes of the arrays +declared as static (compile-time constants) in order to help the compiler. ```{code-cell} ipython3 compute_q = jax.jit(compute_q, static_argnums=(3,)) @@ -725,8 +722,8 @@ values of output $ y $. - $ y_H $ is 5% above the mean of the $ y $ grid values -The grid used to compute this figure was relatively fine (`y_size, B_size = 51, 251`), which explains the minor differences between this and -Arrelano’s figure. +The grid used to compute this figure was relatively fine (`y_size, B_size = 51, 251`), +which explains the minor differences between this and Arrelano’s figure. The figure shows that From 0dfa2b3afdaacb2c95edb6b622155fb98b28d61f Mon Sep 17 00:00:00 2001 From: shlff Date: Tue, 5 Mar 2024 18:02:56 +1100 Subject: [PATCH 09/11] edits --- lectures/arellano.md | 46 ++++++++++++++++++++++---------------------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/lectures/arellano.md b/lectures/arellano.md index fddfb97d..c093450a 100644 --- a/lectures/arellano.md +++ b/lectures/arellano.md @@ -372,30 +372,30 @@ probabilities. ```{code-cell} ipython3 ArellanoEconomy = namedtuple('ArellanoEconomy', - ('β', # Time discount parameter - 'γ', # Utility parameter - 'r', # Lending rate - 'ρ', # Persistence in the income process - 'η', # Standard deviation of the income process - 'θ', # Prob of re-entering financial markets - 'B_size', # Grid size for bonds - 'y_size', # Grid size for income - 'P', # Markov matrix governing the income process - 'B_grid', # Bond unit grid - 'y_grid', # State values of the income process - 'def_y')) # Default income process + ('β', # Time discount parameter + 'γ', # Utility parameter + 'r', # Lending rate + 'ρ', # Persistence in the income process + 'η', # Standard deviation of the income process + 'θ', # Prob of re-entering financial markets + 'B_size', # Grid size for bonds + 'y_size', # Grid size for income + 'P', # Markov matrix governing the income process + 'B_grid', # Bond unit grid + 'y_grid', # State values of the income process + 'def_y')) # Default income process ``` ```{code-cell} ipython3 -def create_arellano(B_size=251, # Grid size for bonds - B_min=-0.45, # Smallest B value - B_max=0.45, # Largest B value - y_size=51, # Grid size for income - β=0.953, # Time discount parameter - γ=2.0, # Utility parameter - r=0.017, # Lending rate - ρ=0.945, # Persistence in the income process - η=0.025, # Standard deviation of the income process +def create_arellano(B_size=251, # Grid size for bonds + B_min=-0.45, # Smallest B value + B_max=0.45, # Largest B value + y_size=51, # Grid size for income + β=0.953, # Time discount parameter + γ=2.0, # Utility parameter + r=0.017, # Lending rate + ρ=0.945, # Persistence in the income process + η=0.025, # Standard deviation of the income process θ=0.282, # Prob of re-entering financial markets def_y_param=0.969): # Parameter governing income in default # Set up grids @@ -533,8 +533,8 @@ def get_greedy(v_c, v_d, q, params, sizes, arrays): return jnp.argmax(vals, axis=2) ``` -Let's make JIT-compiled versions of these functions, with the sizes of the arrays -declared as static (compile-time constants) in order to help the compiler. +Let's make JIT-compiled versions of these functions, with the sizes of the +arrays declared as static (compile-time constants) in order to help the compiler. ```{code-cell} ipython3 compute_q = jax.jit(compute_q, static_argnums=(3,)) From cf734ef857375708efcbe24288aecda5318cdd42 Mon Sep 17 00:00:00 2001 From: shlff Date: Tue, 5 Mar 2024 18:05:35 +1100 Subject: [PATCH 10/11] minor_edits --- lectures/arellano.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lectures/arellano.md b/lectures/arellano.md index c093450a..96f16676 100644 --- a/lectures/arellano.md +++ b/lectures/arellano.md @@ -596,7 +596,8 @@ def solve(model, tol=1e-8, max_iter=10_000): while (current_iter < max_iter) and (error > tol): if current_iter % 100 == 0: print(f"Entering iteration {current_iter} with error {error}.") - new_v_c, new_v_d = update_values_and_prices(v_c, v_d, params, sizes, arrays) + new_v_c, new_v_d = update_values_and_prices(v_c, v_d, params, + sizes, arrays) error = jnp.max(jnp.abs(new_v_c - v_c)) + jnp.max(jnp.abs(new_v_d - v_d)) v_c, v_d = new_v_c, new_v_d current_iter += 1 From a3723f0affa07e754517868d70db844cdcbda78b Mon Sep 17 00:00:00 2001 From: John Stachurski Date: Tue, 5 Mar 2024 19:57:38 +1100 Subject: [PATCH 11/11] misc --- lectures/arellano.md | 48 +++++++++++++++++++++++--------------------- 1 file changed, 25 insertions(+), 23 deletions(-) diff --git a/lectures/arellano.md b/lectures/arellano.md index 96f16676..ec3982a3 100644 --- a/lectures/arellano.md +++ b/lectures/arellano.md @@ -372,32 +372,33 @@ probabilities. ```{code-cell} ipython3 ArellanoEconomy = namedtuple('ArellanoEconomy', - ('β', # Time discount parameter - 'γ', # Utility parameter - 'r', # Lending rate - 'ρ', # Persistence in the income process - 'η', # Standard deviation of the income process - 'θ', # Prob of re-entering financial markets - 'B_size', # Grid size for bonds - 'y_size', # Grid size for income - 'P', # Markov matrix governing the income process - 'B_grid', # Bond unit grid - 'y_grid', # State values of the income process - 'def_y')) # Default income process + ('β', # Time discount parameter + 'γ', # Utility parameter + 'r', # Lending rate + 'ρ', # Persistence in the income process + 'η', # Standard deviation of the income process + 'θ', # Prob of re-entering financial markets + 'B_size', # Grid size for bonds + 'y_size', # Grid size for income + 'P', # Markov matrix governing the income process + 'B_grid', # Bond unit grid + 'y_grid', # State values of the income process + 'def_y')) # Default income process ``` ```{code-cell} ipython3 def create_arellano(B_size=251, # Grid size for bonds - B_min=-0.45, # Smallest B value - B_max=0.45, # Largest B value - y_size=51, # Grid size for income - β=0.953, # Time discount parameter - γ=2.0, # Utility parameter - r=0.017, # Lending rate - ρ=0.945, # Persistence in the income process - η=0.025, # Standard deviation of the income process - θ=0.282, # Prob of re-entering financial markets - def_y_param=0.969): # Parameter governing income in default + B_min=-0.45, # Smallest B value + B_max=0.45, # Largest B value + y_size=51, # Grid size for income + β=0.953, # Time discount parameter + γ=2.0, # Utility parameter + r=0.017, # Lending rate + ρ=0.945, # Persistence in the income process + η=0.025, # Standard deviation of the income process + θ=0.282, # Prob of re-entering financial markets + def_y_param=0.969): # Parameter governing income in default + # Set up grids B_grid = jnp.linspace(B_min, B_max, B_size) mc = qe.markov.tauchen(y_size, ρ, η) @@ -410,7 +411,8 @@ def create_arellano(B_size=251, # Grid size for bonds def_y = jnp.minimum(def_y_param * jnp.mean(y_grid), y_grid) return ArellanoEconomy(β=β, γ=γ, r=r, ρ=ρ, η=η, θ=θ, B_size=B_size, - y_size=y_size, P=P, B_grid=B_grid, y_grid=y_grid, + y_size=y_size, P=P, + B_grid=B_grid, y_grid=y_grid, def_y=def_y) ```