{
"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"
]
},
"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"
]
},
"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
}