Quasi-hyperbolic discounting and commitment savings

The exponential discounter

Consider a simple extension of the standard intertemporal optimization problem (seen in an earlier notebook from two to three periods.

Our exponential or time-consistent discounter wishes use own-savings strategies and/or the services of a competitive financial service sector to exchange existing endowment income stream \((y_0,y_1,y_2)\) for a more optimal consumption stream.

The consumer optimization problem is to choose \({c_0,c_1,c_2}\) to solve:

\[\max_{c_0,c_1,c_2} u(c_0) + \delta u(c_1) + \delta^2 u(c_2)\]
\[s.t. c_0 + \frac{c_1}{1+r} + \frac{c_2}{1+r} = y_0 + \frac{y_1}{1+r} + \frac{y_2}{1+r}\]

where \(\delta\) is the consumer’s own personal psychic discount factor and \(r\) is the financial sector’s opportunity cost of funds. Competitition drives banks to offer earn zero-profits, leading them to offer consumption contract \(c^*=(c_0^*,c_1^*,c_2^*)\) in exchange for the consumer’s original more volatile income stream \(c^*=(y_0,y_1,y_2)\) of equal monetary present value.

Let us solve this by setting up a Lagrangean

\[u(c_0) + \delta u(c_1) + \delta^2 u(c_2) - \lambda \left [ Ey - c_0 - \frac{c_1}{1+r} - \frac{c_2}{1+r} \right ]\]

The first-order necessary conditions for an interior optimum are:

\[u'(c_0^*) = \lambda\]
\[\delta u'(c_1^*) = \lambda \frac{1}{(1+r)}\]
\[\delta^2 u'(c_0^*) = \lambda \frac{1}{(1+r)^2}\]

If it just happens that the consumer’s discount factor \(\delta\) has the following relationship to the bank’s opportunity cost of funds \(r\):

\[\delta = \frac{1}{1+r}\]

Then the first order conditions collapse down to:

\($u'(c_0^*) = u'(c_1^*) =u'(c_2^*) = \lambda\)

which of course then implies that the consumer has constant consumption across periods $c_0^* = c_1^* = c_2^* $

It’s easy to establish that if the consumer is sufficiently patient and/or the return to saving is high enough then the consumer will consume more in later periods:

\[\delta > \frac{1}{1+r} \text{ then } c_0^* < c_1^* < c_2^*\]

and if the situation is reversed so the consumer is relatively impatient and/or the return to savings is low then they will consume more in earlier periods:

\[\delta > \frac{1}{1+r} \text{ then } c_0^* > c_1^* > c_2^*\]

The CRRA utility case

A Constant-Relative Risk Aversion (CRRA) felicity function is given by:

\[\begin{split}\begin{equation} u\left(c_{t}\right)=\begin{cases} \frac{c^{1-\rho}}{1-\rho}, & \text{if } \rho>0 \text{ and } \rho \neq 1 \\ ln\left(c\right) & \text{if } \rho=1 \end{cases} \end{equation}\end{split}\]

Te Arrow-Pratt measure of relative risk aversion

\[R(c) =\frac{-cu''(c)}{u'(c)}\]

gives us a measure of how the curvature of the consumers felicity function – or how averse consumers are to risks – changes with wealth (consumption). As its name implies the CRRA function has a constant measure of relative risk aversion given simply by \(\rho\).

The elasticity of intertemporal substitution \(\sigma\) (the responsiveness of the slope of the consumption path to changes in the interest rate) for a CRRA function is also constant and given simply by:

\[\sigma = \frac{1}{\rho}\]

If we plug our CRRA felicity function into our earlier derived FOC we can solve to find:

\[\frac{c_1^*}{c_0^*} = \frac{c_2^*}{c_1^*} = \left [\delta (1+r) \right ]^\frac{1}{\rho}\]

Match this to the zero profit condition and we can find a closed form solutions for the consumption path.

Quasi-hyperbolic time-inconsistent preferences

A relatively simple way to model present-biased and time-inconsistent preferences is by moderling prefernces using quasi-hyperbolic preferences as follows. The key idea in what follows is that the agent’s preferences change from period to period.

The problem can be described in broad terms like this. When first making plans for future consumption choices – say the choice between period period 1 consumption and period 2 consumption – the consumer’s period 0 self wants to keep consumption smoothly balanced between those two periods. However when period 1 arrives the consumer’s preferences change in a way that makes him/her more impatient or present biased. The new period 1 self consumer now wants to undo the optimal consumption plans laid out by her earlier period 0 self and to choose a new consumption plan that boosts present (period 1) consumption at the expense of future (period 2) consumption.

The ‘sophisticated’ (quasi) hyperbolic discounter anticipates his own future self’s likely change of heart and this is likely to alter their original period 0 consumption plan. This sets up in effect a conflict or a struggle between the consumer’s earlier and future selves. The period 0 self acts strategically, anticipating their own later period’s optimal responses.

The demand for commitment services

Let’s see this formally.The consumer’s “period-0” self wants to choose consumption path \((c_0,c_1,c_2)\) to maximize:

\[u(c_0)+\beta[\delta u(c_1)+\delta^2 u(c_2)]\]

subject to the earlier described intertemporal budget constraint.

This is as before except for the fact that we’ve now introduced a ‘present-bias’ parameter \(\beta\) (where \(0<\beta \leq 1\)) that tilts the consumer’s preferences toward period zero consumption. Whenever \(\beta\) is strictly less than one the consumer wants to smooth preferences in a way that tilts toward period 0 consumption but seeks to keep consumption between period 1 and 2 more balanced.

When period 1 rolls around however the consumer’s preferences over remaining consumption bundles change. The period 1 self now wants to re-arrange remaining consumption to now maximize:

\[u(c_1) +\beta\delta u(c_2)\]

While the period-0 self wanted to trade off period 1 and period 2 consumption to equalize marginal utilities like this:

\[u'(c_1^*) = \delta (1+r )u'(c_2^*)\]

the new period-1 self now pefers to tradeoff like this:

\[u'(c_1^*) = \beta \delta (1+r )u'(c_2^*)\]

The \(\beta\) on the right-hand side of the last equation means the period 1 consumer now values period 2 consumption less relative to period 1 consumption compared to his period 0 self. Compared to the period-0 self’s plans the new period-1 consumer wants to ‘raid-savings’ and/or ‘take out a new loan’.

Lets look again at the CRRA case under the special assumption that \(\delta = \frac{1}{1+r}\) and \(r=0\) (and hence \(\delta = 1\). These last assumptions are without loss of generality and done only to simplify the math and spotlight the key mechanisms at work.

Let’s assume also that the period zero consumer can contract with a bank and that the bank can credibly commit to not renegotiating the terms of the contract even when the consumer’s period 1 self comes begging for the bank to do so.

In this case the problem is exactly as described in the earlier section. The period 0 consumer maximizes

\[u(c_0)+\beta[\delta u(c_1)+\delta^2 u(c_2)]\]

subject to the intertemporal budget constraint.

When \(\delta = \frac{1}{1+r}\) the period 0 consumer would like to keep consumption between period 1 and period 2 flat. The first order conditions now reduce to:

\[c_1^* = \beta^\frac{1}{\rho} c_0^*\]
\[c_2^* = c_1^*\]

Substituting these into the binding budget constraint yields:

\[c_0^* = \frac{E[y]}{1+\beta^\frac{1}{\rho}}\]
\[c_1^* = c_2^* = \beta^\frac{1}{\rho}c_0^*\]

We call this the full commitment contract.

The financial intermediary who offers such a contract is really providing two services to consumer’s period 0 self: they’re helping the consumer to smooth consumption between period zero and later periods and they’re also helping the consumer resist his period 1 self’s temptation to disrupt this optimal consumption plan.

For example suppose that consumer endowment income is such that she finds it optimum to save in period 0 and then finance constant consumption out of endowment income and savings in period 1 and 2. When period 1 rolls around the consumer’s period 1 self present bias would tempt them to want to ‘raid savings’ and/or take out a new loan to boost period 1 consumption at the expense of period 2 consumption.

To see this formally note that under the full commitment contract the consumer enters the period with contractual claims to the remaining consumption stream \((c_1^*,c_2^*) =({\bar c}^*, {\bar c}^*)\). If they could however the period 1 self would re-contract with this bank (or another) to choose another contract \((\hat c_1, \hat c_2)\) that solves:

\[\max_{c_1, c_2} u(c_1) + \beta u(c_2)\]

subject to

\[c_1 + \frac{c_2}{1+r} \leq {\bar c}^* + \frac{{\bar c}^*}{1+r}\]

The first order conditions for this problem are

\[u'(c_1) = \beta u'(c_2)\]

which in the CRRA case requires \(c_2 =\beta ^\frac{1}{\rho} c_1\)

which is clearly not satisfied along the original contract which had \((c_1^*,c_2^*) =({\bar c}^*, {\bar c}^*)\)

Substituting the FOC into the new period 1 budget constraint we can arrive at a solution or reaction function that states that when the period 1 self enters the period with claims \({c_1, c_2}\) they will want to renegotiate to:

\[\hat c_1 = \frac{ c_1 +c_2 }{1+\beta^\frac{1}{\rho} }\]
\[\hat c_2 =\beta ^\frac{1}{\rho} \hat c_1\]

If this renegotiation takes place then the period 1’s welfare would increase but at the expense of period 0’s welfare, since period 0’s optimal consumption plan would have been undone.

From this discussion it should be clear that the period 0 self would like to have banks compete for her business in period 0 but offer a full-commitment contract which in practice means being locked into an exclusive relationship (if the relationship were not exclusive then the period 1 self would approach a second bank in period 1 and ask them to ‘buy out’ and then renegotiate their contract with the first bank.

More detailed analysis

Much more detail on the analysis of contracts like this can be found in our 2016 working paper (with Karna Basu) entitled “Sticking to the Contract: Nonprofit vs For-profit Banks and Hyperbolic Discounters.” A github repository is available with code and jupyter notebooks describing some of that analysis. I draw on that here, but most of the details of the methods are in those other notebooks.

Commitment Savings products

Many economists believe that time-inconsistent preferences drive people to have to struggle with important issues of self-control that affects their ability to reach savings goals, and generates a demand for commitment services. Indeed some economiss have gone so far as to argue that these problems are ubiquitous and that one reason for the demand for microfinance services is that they provide individuals with the discipline and commitment mechanisms that can help them with these problems of self-control.

Rotating Savings and Credit Associations (ROSCAs) for example place individuals into savings groups and then create pressures and social sanctions to help individuals achieve savings goals. Iterant savings collectors may serve a similar purpose. Some have even suggested that many microcredit loans which advance loans to individuals and then put them on tight weekly repayment schedules may be popular not so much because they are releasing the individual from a binding credit constraint as because they are helping the individual ‘borrow to save.’ In this type of scenario the individual wants to save up to buy say a refrigerator or other household appliance but cannot find the discipline to save up for the item themselves. A microcredit loan allows them to buy the refrigerator outright and then places them on a strict repayment schedule that commits the individual to putting aside the fraction of weekly income toward the item that they might have otherwise struggled to do on their own.

In all these stories the availabiliy of commitment contracts provides additional value to the consumer, value that they may be willing to pay for.

In the following section I will illustrate some of these ideas with contracts that we will solve for and illustrate for the CRRA case. The code for much of what follows is in the Contract.py module described in greater detail in the github repo.

In [5]:
import Contract

Lets look at a competive contracting situation where \(\beta = 0.8\) and \(\rho = 0.5\)

In [9]:
cC = Contract.Competitive(beta = 0.8)
cC.rho = 0.5

Now lets give the individual an endowment income of \((y_0,y_1,y_2) = (150, 100, 50)\)

In [15]:
cC.y = [150,100,50]

The full commitment contract is:

In [21]:
cCF = cC.fcommit(); cCF
Out[21]:
array([ 131.57894737,   84.21052632,   84.21052632])

Note how this involves some saving in period 0 (\(y_0=150\) and consumption \(c_0=131.6\)) as well as additional saving for period 2.

If for some reason period 0 self agreed to this contract (sincerely believing that it would never be renegotiated) but then suddenly to everyone’s surprise period 1 self had an opportunity to renegotiate the continuation of this contract, they would renegotiate to the following contract:

In [22]:
cCR = cC.reneg(cCF); cCR
Out[22]:
array([ 131.57894737,  101.44337644,   64.92376092])

We can see here how period 1 self ‘raids’ the savings that the period 0 self had intended should be passed onto period 2 consumption. The period 1 self boosts period 1 consumption from 84 to 101. Rather than pass 34 units of consumption into period 2 only 20 units are now passed.

If the bank cannot credibly commit to not renegotiate the contract then the sophisticated time-inconsistent consumer will defensively alter their consumption plans to try to thwart their future self’s strategic renegotiations. The period 0 consumer will insist on renegotiation proof contracts which will impose an additional constraint on the problem, namely that no bank find it profitable to renegotiate the contract. In general this will be achieved by in a sense ‘surrendering’ to their future self’s bias tilt toward period 1 consumption.

Details in the paper and in class lecture on the shape of this constraint.

The important thing to understand is that adding any constraint to the problem can only lower consumer welfare and push us away from the full-commitment optimum.

For the present setup the renegotiation proof contract can be solved for to find:

In [31]:
cCRP = cC.reneg_proof().x; cCRP
Out[31]:
array([ 122.59354576,  108.17462856,   69.23182568])

Compare to the full commitment contract this contract involves more savings pased from from period 0 to period 1 but much less savings passed from period 1 to period 2. Total savings (period 0 plus period 1 savings) are higher when credible commitment savings devices are available compared to when not.

Replicating Ashraf, Karlan and Yin (2006) Commitment Savings paper

Ashraf, Karlan and Yin (2006) “Tying Odysseus to the Mast: Evidence from a Commitment Savings Product in the Philippines,” *Quarterly Journal of Economics.

What follows are incomplete notes… just some pieces of the puzzle needed to replicate the paper. I hope to improve on this in time and I just offer this here so that you might form an idea on how this might be done. Note that I am using the ipystata library which requires Stata to be running in the background. This seems to only be possible to do on Windows machines as described in the ipystata library.

The Stata dataset and code replication files have been made available by the authors via the Harvard Dataverse here

Notes to self: Files in D:

\Users

\jconning

\Google

Drive

\GC

\DevII

_S15

\other

\Karlan

renamed

“D:

\Users

\jconning

\Google

Drive

\GC

\DevII

_S15

\other

\Karlan

\seedanalysis

_011204_1.dta” “D:

\Users

\jconning

\Google

Drive

\GC

\DevII

_S15

\other

\Karlan

\seedanalysis

_011204_080404_1.dta” “D:

\Users

\jconning

\Google

Drive

\GC

\DevII

_S15

\other

\Karlan

\seedanalysis

_080404_1.dta”

The posted files are Stata version 14. These can be opened by python pandas but not by older versions of Stata.

In [2]:
%matplotlib inline
import seaborn as sns
import pandas as pd
import ipystata
import statsmodels.formula.api as sm

Open the datasets

One disadvantage of proprietary software is that you often cannot open a dataset saved with a later version of the software unless you pay to upgrade the software. I’m going to load the Stata dataset into a python pandas dataframe using its read_stata method and then pass the dataset into the running Stata session (which on my home machine is Stata 11).

In [7]:
#df = pd.read_stata(r"G:\GC\Dev-II\notebooks\seedanalysis_011204_1_v12.dta")
df = pd.read_stata(r"G:\GC\Dev-II\notebooks\data\savings1.dta")
In [8]:
regVI_1 = 'balchange ~ treatment + marketing'
model = sm.ols(regVI_1, df)
fitted = model.fit(cov_type='HC1')
print(fitted.summary())
                            OLS Regression Results
==============================================================================
Dep. Variable:              balchange   R-squared:                       0.002
Model:                            OLS   Adj. R-squared:                  0.001
Method:                 Least Squares   F-statistic:                     2.901
Date:                Tue, 29 Mar 2016   Prob (F-statistic):             0.0553
Time:                        17:00:31   Log-Likelihood:                -16270.
No. Observations:                1777   AIC:                         3.255e+04
Df Residuals:                    1774   BIC:                         3.256e+04
Df Model:                           2
Covariance Type:                  HC1
==============================================================================
                 coef    std err          z      P>|z|      [95.0% Conf. Int.]
------------------------------------------------------------------------------
Intercept     40.6257     61.676      0.659      0.510       -80.257   161.509
treatment    234.6785    101.748      2.306      0.021        35.256   434.101
marketing    184.8506    146.982      1.258      0.209      -103.228   472.929
==============================================================================
Omnibus:                     3458.895   Durbin-Watson:                   0.051
Prob(Omnibus):                  0.000   Jarque-Bera (JB):          5716807.283
Skew:                          14.932   Prob(JB):                         0.00
Kurtosis:                     279.259   Cond. No.                         4.24
==============================================================================

Warnings:
[1] Standard Errors are heteroscedasticity robust (HC1)
In [33]:
model = sm.ols('balchange ~ treatment', df[(df.treatment ==1) | (df.marketing ==1)])
fitted = model.fit(cov_type='HC1')
print(fitted.summary())
                            OLS Regression Results
==============================================================================
Dep. Variable:              balchange   R-squared:                       0.000
Model:                            OLS   Adj. R-squared:                 -0.001
Method:                 Least Squares   F-statistic:                    0.1020
Date:                Thu, 24 Mar 2016   Prob (F-statistic):              0.750
Time:                        23:43:38   Log-Likelihood:                -12115.
No. Observations:                1308   AIC:                         2.423e+04
Df Residuals:                    1306   BIC:                         2.424e+04
Df Model:                           1
Covariance Type:                  HC1
==============================================================================
                 coef    std err          z      P>|z|      [95.0% Conf. Int.]
------------------------------------------------------------------------------
Intercept    225.4763    133.405      1.690      0.091       -35.992   486.944
treatment     49.8279    156.027      0.319      0.749      -255.979   355.635
==============================================================================
Omnibus:                     2498.290   Durbin-Watson:                   0.056
Prob(Omnibus):                  0.000   Jarque-Bera (JB):          3202671.430
Skew:                          14.153   Prob(JB):                         0.00
Kurtosis:                     243.756   Cond. No.                         3.11
==============================================================================

Warnings:
[1] Standard Errors are heteroscedasticity robust (HC1)

Table 6: Impact: 6 months