Skip to content

Instantly share code, notes, and snippets.

@chriselrod
Created February 12, 2018 00:08
Show Gist options
  • Save chriselrod/f30fdfadccd8413000f0703a7cc6f8a5 to your computer and use it in GitHub Desktop.
Save chriselrod/f30fdfadccd8413000f0703a7cc6f8a5 to your computer and use it in GitHub Desktop.
Quant Econ - Numba and Julia
Display the source blob
Display the rendered blob
Raw
{
"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
}
Display the source blob
Display the rendered blob
Raw
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment