50. Asset Pricing I: Finite State Models#
Contents
“A little knowledge of geometric series goes a long way” – Robert E. Lucas, Jr.
“Asset pricing is all about covariances” – Lars Peter Hansen
50.1. Overview#
An asset is a claim on one or more future payoffs.
The spot price of an asset depends primarily on
the anticipated dynamics for the stream of income accruing to the owners
attitudes to risk
rates of time preference
In this lecture we consider some standard pricing models and dividend stream specifications.
We study how prices and dividend-price ratios respond in these different scenarios.
We also look at creating and pricing derivative assets by repackaging income streams.
Key tools for the lecture are
formulas for predicting future values of functions of a Markov state
a formula for predicting the discounted sum of future values of a Markov state
50.2. Pricing Models#
In what follows let
A time-
cum-dividend asset is a claim to the stream .A time-
ex-dividend asset is a claim to the stream .
Let’s look at some equations that we expect to hold for prices of assets under ex-dividend contracts (we will consider cum-dividend pricing in the exercises).
50.2.1. Risk Neutral Pricing#
Our first scenario is risk-neutral pricing.
Let
The basic risk-neutral asset pricing equation for pricing one unit of an ex-dividend asset is.
This is a simple “cost equals expected benefit” relationship.
Here
50.2.2. Pricing with Random Discount Factor#
What happens if for some reason traders discount payouts differently depending on the state of the world?
Michael Harrison and David Kreps [HK79] and Lars Peter Hansen and Scott Richard [HR87] showed that in quite general settings the price of an ex-dividend asset obeys
for some stochastic discount factor
The fixed discount factor
The way anticipated future payoffs are evaluated can now depend on various random outcomes.
One example of this idea is that assets that tend to have good payoffs in bad states of the world might be regarded as more valuable.
This is because they pay well when the funds are more urgently needed.
We give examples of how the stochastic discount factor has been modeled below.
50.2.3. Asset Pricing and Covariances#
Recall that, from the definition of a conditional covariance
If we apply this definition to the asset pricing equation (50.2) we obtain
It is useful to regard equation (50.4) as a generalization of equation (50.1).
In equation (50.1), the stochastic discount factor
, a constant.In equation (50.1), the covariance term
is zero because .
Equation (50.4) asserts that the covariance of the stochastic discount factor with the one period payout
We give examples of some models of stochastic discount factors that have been proposed later in this lecture and also in a later lecture.
50.2.4. The Price-Dividend Ratio#
Aside from prices, another quantity of interest is the price-dividend ratio
Let’s write down an expression that this ratio should satisfy.
We can divide both sides of (50.2) by
Below we’ll discuss the implication of this equation.
50.3. Prices in the Risk Neutral Case#
What can we say about price dynamics on the basis of the models described above?
The answer to this question depends on
the process we specify for dividends
the stochastic discount factor and how it correlates with dividends
For now let’s focus on the risk neutral case, where the stochastic discount factor is constant, and study how prices depend on the dividend process.
50.3.1. Example 1: Constant dividends#
The simplest case is risk neutral pricing in the face of a constant, non-random dividend stream
Removing the expectation from (50.1) and iterating forward gives
Unless prices explode in the future, this sequence converges to
This price is the equilibrium price in the constant dividend case.
Indeed, simple algebra shows that setting
50.3.2. Example 2: Dividends with deterministic growth paths#
Consider a growing, non-random dividend process
While prices are not usually constant when dividends grow over time, the price dividend-ratio might be.
If we guess this, substituting
Since
The price is then
If, in this example, we take
This is called the Gordon formula.
50.3.3. Example 3: Markov growth, risk neutral pricing#
Next we consider a dividend process
The stochastic growth factor
where
is a finite Markov chain with state space and transition probabilities
is a given function on taking positive values
You can think of
as possible “states of the world” and as the current state as a function that maps a given state into a growth factor for the endowment is the growth rate of dividends
(For a refresher on notation and theory for finite Markov chains see this lecture)
The next figure shows a simulation, where
evolves as a discretized AR1 process produced using Tauchen’s method , so that is the growth rate
using LinearAlgebra, Statistics, Random
using LaTeXStrings, Plots, QuantEcon, NLsolve
n = 25
mc = tauchen(n, 0.96, 0.25)
sim_length = 80
x_series = simulate(mc, sim_length; init = round(Int, n / 2))
g_series = exp.(x_series)
d_series = cumprod(g_series) # assumes d_0 = 1
series = [x_series g_series d_series log.(d_series)]
labels = [L"X_t" L"g_t" L"d_t" L"ln(d_t)"]
plot(series; layout = 4, labels)
50.3.3.1. Pricing#
To obtain asset prices in this setting, let’s adapt our analysis from the case of deterministic growth.
In that case we found that
This encourages us to guess that, in the current case,
In other words, we are looking for a fixed function
We can substitute this guess into (50.5) to get
If we condition on
or
Suppose that there are
We can then think of (50.8) as
Here
is understood to be the column vector is the matrix is a column vector of ones
When does (50.9) have a unique solution?
From the Neumann series lemma and Gelfand’s formula, this will be the case if
In other words, we require that the eigenvalues of
The solution is then
50.3.4. Code#
Let’s calculate and plot the price-dividend ratio at a set of parameters.
As before, we’ll generate
Here’s the code, including a test of the spectral radius condition
n = 25 # size of state space
beta = 0.9
mc = tauchen(n, 0.96, 0.02)
K = mc.p .* exp.(mc.state_values)'
v = (I - beta * K) \ (beta * K * ones(n, 1))
plot(mc.state_values, v; lw = 2, ylabel = "price-dividend ratio",
xlabel = L"X_t", alpha = 0.7, label = L"v")
Why does the price-dividend ratio increase with the state?
The reason is that this Markov process is positively correlated, so high current states suggest high future states.
Moreover, dividend growth is increasing in the state.
Anticipation of high future dividend growth leads to a high price-dividend ratio.
50.4. Asset Prices under Risk Aversion#
Now let’s turn to the case where agents are risk averse.
We’ll price several distinct assets, including
The price of an endowment stream.
A consol (a variety of bond issued by the UK government in the 19th century).
Call options on a consol.
50.4.1. Pricing a Lucas tree#
Let’s start with a version of the celebrated asset pricing model of Robert E. Lucas, Jr. [Luc78].
As in [Luc78], suppose that the stochastic discount factor takes the form
where
(A derivation of this expression is given in a later lecture)
Assume the existence of an endowment that follows (50.7).
The asset being priced is a claim on the endowment process.
Following [Luc78], suppose further that in equilibrium, consumption
is equal to the endowment, so that
For utility, we’ll assume the constant relative risk aversion (CRRA) specification
When
Inserting the CRRA specification into (50.11) and using
Substituting this into (50.5) gives the price-dividend ratio formula
Conditioning on
If we let
then we can rewrite in vector form as
Assuming that the spectral radius of
We will define a function tree_price to solve for
The default Markov Chain for will be a discretized AR(1) with
function AssetPriceModel(; beta = 0.96, gamma = 2.0, g = exp,
mc = tauchen(25, 0.9, 0.02))
return (; beta, gamma, mc, g)
end
# price/dividend ratio of the Lucas tree
function tree_price(ap)
(; beta, mc, gamma, g) = ap
P = mc.p
y = mc.state_values'
J = P .* g.(y) .^ (1 - gamma)
@assert maximum(abs, eigvals(J)) < 1 / beta # check stability
# Compute v
v = (I - beta * J) \ sum(beta * J, dims = 2)
return v
end
tree_price (generic function with 1 method)
Here’s a plot of
gammas = [1.2, 1.4, 1.6, 1.8, 2.0]
p = plot(title = "Price-dividend ratio as a function of the state",
xlabel = L"X_t", ylabel = "price-dividend ratio")
for gamma in gammas
ap = AssetPriceModel(; gamma)
states = ap.mc.state_values
plot!(states, tree_price(ap); label = L"\gamma = %$gamma")
end
p
Notice that
This is because, with a positively correlated state process, higher states suggest higher future consumption growth.
In the stochastic discount factor (50.13), higher growth decreases the discount factor, lowering the weight placed on future returns.
50.4.1.1. Special cases#
In the special case
Recalling that
Thus, with log preferences, the price-dividend ratio for a Lucas tree is constant.
Alternatively, if
This is as expected, since
50.4.2. A Risk-Free Consol#
Consider the same pure exchange representative agent economy.
A risk-free consol promises to pay a constant amount
Recycling notation, let
An ex-coupon claim to the consol entitles the owner at the end of period
in period , plusthe right to sell the claim for
next period
The price satisfies (50.2) with
We maintain the stochastic discount factor (50.13), so this becomes
Guessing a solution of the form
Letting
The above is implemented in the function consol_price
function consol_price(ap, zeta)
(; beta, gamma, mc, g) = ap
P = mc.p
y = mc.state_values'
M = P .* g.(y) .^ (-gamma)
@assert maximum(abs, eigvals(M)) < 1 / beta
# Compute price
return (I - beta * M) \ sum(beta * zeta * M, dims = 2)
end
consol_price (generic function with 1 method)
Note that the sum(Q, dims=2) is equivalent to Q * ones(size(Q)[1], 1).
50.4.3. Pricing an Option to Purchase the Consol#
Let’s now price options of varying maturity that give the right to purchase a consol at a price
50.4.3.1. An infinite horizon call option#
We want to price an infinite horizon option to purchase a consol at a price
The option entitles the owner at the beginning of a period either to
purchase the bond at price
now, orNot to exercise the option now but to retain the right to exercise it later
Thus, the owner either exercises the option now, or chooses not to exercise and wait until next period.
This is termed an infinite-horizon call option with strike price
The owner of the option is entitled to purchase the consol at the price
The fundamentals of the economy are identical with the one above, including the stochastic discount factor and the process for consumption.
Let
Recalling that
The first term on the right is the value of waiting, while the second is the value of exercising now.
We can also write this as
With
To solve (50.18), form the operator
Start at some initial
We can find the solution with the following function call_option
# price of perpetual call on consol bond
function call_option(ap, zeta, p_s)
(; beta, gamma, mc, g) = ap
P = mc.p
y = mc.state_values'
M = P .* g.(y) .^ (-gamma)
@assert maximum(abs, eigvals(M)) < 1 / beta
# Find consol prices
p = consol_price(ap, zeta)
# Operator for fixed point, using consol prices
T(w) = max.(beta * M * w, p .- p_s)
# Compute option price as fixed point
sol = fixedpoint(T, zeros(length(y), 1))
converged(sol) || error("Failed to converge in $(sol.iterations) iter")
return sol.zero
end
call_option (generic function with 1 method)
Here’s a plot of
ap = AssetPriceModel(; beta = 0.9)
zeta = 1.0
strike_price = 40.0
x = ap.mc.state_values
p = consol_price(ap, zeta)
w = call_option(ap, zeta, strike_price)
plot(x, p, color = "blue", lw = 2, xlabel = L"X_t", label = "consol price")
plot!(x, w, color = "green", lw = 2,
label = "value of call option with strike at $strike_price")
In large states the value of the option is close to zero.
This is despite the fact the Markov chain is irreducible and low states — where the consol prices is high — will eventually be visited.
The reason is that
50.4.4. Risk Free Rates#
Let’s look at risk free interest rates over different periods.
50.4.4.1. The one-period risk-free interest rate#
As before, the stochastic discount factor is
It follows that the reciprocal
We can write this as
where the
50.4.4.2. Other terms#
Let
Then
50.5. Exercises#
50.5.1. Exercise 1#
In the lecture, we considered ex-dividend assets.
A cum-dividend asset is a claim to the stream
Following (50.1), find the risk-neutral asset pricing equation for one unit of a cum-dividend asset.
With a constant, non-random dividend stream
With a growing, non-random dividend process
50.5.2. Exercise 2#
Consider the following primitives
n = 5
P = fill(0.0125, n, n) + (0.95 - 0.0125)I
s = [1.05, 1.025, 1.0, 0.975, 0.95]
gamma = 2.0
beta = 0.94
zeta = 1.0
1.0
Let
Compute the price of the Lucas tree.
Do the same for
the price of the risk-free consol when
the call option on the consol when
and
50.5.3. Exercise 3#
Let’s consider finite horizon call options, which are more common than the infinite horizon variety.
Finite horizon options obey functional equations closely related to (50.17).
A
If we view today as date zero, a
The option expires at time
Thus, for
It obeys
where
We can express the preceding as the sequence of nonlinear vector equations
Write a function that computes
Compute the value of the option with k = 5 and k = 25 using parameter values as in Exercise 1.
Is one higher than the other? Can you give intuition?
50.6. Solutions#
50.6.1. Exercise 2#
n = 5
P = fill(0.0125, n, n) + (0.95 - 0.0125) * I
s = [0.95, 0.975, 1.0, 1.025, 1.05] # state values
mc = MarkovChain(P, s)
g = x -> x # identity
gamma = 2.0
beta = 0.94
zeta = 1.0
p_s = 150.0
150.0
Next we’ll create an instance of AssetPriceModel to feed into the functions.
ap = AssetPriceModel(; beta, mc, gamma, g)
(beta = 0.94, gamma = 2.0, mc = Discrete Markov Chain
stochastic matrix of type Matrix{Float64}:
[0.95 0.0125 … 0.0125 0.0125; 0.0125 0.95 … 0.0125 0.0125; … ; 0.0125 0.0125 … 0.95 0.0125; 0.0125 0.0125 … 0.0125 0.95], g = var"#3#4"())
Lucas tree prices are
tree_price(ap)
5×1 Matrix{Float64}:
29.474015777145
21.935706611219704
17.571422357262907
14.725150017725886
12.722217630644252
Consol Bond Prices
consol_price(ap, 1.0)
5×1 Matrix{Float64}:
753.8710047641281
242.5514408198748
148.6755454846522
109.25108965023784
87.56860138530377
w = call_option(ap, zeta, p_s)
5×1 Matrix{Float64}:
603.8710047641281
176.8393360121302
108.67734549950063
80.05179284845048
64.30843770772067
50.6.2. Exercise 3#
Here’s a suitable function:
function finite_horizon_call_option(ap, zeta, p_s, k)
(; beta, gamma, mc) = ap
P = mc.p
y = mc.state_values'
M = P .* ap.g.(y) .^ (-gamma)
@assert maximum(abs, eigvals(M)) < 1 / beta
# Compute option price
p = consol_price(ap, zeta)
w = zeros(length(y), 1)
for i in 1:k
# Maximize across columns
w = max.(beta * M * w, p .- p_s)
end
return w
end
finite_horizon_call_option (generic function with 1 method)
p = plot(title = "Value Finite Horizon Call Option", xlabel = L"t",
ylabel = "value")
for k in [5, 25]
w = finite_horizon_call_option(ap, zeta, p_s, k)
plot!(w; label = L"k = %$k")
end
p
Not surprisingly, the option has greater value with larger