Chapter 5. Static Economy

A securities market model is viable if and only if there exists at least one equivalent martingale measure for it.

Harrison and Kreps (1979)

The central piece of the theory relating the no-arbitrage arguments with martingale theory is the so-called Fundamental Theorem of Asset Pricing.

Delbaen and Schachermeyer (2006)

This chapter introduces more formalism to model a general static economy. Such an economy is characterized by an arbitrarily large, but still finite, state space. As before, the general static economy is analyzed at two relevant points in time only, for example, today and one year from now. Therefore, this chapter introduces one major generalization — namely with regard to the state space. The next chapter then generalizes the model economy further with regard to the number of relevant points in time. This enables one to also model dynamics.

The chapter makes use, as before, of linear algebra and probability theoretical concepts. Books that cover these topics well for the purposes of this chapter are Aleskorov et al. (2011) for linear algebra and Jacod and Protter (2004) for probability theory. A gentle introduction to general static economies and their analysis is found in Milne (1995). Pliska (1997) is a good introductory text book on the topic that is both accessible and rigorous. Duffie (1988) is an advanced text that covers general static economies in greater detail, providing all the necessary tools from linear algebra and probability in a self-contained fashion.

Topics covered in this chapter are general, discrete probability spaces, financial assets and contingent claims, market completeness, the two Fundamental Theorems of Asset Pricing, replication and arbitrage pricing, Black-Scholes-Merton (1973) and Merton (1976) option pricing as well as representative agent pricing with Arrow-Debreu securities.

The following table gives an overview of the topics in finance, mathematics, and Python found in this chapter.

Finance Mathematics Python

uncertainty

state space, algebra, probability measure, probability space

NumPy, ndarray, np.random.normal

financial asset, contingent claim

random variable, expectation

np.random, mean(), np.dot

market payoff matrix

matrix

ndarray, mean(), std()

replication, arbitrage pricing

solving systems of linear equations, dot product

np.maximum, np.linalg.solve, np.dot

market completeness

rank, span, vector space

ndarray, np.linalg.matrix_rank, np.dot

martingale measue

probability measure

ndarray, scipy.optimize.minimize

Black-Scholes-Merton model (1973)

geometric Brownian motion, normal distribution, Monte Carlo simulation, replication

np.random.standard_normal, np.linalg.lstsq

Merton (1976) model, log-normal jumps

jump diffusion, Poisson distribution

np.random.poisson, np.linalg.lstsq

The major goal of this chapter is generalization. Almost all concepts and notions presented in this chapter are introduced already in the previous chapters. The enlargement of the state space makes the introduction of a bit more formalism necessary. However, on the Python side the code is still as concise as experienced before. The benefits of this generalization should be clear. It is simply not realistic to model the possible future share price, of say the Apple stock, with two or three states only. It is much more realistic to assume that the share price can take on a value out of a possible 100, 500 or even more values. This is an important step towards a more realistic financial model.

Uncertainty

Consider an economy with a general, discrete state space Ω with a finite number of elements Ω < . An algebra in Ω is a family of sets for which the following statements hold true:

  1. Ω

  2. ? ? c

  3. ? 1 , ? 2 , . . . , ? I i=1 I ? i

? c denotes the complement of a set ? . The power set ( Ω ) is the largest algebra while the set = { , Ω } is the smallest algebra in Ω . An algebra is a model for observable events in an economy. In this context, a single state of the economy ω Ω can be interpreted as an atomic event.

A probability assigns a real number 0 p ω P ( { ω } ) 1 to a state ω Ω or a real number 0 P ( ? ) 1 to an event ? . If the probabilities for all states are known, one has P ( ? ) = ω? p ω .

A probability measure P : [ 0 , 1 ] is characterized by the following characteristics:

  1. ? : P ( ? ) 0

  2. P i=1 I ? i = i=1 I ? i for disjoint sets ? i

  3. P ( Ω ) = 1

Together the three elements { Ω , , P } form a probability space. A probability space is the formal representation for uncertainty in the model economy.

Random Variables

Given a probability space { Ω , , P } , a random variable is a - measurable function:

S : Ω 0 , ω S ( ω )

- measurability implies that for each ? { [ a , b [ : a , b , a < b } one has:

S -1 ( ? ) { ω Ω : S ( ω ) ? }

If ( Ω ) , the expectation of a random variable is defined by:

? P ( S ) = ωΩ P ( ω ) · S ( ω )

Otherwise, it holds:

? P ( S ) = ? P ( ? ) · S ( ? )

Numerical Examples

To make a concrete example, assume a state space of Ω = { ω 1 , ω 2 , ω 3 , ω 4 } . Furthermore, assume that an algebra with = { , { ω 1 , ω 2 } , { ω 3 , ω 4 } , Ω } is given. It is easily verified that this set satisfies the three characteristics of an alegbra in Ω . The probability measure shall be defined by P ( { ω 1 , ω 2 } ) = P ( { ω 3 , ω 4 } ) = 1 2 . Again, it is easy to see that P is indeed a probability measure on under these assumptions.

Consider now a function T with T ( ω 1 ) = 1 , T ( ω 2 ) = 2 , T ( ω 3 ) = 3 and T ( ω 4 ) = 4 . This function is not a random variable defined on the probability space since the algebra does not distinguish, for example, between ω 1 and ω 2  — they are subsumed by the set { ω 1 , ω 2 } . One could say that the algebra is “not granular” enough.

Consider another function S with S ( ω 1 ) = 20 , S ( ω 2 ) = 20 , S ( ω 3 ) = 5 and S ( ω 4 ) = 5 . This is now a random variable defined on the probability space with an expectation of

? P ( S ) = ? P ( ? ) · S ( ? ) = 1 2 · 20 + 1 2 · 5 = 12 . 5

In general, however, it will be assumed that ( Ω ) with P accordingly defined such that the function (random variable) T , for example, also is - measurable with the expectation properly defined.

With Python, it is efficient to illustrate cases in which Ω is much larger. The following Python code assumes equal probability for all possible states.

In [1]: import numpy as np
        np.set_printoptions(precision=5)

In [2]: np.random.seed(100)  1

In [3]: I = 1000  2

In [4]: S = np.random.normal(loc=100, scale=20, size=I)  3

In [5]: S[:14]  3
Out[5]: array([ 65.00469, 106.85361, 123.06072,  94.95128, 119.62642, 110.28438,
               104.42359,  78.59913,  96.21008, 105.10003,  90.83946, 108.70327,
                88.3281 , 116.33694])

In [6]: S.mean()  4
Out[6]: 99.66455685312181
1

Fixes the seed value for the NumPy random number generator for reproducibility of the results.

2

Fixes the number of states in the state space (for the simulations to follow).

3

Draws I normally distributed (pseudo-)random numbers with mean loc and standard deviation scale.

4

Calcualtes the expectation (mean value) assuming an equal probability for every simulated value (state).

Any other probability measure can of course also be chosen.

In [7]: P = np.random.random(I)  1

In [8]: P[:10]  2
Out[8]: array([0.079  , 0.36885, 0.0657 , 0.2236 , 0.25101, 0.94175, 0.1182 ,
               0.81407, 0.34056, 0.79935])

In [9]: P /= P.sum()  2

In [10]: P.sum()  2
Out[10]: 1.0

In [11]: P[:10]  3
Out[11]: array([0.00017, 0.00077, 0.00014, 0.00047, 0.00053, 0.00197, 0.00025,
                0.00171, 0.00071, 0.00167])

In [12]: np.dot(P, S)  4
Out[12]: 99.48909209680373
1

Draws uniformly distributed random numbers between 0 and 1.

2

Normalizes the values in the ndarray object to sum up to 1.

3

The resulting weights according to the random probability measure.

4

The expectation as the dot product of the probability vector and the vector representing the random variable.

Mathematical Techniques

In addition to linear algebra, traditional probability theory plays a central role in discrete finance. It allows to capture and analyze uncertainty and, more specifically, risk in a systematic, well-established way. When moving from discrete finance models to continuous ones, more advanced approaches, such as stochastic calculus, are required. For discrete finance models, standard linear algebra and probability theory prove powerful enough in most cases. For more details on discrete finance, refer to Pliska (1997).

Financial Assets

Consider an economy at two different dates t { 0 , 1 } , today and one year from now (or any other time period in the future to this end). Assume that a probability space { Ω , ( Ω ) , P } is given that represents uncertainty about the future in the model economy, with Ω I possible future states. In this case, Ω = { ω 1 , ω 2 , . . . , ω I } .

A traded financial asset is represented by a price process S = ( S 0 , S 1 ) where the price today is fixed S 0 >0 and the price in one year S 1 : Ω 0 is a random variable that is - measurable. Formally, the future price vector of a traded financial asset is a vector with I elements

S 1 = S 1 ( ω 1 ) S 1 ( ω 2 ) . . . S 1 ( ω I )

If there are multiple financial assets traded, say K > 1 , they are represented by multiple price processes S k = ( S 0 k , S 1 k ) , k = 1 , 2 , . . . , K . The market payoff matrix is then composed of the future price vectors of the traded financial assets.

= S 1 1 ( ω 1 ) S 1 2 ( ω 1 ) . . . S 1 K ( ω 1 ) S 1 1 ( ω 2 ) S 1 2 ( ω 2 ) . . . S 1 K ( ω 2 ) . . . . . . . . . . . . S 1 1 ( ω 3 ) S 1 2 ( ω 3 ) . . . S 1 K ( ω 3 )

Denote the set of traded financial assets by ? ( S 1 , S 2 , . . . , S K ) . The static model economy can then be summarized by

= ( { Ω , , P } , ? )

where it is usually assumed that ( Ω ) .

Fixing the number of possible future states to five Ω = { ω 1 , . . . , ω 5 } with equal probability ω Ω : P ( ω ) = 1 5 and the number of traded financial assets to five as well, a numerical example in Python illustrates such a static model economy.

In [13]: M = np.array((
             (11, 25, 0,  0,  25),
             (11, 20, 30, 15, 25),
             (11, 10, 0,  20, 10),
             (11, 5,  30, 15, 0),
             (11, 0,  0,  0,  0)
         ))  1

In [14]: M0 = np.array(5 * [10.])  2

In [15]: M0  2
Out[15]: array([10., 10., 10., 10., 10.])

In [16]: M.mean(axis=0)  3
Out[16]: array([11., 12., 12., 10., 12.])

In [17]: mu = M.mean(axis=0) / M0 - 1  4

In [18]: mu  4
Out[18]: array([0.1, 0.2, 0.2, 0. , 0.2])

In [19]: (M / M0 - 1)  5
Out[19]: array([[ 0.1,  1.5, -1. , -1. ,  1.5],
                [ 0.1,  1. ,  2. ,  0.5,  1.5],
                [ 0.1,  0. , -1. ,  1. ,  0. ],
                [ 0.1, -0.5,  2. ,  0.5, -1. ],
                [ 0.1, -1. , -1. , -1. , -1. ]])

In [20]: sigma = (M / M0 - 1).std(axis=0)  6

In [21]: sigma  6
Out[21]: array([0.     , 0.92736, 1.46969, 0.83666, 1.1225 ])
1

The assumed market payoff matrix where the columns represent the future, uncertain price vectors of the traded financial assets.

2

The current price vector for the five assets for each of which the price is fixed to 10.

3

This calculates the expected (or average) future price for every traded financial asset.

4

This in turn calculates the expected (or average) rates of return.

5

The rates of return matrix calculated and printed out.

6

The standard deviation of the rates of return or volatility calculated for every traded financial asset — the first one is risk-less, it can be considered to be a bond.

Contingent Claims

Given a model economy , a contingent claim is characterized by a price process C = ( C 0 , C 1 ) where C 1 is a - measurable random variable.

One can think of European call and put options as canonical examples of contingent claims. The payoff of a European call option might, for instance, be defined relative to the second traded financial asset according to C 1 = max ( S 1 2 - K , 0 ) where K 0 is the strike price of the option. Since the payoff of the option is “derived” from another asset, one therefore often speaks of derivative instruments or derivatives for short.

If a contingent claim can be replicated by a portfolio ϕ K of the traded financial assets ?

· ϕ = C 1

then the arbitrage price of the contingent claim is

0 · ϕ = C 0

where 0 = S 0 1 ,S 0 2 ,...,S 0 K T ++ I is the current price vector of the traded financial assets.

Continuing the Python example from before, replication of contingent claims based on linear algebra methods is illustrated in the following.

In [22]: K = 15  1

In [23]: M[:, 1]  1
Out[23]: array([25, 20, 10,  5,  0])

In [24]: C1 = np.maximum(M[:, 1] - K, 0)  2

In [25]: C1  2
Out[25]: array([10,  5,  0,  0,  0])

In [26]: phi = np.linalg.solve(M, C1)  3

In [27]: phi  3
Out[27]: array([-9.08364e-17,  5.00000e-01,  1.66667e-02, -2.00000e-01,
                -1.00000e-01])

In [28]: C1 == np.dot(M, phi)  4
Out[28]: array([ True, False, False, False, False])

In [29]: C0 = np.dot(M0, phi)  5

In [30]: C0  5
Out[30]: 2.1666666666666665
1

The strike price of the European call option and the payoff vector of the relevant financial asset.

2

The call option is written on the second traded financial asset with future payoff of S 1 2 = ( 25 , 20 , 10 , 5 , 0 ) .

3

This solves the replication problem given the market payoff matrix.

4

Checks whether the replication portfolio indeed perfectly replicates the future payoff of the European call option.

5

From the replication portfolio, the arbitrage price follows in combination with the current price vector of the traded financial assets.

Market Completeness

Market completeness of the static model economy can be analyzed based on the rank of the market payoff matrix as defined by the traded financial assets ? . The rank of a matrix equals the number of linearly independent (column or row) vectors (see Aleskerov et al. (2011), sec. 2.7). Consider the column vectors that represent the future price vectors of the traded financial assets. They are linearly independent if

· ϕ = 0

has only one solution, namely the null vector ϕ = (0,0,...,0) T K .

On the other hand, the span of the market payoff matrix is given by all linear combinations of the column vectors

span ( ) = ϕ K : · ϕ

The model economy is complete if the set of attainable contingent claims satisfies ? = I . However, the set of attainable contingent claims equals by definition the span of the traded financial assets ? span ( ) . The model economy therefore is complete if

span ( ) = I

Under which circumstances is this the case? It is the case if the rank of the matrix is at least as large as the number of future states possible

rank ( ) I

In other words the column vectors of form a basis of the vector space I (with potentially more basis vectors than required). A vector space ? is a set of elements (called vectors) that is characterized by

  1. an addition function mapping two vectors v 1 , v 2 ? to another element of the vector space ( v 1 + v 2 ) ? .

  2. a scalar multiplication function mapping a scalar α and a vector v ? to another element of the vector space ( α · v ) ? .

  3. a special element — usually called “zero” or “netural element" —  0 ? such that v + 0 = v

It is easy to verify that, for example, the sets , 5 or I , I + , are vector spaces.

Consequently, the model economy is incomplete if

rank ( ) < I

To make things a bit more concrete, consider a state space with three possible future states only Ω = { ω 1 , ω 2 , ω 3 } . All random variables then are vectors in the vector space 3 . The following market payoff matrix — resulting from three traded financial assets — has a rank of 2 only since two column vectors are linearly dependent. This leads to an incomplete market.

= 11 20 10 11 10 5 11 5 2 . 5 rank ( ) = 2

It is easily verified that the financial assets 2 and 3 are indeed linearly dependent.

S 1 2 = 20 10 5 = 2 · 10 5 2 . 5 = 2 · S 1 3

By contrast, the market payoff matrix below — resulting from a different set of three traded financial assets — has a rank of 3, leading to a complete market. In such a case, one also speaks of the matrix having full rank:

= 11 20 10 11 10 25 11 5 10 rank ( ) = 3

Assume next that a probability space is fixed for which the state space has five elements Ω = { ω 1 , . . . , ω 5 } . The future (uncertain) price and payoff vectors of the five traded financial assets ? and all contingent claims, respectively, are now elements of the vector space 5 . The Python that follows analyzes contingent claim replication based on such a model economy . It starts by assuming that all five Arrow-Debreu securities are traded and then proceeds to a randomized market payoff matrix.

In [31]: M = np.eye(5)  1

In [32]: M  1
Out[32]: array([[1., 0., 0., 0., 0.],
                [0., 1., 0., 0., 0.],
                [0., 0., 1., 0., 0.],
                [0., 0., 0., 1., 0.],
                [0., 0., 0., 0., 1.]])

In [33]: np.linalg.linalg.matrix_rank(M)  2
Out[33]: 5

In [34]: C1 = np.arange(10, 0, -2)  3

In [35]: C1  3
Out[35]: array([10,  8,  6,  4,  2])

In [36]: np.linalg.solve(M, C1)  4
Out[36]: array([10.,  8.,  6.,  4.,  2.])
1

Creates a two-dimensional ndarray object, here an identity matrix. It can be interpreted as the market payoff matrix resulting from five traded Arrow-Debreu securities. It forms a (so-called canonical) basis of the vector space 5 .

2

Calculates the rank of the matrix which is trivial to see for the identity matrix.

3

A contingent claim payoff which is to be replicated by the traded financial assets.

4

This solves the replication (representation) problem which is again trivial in the case of the identity matrix.

Next, a randomized market payoff matrix is generated which happens to be of full rank as well (no guarantees here in general).

In [37]: np.random.seed(100)  1

In [38]: M = np.random.randint(1, 10, (5, 5))  2

In [39]: M  2
Out[39]: array([[9, 9, 4, 8, 8],
                [1, 5, 3, 6, 3],
                [3, 3, 2, 1, 9],
                [5, 1, 7, 3, 5],
                [2, 6, 4, 5, 5]])

In [40]: np.linalg.linalg.matrix_rank(M)  3
Out[40]: 5

In [41]: np.linalg.linalg.matrix_rank(M.T)  3
Out[41]: 5

In [42]: phi = np.linalg.solve(M, C1)  4

In [43]: phi  4
Out[43]: array([ 0.00466, -3.27763, -2.00266,  4.19707,  1.73635])

In [44]: np.dot(M, phi)  5
Out[44]: array([10.,  8.,  6.,  4.,  2.])
1

Fixes the seed for the NumPy random number generator which allows for reproducibility of the results.

2

Creates a randomized market payoff matrix (ndarray object with shape (5, 5) populated by random integers between 1 and 10).

3

The matrix has full rank — both the column and row vectors are linearly independent.

4

The non-trivial solution to the replication problem with the randomized basis for the vector space 5 .

5

Checks the solution for achieving perfect replication.

Fundamental Theorems of Asset Pricing

Consider the general static model economy = ( { Ω , , P } , ? ) with I possible states and K traded financial assets. Assume that the risk-less short rate for lending and borrowing in the economy is r 0 .1

An arbitrage opportunity is a portfolio ϕ K of the traded financial assets ? such that the price of the portfolio is zero

S 0 · ϕ = k=1 K S 0 k · ϕ k = 0

and the expected payoff greater than zero

? P ( · ϕ ) > 0

Denote the set of all arbitrage opportunities by:

? { ϕ K : S 0 · ϕ = 0 , ? P ( · ϕ ) > 0 }

A martingale measure Q for the model economy makes the discounted price processes martingales and therefore satisfies the following condition:

1 1+r · ? Q ( ) = S 0

With these definitions, the First Fundamental Theorem of Asset Pricing (see also Chapter 2), which relates the existence of a martingale measure to the absence of arbitrage opportunities, can be formulated. For a discussion and proof, refer to Pliska (1997, sec. 1.3).

First Fundamental Theorem of Asset Pricing (1FTAP)

The following statements are equivalent:

  1. A martingale measure Q exists.

  2. The economy is arbitrage-free, it holds 0 = .

The derivation of a martingale measure is formally the same as the solution of a replication problem for a contingent claim C = ( C 0 , C 1 ) which reads

· ϕ = C 1

and where the replication portfolio ϕ needs to be determined. Mathematically, this is equivalent to solving a system of linear equations as illustrated in Chapter 2. Finding a martingale measure can be written as

1 1+r · ? Q ( ) = 1 1+r T · Q = ˜ · Q = S 0

where ˜ 1 1+r T and where

Q = Q ( ω 1 ) Q ( ω 2 ) . . . Q ( ω I ) , ω Ω : 0 Q ( ω ) 1 , ωΩ Q ( ω ) = 1

This problem can be considered the dual problem to the replication problem — albeit under some restrictive constraints. The constraints, resulting from the requirement that the solution be a probability measure, make a different technical approach in Python necessary. The problem of finding a martingale measure can be modeled as a constrained minimization problem — instead of just solving a system of linear equation. The example assumes a state space with five elements and the market payoff structure from before.

In [45]: import scipy.optimize as sco    1

In [46]: M = np.array((
             (11, 25, 0,  0,  25),
             (11, 20, 30, 15, 25),
             (11, 10, 0,  20, 10),
             (11, 5,  30, 15, 0),
             (11, 0,  0,  0,  0)
         ))  2

In [47]: np.linalg.linalg.matrix_rank(M[:, :5])  3
Out[47]: 5

In [48]: M0 = np.ones(5) * 10  4

In [49]: M0  5
Out[49]: array([10., 10., 10., 10., 10.])

In [50]: r = 0.1  6

In [51]: def E(Q):
             return np.sum((np.dot(M.T, Q) - M0 * (1 + r)) ** 2)   7

In [52]: E(np.array(5 * [0.2]))
Out[52]: 4.0

In [53]: cons = ({'type': 'eq', 'fun': lambda Q: Q.sum() - 1})  8

In [54]: bnds = (5 * [(0, 1)])  9

In [55]: bnds  9
Out[55]: [(0, 1), (0, 1), (0, 1), (0, 1), (0, 1)]

In [56]: res = sco.minimize(E, 5 * [1],  10
                            method='SLSQP',  11
                            constraints=cons,  12
                            bounds=bnds)  13

In [57]: Q = res['x']  14

In [58]: Q  14
Out[58]: array([0.14667, 0.18333, 0.275  , 0.18333, 0.21167])

In [59]: np.dot(M.T, Q) / (1 + r)  15
Out[59]: array([10.     ,  9.99998,  9.99999, 10.00001,  9.99998])

In [60]: np.allclose(M0, np.dot(M.T, Q) / (1 + r))
Out[60]: True
1

Imports the optimize sub-package from scipy as sco.

2

Defines the market payoff matrix.

3

Verifies that the matrix is of full rank.

4

Defines the price vector for the traded financial assets …

5

… and shows the values which are all set to 10.

6

Fixes the constant short rate.

7

Defines the objective function which is to be minimized. This approach is necessary because the linear system is to be solved under a constraint and with bounds for all parameters.

8

The constraint that the single probabilities need to add up to one.

9

Defines the bounds for every single probability.

10

The optimization procedure minimizing the function E

11

… defining the method used …

12

… providing the constraints to be observed and …

13

… providing the bounds for the parameters.

14

The results vector is the martingale measure.

15

Under the martingale measure, the discounted price processes are martingales.

The second Fundamental Theorem of Asset Pricing also holds true in the general static model economy . For a discussion and proof, refer to Pliska (1997, sec. 1.5).

Second Fundamental Theorem of Asset Pricing (2FTAP)

The following statements are equivalent:

  1. The martingale measure Q is unique.

  2. The economy is complete, it holds ? = + I .

Fundamental Theorems

The quest for valid option pricing models led to the seminal option pricing models of Black and Scholes (1973) and Merton (1973) — together Black-Scholes-Merton (1973). The models used in these seminal papers are rather specific in that they assume a geometric Brownian motion as the model for the price process of the only risky asset. Research from the late 1970s and early 1980s, namely from Harrison and Kreps (1979) and Harrison and Pliska (1981), provides a general framework for the pricing of contingent claims. In their general framework, martingale measures and processes that are (semi-)martingales play the central role. The class of (semi-)martingale processes is pretty large and encompasses both the early models (for example, geometric Brownian motion) as well as many more sophisticated financial models proposed and analyzed much later (for example, jump diffusions or stochastic volatility processes). Among others, this is one of the reasons why the presented Theorems are called fundamental — they apply to a large class of interesting and important financial models.

Black-Scholes-Merton Option Pricing

The Black-Scholes-Merton (1973) model for option pricing is based on a continuous model economy generally represented by stochastic differential equations (SDEs) with suitable boundary conditions. The SDE used to describe the evolution of the single risky asset (think of a stock or stock index) is the one for a geometric Brownian motion. In addition to the risky asset, another risk-less asset is traded in their model economy which pays a continuous, risk-less short rate.

In the static case with two relevant points in time only, say t = 0 and t = T > 0 , the future, uncertain value of the risky asset S T is given by

S T = S 0 · e r-σ 2 2T+σTz

where S 0 >0 is the price of the risky asset today, r 0 is the constant risk-less short rate, σ >0 is a constant volatility factor, and z is a standard normally distributed random variable (see Jacod and Protter (2004), ch. 16).

In a discrete, numerical context, one can draw, for example, pseudo-random numbers z i , i = 1 , 2 , . . . , I that are standard normally distributed to derive I numerical values for S T according to the above equation:

S T ( z i ) = S 0 · e r-σ 2 2T+σTz i , i = 1 , 2 , . . . , I

Such a procedure is usually called Monte Carlo simulation. To simplify the notation, S T shall from now on specify the vector of simulated future values of the stock:

S T S T ( z 1 ) S T ( z 2 ) . . . S T ( z I )

With these definitions, the model economy is as follows. There is a general probability space { Ω , ( Ω ) , P } with I possible future states of the economy. Every state is assumed to be equally likely — that is, it holds:

ω Ω : P ( ω ) = 1 I

The set of traded financial assets ? consists of the risk-less asset called bond with price process B = B 0 , B 0 · e rT and the risky asset called stock (paying no dividends) with price process S = ( S 0 , S T ) and S T as defined above. Together this forms the Black-Scholes-Merton (1973) model economy

BSM = { Ω , , P } , ? = { B , S }

Assume a European call option written on the stock as a contingent claim. The payoff is

C T ( S T - K , 0 )

with strike price K 0 . The price — here, the Monte Carlo estimator — for the call option is given as the expected (average) discounted payoff:

C 0 = e -rT 1 I i=1 I max ( S T ( z i ) - K , 0 )

The model economy and the Monte Carlo based pricing approach are straightforward to implement in Python. Figure 5-1 shows the frequency distribution of the simulated stock price values including the mean and the standard deviation around the mean.

In [61]: import math

In [62]: S0 = 100  1
         r = 0.05  2
         sigma = 0.2  3
         T = 1.0  4
         I = 10000  5

In [63]: np.random.seed(100)  6

In [64]: ST = S0 * np.exp((r - sigma ** 2 / 2) * T +
              sigma * math.sqrt(T) * np.random.standard_normal(I))  7

In [65]: ST[:8].round(1)  7
Out[65]: array([ 72.6, 110.4, 129.8,  98. , 125.4, 114.2, 107.7,  83.2])

In [66]: ST.mean()  8
Out[66]: 105.1801645479748

In [67]: S0 * math.exp(r * T)  9
Out[67]: 105.12710963760242

In [68]: from pylab import mpl, plt
         plt.style.use('seaborn')
         mpl.rcParams['savefig.dpi'] = 300
         mpl.rcParams['font.family'] = 'serif'

In [69]: plt.figure(figsize=(10, 6))
         plt.hist(ST, bins=35, label='frequency');
         plt.axvline(ST.mean(), color='r', label='mean')
         plt.axvline(ST.mean() + ST.std(), color='y', label='sd up')
         plt.axvline(ST.mean() - ST.std(), color='y', label='sd down')
         plt.legend(loc=0);   10
1

The initial stock price level.

2

The constant short rate.

3

The volatility factor.

4

The time horizon in year fractions.

5

The number of states and also the number of simulations.

6

Fixes the seed value for reproducibility.

7

The core line of code: It implements the Monte Carlo simulation with NumPy in vectorized fashion, simulating I values in a single step.

8

The mean value as obtained from the simulated set of stock prices.

9

The theoretically to be expected value of the stock price.

10

These lines of code plot the simulation results as a histogram and add some major statistics.

ftwp 0501
Figure 5-1. Simulated values for the stock price in Black-Scholes-Merton (1973)

Having the simulated stock price values available, makes European option pricing only a matter of two more vectorized operations.

In [70]: K = 105  1

In [71]: CT = np.maximum(ST - K, 0)  2

In [72]: CT[:8].round(1)
Out[72]: array([ 0. ,  5.4, 24.8,  0. , 20.4,  9.2,  2.7,  0. ])

In [73]: C0 = math.exp(-r * T) * CT.mean()  3

In [74]: C0  3
Out[74]: 8.120009539141193
1

The strike price of the option.

2

The payoff vector of the option.

3

The Monte Carlo estimator of the option price.

Completeness of Black-Scholes-Merton

What about the completeness of the Black-Scholes-Merton model economy BSM ? The previous section derives a Monte Carlo estimator for the (arbitrage) price of a European call option despite the fact that there are much more states of the economy I 2 than financial assets traded K = 2 . Two observations can be made:

  • General incompleteness: In a wider sense, the economy is incomplete because not every contingent claim can be replicated by a portfolio of the traded assets and because there is not a unique martingale measure (see 2FTAP).

  • Specific completeness: In a narrow sense, the model is complete, because every contingent claim that can be represented as a function of the price vector of the stock C 1 = f ( S 1 2 ) is replicable by positions in the bond and the stock.

When using Monte Carlo simulation to derive an estimator for the arbitrage price in the previous section, the fact is used that the model economy BSM is complete in the above specific sense. The payoff of the European call option only depends on the future price vector of the stock. What is missing so far is the replication portfolio and the resulting arbitrage price calculation to verify that the Monte Carlo simulation approach is justified.

The NumPy function used so far to solve replication problems np.linalg.solve requires a square (market payoff) matrix. In the Black-Scholes-Merton economy with only two traded financial assets and many more possible future states this prerequisite is not given. However, one can use a least-squares approach via np.linalg.lstsq to find a numerical solution to the replication problem.

In [75]: B0 = 100  1

In [76]: M0 = np.array((B0, S0))  2

In [77]: BT = B0 * np.ones(len(ST)) * math.exp(r * T)  3

In [78]: BT[:4]  3
Out[78]: array([105.12711, 105.12711, 105.12711, 105.12711])

In [79]: M = np.array((BT, ST)).T  4

In [80]: M  4
Out[80]: array([[105.12711,  72.61831],
                [105.12711, 110.35542],
                [105.12711, 129.77178],
                ...,
                [105.12711,  94.19527],
                [105.12711, 119.30886],
                [105.12711,  98.80359]])

In [81]: phi = np.linalg.lstsq(M, CT, rcond=None)[0]  5

In [82]: phi  5
Out[82]: array([-0.50337,  0.58428])

In [83]: np.mean((np.dot(M, phi) - CT))  6
Out[83]: -3.425384420552291e-14

In [84]: np.dot(M0, phi)  7
Out[84]: 8.090522690395254
1

The arbitrarily fixed price for the bond.

2

The price vector today for the two traded financial assets.

3

The future price vector of the bond given the initial price and the short rate.

4

The resulting market payoff matrix which is of rank 2 only — compared to 10,000 future states.

5

This solves the replication problem through least-squares representation. For the call option replication the bond is to be shorted (sold) and the stock is to be bought.

6

The average replication error, resulting, for example, from floating point inaccuracies and the numerical methods used, is not exactly zero but really close to it.

7

This calculates the arbitrage price given the (numerically) optimal replication portfolio. It is close to the Monte Carlo estimator from before.

Merton Jump-Diffusion Option Pricing

This section introduces another important model economy which dates back to Merton (1976) and adds a jump component to the stock price model of Black-Scholes-Merton (1973). The random jump component renders the model economy M76 incomplete in general. However, in the discrete setting of this chapter one can apply the same numerical approaches for option pricing as introduced for BSM in the previous two sections. The model is called jump-diffusion model although a diffusion is only defined in a dynamic context.

In real financial time series, one observes jumps with some regularities. They might be caused by a stock market crash and by other rare and/or extreme events. The model by Merton (1976) allows to explicitly model such rare events and their impact on the price of financial instruments. Models without jumps are often not well suited to explain certain characteristics and phenomena as regularly observed in financial time series. The model is also capable of modeling both positive as well as negative jumps. While a negative jump (large drop) might be observed in practice for stock indices, positive jumps (spikes) occur in practice, for example, in volatility indices.

The Merton jump-diffusion economy M76 is the same as the Black-Scholes-Merton economy BSM apart from the future price of the stock at time T which can be simulated in this economy according to

S T ( z i ) = S 0 · e r-r j -σ 2 2T+σTz i 1 + + e μ+δz i 2 - 1 y i , i = 1 , 2 , . . . , I

with the z i 1 , z i 2 being standard normally distributed and the y i being Poisson distributed with intensity λ (see Jacod and Protter (2004), ch. 4). The jumps are log-normally distributed with expected value of μ and standard deviation of δ (see Jacod and Protter (2004), ch. 7). The expected jump size is:

r j = λ · e μ+δ 2 /2 - 1

To implement and simulate this model in Python requires the definition of additional parameters and the simulation of three random variables. Figure 5-2 shows the simulated values which can become negative given the parameters assumed and the Python code used.

In [85]: M0 = np.array((100, 100))   1

In [86]: r = 0.05
         sigma = 0.2
         lmbda = 0.3
         mu = -0.3
         delta = 0.1
         rj = lmbda * (math.exp(mu + delta ** 2 / 2) - 1)
         T = 1.0
         I = 10000

In [87]: BT = M0[0] * np.ones(I) * math.exp(r * T)

In [88]: z = np.random.standard_normal((2, I))  2
         z -= z.mean()  3
         z /= z.std()  3
         y = np.random.poisson(lmbda, I)  4

In [89]: ST = S0 * (
             np.exp((r - rj - sigma ** 2 / 2) * T +
                    sigma * math.sqrt(T) * z[0]) +
             (np.exp(mu + delta * z[1]) - 1) * y
         )  5

In [90]: ST.mean() * math.exp(-r * T)  6
Out[90]: 100.63133302530244

In [91]: plt.figure(figsize=(10, 6))
         plt.hist(ST, bins=35, label='frequency');
         plt.axvline(ST.mean(), color='r', label='mean')
         plt.axvline(ST.mean() + ST.std(), color='y', label='sd up')
         plt.axvline(ST.mean() - ST.std(), color='y', label='sd down')
         plt.legend(loc=0);
1

Fixes the initial price vector of the two traded financial assets (bond and stock).

2

The first set of standard normally distributed random numbers.

3

The second set of standard normally distributed random numbers.

4

The set with Poisson distributed random numbers with intensity lambda.

5

The simulation of the stock price values at T given the three sets of random numbers.

6

Calculates the discounted mean value of the simulated stock price.

ftwp 0502
Figure 5-2. Simulated values for the stock price in Merton (1976)

Adding a maximum function to the stock price, Monte Carlo simulation avoids negative values (see Figure 5-3).

In [92]: ST = np.maximum(S0 * (
             np.exp((r - rj - sigma ** 2 / 2) * T +
                    sigma * math.sqrt(T) * z[0]) +
             (np.exp(mu + delta * z[1]) - 1) * y
         ), 0)  1

In [93]: plt.figure(figsize=(10, 6))
         plt.hist(ST, bins=35, label='frequency')  2
         plt.axvline(ST.mean(), color='r', label='mean')
         plt.axvline(ST.mean() + ST.std(), color='y', label='sd up')
         plt.axvline(ST.mean() - ST.std(), color='y', label='sd down')
         plt.legend(loc=0);
1

Maximum function …

2

… avoids negative values for the stock price.

ftwp 0503
Figure 5-3. Simulated values (truncated) for the stock price in Merton (1976)

The final step is the pricing of the European call option through calculation of the Monte Carlo estimator and the approximate replication approach.

In [94]: K = 105

In [95]: CT = np.maximum(ST - K, 0)

In [96]: C0 = math.exp(-r * T)  * np.mean(CT)  1

In [97]: C0  1
Out[97]: 10.322864494488943

In [98]: M = np.array((BT, ST)).T

In [99]: phi = np.linalg.lstsq(M, CT, rcond=-1)[0]  2

In [100]: phi  2
Out[100]: array([-0.41918,  0.51909])

In [101]: np.mean(np.dot(M, phi) - CT)  3
Out[101]: -2.5636381906224415e-14

In [102]: np.dot(M0, phi)  4
Out[102]: 9.991506469652071
1

The Monte Carlo estimator for the European call option price.

2

The approximate replication portfolio.

3

The replication error of the optimal portfolio.

4

The arbitrage price according to the optimal portfolio.

Incompleteness Through Jumps

While the Black-Scholes-Merton (1973) model is complete, the addition of a jump component in the Merton (1976) jump diffusion model makes it incomplete in a wide sense. This means that even the introduction of additional financial assets cannot make it complete. The fact that the jump component can take on an infinite number of values would require an infinite number of additional financial assets to make the model complete.

Representative Agent Pricing

Assume again the general static economy now populated by a representative, expected utility maximizing agent. The agent is endowed with initial wealth today of w >0 and has preferences that can be represented by a utility function u : c , u ( c ) ln c . Formally, the problem of the agent is the same as in Chapter 4:

max ϕ ? P ( u ( · ϕ ) ) w = 0 · ϕ

The difference is that there are now potentially many more future states possible and many more financial assets traded.

Furthermore, assume that the complete set of Arrow-Debreu securities — with a net supply of one for each security — is traded, K = I , the market payoff matrix is:

= 1 0 . . . 0 0 1 . . . 0 . . . . . . . . . . . . 0 0 . . . 1

The optimization problem in unconstrained form is according to the Theorem of Lagrange given by:

max ϕ,λ f ( ϕ , λ ) = ? P u ( · ϕ ) - λ · ( 0 · ϕ - w )

From this, the first order conditions for all portfolio positions ϕ i , i = 1 , 2 , . . . , I  — where i refers to the Arrow-Debreu security which pays off in state ω i  — are:

f ϕ i = P ( ω i ) - λ · S 0 i = 0 , i = 1 , 2 , . . . , I

S 0 i is the price of the Arrow-Debreu security paying off in state ω i . The relative prices between all Arrow-Debreu securities are accordingly determined by the probabilities for the respective payoff states to unfold:

S 0 i S 0 j = P(ω i ) P(ω j ) , ω i , ω j Ω

Fixing w = 1 , one obtains for the absolute prices

S 0 i = P ( ω i )

In words, the price for the Arrow-Debreu security paying off in state ω i equals the probability P ( ω i ) for this state to unfold.

This little analysis shows that the formalism of solving the representative agent problem for pricing purposes is more or less the same in the general static economy as compared to the simple economies of Chapter 4.

Conclusions

This chapter covers general static economies with a potentially large number of states — for the Black-Scholes-Merton (1973) model simulation, for example, 10,000 different states are assumed. The additional formalism introduced pays off pretty well because it allows for much more realistic models that can be applied in practice, for instance, to value European put or call options on a stock index or a single stock.

Python in combination with NumPy proves powerful for the modeling of such economies with much larger market payoff matrices than seen before. Monte Carlo simulation is also accomplished both efficiently and fast by the use of vectorization techniques. Using least-squares regression techniques, approximate replication portfolios are also efficiently derived in such a setting.

However, static economies are per se limited with regard to what they can model in the financial space. For instance, early exercise features like those seen in the context of American options cannot be accounted for. This shortcoming will be overcome when enlarging the relevant set of points in the time — making thereby the next natural step to dynamic economies — in the next chapter.

Further Resources

Papers cited in this chapter:

  • Black, Fischer and Myron Scholes (1973): “The Pricing of Options and Corporate Liabilities.” Journal of Political Economy, Vol. 81, No. 3, 638-659.

  • Harrison, Michael and David Kreps (1979): “Martingales and Arbitrage in Multiperiod Securities Markets.” Journal of Economic Theory, Vol. 20, 381–408.

  • Merton, Robert (1973): “Theory of Rational Option Pricing.” Bell Journal of Economics and Management Science, Vol. 4, 141-183.

  • Merton, Robert (1976): “Option Pricing when the Underlying Stock Returns are Discontinuous.” Journal of Financial Economics, No. 3, Vol. 3, 125-144.

Books cited in this chapter:

  • Aleskerov, Fuad, Hasan Ersel and Dmitri Piontkovski (2011): Linear Algebra for Economists. Springer, Heidelberg et al.

  • Delbaen, Freddy and Walter Schachermayer (2006): The Mathematics of Arbitrage. Springer Verlag, Berlin.

  • Duffie, Darrell (1988): Security Markets — Stochastic Models. Academic Press, San Diego et al.

  • Jacod, Jean and Philip Protter (2004): Probability Essentials. Springer, Berlin and Heidelberg.

  • Milne, Frank (1995): Finance Theory and Asset Pricing. Oxford University Press, New York.

  • Pliska, Stanley (1997): Introduction to Mathematical Finance. Blackwell Publishers, Malden and Oxford.

1 The notation is changed here from i to r to emphasize that the short rate is meant from now on.

..................Content has been hidden....................

You can't read the all page of ebook, please click here login for view all page.
Reset
3.144.172.115