is the threshold minimum renegotiation cost that is required to sustain a first best efficient smoothing contract. Any will require some endogenous distortion of the contract to keep the contract renegotiation-proof.
If a contract is renegotiated it would be to a new contract that maximizes one-self’s preferences. Hence, a renegotiation-proof contract would satisfy the constraint:
Let’s substitute on the right hand side for the best contract that one-self can obtain. One-self wants
For the CRRA case, this implies . The most favorable renegotiated contract for one-self would leave the renegotiating bank indifferent (after subtracting out the renegotiation cost):
Since we just pointed out that , this can be rewitten as:
Notice also that can be written Putting this all together, the no-renegotiation constraint above can be rewritten as:
A first-best efficient contract with .
Let’s substitute that into the no-renegotiation constraint above. With appropriate simplifications such as we can write:
For this CRRA case, we can solve further:
Re-arranging to solve for the at which this holds as an equality, we find:
Setting equal to the implied efficient continuation contract into no-renegotiation constraint we can solve for the value of that allows this to just hold:
where
The above is for the competitive case.
For the monopoly case we simply replace the competitive term by the analogous efficient monopoly contract ters. The monopoly formula for the threshold is thus
This diagram helps to visualize. Zero’s first-best commitment smoothing contract at is not because the renegotiation cost is just high enough to make the bank reject the most favorable renegotiated contract that could be offered to the bank at .

Code¶
Several functions used can be found in the python module Contract.py
import ContractCode below uses this module to produce Figure 1. If code is hidden in HTML view, click button to display.
import numpy as np
import matplotlib.pyplot as plt
from ipywidgets import interact,fixed
plt.rcParams['figure.figsize'] = 10, 8
np.set_printoptions(precision=2) Competitive and Monopoly ¶
We will in general have
Cc = Contract.Competitive(beta=0.6)
Cm = Contract.Monopoly(beta=0.6)Cc.kbar(), Cm.kbar()(4.43642366042653, 4.3219284107549765)def plotkb(rho=0.9, y0 = 100):
num = 40
kb = np.zeros(shape=(num, 3))
Cc.y = np.array([y0, (300-y0)/2, (300-y0)/2])
Cm.y = np.array([y0, (300-y0)/2, (300-y0)/2])
Cc.rho = rho
Cm.rho = rho
for i in range(num):
Cc.beta = i/num
Cm.beta = i/num
kb[i] = np.array([i/num, Cc.kbar(), Cm.kbar()])
plt.plot(kb[:,0], kb[:,1], label = 'competitive')
plt.plot(kb[:,0], kb[:,2], label = 'monopoly')
plt.legend()
plt.xlabel(r'$\beta$', fontsize=14)
plt.ylabel(r'$\bar \kappa, \bar \kappa^m$', fontsize=14)
plt.xlim(0,1)
plt.ylim(0,20)
plotkb(rho = 1.1, y0 = 100)
Interactive Plot¶
In order for the widget sliders to affect the chart you must be running this on a jupyter notebooks server. If you are viewing this on the web, click on the Rocket icon button above to launch a cloud server service (Binder, or google colab).
interact(plotkb, rho=(0.1, 2, 0.101), y0=(50,300,10));