Bolton–Chen–Wang (2009): investment with costly external finance

Bolton, Chen, and Wang build a unified theory of investment, financing, and cash management. A firm faces costly external finance, so it hoards cash as a buffer against shocks. The single state is the cash–capital ratio $w$, and the unknown is firm value per unit of capital $v(w)$ — a generalized Tobin's $q$. It solves the HJB equation

\[r\,v(w) = \max_{i}\;(i-\delta)\bigl(v - w\,v'\bigr) + \bigl((r-\lambda)w + A - i - \tfrac{\theta}{2}i^2\bigr)v' + \tfrac{\sigma^2}{2}v'',\]

with optimal investment $i = \tfrac{1}{\theta}\!\left(\tfrac{v}{v'} - w - 1\right)$. Two endogenous boundaries close the model: a payout boundary, where the marginal value of cash $v'$ falls to one, and a refinancing boundary, where the firm issues equity at marginal cost $\gamma$ and fixed cost $\phi$.

The model

The parameters:

using EconPDEs, NLsolve, Plots

Base.@kwdef struct BoltonChenWangModel
  r::Float64 = 0.06       # risk-free rate
  δ::Float64 = 0.10       # depreciation rate of capital
  A::Float64 = 0.18       # productivity (expected profitability per unit capital)
  σ::Float64 = 0.09       # cash-flow (capital) volatility
  θ::Float64 = 1.5        # investment adjustment-cost parameter
  λ::Float64 = 0.01       # carrying cost of holding cash
  l::Float64 = 0.9        # liquidation value of capital
  γ::Float64 = 0.06       # marginal (proportional) cost of external finance
  ϕ::Float64 = 0.01       # fixed cost of external finance
end
Main.BoltonChenWangModel

We solve the model at its default parameters:

m = BoltonChenWangModel()
Main.BoltonChenWangModel(0.06, 0.1, 0.18, 0.09, 1.5, 0.01, 0.9, 0.06, 0.01)

The grid

We define the grid, a NamedTuple keyed by the state $w$ (the cash–capital ratio).

stategrid = (; w = range(0.0, 0.3, length = 100))
(w = 0.0:0.0030303030303030303:0.3,)

The initial guess

We define the initial guess, a NamedTuple keyed by the unknown function $v$ — one value per grid point, with firm value initialized to the cash ratio $w$ itself. This name (and its finite differences, such as vw_up) is what reappears in the equation below.

guess = (; v = stategrid[:w])
(v = 0.0:0.0030303030303030303:0.3,)

The PDE equation

We now write the function encoding the HJB equation. Following the package convention, it takes the current state (a grid point) and u — the local bundle holding the unknown and its finite-difference derivatives there (v, vw_up, vw_down, vww) — and returns the time derivative vt.

The cash drift $\mu_w$ can point either way, so the marginal value of cash is upwinded: forward (vw_up) where the drift is positive, backward (vw_down) where it is negative.

function (m::BoltonChenWangModel)(state::NamedTuple, u::NamedTuple)
  (; r, δ, A, σ, θ, λ, l, γ, ϕ) = m
  (; w) = state
  (; v, vw_up, vw_down, vww) = u
  vw = vw_up
  iter = 0
  @label start
  i = 1 / θ * (v / vw - w - 1)
  μw = (r - λ) * w + A - i - θ * i^2 / 2 - (i - δ) * w
  if (iter == 0) && (μw <= 0)
    iter += 1
    vw = vw_down
    @goto start
  end
  vt = - ((i - δ) * (v - vw * w) + ((r - λ) * w + A - i - θ * i^2 / 2) * vw + σ^2 / 2 * vww - r * v)
  return (; vt), (; v, vw, vww, w)
end

Solving the model

We first solve the HJB with guessed slopes for the marginal value of cash at the two boundaries.

result = pdesolve(m, stategrid, guess; bc = (; vw = (1.5, 1.0)))
EconPDEResult
  solution:      v (100)
  saved:         v, vw, vww, w
  residual_norm: 6.45e-10
  converged:     true (tolerance 1.49e-08)

The guessed slopes are only a starting point. We then use NLsolve to find the boundary slopes that satisfy the value-matching and optimality conditions of Bolton–Chen–Wang (2009) — one at the refinancing boundary (marginal value of cash $1+\gamma$) and one at the payout boundary (marginal value of cash $1$) — and re-solve at the fixed point.

function f(m, x, stategrid, y)
  result = pdesolve(m, stategrid, y; bc = (; vw = (x[1], x[2])), verbose = false)
  v, vw, w = result.saved.v, result.saved.vw, result.saved.w
  out = zeros(2)
  mi = argmin(abs.(1 + m.γ .- vw))
  out[1] =  v[mi] - m.ϕ - (1 + m.γ) * w[mi] - v[1]
  wi = argmin(abs.(1 .- vw))
  i = 1 / m.θ * (v[wi] - w[wi] - 1)
  out[2] = m.r * v[wi] - (i - m.δ) * (v[wi] - w[wi]) - ((m.r - m.λ) * w[wi] + m.A - i - m.θ * i^2 / 2)
  return out
end

newsol = nlsolve(x -> f(m, x, stategrid, guess), [1.0,  1.0])
result = pdesolve(m, stategrid, guess; bc = (; vw = (newsol.zero[1], newsol.zero[2])))
EconPDEResult
  solution:      v (100)
  saved:         v, vw, vww, w
  residual_norm: 6.11e-10
  converged:     true (tolerance 1.49e-08)

The solution

Firm value $v(w)$ is increasing and concave in the cash–capital ratio: an extra dollar of internal cash is worth more than one ($v'(w)>1$) because external finance is costly, and this marginal value declines as the buffer grows. Investment $i(w)$ rises with cash, so a cash-poor firm underinvests — internal liquidity, not just fundamentals, drives real investment. Both panels use the solution at the boundary slopes pinned down by NLsolve.

ws = stategrid[:w]
v = result.saved.v
vw = result.saved.vw
i = (v ./ vw .- ws .- 1) ./ m.θ
p1 = plot(ws, v; xlabel = "cash–capital ratio w", ylabel = "firm value v(w)", legend = false)
p2 = plot(ws, i; xlabel = "cash–capital ratio w", ylabel = "investment rate i(w)", legend = false)
plot(p1, p2; layout = (1, 2), size = (800, 300))
Example block output

This page was generated using Literate.jl.