diff --git a/HARK/ConsumptionSaving/ConsPortfolioModel.py b/HARK/ConsumptionSaving/ConsPortfolioModel.py index 575652e2f..ada6026f0 100644 --- a/HARK/ConsumptionSaving/ConsPortfolioModel.py +++ b/HARK/ConsumptionSaving/ConsPortfolioModel.py @@ -166,7 +166,7 @@ class PortfolioConsumerType(RiskyAssetConsumerType): """ time_inv_ = deepcopy(RiskyAssetConsumerType.time_inv_) - time_inv_ = time_inv_ + ["AdjustPrb", "DiscreteShareBool"] + time_inv_ = time_inv_ + ["AdjustPrb", "DiscreteShareBool", "ApproxShareBool"] def __init__(self, verbose=False, quiet=False, **kwds): params = init_portfolio.copy() @@ -213,7 +213,7 @@ def update_solution_terminal(self): None """ # Consume all market resources: c_T = m_T - cFuncAdj_terminal = IdentityFunction() + cFuncAdj_terminal = LinearInterp([0.0, 1.0], [0.0, 1.0]) cFuncFxd_terminal = IdentityFunction(i_dim=0, n_dims=2) # Risky share is irrelevant-- no end-of-period assets; set to zero @@ -244,6 +244,8 @@ def update_solution_terminal(self): dvdsFuncFxd=dvdsFuncFxd_terminal, ) + self.solution_terminal.ShareEndOfPrdFunc = ShareFuncAdj_terminal + def update_ShareGrid(self): """ Creates the attribute ShareGrid as an evenly spaced grid on [0.,1.], using @@ -492,6 +494,7 @@ def __init__( DiscreteShareBool, ShareLimit, IndepDstnBool, + ApproxShareBool, ): """ Constructor for portfolio choice problem solver. @@ -514,6 +517,7 @@ def __init__( self.DiscreteShareBool = DiscreteShareBool self.ShareLimit = ShareLimit self.IndepDstnBool = IndepDstnBool + self.ApproxShareBool = ApproxShareBool # Make sure the individual is liquidity constrained. Allowing a consumer to # borrow *and* invest in an asset with unbounded (negative) returns is a bad mix. @@ -822,6 +826,8 @@ def make_ShareFuncAdj(self): Construct the risky share function when the agent can adjust """ + # Share function for mGrid + if self.zero_bound: Share_lower_bound = self.ShareLimit else: @@ -834,6 +840,96 @@ def make_ShareFuncAdj(self): slope_limit=0.0, ) + # Share function on aGrid + + if self.zero_bound: + aNrm_temp = np.append(0.0, self.aNrmGrid) + share_temp = np.append(self.ShareLimit, self.Share_now) + else: + aNrm_temp = self.aNrmGrid + share_temp = self.Share_now + + self.ShareEndOfPrdFunc = LinearInterp( + aNrm_temp, share_temp, intercept_limit=self.ShareLimit, slope_limit=0.0 + ) + + def make_share_func_approx(self): + """ + Alternative share functions from linear approximation. + """ + + # get next period's consumption and share function + cFunc_next = self.solution_next.cFuncAdj + sFunc_next = self.solution_next.ShareEndOfPrdFunc + + def premium(shock): + """ + Used to evaluate mean and variance of equity premium. + """ + r_diff = shock - self.Rfree + + return r_diff, r_diff ** 2, r_diff ** 3 + + prem_mean, prem_sqrd, prem_cube = calc_expectation(self.RiskyDstn, premium) + + def c_nrm_and_deriv(shocks, a_nrm): + """ + Used to calculate expected consumption and MPC given today's savings, + assuming that today's risky share is the same as it would be tomorrow + with that same level of savings. + """ + p_shk = shocks[0] * self.PermGroFac + t_shk = shocks[1] + share = sFunc_next(a_nrm) + r_diff = shocks[2] - self.Rfree + r_port = self.Rfree + r_diff * share + m_nrm_next = a_nrm * r_port / p_shk + t_shk + + c_next, cP_next = cFunc_next.eval_with_derivative(m_nrm_next) + + return c_next, cP_next + + exp_c_values = calc_expectation(self.ShockDstn, c_nrm_and_deriv, self.aNrmGrid) + + exp_c_values = exp_c_values[:, :, 0] + exp_c_next = exp_c_values[0] + exp_cP_next = exp_c_values[1] + + MPC = exp_cP_next * self.aNrmGrid / exp_c_next + + # first order approximation + approx_share = prem_mean / (self.CRRA * MPC * prem_sqrd) + + # clip at 0 and 1, although we know the Share limit we + # want to see what the approximation would give us + approx_share = np.clip(approx_share, 0, 1) + + self.ApproxFirstOrderShareFunc = LinearInterp( + self.aNrmGrid, + approx_share, + intercept_limit=self.ShareLimit, + slope_limit=0.0, + ) + + # second order approximation + + a = -self.CRRA * prem_cube * MPC ** 2 * (-self.CRRA - 1) / 2 + b = -self.CRRA * MPC * prem_sqrd + c = prem_mean + + temp = np.sqrt(b ** 2 - 4 * a * c) + + roots = np.array([(-b + temp) / (2 * a), (-b - temp) / (2 * a)]) + roots[:, 0] = 1.0 + roots = np.where( + np.logical_and(roots[0] >= 0, roots[0] <= 1), roots[0], roots[1] + ) + roots = np.clip(roots, 0, 1) + + self.ApproxSecondOrderShareFunc = LinearInterp( + self.aNrmGrid, roots, intercept_limit=self.ShareLimit, slope_limit=0.0, + ) + def add_save_points(self): # This is a point at which (a,c,share) have consistent length. Take the # snapshot for storing the grid and values in the solution. @@ -978,6 +1074,11 @@ def make_porfolio_solution(self): AdjPrb=self.AdjustPrb, ) + if self.ApproxShareBool: + self.solution.ShareEndOfPrdFunc = self.ShareEndOfPrdFunc + self.solution.ApproxFirstOrderShareFunc = self.ApproxFirstOrderShareFunc + self.solution.ApproxSecondOrderShareFunc = self.ApproxSecondOrderShareFunc + def solve(self): """ Solve the one period problem for a portfolio-choice consumer. @@ -999,6 +1100,9 @@ def solve(self): self.make_basic_solution() self.make_ShareFuncAdj() + if self.ApproxShareBool: + self.make_share_func_approx() + self.add_save_points() # Add the value function if requested @@ -1319,10 +1423,7 @@ def add_SequentialShareFuncAdj(self, solution): Share_now = self.Share_now self.SequentialShareFuncAdj_now = LinearInterp( - aNrm_temp, - Share_now, - intercept_limit=self.ShareLimit, - slope_limit=0.0, + aNrm_temp, Share_now, intercept_limit=self.ShareLimit, slope_limit=0.0, ) solution.SequentialShareFuncAdj = self.SequentialShareFuncAdj_now @@ -1349,6 +1450,8 @@ def solve(self): init_portfolio["AdjustPrb"] = 1.0 # Flag for whether to optimize risky share on a discrete grid only init_portfolio["DiscreteShareBool"] = False +# Flat for wether to approximate risky share +init_portfolio["ApproxShareBool"] = False # Adjust some of the existing parameters in the dictionary init_portfolio["aXtraMax"] = 100 # Make the grid of assets go much higher... diff --git a/examples/ConsPortfolioModel/example_ConsPortfolioModel - Approx.ipynb b/examples/ConsPortfolioModel/example_ConsPortfolioModel - Approx.ipynb new file mode 100644 index 000000000..b3d34147c --- /dev/null +++ b/examples/ConsPortfolioModel/example_ConsPortfolioModel - Approx.ipynb @@ -0,0 +1,193 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "\"\"\"\n", + "Example implementations of HARK.ConsumptionSaving.ConsPortfolioModel\n", + "\"\"\"\n", + "from time import time\n", + "\n", + "import matplotlib.pyplot as plt\n", + "import numpy as np\n", + "\n", + "from HARK.ConsumptionSaving.ConsPortfolioModel import (\n", + " PortfolioConsumerType,\n", + ")\n", + "from HARK.utilities import plot_funcs" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Now solving an example portfolio choice problem; this might take a moment...\n", + "Solving an infinite horizon portfolio choice problem took 8.5339994430542 seconds.\n" + ] + } + ], + "source": [ + "# Make and solve an example portfolio choice consumer type\n", + "print(\"Now solving an example portfolio choice problem; this might take a moment...\")\n", + "MyType = PortfolioConsumerType(ApproxShareBool=True)\n", + "MyType.cycles = 0\n", + "t0 = time()\n", + "MyType.solve()\n", + "t1 = time()\n", + "MyType.cFunc = [MyType.solution[t].cFuncAdj for t in range(MyType.T_cycle)]\n", + "MyType.ShareFunc = [MyType.solution[t].ShareFuncAdj for t in range(MyType.T_cycle)]\n", + "MyType.ShareEndOfPrdFunc = [MyType.solution[t].ShareEndOfPrdFunc for t in range(MyType.T_cycle)]\n", + "MyType.ApproxFirstOrderShareFunc = [MyType.solution[t].ApproxFirstOrderShareFunc for t in range(MyType.T_cycle)]\n", + "MyType.ApproxSecondOrderShareFunc = [MyType.solution[t].ApproxSecondOrderShareFunc for t in range(MyType.T_cycle)]\n", + "print(\n", + " \"Solving an infinite horizon portfolio choice problem took \"\n", + " + str(t1 - t0)\n", + " + \" seconds.\"\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Consumption function over market resources:\n" + ] + }, + { + "data": { + "text/plain": "
", + "image/png": "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\n" + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Risky asset share as a function of market resources:\n", + "Optimal (blue) versus Theoretical Limit (orange)\n" + ] + }, + { + "data": { + "text/plain": "
", + "image/png": "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\n" + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "# Plot the consumption and risky-share functions\n", + "print(\"Consumption function over market resources:\")\n", + "plot_funcs(MyType.cFunc[0], 0.0, 20.0)\n", + "print(\"Risky asset share as a function of market resources:\")\n", + "print(\"Optimal (blue) versus Theoretical Limit (orange)\")\n", + "plt.xlabel(\"Normalized Market Resources\")\n", + "plt.ylabel(\"Portfolio Share\")\n", + "plt.ylim(0.0, 1.0)\n", + "# Since we are using a discretization of the lognormal distribution,\n", + "# the limit is numerically computed and slightly different from\n", + "# the analytical limit obtained by Merton and Samuelson for infinite wealth\n", + "plot_funcs(\n", + " [\n", + " MyType.ShareFunc[0],\n", + " lambda m: MyType.ShareLimit * np.ones_like(m),\n", + " ],\n", + " 0.0,\n", + " 100.0,\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "outputs": [ + { + "data": { + "text/plain": "
", + "image/png": "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\n" + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plot_funcs(\n", + " [\n", + " MyType.ShareEndOfPrdFunc[0], # blue\n", + " MyType.ApproxFirstOrderShareFunc[0], # orange\n", + " MyType.ApproxSecondOrderShareFunc[0] # green\n", + "\n", + " ],\n", + " 0.0,\n", + " 100.0, legend_kwds={\"labels\": [\"true\", \"first order\", \"second order\"]})" + ], + "metadata": { + "collapsed": false, + "pycharm": { + "name": "#%%\n" + } + } + }, + { + "cell_type": "code", + "execution_count": 4, + "outputs": [], + "source": [], + "metadata": { + "collapsed": false, + "pycharm": { + "name": "#%%\n" + } + } + } + ], + "metadata": { + "jupytext": { + "cell_metadata_filter": "title,-all", + "formats": "ipynb,auto:percent", + "main_language": "python", + "notebook_metadata_filter": "-all" + }, + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.10" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} \ No newline at end of file