{ "cells": [ { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "# El Modelo Neoclásico de Crecimiento Estocástico, Programación Dinámica Estocástica e Iteración de la Función Valor\n", "\n", "Mauricio M. Tejada\n", "\n", "ILADES - Universidad Alberto Hurtado" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "### El Problema de Opmización \n", "\n", "El problema de optimización del planificador central es el siguiente:\n", "\\begin{eqnarray*}\n", "\\max U_{0} & = & E_0 \\sum_{t=0}^{\\infty}\\beta^{t}\\ln c_{t}\\\\\n", "s.a & & c_{t}+i_{t}=A_t k_{t}^{\\alpha}\\\\\n", " & & k_{t+1}=i_{t}\\\\\n", " & & k_{0},A_0 \\ dados.\n", "\\end{eqnarray*}\n", "\n", "Alternativamente:\n", "\\begin{eqnarray*}\n", "\\max U_{0} & = & E_0 \\sum_{t=0}^{\\infty}\\beta^{t}\\ln c_{t}\\\\\n", "s.a & & c_{t}+k_{t+1}=A_t k_{t}^{\\alpha}\\\\\n", " & & k_{0},A_0 \\ dados.\n", "\\end{eqnarray*}\n", "\n", "La productividad es una cadena de Markov con el espacio de estados dado por: $S = \\{A_L,A_H\\}$ y la matriz de transición caraterizada por: $\\Pr[A_L|A_L] = p$ y $\\Pr[A_H|A_H] = q$." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "La ecuación de Bellman es:\n", "$$\n", "v(k_{t},A_{t})=\\max_{k_{t+1}}\\left\\{ \\log\\left(A_tk_{t}^{\\alpha}-k_{t+1}\\right)+\\beta E_t[v(k_{t+1},A_{t+1})]\\right\\} \n", "$$\n", "\n", "Escribiendo explícitamente la expectativa tenemos:\n", "\n", "$$\n", "v(k_{t},A_L)=\\max_{k_{t+1}}\\left\\{ \\log\\left(A_L k_{t}^{\\alpha}-k_{t+1}\\right)+\\beta [p v(k_{t+1},A_L) + (1-p)v(k_{t+1},A_H) ]\\right\\} \n", "$$\n", "\n", "$$\n", "v(k_{t},A_H)=\\max_{k_{t+1}}\\left\\{ \\log\\left(A_H k_{t}^{\\alpha}-k_{t+1}\\right)+\\beta [(1-q) v(k_{t+1},A_L) + qv(k_{t+1},A_H) ]\\right\\} \n", "$$\n", "\n", "La solución del problema funcional está dada por la función valor y la función de política:\n", "\n", "$$\n", "v(k_{k},z_t)\\,\\,y\\,\\,k_{t+1}=g(k_{t},z_t)\n", "$$" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "### Implementación Solución Numérica\n", "\n", "Algoritmo:\n", "\n", "1. Definir un grid de puntos $k$ (discretización) y realizar una conjetura para $v(k,A)$ en cada posible punto del grid y para cada valor de $A$. \n", "2. Usando la conjetura evaluar el operador $Tv$ para cada punto en el grid (esto implica resolver el $\\max$).\n", "3. Evaluar si $v=Tv$ (usando algún grado de tolerancia), en tal caso terminar el proceso. Caso contrario volver al punto 2 usando la función valor resultante.\n", "\n", "En términos de la ecuación de Bellman, la iteración sería:\n", "$$\n", "v_{j+1}(k,A)=\\max_{k'}\\left\\{ \\ln\\left(Ak^{\\alpha}-k'\\right)+\\beta E[v_{j}(k',A')]\\right\\} \n", "$$\n", "\n", "Partir con algún $v_{0}(k,A)$. " ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "slideshow": { "slide_type": "slide" } }, "outputs": [ { "data": { "text/plain": [ "500" ] }, "execution_count": 1, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Discretizamos la variable de estado. Definimos primero el número de puntos en el grid de k\n", "n = 500" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Parametros del modelo:" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "AL = 0.8 # tecnologia en estado bajo\n", "AH = 1.2 # tecnologia en estado alto\n", "Avec = [AL, AH]\n", "p = 0.65 # \\Pr[A_L|A_L] = p\n", "q = 0.65 # \\Pr[A_H|A_H] = q\n", "α = 0.36 # participacion del capital \n", "β = 0.9; # factor de descuento \n", "\n", "crit = 1e-6; # valor critico de convergencia" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "Encontramos la distribución invariante de $A$ para calcular el estado estacionario del modelo:" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Distribución invariante: [0.5 0.5]\n" ] } ], "source": [ "# Distribución invariante de A. Inicializamos la distribución\n", "π0 = [0.5, 0.5]'\n", "P = [p 1-p; 1-q q]\n", "\n", "dif_pi = 1\n", "π1 = similar(π0)\n", "\n", "while dif_pi > crit\n", " \n", " global π0, π1, dif_pi\n", " \n", " π1 = π0*P\n", " dif_pi = abs(maximum(π1 - π0))\n", " π0 = copy(π1)\n", "end\n", "\n", "println(\"Distribución invariante: $π0\")" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "Definimos el grid de puntos de $k$ como $k_1,...,k_n \\in [0.6k^*,1.4k^*]$" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "k de estado estacionario: 0.17188048815558038\n" ] } ], "source": [ "# Calcular kss y definir kgrid \n", "kss = ((π0[1,1]*AL + π0[1,2]*AH)*α*β)^(1/(1-α)) # capital en EE \n", "kgrid = kss * collect(range(0.6,stop=1.4,length=n)); # n x 1 \n", "\n", "println(\"k de estado estacionario: $kss\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Note que mientras más puntos tengamos en el grid, más precisión tendremos." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "El siguiente paso es iterar la función valor partiendo de la siguiente conjetura:\n", "$$\n", "v_{0}(k,A)=\\left[\\begin{array}{cc}\n", "0 & 0\\\\\n", "\\vdots & \\vdots \\\\\n", "0 & 0\n", "\\end{array}\\right]\n", "$$" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "# Definir valores inciales\n", "\n", "val0 = zeros(n,2); # Conjetura Inicial " ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "slideshow": { "slide_type": "slide" } }, "outputs": [], "source": [ "# Paquetes necesarios\n", "using Optim\n", "using Interpolations" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Usamos interpolación lineal para evaluar la función entre los puntos definidos en el grid del capital y para cada valor de $A$, por ejemplo:" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [], "source": [ "v_interpolate_L = LinearInterpolation(kgrid, val0[:,1], extrapolation_bc = Line())\n", "v_interpolate_H = LinearInterpolation(kgrid, val0[:,2], extrapolation_bc = Line());" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "Resolvemos usando el método de iteración de la función valor:" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Convergencia = 8.156625312949473e-7\n" ] } ], "source": [ "diff_val = 1\n", "val1 = zeros(n,2) # Vector para guardar la función valor\n", "kdeci = zeros(n,2) # Vector para guardar la función de política \n", "\n", "while diff_val > crit\n", " \n", "global val0, val1, kdeci, diff_val\n", "\n", "for j = 1:2\n", " A = Avec[j]\n", " PT = P[j,:]\n", "\n", " v_interpolate_L = LinearInterpolation(kgrid, val0[:,1], extrapolation_bc = Line())\n", " v_interpolate_H = LinearInterpolation(kgrid, val0[:,2], extrapolation_bc = Line()) \n", " Tv(k,kf) = log(A*k^α-kf) + β*(PT[1]*v_interpolate_L(kf) + PT[2]*v_interpolate_H(kf))\n", "\n", " for i in 1:n\n", " res = optimize(x -> -Tv(kgrid[i],x), 1e-10, A*kgrid[i]^α)\n", " kdeci[i,j] = res.minimizer\n", " val1[i,j] = -res.minimum\n", " end\n", "\n", "end\n", "\n", "diff_val = abs(maximum(val1-val0)) \n", "val0 = copy(val1) \n", "end\n", "\n", "println(\"Convergencia = $diff_val\");" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "### Gráficos" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [], "source": [ "using LaTeXStrings\n", "using Plots" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "Función de política:" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "\n", "\n", "\n", " \n", " \n", " \n", "\n", "\n", "\n", " \n", " \n", " \n", "\n", "\n", "\n", " \n", " \n", " \n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "plot(kgrid, kdeci, title = \"Función de Política\", \n", " xlabel = L\"k(t)\", ylabel = L\"k(t+1)\", label=[L\"A=A_L\" L\"A=A_H\"], \n", " linewidth = 2, grid = true, line=[:solid :dot], color=[:red :blue])" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "Función valor:" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "\n", "\n", "\n", " \n", " \n", " \n", "\n", "\n", "\n", " \n", " \n", " \n", "\n", "\n", " \n", " \n", " \n", "\n", "\n", "\n", " \n", " \n", " \n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "plot(kgrid, val1, title = \"Función Valor\", \n", " xlabel = L\"k(t)\", ylabel = L\"v(k(t))\", label=[L\"A=A_L\" L\"A=A_H\"], \n", " linewidth = 2, grid = true, line=[:solid :dot], color=[:red :blue])" ] } ], "metadata": { "kernelspec": { "display_name": "Julia 1.6.2", "language": "julia", "name": "julia-1.6" }, "language_info": { "file_extension": ".jl", "mimetype": "application/julia", "name": "julia", "version": "1.6.3" } }, "nbformat": 4, "nbformat_minor": 4 }