%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt
from ipywidgets import interact, fixed
Employer hires worker to perform a task that has a stochastic outcome. Project can either:
There are two states of the world lebeled s and f. The expected return from the project is: E(X|p)=p⋅Xs+(1−p)⋅Xf
Contract design problem: how to allocate claims to stochastic output between:
The agent maximize the von-Neumann-Morgenstern expected utility:
Eu(c|p)=pu(cs)+(1−p)u(cf)
Lagrangian: L(cs,cf,λ)=p⋅(Xs−cs)+(1−p)⋅(Xf−cf)−λ(ˉu−p⋅u(cs)−(1−p)u(cf))
for state-contingent claim in state s: p⋅λ⋅u′(cs)−p=0
Rearranging for i=s,f
1u′(cs)=λ=1u′(cf)This implies agent should be fully insured: cs=cf=c∗
substitute cs=cf=c∗ into agent participation:
If for example u(c)=cαα and α=12 then 2√ˉc∗=ˉu
Monopoly contract pays worker a fixed wage determined by their reservation utility: c∗=(ˉu2)2
For example if the worker ran the project without insurance:
ˉu=0.8⋅2√(100)+0.22√(0)=16 utils
The monopoly insurer offers safe contract: cf=cs=64
Firm then earns Xs−cs=100−64=36 or Xf−cf=0−64=−64
For expected return of 0.8⋅64+0.2(−36)=44
Employers compete for workers:
maxcs,cfp⋅u(cs)+(1−p)u(cf)subject to then employer participation (zero-profit) constraint:
p⋅(Xs−cs)+(1−p)⋅(Xf−cf)≥0Same FOC as above imply: cs=cf
substitute this now into employer participation to get: cf=cs=E(X|p)
In our example agent is paid cf=cs=80
And firm earns (Xs−cs)=100−80=20 and (Xf−cf)=0−80=−80 for expected return of zero.
A financial contract is modeled just like this last example (with a slight rewriting and reinterpretation of the Bank (i.e. the principal's) participation constraint).
Suppose agent has access to the same stochastic project above but can only get it started with lump sum investment I.
maxcs,cfp⋅u(cs)+(1−p)u(cf)subject to then employer participation (zero-profit) constraint:
p⋅(Xs−cs)+(1−p)⋅(Xf−cf)≥I(1+r)Exactly the problem above only that the participation constraint includes a term to cover the opportunity cost of funding.
Lagrangian:
L(cs,cf,λ)=p⋅u(cs)+(1−p)u(cf)+λ(I(1+r)−p⋅(Xs−cs)−(1−p)⋅(Xf−cf))FOC again imply contract keeps agent's consumption steady at: cs=cf=c∗
Bank just breaks even: E(X|p)−E(c|p)=I(1+r)
Example: Suppose loan finance costs I(1+r)=70
E(c|p)=E(X|p)−I(1+r)
E(c|p)=80−70=10
Can think of contract as a loan with state-contingent repayments:
Xs−cs−I(1+r)=100−10−70=20
Xf−cf−I(1+r)=0−10−70=−80
Bank breaks even: 0.8⋅20+0.2⋅(−80)=0
Can extend to many states of the world:
E(X|e)=∑iXi⋅f(Xi|e)alpha = 0.25
def u(c, alpha=alpha):
return (1/alpha)*c**alpha
def E(x,p):
return p*x[1] + (1-p)*x[0]
def EU(c, p):
return p*u(c[1]) + (1-p)*u(c[0])
def budgetc(c0, p, x):
return E(x,p)/p - ((1-p)/p)*c0
def indif(c0, p, ubar):
return (alpha*(ubar-(1-p)*u(c0))/p)**(1/alpha)
def IC(c0,p,q,B):
'''incentive compatibility line'''
return (alpha*(u(c0)+B/(p-q)))**(1/alpha)
def Bopt(p,x):
'''Bank profit maximum'''
return (alpha*EU(x,p))**(1/alpha)
def Copt(p,x):
'''Consumer utility maximum'''
return E(x,p)
x = [15,90]
p = 0.6
EU([36,36],p)
9.797958971132712
or Hidden Actions model
Stiglitz (1974), Holmstrom (1979), Grossman and Hart (1983)
Agent's private benefit from avoiding diligence or effort is B (extra disutility from high vs. low effort).
Effort is non-contractible and B cannot be observed/seized. Effort-contingent contracts not possible.
Only outcone-contingent contracts can be used.
Now agent's unobserved (or more to the point non-verifiable) effort levels determines success probability:
Example q=0.6 versus p=0.8 - E(X|p) - E(c|p) - I(1+r) = 80-10-70 = 0 (bank breaks even) - E(X|q) - E(c|q) - I(1+r) = 60-10-70 = -20 (bank loses money)
Full residual claimant when fixed repayment I(1+r)
But this imposes a lot of risk (actually here not even defined since u(-70) is 'catastrophic')
Need to find balance between risk sharing and incentives
In 2 outcome case can be re-arranged to:
u(c1)≥u(c0)+Bp−qp = 0.5
q = 0.4
cmax = 100
B = 1.5
IC(2,p,q,B)
595.1534438537282
def consume_plot(p,q,B,ic=False):
c0 = np.linspace(0.1,200,num=100)
#bank optimum
c0e = Bopt(p,x)
c1e = c0e
uebar = EU([c0e,c1e],p)
idfc = indif(c0, p, uebar)
budg = budgetc(c0, p, [c0e,c1e])
#consumer optimum
c0ee = Copt(p,x)
c1ee = c0ee
uemax = EU([c0ee,c1ee],p)
idfcmax = indif(c0, p, uemax)
zerop = budgetc(c0, p, x)
icline = IC(c0,p,q,B)
fig, ax = plt.subplots(figsize=(10,10))
if ic:
ax.plot(c0,icline)
ax.plot(c0, budg, lw=2.5)
ax.plot(c0, zerop, lw=2.5)
ax.plot(c0, idfc, lw=2.5)
#ax.plot(c0, idfcmax, lw=2.5)
ax.plot(c0,c0)
#ax.vlines(c0e,0,c2e, linestyles="dashed")
#ax.hlines(c1e,0,c1e, linestyles="dashed")
ax.plot(c0e,c1e,'ob')
ax.plot(c0ee,c1ee,'ob')
ax.plot(x[0],x[1],'ob')
ax.set_xlim(0, 100)
ax.set_ylim(0, 100)
ax.set_xlabel(r'$c_0$', fontsize=16)
ax.set_ylabel('$c_1$', fontsize=16)
ax.spines['right'].set_visible(False)
ax.spines['top'].set_visible(False)
ax.grid()
plt.show()
interact(consume_plot,p=fixed(0.5),q=(0.1,0.5,0.01),B=(0,3,0.1));
interactive(children=(FloatSlider(value=0.30000000000000004, description='q', max=0.5, min=0.1, step=0.01), Fl…
If we set this up and solve it as a Lagrangean (loosely following Holmstrom, 1979) we get a condition like this:
In our two outcome case p=f(x1|eH) and q=f(x1|eL) and this becomes:
1u′(c1)=λ+μ⋅[1−qp]TODO:
Holmstrom's sufficient statistic
%%html
<script src="https://cdn.rawgit.com/parente/4c3e6936d0d7a46fd071/raw/65b816fb9bdd3c28b4ddf3af602bfd6015486383/code_toggle.js"></script>