Created
February 12, 2018 00:08
-
-
Save chriselrod/f30fdfadccd8413000f0703a7cc6f8a5 to your computer and use it in GitHub Desktop.
Quant Econ - Numba and Julia
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"cells": [ | |
{ | |
"cell_type": "code", | |
"execution_count": 3, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"mainOld (generic function with 2 methods)" | |
] | |
}, | |
"execution_count": 3, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"using Compat, BenchmarkTools\n", | |
"\n", | |
"\n", | |
"function mainNew(verbose = true)\n", | |
" ## 1. Calibration\n", | |
"\n", | |
" α = 1/3 # Elasticity of output w.r.t. capital\n", | |
" β = 0.95 # Discount factor\n", | |
"\n", | |
" # Productivity values\n", | |
" vProductivity = [0.9792 0.9896 1.0000 1.0106 1.0212]\n", | |
"\n", | |
" # Transition matrix\n", | |
" mTransition = [0.9727 0.0273 0.0000 0.0000 0.0000;\n", | |
" 0.0041 0.9806 0.0153 0.0000 0.0000;\n", | |
" 0.0000 0.0082 0.9837 0.0082 0.0000;\n", | |
" 0.0000 0.0000 0.0153 0.9806 0.0041;\n", | |
" 0.0000 0.0000 0.0000 0.0273 0.9727]\n", | |
"\n", | |
" # 2. Steady State\n", | |
"\n", | |
" capitalSteadyState = (α*β)^(1/(1-α))\n", | |
" outputSteadyState = capitalSteadyState^α\n", | |
" consumptionSteadyState = outputSteadyState-capitalSteadyState\n", | |
"\n", | |
" verbose && println(\"Output = \",outputSteadyState,\" Capital = \",capitalSteadyState,\" Consumption = \",consumptionSteadyState)\n", | |
"\n", | |
" # We generate the grid of capital\n", | |
" vGridCapital = collect(0.5*capitalSteadyState:0.00001:1.5*capitalSteadyState)\n", | |
" #vGridCapital = 0.5*capitalSteadyState:0.00001:1.5*capitalSteadyState\n", | |
"\n", | |
" nGridCapital = length(vGridCapital)\n", | |
" nGridProductivity = length(vProductivity)\n", | |
"\n", | |
" # 3. Required matrices and vectors\n", | |
"\n", | |
" mOutput = Matrix{Float64}(uninitialized, nGridCapital, nGridProductivity)\n", | |
" mValueFunction = fill(0.0, nGridCapital, nGridProductivity)\n", | |
" mValueFunctionNew = Matrix{Float64}(uninitialized, nGridCapital,nGridProductivity)\n", | |
" mPolicyFunction = Matrix{Float64}(uninitialized, nGridCapital,nGridProductivity)\n", | |
" expectedValueFunction = Matrix{Float64}(uninitialized, nGridCapital, nGridProductivity)\n", | |
"\n", | |
" # 4. We pre-build output for each point in the grid\n", | |
"\n", | |
" @. mOutput = vGridCapital^ α * vProductivity;\n", | |
"\n", | |
" # 5. Main iteration\n", | |
"\n", | |
" maxDifference = 10.0\n", | |
" tolerance = 0.0000001\n", | |
" iteration = 0\n", | |
"\n", | |
" while(maxDifference > tolerance)\n", | |
" #A_mul_Bt! for Julia < 0.7\n", | |
" A_mul_Bt!(expectedValueFunction, mValueFunction, mTransition)\n", | |
"# mul!(expectedValueFunction, mValueFunction, mTransition')\n", | |
"\n", | |
" @inbounds for nProductivity in 1:nGridProductivity\n", | |
"\n", | |
" # We start from previous choice (monotonicity of policy function)\n", | |
" gridCapitalNextPeriod = 1\n", | |
"\n", | |
" for nCapital in 1:nGridCapital\n", | |
"\n", | |
" valueHighSoFar = -1000.0\n", | |
" capitalChoice = vGridCapital[1]\n", | |
"\n", | |
" for nCapitalNextPeriod in gridCapitalNextPeriod:nGridCapital\n", | |
"\n", | |
" consumption = mOutput[nCapital,nProductivity]-vGridCapital[nCapitalNextPeriod]\n", | |
" valueProvisional = (1-β)*log(consumption)+β*expectedValueFunction[nCapitalNextPeriod,nProductivity]\n", | |
"\n", | |
" if (valueProvisional>valueHighSoFar)\n", | |
" \t valueHighSoFar = valueProvisional\n", | |
" \t capitalChoice = vGridCapital[nCapitalNextPeriod]\n", | |
" \t gridCapitalNextPeriod = nCapitalNextPeriod\n", | |
" else\n", | |
" \t break # We break when we have achieved the max\n", | |
" end\n", | |
"\n", | |
" end\n", | |
"\n", | |
" mValueFunctionNew[nCapital,nProductivity] = valueHighSoFar\n", | |
" mPolicyFunction[nCapital,nProductivity] = capitalChoice\n", | |
"\n", | |
" end\n", | |
"\n", | |
" end\n", | |
" \n", | |
" # I can write into expectedValueFunction, because we are about to\n", | |
" # overwrite it anyway on the start of the next iteration.\n", | |
" @. expectedValueFunction = abs(mValueFunctionNew-mValueFunction)\n", | |
" maxDifference = maximum(expectedValueFunction)\n", | |
" mValueFunction, mValueFunctionNew = mValueFunctionNew, mValueFunction\n", | |
" \n", | |
" iteration = iteration+1\n", | |
" if verbose && (mod(iteration,10)==0 || iteration == 1)\n", | |
" println(\" Iteration = \", iteration, \" Sup Diff = \", maxDifference)\n", | |
" end\n", | |
"\n", | |
" end\n", | |
"\n", | |
" if verbose\n", | |
" println(\" Iteration = \", iteration, \" Sup Diff = \", maxDifference)\n", | |
" println(\" \")\n", | |
" println(\" My check = \", mPolicyFunction[1000,3])\n", | |
" println(\" My check = \", mValueFunction[1000,3])\n", | |
" end\n", | |
" return iteration, maxDifference, mPolicyFunction[1000,3], mValueFunction[1000,3]\n", | |
"\n", | |
"end\n", | |
"\n", | |
"\n", | |
"function mainOld(verbose = true)\n", | |
"\n", | |
" ## 1. Calibration\n", | |
"\n", | |
" α = 1/3 # Elasticity of output w.r.t. capital\n", | |
" β = 0.95 # Discount factor\n", | |
"\n", | |
" # Productivity values\n", | |
" vProductivity = [0.9792 0.9896 1.0000 1.0106 1.0212]\n", | |
"\n", | |
" # Transition matrix\n", | |
" mTransition = [0.9727 0.0273 0.0000 0.0000 0.0000;\n", | |
" 0.0041 0.9806 0.0153 0.0000 0.0000;\n", | |
" 0.0000 0.0082 0.9837 0.0082 0.0000;\n", | |
" 0.0000 0.0000 0.0153 0.9806 0.0041;\n", | |
" 0.0000 0.0000 0.0000 0.0273 0.9727]\n", | |
"\n", | |
" # 2. Steady State\n", | |
"\n", | |
" capitalSteadyState = (α*β)^(1/(1-α))\n", | |
" outputSteadyState = capitalSteadyState^α\n", | |
" consumptionSteadyState = outputSteadyState-capitalSteadyState\n", | |
"\n", | |
" verbose && println(\"Output = \",outputSteadyState,\" Capital = \",capitalSteadyState,\" Consumption = \",consumptionSteadyState)\n", | |
"\n", | |
" # We generate the grid of capital\n", | |
" vGridCapital = collect(0.5*capitalSteadyState:0.00001:1.5*capitalSteadyState)\n", | |
"\n", | |
" nGridCapital = length(vGridCapital)\n", | |
" nGridProductivity = length(vProductivity)\n", | |
"\n", | |
" # 3. Required matrices and vectors\n", | |
"\n", | |
" mOutput = zeros(nGridCapital,nGridProductivity)\n", | |
" mValueFunction = zeros(nGridCapital,nGridProductivity)\n", | |
" mValueFunctionNew = zeros(nGridCapital,nGridProductivity)\n", | |
" mPolicyFunction = zeros(nGridCapital,nGridProductivity)\n", | |
" expectedValueFunction = zeros(nGridCapital,nGridProductivity)\n", | |
"\n", | |
" # 4. We pre-build output for each point in the grid\n", | |
"\n", | |
" mOutput = (vGridCapital.^α)*vProductivity;\n", | |
"\n", | |
" # 5. Main iteration\n", | |
"\n", | |
" maxDifference = 10.0\n", | |
" tolerance = 0.0000001\n", | |
" iteration = 0\n", | |
"\n", | |
" while(maxDifference > tolerance)\n", | |
" expectedValueFunction = mValueFunction*mTransition';\n", | |
"\n", | |
" for nProductivity in 1:nGridProductivity\n", | |
"\n", | |
" # We start from previous choice (monotonicity of policy function)\n", | |
" gridCapitalNextPeriod = 1\n", | |
"\n", | |
" for nCapital in 1:nGridCapital\n", | |
"\n", | |
" valueHighSoFar = -1000.0\n", | |
" capitalChoice = vGridCapital[1]\n", | |
"\n", | |
" for nCapitalNextPeriod in gridCapitalNextPeriod:nGridCapital\n", | |
"\n", | |
" consumption = mOutput[nCapital,nProductivity]-vGridCapital[nCapitalNextPeriod]\n", | |
" valueProvisional = (1-β)*log(consumption)+β*expectedValueFunction[nCapitalNextPeriod,nProductivity]\n", | |
"\n", | |
" if (valueProvisional>valueHighSoFar)\n", | |
" \t valueHighSoFar = valueProvisional\n", | |
" \t capitalChoice = vGridCapital[nCapitalNextPeriod]\n", | |
" \t gridCapitalNextPeriod = nCapitalNextPeriod\n", | |
" else\n", | |
" \t break # We break when we have achieved the max\n", | |
" end\n", | |
"\n", | |
" end\n", | |
"\n", | |
" mValueFunctionNew[nCapital,nProductivity] = valueHighSoFar\n", | |
" mPolicyFunction[nCapital,nProductivity] = capitalChoice\n", | |
"\n", | |
" end\n", | |
"\n", | |
" end\n", | |
" \n", | |
" maxDifference = maximum(abs.(mValueFunctionNew-mValueFunction))\n", | |
" mValueFunction, mValueFunctionNew = mValueFunctionNew, mValueFunction\n", | |
" \n", | |
" iteration = iteration+1\n", | |
" if verbose && (mod(iteration,10)==0 || iteration == 1)\n", | |
" println(\" Iteration = \", iteration, \" Sup Diff = \", maxDifference)\n", | |
" end\n", | |
"\n", | |
" end\n", | |
"\n", | |
"\n", | |
" if verbose\n", | |
" println(\" Iteration = \", iteration, \" Sup Diff = \", maxDifference)\n", | |
" println(\" \")\n", | |
" println(\" My check = \", mPolicyFunction[1000,3])\n", | |
" println(\" My check = \", mValueFunction[1000,3])\n", | |
" end\n", | |
" return iteration, maxDifference, mPolicyFunction[1000,3], mValueFunction[1000,3]\n", | |
"\n", | |
"\n", | |
"end" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 4, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"Output = 0.5627314338711378 Capital = 0.178198287392527 Consumption = 0.3845331464786108\n", | |
" Iteration = 1 Sup Diff = 0.05274159340733661\n", | |
" Iteration = 10 Sup Diff = 0.031346949265852075\n", | |
" Iteration = 20 Sup Diff = 0.01870345989335709\n", | |
" Iteration = 30 Sup Diff = 0.01116551203397076\n", | |
" Iteration = 40 Sup Diff = 0.00666854170813258\n", | |
" Iteration = 50 Sup Diff = 0.003984292748717033\n", | |
" Iteration = 60 Sup Diff = 0.0023813118039327508\n", | |
" Iteration = 70 Sup Diff = 0.0014236586450983024\n", | |
" Iteration = 80 Sup Diff = 0.0008513397747205165\n", | |
" Iteration = 90 Sup Diff = 0.0005092051752288995\n", | |
" Iteration = 100 Sup Diff = 0.00030462324421465237\n", | |
" Iteration = 110 Sup Diff = 0.00018226485632300005\n", | |
" Iteration = 120 Sup Diff = 0.00010906950872624499\n", | |
" Iteration = 130 Sup Diff = 6.527643736320421e-5\n", | |
" Iteration = 140 Sup Diff = 3.907108211997912e-5\n", | |
" Iteration = 150 Sup Diff = 2.3388077119990136e-5\n", | |
" Iteration = 160 Sup Diff = 1.4008644637186762e-5\n", | |
" Iteration = 170 Sup Diff = 8.391317202871562e-6\n", | |
" Iteration = 180 Sup Diff = 5.026474537817016e-6\n", | |
" Iteration = 190 Sup Diff = 3.010899863653549e-6\n", | |
" Iteration = 200 Sup Diff = 1.8035522479920019e-6\n", | |
" Iteration = 210 Sup Diff = 1.080340915837752e-6\n", | |
" Iteration = 220 Sup Diff = 6.471316943423844e-7\n", | |
" Iteration = 230 Sup Diff = 3.876361938104367e-7\n", | |
" Iteration = 240 Sup Diff = 2.3219657907525004e-7\n", | |
" Iteration = 250 Sup Diff = 1.3908720930544405e-7\n", | |
" Iteration = 257 Sup Diff = 9.716035664908418e-8\n", | |
" \n", | |
" My check = 0.1465491436962635\n", | |
" My check = -0.9714880021887344\n" | |
] | |
}, | |
{ | |
"data": { | |
"text/plain": [ | |
"(257, 9.716035664908418e-8, 0.1465491436962635, -0.9714880021887344)" | |
] | |
}, | |
"execution_count": 4, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"mainNew()" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 5, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"Output = 0.5627314338711378 Capital = 0.178198287392527 Consumption = 0.3845331464786108\n", | |
" Iteration = 1 Sup Diff = 0.05274159340733661\n", | |
" Iteration = 10 Sup Diff = 0.031346949265852075\n", | |
" Iteration = 20 Sup Diff = 0.01870345989335709\n", | |
" Iteration = 30 Sup Diff = 0.01116551203397076\n", | |
" Iteration = 40 Sup Diff = 0.00666854170813258\n", | |
" Iteration = 50 Sup Diff = 0.003984292748717033\n", | |
" Iteration = 60 Sup Diff = 0.0023813118039327508\n", | |
" Iteration = 70 Sup Diff = 0.0014236586450983024\n", | |
" Iteration = 80 Sup Diff = 0.0008513397747205165\n", | |
" Iteration = 90 Sup Diff = 0.0005092051752288995\n", | |
" Iteration = 100 Sup Diff = 0.00030462324421465237\n", | |
" Iteration = 110 Sup Diff = 0.00018226485632300005\n", | |
" Iteration = 120 Sup Diff = 0.00010906950872624499\n", | |
" Iteration = 130 Sup Diff = 6.527643736320421e-5\n", | |
" Iteration = 140 Sup Diff = 3.907108211997912e-5\n", | |
" Iteration = 150 Sup Diff = 2.3388077119990136e-5\n", | |
" Iteration = 160 Sup Diff = 1.4008644637186762e-5\n", | |
" Iteration = 170 Sup Diff = 8.391317202871562e-6\n", | |
" Iteration = 180 Sup Diff = 5.026474537817016e-6\n", | |
" Iteration = 190 Sup Diff = 3.010899863653549e-6\n", | |
" Iteration = 200 Sup Diff = 1.8035522479920019e-6\n", | |
" Iteration = 210 Sup Diff = 1.080340915837752e-6\n", | |
" Iteration = 220 Sup Diff = 6.471316943423844e-7\n", | |
" Iteration = 230 Sup Diff = 3.876361938104367e-7\n", | |
" Iteration = 240 Sup Diff = 2.3219657907525004e-7\n", | |
" Iteration = 250 Sup Diff = 1.3908720930544405e-7\n", | |
" Iteration = 257 Sup Diff = 9.716035664908418e-8\n", | |
" \n", | |
" My check = 0.1465491436962635\n", | |
" My check = -0.9714880021887344\n" | |
] | |
}, | |
{ | |
"data": { | |
"text/plain": [ | |
"(257, 9.716035664908418e-8, 0.1465491436962635, -0.9714880021887344)" | |
] | |
}, | |
"execution_count": 5, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"mainOld()" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 6, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"BenchmarkTools.Trial: \n", | |
" memory estimate: 3.54 MiB\n", | |
" allocs estimate: 15\n", | |
" --------------\n", | |
" minimum time: 1.333 s (0.00% GC)\n", | |
" median time: 1.335 s (0.00% GC)\n", | |
" mean time: 1.336 s (0.00% GC)\n", | |
" maximum time: 1.342 s (0.00% GC)\n", | |
" --------------\n", | |
" samples: 4\n", | |
" evals/sample: 1" | |
] | |
}, | |
"execution_count": 6, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"@benchmark mainNew(false)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 7, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"BenchmarkTools.Trial: \n", | |
" memory estimate: 528.54 MiB\n", | |
" allocs estimate: 1563\n", | |
" --------------\n", | |
" minimum time: 1.569 s (0.80% GC)\n", | |
" median time: 1.598 s (0.83% GC)\n", | |
" mean time: 1.605 s (1.69% GC)\n", | |
" maximum time: 1.656 s (4.21% GC)\n", | |
" --------------\n", | |
" samples: 4\n", | |
" evals/sample: 1" | |
] | |
}, | |
"execution_count": 7, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"@benchmark mainOld(false)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"metadata": {}, | |
"outputs": [], | |
"source": [] | |
} | |
], | |
"metadata": { | |
"kernelspec": { | |
"display_name": "Julia 0.6.2", | |
"language": "julia", | |
"name": "julia-0.6" | |
}, | |
"language_info": { | |
"file_extension": ".jl", | |
"mimetype": "application/julia", | |
"name": "julia", | |
"version": "0.6.2" | |
} | |
}, | |
"nbformat": 4, | |
"nbformat_minor": 2 | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment