---
title: "Chapter 6. Fundamental Theorem of Asset Pricing in Discrete Time"
---
::: {.chapter-objectives}
## Learning Goals
By the end of this chapter, students should be able to:
- state the discrete-time Fundamental Theorem of Asset Pricing in finite markets;
- define arbitrage using self-financing trading strategies and discounted gains;
- explain the meaning of an equivalent martingale measure;
- prove the one-period theorem using finite-dimensional linear algebra;
- connect no arbitrage with the existence of strictly positive state prices;
- distinguish physical probabilities from risk-neutral probabilities;
- explain why market completeness corresponds to uniqueness of the pricing measure;
- compute no-arbitrage price intervals in incomplete markets;
- implement finite-market no-arbitrage, martingale, and completeness checks in Python;
- use AI tools to audit theorem statements, assumptions, proofs, and numerical code.
:::
::: {.hero-box}
The Fundamental Theorem of Asset Pricing is the central organizing theorem of mathematical finance:
$$
\text{No arbitrage}
\quad\Longleftrightarrow\quad
\exists\ \mathbb Q\sim \mathbb P
\text{ such that discounted traded prices are }\mathbb Q\text{-martingales.}
$$
In finite discrete-time models, this is a theorem about **linear algebra**. Arbitrage means that a linear space of attainable gains intersects the positive orthant in a nontrivial way. No arbitrage means that this does not happen. A separating vector then becomes a strictly positive probability measure under which discounted prices have zero conditional drift.
:::
## 6.1 Why the Fundamental Theorem Matters
Chapters 3--5 introduced pricing by replication, risk-neutral probabilities, and martingales. In each example, the same pattern appeared:
1. construct a market model;
2. rule out arbitrage;
3. find a probability measure $\mathbb Q$;
4. check that discounted prices are martingales under $\mathbb Q$;
5. price claims by discounted conditional expectation.
The Fundamental Theorem of Asset Pricing explains why this pattern is not a coincidence. In a finite discrete-time market, absence of arbitrage is equivalent to the existence of a pricing probability measure.
This theorem is important for three reasons.
First, it gives a **mathematical test for model consistency**. If no equivalent martingale measure exists, then the model admits arbitrage and cannot be used for rational pricing.
Second, it explains the role of risk-neutral probabilities. The measure $\mathbb Q$ is not introduced because investors are literally risk-neutral. It appears because no-arbitrage pricing can be represented as expectation after changing the probability measure.
Third, it separates two issues:
- **no arbitrage**: at least one equivalent martingale measure exists;
- **completeness**: exactly one equivalent martingale measure exists.
When the market is complete, every claim can be replicated and therefore has one no-arbitrage price. When the market is incomplete, some claims cannot be replicated and may have a range of no-arbitrage prices.
## 6.2 Finite Discrete-Time Market Setup
We work on a finite probability space
$$
\Omega=\{\omega_1,\ldots,\omega_m\},
$$
with physical probability measure $\mathbb P$ satisfying
$$
\mathbb P(\omega_i)>0,
\qquad
\sum_{i=1}^m \mathbb P(\omega_i)=1.
$$
The assumption $\mathbb P(\omega_i)>0$ means that every state in the model is considered possible under the real-world model.
Let
$$
\mathcal F_0\subseteq \mathcal F_1\subseteq\cdots\subseteq \mathcal F_N
$$
be a filtration. The sigma-algebra $\mathcal F_n$ represents the information available at time $n$.
Suppose there are $d+1$ traded assets. Asset $0$ is the bank account,
$$
B_n>0,
$$
and assets $1,\ldots,d$ are risky assets with price vector
$$
S_n=(S_n^1,\ldots,S_n^d)^\top.
$$
The discounted risky asset prices are
$$
\widetilde S_n^i=\frac{S_n^i}{B_n},
\qquad i=1,\ldots,d.
$$
We write
$$
\widetilde S_n=(\widetilde S_n^1,\ldots,\widetilde S_n^d)^\top.
$$
Discounting is not just a technical convenience. It changes all cash flows into units of the bank account. After discounting, the bank account price is identically one:
$$
\widetilde B_n=\frac{B_n}{B_n}=1.
$$
Therefore all no-arbitrage questions can be stated in terms of discounted gains from risky assets.
## 6.3 Trading Strategies and Self-Financing Gains
A trading strategy is a sequence
$$
\theta_n=(\theta_n^1,\ldots,\theta_n^d)^\top,
\qquad n=1,
\ldots,N,
$$
where $\theta_n^i$ is the number of shares of risky asset $i$ held over the period $(n-1,n]$.
::: {.definition}
### Definition 6.1: Predictable trading strategy
A trading strategy $(\theta_n)_{n=1}^N$ is predictable if $\theta_n$ is $\mathcal F_{n-1}$-measurable for each $n$.
:::
Predictability means that the portfolio chosen for the next period can depend on current and past information, but not on future information. This is the mathematical version of the rule that traders cannot see tomorrow's prices before choosing today's position.
The discounted gain from the strategy is
$$
G_N(\theta)
=
\sum_{n=1}^N \theta_n^\top
\left(\widetilde S_n-\widetilde S_{n-1}\right).
$$
This formula is central. It says that profit comes from holding risky assets while their discounted prices change.
A self-financing strategy is one in which changes in holdings are financed internally by selling and buying assets, not by injecting or withdrawing external cash. In discounted units, the terminal wealth of a self-financing strategy with initial discounted wealth $x$ is
$$
\widetilde V_N=x+G_N(\theta).
$$
Thus zero initial wealth means
$$
\widetilde V_N=G_N(\theta).
$$
## 6.4 Arbitrage
::: {.definition}
### Definition 6.2: Arbitrage opportunity
An arbitrage opportunity is a predictable self-financing strategy $\theta$ with zero initial wealth such that
$$
G_N(\theta)\ge 0
\quad \text{for every } \omega\in\Omega,
$$
and
$$
\mathbb P(G_N(\theta)>0)>0.
$$
:::
Because every state has positive physical probability, the second condition means that the payoff is strictly positive in at least one state.
The definition has three parts:
1. **zero initial cost**: no money is invested initially;
2. **no possible loss**: the terminal gain is nonnegative in every state;
3. **some possible gain**: the terminal gain is positive in at least one state.
No arbitrage means that no such strategy exists.
::: {.warning}
A strategy with positive expected profit under $\mathbb P$ is not necessarily an arbitrage. Arbitrage is pathwise stronger: it requires no loss in any state and strict gain in at least one state.
:::
## 6.5 Equivalent Probability Measures
The Fundamental Theorem uses probability measures that are equivalent to the physical measure.
::: {.definition}
### Definition 6.3: Equivalent measures
Two probability measures $\mathbb Q$ and $\mathbb P$ on a finite space $\Omega$ are equivalent, written
$$
\mathbb Q\sim\mathbb P,
$$
if they assign zero probability to exactly the same events.
:::
Since we assume $\mathbb P(\omega_i)>0$ for every state, equivalence is simply
$$
\mathbb Q(\omega_i)>0
\quad \text{for every } i=1,\ldots,m.
$$
Thus an equivalent measure does not delete any state that the original model considers possible. It may change probabilities, but it cannot declare a possible state impossible.
This is financially important. If a pricing measure assigned probability zero to a possible bad state, it could hide risk. Equivalence prevents that.
## 6.6 Equivalent Martingale Measures
::: {.definition}
### Definition 6.4: Equivalent martingale measure
A probability measure $\mathbb Q$ is an equivalent martingale measure, or EMM, if:
1. $\mathbb Q\sim\mathbb P$;
2. the discounted price process $\widetilde S_n$ is a martingale under $\mathbb Q$:
$$
\mathbb E^{\mathbb Q}
\left[\widetilde S_{n+1}\mid\mathcal F_n\right]
=
\widetilde S_n,
\qquad n=0,\ldots,N-1.
$$
:::
The martingale condition can also be written as a zero conditional drift condition:
$$
\mathbb E^{\mathbb Q}
\left[\widetilde S_{n+1}-\widetilde S_n\mid\mathcal F_n\right]=0.
$$
If there are several risky assets, this means that every discounted risky asset has zero conditional drift under the same measure $\mathbb Q$.
The same measure must work for all traded assets. That is what makes the theorem powerful: one pricing measure synchronizes the entire market.
## 6.7 Why an Equivalent Martingale Measure Rules Out Arbitrage
The easier direction of the theorem is the following.
::: {.theorem}
### Theorem 6.1: Martingale measure implies no arbitrage
If there exists an equivalent martingale measure $\mathbb Q$, then the finite discrete-time market has no arbitrage.
:::
::: {.proof}
Let $\theta$ be a predictable self-financing strategy with zero initial wealth. Its discounted terminal gain is
$$
G_N(\theta)
=
\sum_{n=1}^N \theta_n^\top
\left(\widetilde S_n-\widetilde S_{n-1}\right).
$$
Because $\theta_n$ is $\mathcal F_{n-1}$-measurable and $\widetilde S$ is a $\mathbb Q$-martingale,
$$
\mathbb E^{\mathbb Q}
\left[\theta_n^\top(\widetilde S_n-\widetilde S_{n-1})
\mid \mathcal F_{n-1}\right]
=
\theta_n^\top
\mathbb E^{\mathbb Q}
\left[\widetilde S_n-\widetilde S_{n-1}
\mid \mathcal F_{n-1}\right]
=0.
$$
Taking expectations and summing over $n$ gives
$$
\mathbb E^{\mathbb Q}[G_N(\theta)]=0.
$$
Suppose $\theta$ were an arbitrage. Then $G_N(\theta)\ge 0$ in every state and $G_N(\theta)>0$ in at least one state with positive $\mathbb P$-probability. Since $\mathbb Q\sim\mathbb P$, that state also has positive $\mathbb Q$-probability. Therefore
$$
\mathbb E^{\mathbb Q}[G_N(\theta)]>0,
$$
contradicting $\mathbb E^{\mathbb Q}[G_N(\theta)]=0$. Hence no arbitrage exists.
:::
This proof contains the financial logic of risk-neutral pricing. A zero-cost self-financing gain has zero expectation under the martingale measure. It cannot be nonnegative everywhere and positive somewhere.
## 6.8 The Fundamental Theorem of Asset Pricing
We now state the theorem in the finite discrete-time setting.
::: {.theorem}
### Theorem 6.2: Fundamental Theorem of Asset Pricing, finite discrete time
In a finite discrete-time market, the following are equivalent:
1. the market has no arbitrage;
2. there exists an equivalent martingale measure $\mathbb Q\sim\mathbb P$ for the discounted price process $\widetilde S$.
:::
In symbols,
$$
\text{No arbitrage}
\quad\Longleftrightarrow\quad
\mathcal M_e(\widetilde S)\ne\varnothing,
$$
where $\mathcal M_e(\widetilde S)$ denotes the set of equivalent martingale measures.
The nontrivial direction is:
$$
\text{No arbitrage}
\quad\Longrightarrow\quad
\text{there exists an equivalent martingale measure.}
$$
In continuous time, this direction requires more advanced functional analysis and technical assumptions. In finite discrete time, the core idea is a separation theorem from linear algebra.
## 6.9 One-Period Proof by Linear Algebra
To understand the theorem, start with a one-period model. Suppose there are $m$ states at time $1$ and $d$ risky assets. Work in discounted units. Let
$$
\Delta \widetilde S^i(\omega_j)
=
\widetilde S_1^i(\omega_j)-\widetilde S_0^i.
$$
For a portfolio vector $\theta\in\mathbb R^d$, the zero-cost discounted gain is the state vector
$$
X_\theta
=
\theta^\top \Delta \widetilde S
\in \mathbb R^m,
$$
where
$$
X_\theta(\omega_j)
=
\sum_{i=1}^d \theta_i
\left(\widetilde S_1^i(\omega_j)-\widetilde S_0^i\right).
$$
The set of attainable zero-cost gains is the linear subspace
$$
L=\{X_\theta:\theta\in\mathbb R^d\}\subseteq \mathbb R^m.
$$
Arbitrage exists exactly when $L$ contains a nonzero vector in the nonnegative orthant:
$$
L\cap \mathbb R_+^m\ne \{0\}.
$$
Therefore no arbitrage means
$$
L\cap \mathbb R_+^m=\{0\}.
$$
This is now a geometric statement. A linear subspace does not enter the positive orthant except at the origin. The separation idea says that there must be a strictly positive vector $q=(q_1,\ldots,q_m)$ orthogonal to $L$.
::: {.theorem}
### Theorem 6.3: One-period finite-market separation form
A one-period finite market has no arbitrage if and only if there exists a vector
$$
q=(q_1,
\ldots,q_m)
$$
such that
$$
q_j>0,
\qquad
\sum_{j=1}^m q_j=1,
$$
and
$$
\sum_{j=1}^m q_j
\left(\widetilde S_1^i(\omega_j)-\widetilde S_0^i\right)=0,
\qquad i=1,\ldots,d.
$$
:::
The last condition is equivalent to
$$
\mathbb E^{\mathbb Q}[\widetilde S_1^i]=\widetilde S_0^i,
\qquad i=1,\ldots,d,
$$
where $\mathbb Q(\omega_j)=q_j$. Since every $q_j>0$, the measure $\mathbb Q$ is equivalent to $\mathbb P$. Since there is only one period, the expectation condition is exactly the martingale condition.
::: {.proof}
Assume such a vector $q$ exists. For any zero-cost gain $X_\theta\in L$,
$$
\mathbb E^{\mathbb Q}[X_\theta]
=
\sum_{j=1}^m q_j X_\theta(\omega_j)
=
\sum_{i=1}^d \theta_i
\sum_{j=1}^m q_j
\left(\widetilde S_1^i(\omega_j)-\widetilde S_0^i\right)
=0.
$$
If $X_\theta$ were an arbitrage payoff, then it would be nonnegative in every state and positive in at least one state. Since all $q_j>0$, its $\mathbb Q$-expectation would be strictly positive, a contradiction. Thus no arbitrage exists.
Conversely, suppose no arbitrage holds. Then the subspace $L$ intersects the nonnegative orthant only at $0$. A finite-dimensional separating-hyperplane theorem gives a vector $y\in\mathbb R^m$ with strictly positive coordinates such that
$$
y\cdot X=0
\qquad \text{for every }X\in L.
$$
Normalize by setting
$$
q_j=\frac{y_j}{\sum_{k=1}^m y_k}.
$$
Then $q_j>0$, $\sum_j q_j=1$, and $q$ is orthogonal to every attainable zero-cost gain. Taking $X$ to be the gain from holding one unit of asset $i$ gives
$$
\sum_{j=1}^m q_j
\left(\widetilde S_1^i(\omega_j)-\widetilde S_0^i\right)=0.
$$
Thus $q$ defines an equivalent martingale measure.
:::
::: {.callout-note}
The separating-hyperplane step is the only abstract ingredient. For this course, the key point is geometric: no arbitrage means the attainable-gain subspace avoids the positive orthant, so there is a strictly positive vector that prices every zero-cost gain at zero.
:::
## 6.10 State Prices and the Same Theorem
In a one-period model, the theorem can also be expressed using state prices.
Let $\pi_j$ be the time-$0$ price of receiving one dollar in state $\omega_j$ at time $1$. The vector
$$
\pi=(\pi_1,\ldots,\pi_m)
$$
is called a state-price vector.
If the bank account gross return is $R$, then receiving one dollar in every state is a risk-free payoff with price $1/R$. Hence
$$
\sum_{j=1}^m \pi_j=\frac{1}{R}.
$$
State prices and risk-neutral probabilities are related by
$$
q_j=R\pi_j.
$$
Thus positivity of state prices,
$$
\pi_j>0,
$$
is equivalent to positivity of risk-neutral probabilities,
$$
q_j>0.
$$
The price of a claim $H=(H(\omega_1),\ldots,H(\omega_m))$ is
$$
\text{Price}(H)=\sum_{j=1}^m \pi_j H(\omega_j)
=\frac{1}{R}\sum_{j=1}^m q_j H(\omega_j)
=\frac{1}{R}\mathbb E^{\mathbb Q}[H].
$$
Therefore the FTAP can be read in either of two equivalent languages:
- no arbitrage means there exists a positive state-price vector;
- no arbitrage means there exists an equivalent risk-neutral probability measure.
## 6.11 Example: The Two-State Binomial Model
Consider a one-period binomial model with
$$
S_0=100,
\qquad
S_1=
\begin{cases}
120, & \text{up},\\
80, & \text{down},
\end{cases}
$$
and risk-free gross return
$$
R=1.05.
$$
The discounted stock price at time $0$ is $100$, and the discounted time-$1$ values are
$$
\frac{120}{1.05},
\qquad
\frac{80}{1.05}.
$$
The risk-neutral probability $q$ must satisfy
$$
100
=
\frac{1}{1.05}\left(120q+80(1-q)\right).
$$
Solving,
$$
q=\frac{105-80}{120-80}=\frac{25}{40}=0.625.
$$
Because $0<q<1$, the measure is equivalent to the physical measure, assuming both up and down states have positive physical probability.
The no-arbitrage condition in this model is
$$
d<R<u,
$$
where $u=1.2$ and $d=0.8$. Since
$$
0.8<1.05<1.2,
$$
there is no arbitrage.
## 6.12 Interactive Demo: Risk-Neutral Probability and No Arbitrage
The binomial model is the cleanest place to see the FTAP. The no-arbitrage condition
$$
d<R<u
$$
is exactly the condition that
$$
q=\frac{R-d}{u-d}
$$
lies strictly between $0$ and $1$.
::: {.interactive-card}
### Explore the FTAP in a one-step binomial model
Move the sliders. When $d<R<u$, the risk-neutral probability is inside $(0,1)$ and the model admits an equivalent martingale measure. When this condition fails, the model admits arbitrage.
<div class="mf-controls">
<label for="ch6-u">up factor $u$</label>
<input id="ch6-u" type="range" min="1.01" max="1.80" step="0.01" value="1.20">
<label for="ch6-d">down factor $d$</label>
<input id="ch6-d" type="range" min="0.40" max="1.10" step="0.01" value="0.80">
<label for="ch6-R">gross risk-free return $R$</label>
<input id="ch6-R" type="range" min="0.85" max="1.35" step="0.005" value="1.05">
<label for="ch6-p">physical up probability $p$</label>
<input id="ch6-p" type="range" min="0.05" max="0.95" step="0.01" value="0.55">
</div>
<div id="ch6-q-demo" class="plotly-demo"></div>
<div id="ch6-q-output" class="mf-output"></div>
<script>
(function(){
function el(id){ return document.getElementById(id); }
function update(){
if (typeof Plotly === "undefined") return;
const u = parseFloat(el("ch6-u").value);
const d = parseFloat(el("ch6-d").value);
const R = parseFloat(el("ch6-R").value);
const p = parseFloat(el("ch6-p").value);
const S0 = 100;
const q = (R - d) / (u - d);
const noArb = d < R && R < u;
const expectedUnderP = (p * u + (1 - p) * d) * S0 / R;
const expectedUnderQ = (q * u + (1 - q) * d) * S0 / R;
const bars = {
x: ["physical p", "risk-neutral q"],
y: [p, q],
type: "bar",
text: [p.toFixed(3), q.toFixed(3)],
textposition: "auto"
};
const layout = {
title: noArb ? "Equivalent martingale measure exists" : "No equivalent martingale measure",
yaxis: {title: "probability of up state", range: [-0.25, 1.25]},
margin: {t:55,l:65,r:25,b:60},
shapes: [
{type:"line", xref:"paper", x0:0, x1:1, y0:0, y1:0, line:{dash:"dot"}},
{type:"line", xref:"paper", x0:0, x1:1, y0:1, y1:1, line:{dash:"dot"}}
]
};
Plotly.react("ch6-q-demo", [bars], layout, {responsive:true});
let message = `u = ${u.toFixed(2)}, d = ${d.toFixed(2)}, R = ${R.toFixed(3)}. `;
if (noArb) {
message += `The no-arbitrage condition holds, so q = <strong>${q.toFixed(4)}</strong> is inside (0,1). Under Q, E[S1/R] = <strong>${expectedUnderQ.toFixed(4)}</strong>, equal to S0 = 100.`;
} else {
message += `The no-arbitrage condition fails. The formula gives q = <strong>${q.toFixed(4)}</strong>, which is not a valid equivalent probability.`;
}
message += ` Under the physical probability p, E_P[S1/R] = <strong>${expectedUnderP.toFixed(4)}</strong>.`;
el("ch6-q-output").innerHTML = message;
}
["ch6-u","ch6-d","ch6-R","ch6-p"].forEach(id => el(id).addEventListener("input", update));
update();
})();
</script>
:::
## 6.13 Python Example: Risk-Neutral Probability in a Binomial Model
```{python}
S0 = 100.0
u = 1.20
d = 0.80
R = 1.05
p_physical = 0.55
q = (R - d) / (u - d)
print("Risk-neutral probability q:", q)
print("No-arbitrage condition d < R < u:", d < R < u)
expected_discounted_S1_Q = (q * u * S0 + (1 - q) * d * S0) / R
expected_discounted_S1_P = (p_physical * u * S0 + (1 - p_physical) * d * S0) / R
print("E_Q[S1/R] =", expected_discounted_S1_Q)
print("E_P[S1/R] =", expected_discounted_S1_P)
print("S0 =", S0)
```
The output shows the distinction between the physical probability and the pricing probability. Under $\mathbb Q$, the discounted stock price has expectation $S_0$. Under $\mathbb P$, it generally does not.
## 6.14 Multi-Period Version
In a multi-period model, the theorem says that no arbitrage is equivalent to the existence of a measure $\mathbb Q$ such that
$$
\mathbb E^{\mathbb Q}
\left[\widetilde S_{n+1}\mid\mathcal F_n\right]
=\widetilde S_n
$$
at every time $n$.
In a finite tree, this condition can be checked locally. At each node, the current discounted price must lie inside the convex hull of the possible next discounted prices. If it lies strictly inside the convex hull, then one can assign strictly positive conditional probabilities to the outgoing branches so that the conditional expectation equals the current price.
For a one-dimensional binomial tree, this local condition becomes
$$
d_n<R_n<u_n
$$
at every node. The conditional risk-neutral probability at that node is
$$
q_n=\frac{R_n-d_n}{u_n-d_n}.
$$
Then the path probability under $\mathbb Q$ is the product of the conditional probabilities along the path.
::: {.theorem}
### Theorem 6.4: Local martingale condition on a finite tree
In a finite tree model, a probability measure $\mathbb Q$ is an equivalent martingale measure if and only if, at every node and for every risky asset,
$$
\widetilde S_n
=
\mathbb E^{\mathbb Q}
\left[\widetilde S_{n+1}\mid \mathcal F_n\right].
$$
Equivalently, at each node the current discounted price vector is a strictly positive convex combination of the discounted successor price vectors.
:::
This theorem gives a geometric view of multi-period no-arbitrage: no node should allow a one-step arbitrage.
## 6.15 Pricing Claims Under an Equivalent Martingale Measure
Let $H$ be a terminal payoff paid at time $N$. Its discounted payoff is
$$
\widetilde H=\frac{H}{B_N}.
$$
If $\mathbb Q$ is an equivalent martingale measure and the claim can be replicated, then its unique no-arbitrage value at time $n$ is
$$
\widetilde V_n
=
\mathbb E^{\mathbb Q}
\left[\widetilde H\mid\mathcal F_n\right].
$$
In undiscounted units,
$$
V_n
=B_n\mathbb E^{\mathbb Q}
\left[\frac{H}{B_N}\mid\mathcal F_n\right].
$$
If the risk-free gross return is constant $R$, then
$$
V_n
=R^{-(N-n)}
\mathbb E^{\mathbb Q}[H\mid\mathcal F_n].
$$
This formula is not merely a convenient calculation. It follows from the martingale property of discounted wealth processes.
## 6.16 Completeness and Uniqueness of the Pricing Measure
No arbitrage gives existence of at least one equivalent martingale measure. Completeness is about uniqueness.
::: {.definition}
### Definition 6.5: Complete market
A market is complete if every terminal payoff $H$ can be replicated by a self-financing trading strategy.
:::
In a finite one-period model, let $M$ be the payoff matrix whose rows are traded asset payoffs and whose columns are states. A claim $H\in\mathbb R^m$ is attainable if it lies in the row space of $M$.
Therefore the market is complete if and only if
$$
\operatorname{rank}(M)=m.
$$
That is, the traded assets span all possible state-contingent payoffs.
::: {.theorem}
### Theorem 6.5: Completeness and uniqueness
In a finite no-arbitrage market, the following are equivalent:
1. the market is complete;
2. every contingent claim has a unique no-arbitrage price;
3. the equivalent martingale measure is unique.
:::
The intuition is straightforward. If every claim can be replicated, then each claim must have the cost of its replicating portfolio, so prices are unique. If some claim cannot be replicated, then different martingale measures can assign different expectations to it, producing a range of no-arbitrage prices.
::: {.warning}
Completeness is not the same as no arbitrage. A market can be arbitrage-free but incomplete. In that case, the set of equivalent martingale measures is nonempty but contains more than one measure.
:::
## 6.17 Example: A Three-State Incomplete Market
Consider a one-period model with one stock and one bank account. There are three possible states:
$$
S_0=100,
\qquad
S_1\in\{120,100,80\},
\qquad
R=1.02.
$$
A risk-neutral measure $\mathbb Q=(q_1,q_2,q_3)$ must satisfy
$$
q_1+q_2+q_3=1,
$$
and
$$
\frac{1}{1.02}\left(120q_1+100q_2+80q_3\right)=100.
$$
Equivalently,
$$
120q_1+100q_2+80q_3=102.
$$
There are three unknown probabilities and two linear equations. Therefore there is typically a one-dimensional family of risk-neutral measures. This market is incomplete.
For a European call with strike $K=100$,
$$
H=(20,0,0).
$$
Different risk-neutral measures can assign different prices to this claim, as long as they satisfy the martingale equations and positivity constraints.
## 6.18 Python Example: Incomplete-Market Price Interval
The following code enumerates feasible risk-neutral probabilities for the three-state model and computes the range of no-arbitrage prices for a call option.
```{python}
import numpy as np
import pandas as pd
S0 = 100.0
S1 = np.array([120.0, 100.0, 80.0])
R = 1.02
K = 100.0
payoff = np.maximum(S1 - K, 0.0)
feasible = []
for q1 in np.linspace(0.001, 0.999, 999):
for q2 in np.linspace(0.001, 0.999 - q1, 500):
q3 = 1.0 - q1 - q2
if q3 <= 0:
continue
q = np.array([q1, q2, q3])
martingale_error = np.dot(q, S1) - R * S0
if abs(martingale_error) < 0.03:
price = np.dot(q, payoff) / R
feasible.append((q1, q2, q3, price))
feasible_df = pd.DataFrame(feasible, columns=["q_up", "q_mid", "q_down", "call_price"])
print("Number of feasible grid points:", len(feasible_df))
print("Approximate minimum price:", feasible_df["call_price"].min())
print("Approximate maximum price:", feasible_df["call_price"].max())
feasible_df.head()
```
This grid method is intentionally simple. More advanced courses formulate the same problem as a linear program:
$$
\min_{\mathbb Q\in\mathcal M_e}\mathbb E^{\mathbb Q}[\widetilde H],
\qquad
\max_{\mathbb Q\in\mathcal M_e}\mathbb E^{\mathbb Q}[\widetilde H].
$$
## 6.19 Interactive Demo: Price Bounds in an Incomplete Market
In the three-state example, the stock and bank account do not span all possible claims. Therefore a derivative may have a no-arbitrage **price interval**, not a unique price.
::: {.interactive-card}
### Explore no-arbitrage price intervals
The stock has three possible terminal values. The slider changes the strike $K$ of a call option. The plot shows all call prices obtained from feasible risk-neutral measures.
<div class="mf-controls">
<label for="ch6-K">strike $K$</label>
<input id="ch6-K" type="range" min="70" max="130" step="1" value="100">
<label for="ch6-R2">gross risk-free return $R$</label>
<input id="ch6-R2" type="range" min="1.00" max="1.08" step="0.005" value="1.02">
</div>
<div id="ch6-incomplete-demo" class="plotly-demo"></div>
<div id="ch6-incomplete-output" class="mf-output"></div>
<script>
(function(){
function el(id){ return document.getElementById(id); }
function update(){
if (typeof Plotly === "undefined") return;
const K = parseFloat(el("ch6-K").value);
const R = parseFloat(el("ch6-R2").value);
const S0 = 100;
const states = [120, 100, 80];
const target = R * S0;
const qs = [];
const prices = [];
const qUpVals = [];
const qMidVals = [];
for (let qUp = 0.001; qUp < 0.999; qUp += 0.002) {
// From q_up + q_mid + q_down = 1 and E[S1] = target:
// 120 q_up + 100 q_mid + 80(1-q_up-q_mid) = target.
const qMid = (target - 80 - 40 * qUp) / 20;
const qDown = 1 - qUp - qMid;
if (qMid > 0 && qDown > 0) {
const payoff = states.map(s => Math.max(s - K, 0));
const price = (qUp * payoff[0] + qMid * payoff[1] + qDown * payoff[2]) / R;
qs.push(qDown);
prices.push(price);
qUpVals.push(qUp);
qMidVals.push(qMid);
}
}
const trace = {
x: qUpVals,
y: prices,
mode: "lines+markers",
type: "scatter",
marker: {size: 5},
text: qMidVals.map((qm, i) => `q_mid=${qm.toFixed(3)}, q_down=${qs[i].toFixed(3)}`),
hovertemplate: "q_up=%{x:.3f}<br>price=%{y:.4f}<br>%{text}<extra></extra>"
};
const minPrice = Math.min(...prices);
const maxPrice = Math.max(...prices);
const layout = {
title: "No-arbitrage call prices across equivalent martingale measures",
xaxis: {title: "q_up"},
yaxis: {title: "discounted call price"},
margin: {t:55,l:65,r:25,b:60}
};
Plotly.react("ch6-incomplete-demo", [trace], layout, {responsive:true});
el("ch6-incomplete-output").innerHTML = `Strike K = <strong>${K.toFixed(0)}</strong>. Feasible martingale measures produce prices from <strong>${minPrice.toFixed(4)}</strong> to <strong>${maxPrice.toFixed(4)}</strong>. A price outside this interval creates arbitrage; a price inside the interval is consistent with no arbitrage but not uniquely forced by replication.`;
}
["ch6-K","ch6-R2"].forEach(id => el(id).addEventListener("input", update));
update();
})();
</script>
:::
## 6.20 Python Example: Rank Test for Completeness
In a one-period finite-state market, completeness is a rank condition. Suppose the payoff matrix has one row for each traded asset and one column for each state.
```{python}
import numpy as np
# One-period, three-state market.
# Asset 0: bank account payoff R in every state.
# Asset 1: stock payoff in three states.
R = 1.02
payoff_matrix = np.array([
[R, R, R],
[120.0, 100.0, 80.0]
])
rank = np.linalg.matrix_rank(payoff_matrix)
num_states = payoff_matrix.shape[1]
print("Payoff matrix:")
print(payoff_matrix)
print("Rank:", rank)
print("Number of states:", num_states)
print("Complete market?", rank == num_states)
```
Since there are only two traded assets but three states, the rank cannot be $3$. The market is incomplete.
If we add a third traded asset with a payoff that is linearly independent of the bank account and stock, the market can become complete.
```{python}
extra_asset = np.array([0.0, 10.0, 0.0])
complete_payoff_matrix = np.vstack([payoff_matrix, extra_asset])
rank_complete = np.linalg.matrix_rank(complete_payoff_matrix)
print("Augmented payoff matrix:")
print(complete_payoff_matrix)
print("Rank:", rank_complete)
print("Complete market?", rank_complete == num_states)
```
The added asset distinguishes the middle state from the up and down states. Its payoff expands the span of traded payoffs.
## 6.21 Python Example: Solving for State Prices
State prices solve a linear system. If $M$ is the payoff matrix and $s_0$ is the vector of current prices, then state prices $\pi$ satisfy
$$
M\pi=s_0.
$$
Here $M$ has shape `(number of assets) x (number of states)`.
```{python}
import numpy as np
import pandas as pd
R = 1.05
S0 = 100.0
S1_up = 120.0
S1_down = 80.0
M = np.array([
[R, R],
[S1_up, S1_down]
])
s0 = np.array([1.0, S0])
state_prices = np.linalg.solve(M, s0)
risk_neutral_probs = R * state_prices
pd.DataFrame({
"state": ["up", "down"],
"state price": state_prices,
"risk-neutral probability": risk_neutral_probs
})
```
The state prices are positive. Therefore the model is arbitrage-free. Multiplying by $R$ gives the risk-neutral probabilities.
## 6.22 Python Example: Martingale Check on a Two-Step Tree
The next code constructs a two-step binomial tree and checks the martingale property of the discounted stock under $\mathbb Q$.
```{python}
import itertools
import numpy as np
import pandas as pd
S0 = 100.0
u = 1.2
d = 0.8
R = 1.05
q = (R - d) / (u - d)
N = 2
rows = []
for path in itertools.product(["U", "D"], repeat=N):
up_count = path.count("U")
down_count = path.count("D")
S_N = S0 * (u ** up_count) * (d ** down_count)
prob_Q = (q ** up_count) * ((1 - q) ** down_count)
rows.append({
"path": "".join(path),
"S_N": S_N,
"discounted_S_N": S_N / (R ** N),
"Q_probability": prob_Q,
})
df = pd.DataFrame(rows)
expected_discounted_terminal = np.sum(df["discounted_S_N"] * df["Q_probability"])
print(df)
print("E_Q[S_N / R^N] =", expected_discounted_terminal)
print("S0 =", S0)
```
The equality
$$
\mathbb E^{\mathbb Q}\left[\frac{S_N}{R^N}\right]=S_0
$$
is the time-zero martingale condition. Conditional versions of the same equality hold at each node.
## 6.23 AI Component: Auditing the Theorem Statement
AI tools can be useful for checking whether a theorem statement is missing assumptions. For the FTAP, this is especially important because the theorem has different forms in finite time, infinite state spaces, and continuous time.
::: {.ai-box}
### AI prompt: identify missing assumptions
Use the following prompt with an AI assistant:
> I am studying the Fundamental Theorem of Asset Pricing in a finite discrete-time market. Here is my theorem statement: "No arbitrage is equivalent to the existence of a risk-neutral measure." Please identify missing assumptions and rewrite the statement precisely. Explain why each assumption is needed.
A good answer should mention:
- finite state space or suitable technical conditions;
- discounted price process;
- equivalent measure, not just any measure;
- martingale condition under the pricing measure;
- predictable self-financing trading strategies;
- no-arbitrage definition.
:::
## 6.24 AI Component: Proof Critique
::: {.ai-box}
### AI prompt: proof audit
Ask an AI assistant:
> I claim that if a market has no arbitrage, then the physical probability measure $\mathbb P$ must make discounted stock prices martingales. Is this proof correct? If not, explain the mistake and give a corrected statement.
The expected critique is that no arbitrage does not usually make discounted prices martingales under the physical measure. It implies existence of an equivalent martingale measure $\mathbb Q$, which generally differs from $\mathbb P$.
:::
## 6.25 AI Component: Code Review for Risk-Neutral Probabilities
::: {.ai-box}
### AI prompt: code audit
Use this prompt after writing Python code to compute risk-neutral probabilities:
> Review this code for computing risk-neutral probabilities in a one-period finite-state model. Check whether it verifies positivity, normalization, the martingale equations, and the difference between physical and risk-neutral probabilities. Suggest tests that would catch arbitrage cases.
Useful tests include:
- probabilities sum to one;
- every probability is strictly positive;
- $\mathbb E^{\mathbb Q}[\widetilde S_1]=\widetilde S_0$;
- the payoff matrix has the expected rank;
- the model warns when the risk-neutral solution has negative components.
:::
## 6.26 Common Mistakes
1. **Forgetting discounting.** The martingale property applies to discounted prices, not usually to raw prices.
2. **Confusing $\mathbb P$ and $\mathbb Q$.** The physical probability describes real-world beliefs or statistical frequencies. The risk-neutral probability is a pricing measure.
3. **Using a non-equivalent measure.** A measure that assigns zero probability to a physically possible state is not equivalent to $\mathbb P$.
4. **Treating positive expected return as arbitrage.** Arbitrage requires no possible loss, not merely positive expected gain.
5. **Ignoring predictability.** A strategy that uses future information is not admissible.
6. **Assuming no arbitrage implies uniqueness.** No arbitrage gives existence of an EMM. Completeness gives uniqueness.
7. **Assuming all derivatives have unique prices in incomplete markets.** Nonreplicable claims may have price intervals.
## 6.27 Chapter Summary
The finite discrete-time FTAP says:
$$
\text{No arbitrage}
\quad\Longleftrightarrow\quad
\exists\ \mathbb Q\sim\mathbb P
\text{ such that }\widetilde S\text{ is a }\mathbb Q\text{-martingale}.
$$
The theorem connects finance with linear algebra:
- trading strategies generate a linear space of attainable discounted gains;
- arbitrage is a nonzero vector in this space that lies in the positive orthant;
- no arbitrage allows a strictly positive separating vector;
- after normalization, this vector becomes a risk-neutral probability measure;
- under this measure, discounted traded prices are martingales.
The chapter also introduced market completeness:
$$
\text{Completeness}
\quad\Longleftrightarrow\quad
\text{unique equivalent martingale measure}.
$$
This distinction will reappear throughout the book. Black--Scholes is a complete-market model. Stochastic volatility, jump models, and many realistic markets are incomplete.
## 6.28 Exercises
### Conceptual Exercises
1. Explain the difference between physical probability and risk-neutral probability.
2. Why must an equivalent martingale measure assign positive probability to every physical state?
3. Give an example of a strategy with positive expected gain that is not an arbitrage.
4. Explain why discounted prices, not raw prices, appear in the martingale condition.
5. In your own words, explain the geometric meaning of the FTAP in a one-period finite market.
### Computational Exercises
6. In a binomial model with $S_0=50$, $u=1.3$, $d=0.7$, and $R=1.04$, compute the risk-neutral probability. Check whether the model is arbitrage-free.
7. Suppose $S_0=100$, $S_1\in\{130,90\}$, and $R=1.1$. Compute the risk-neutral probabilities and state prices.
8. Find an arbitrage if $u=1.05$, $d=0.95$, and $R=1.10$.
9. Find an arbitrage if $u=1.20$, $d=1.08$, and $R=1.05$.
10. Consider the three-state model $S_0=100$, $S_1\in\{130,100,70\}$, and $R=1.03$. Write the linear equations for all risk-neutral measures.
### Linear Algebra Exercises
11. Let $M$ be a payoff matrix with shape $2\times 3$. Explain why the corresponding one-period market cannot be complete.
12. Construct a $3\times 3$ payoff matrix for a complete one-period market with three states.
13. For the matrix
$$
M=
\begin{pmatrix}
1.05 & 1.05 & 1.05\\
120 & 100 & 80\\
0 & 10 & 0
\end{pmatrix},
$$
compute its rank and determine whether the market is complete.
14. Solve $M\pi=s_0$ for the state-price vector when
$$
s_0=(1,100,4)^\top.
$$
Check whether all state prices are positive.
### Proof Exercises
15. Prove that if $\mathbb Q$ is an equivalent martingale measure, then every zero-cost self-financing strategy has expected discounted gain zero under $\mathbb Q$.
16. Prove that a nonnegative random variable with strictly positive probability of being positive has strictly positive expectation under a probability measure assigning positive probability to that event.
17. In the one-period model, show that if $q$ is strictly positive and orthogonal to all attainable zero-cost gains, then no arbitrage exists.
18. Explain why uniqueness of the equivalent martingale measure implies unique prices for all claims.
### Python Exercises
19. Write a Python function `binomial_q(u, d, R)` that returns the risk-neutral probability and raises an error if $d<R<u$ fails.
20. Write a Python function that checks whether a candidate probability vector $q$ is a valid martingale measure for a one-period model.
21. Write a Python function that computes the rank of a payoff matrix and determines whether the market is complete.
22. Use grid search to approximate no-arbitrage price intervals for a digital option in the three-state incomplete model.
23. Simulate a two-step binomial tree and verify that the discounted stock price is a martingale under the risk-neutral path probabilities.
### AI-Assisted Exercises
24. Ask an AI assistant to explain the FTAP to three audiences: an undergraduate linear algebra student, an MS statistics student, and a financial trader. Compare the explanations and identify which mathematical details are preserved or lost.
25. Ask an AI assistant to generate an example of an arbitrage in a binomial model where $R>u$. Verify the example manually.
26. Ask an AI assistant to review your Python function for checking martingale measures. Require it to propose at least five edge-case tests.
27. Ask an AI assistant to critique the statement: "A complete market is one where every asset has positive expected return." Write a corrected version.