Binomial Options-Pricing Model
I present a simple yet useful model for pricing European-style options, called the binomial options-pricing model. It provides good intuition into pricing options without any advanced mathematics.
The goal of this post is to present a simple formula for fairly pricing options, called the binomial options pricing model (Cox et al., 1979; Rendleman, 1979). This is sometimes called the Cox-Ross-Rubinstein model (CRR) after the authors’ surnames in (Cox et al., 1979). I like this model because it is a simple, discrete-time model that captures much of the intuition behind how to price options, while avoiding much of the mathematical machinery needed for a continuous-time treatment or Black–Scholes (Black & Scholes, 1973). Learning the binomial model is like climbing a smaller, easier mountain that gives views that are almost as good as its larger, more intimidating neighbor. As we will see, despite its simplicity this model introduces many important concepts from the options-pricing literature such as the no-arbitrage condition, pricing via replication, and the risk-neutral measure. And it does so without any advanced mathematics.
For brevity, I will assume the reader understands options at a high level, and I will only discuss European-style call options. We are going to trade completeness and generality for concision and intuition.
Binomial random walk
We want to establish a fair price for a European-style call option. Here, “fair” means that an options dealer makes no money on average from mispricing the option, but instead only makes money on a transaction fee or premium. To derive an exact formula, we need a model for how the option’s underlying stock behaves in discrete time. We are going to assume the stock follows a multiplicative random walk. Let denote the stock’s price. After each discrete time interval, we flip a coin with bias . If the coin is heads, the stock changes by a factor to . If the coin is tails with probability , the stock changes by a factor to (Figure ).
Thus, the price of the stock is a random process, and we say that it follows a multiplicative random walk because the value of the stock at time is the previous value multiplied by a factor ,
where is drawn i.i.d. based on our coin toss, or
We can take the logarithm of both sides of Equation to see that a multiplicative random walk is an additive random walk on a logarithmic scale. In fact, it might be easier to think about these factors in log space. For example, if we have , then one up move and one down move results in the stock ending up in its original position. See Figure for examples of random walks that follow the binomial model.
We will refer to as the up factor and as the down factor. Our only constraint on these factors is that
where is the risk-free interest rate plus one in a single time period, e.g. for interest. The plus-one convention is so that we do not have to write everywhere in this post. So is an “up factor” in the sense that it beats the risk-free rate of return, while is a “down factor” in the sense that it loses to the risk-free rate of return.
The constraint in Equation is called the no-arbitrage condition. This name is because if the constraint did not hold, one could make money risk-free. For example, if , we could sell a stock short and then use the proceeds of that sale to invest in a money market fund. In the worst case (for us), the stock could go up to , which would be less than our money in the fund, . I won’t belabor this point, because I think it is fairly intuitive and the details are not critical. However, if you would like, see this post for a more detailed treatment. In the finance literature, when authors assume a no-arbitrage condition, they mean that the relationships between various assets is such that one cannot make risk-free money.
To illustrate this model, consider the binomial tree in Figure . The root node represents the value of the stock at time . Each subsequent node (read left-to-right) is a possible stock value given our simple coin-flipping model. So after two coin flips, the stock is worth , , or . A path from left-to-right in this tree would be one possible realization of coin flips and thus one possible trajectory our stock could take.
This diagram is called a binomial tree because the number of paths to the -th row (number of heads or successes) in the -th column (time point) is the binomial coefficient
and the distribution of outcomes at a given time point is binomially distributed. For example, the probability of arriving at the node in Figure is the probability of three heads (up moves) and one tail (down move). That probability is adjusted by the number of ways to flip three heads in four coin tosses or . So the probability of the stock having up moves in coin tosses is
This explains the name for both the tree and the pricing model.
Replicating portfolio
Recall that our goal is to establish a fair price for a call option. But so far, we have just discussed a model for how underlying stocks behave. How to do we move from this simple model of a stock to the fair price of an option on it?
A key idea in the options-pricing literature is valuation through replication. In other words, we can define the fair price of an option as the cost of constructing a portfolio that replicates its value over time. This means that a dealer can sell a call option, use the proceeds to construct a replicating portfolio, and collect a transaction fee in the form of a premium between the cost of the replicating portfolio and the price of the option. What does the replicating portfolio contain? For sure, it contains some of the underlying stock.
This should make sense. Strip away all the mathematical machinery, and just imagine that you’re an unsophisticated options dealer. What is the simplest thing you could do to hedge your risk if you sold a call option? Well, you could buy some amount of the underlying stock such that, on average, you neither make nor lose money on the call. This is precisely what options dealers have tried to do for many years, even before Black–Scholes (Haug & Taleb, 2011).
To summarize, we want to build a replicating portfolio that is a basket of both some amount of the underlying stock and some amount of risk-free or cash-like assets such as bonds. We’ll then model how our replicating portfolio changes as the underlying stock changes according to our binomial model above. This in turn tells us how the fair price of our option changes, leading to an exact formula for the fair price of the option today.
One-period model
Let’s first focus on a single discrete-time period.
Since a call option’s value is a function of its underlying stock’s value, we can model how the call option changes after we flip our coin once. I’ll use to denote the value of the call at the same time point as , and I’ll use and to denote the value of the call after a heads or tails respectively (Figure ). For example, if the call is in-the-money after a heads (up move), then it is worth . Figure is the call option’s analog to the stock price in Figure .
Now let denote the number of shares of the stock in our replicating portfolio, and let denote an amount of cash or bonds, subject to the interest rate . Then the value of our portfolio is initially
Clearly, this portfolio also changes with the coin flip. After one flip, the value of the portfolio will either go up or down (Figure ). For example, after we flip heads, the stock’s value goes up by and the bonds increase in value by , giving us .
Now let’s pick and . Don’t let the mathematical abstractions obfuscate the key point: if we are an options dealer, then is just how much stock we want to buy in order to hedge a call option that we just sold. As discussed above, we would like to pick them such as that the value of our portfolio perfectly replicates the value of option. Mathematically, this means that we want this linear system of equations to hold:
Solving this system is easy and gives us and :
See A1 for a derivation. This allows us to write the value of a call option in terms of its future value, depending on whether or not the coin toss is heads or tails (so in terms of and ):
See A2 for a derivation. This is cool! The first equality in Equation is simply an accounting identity. We want this to hold in order to hedge the call option we sold. But the second equality says that our replicating portfolio can be expressed in terms of the option’s possible values after a coin flip, and , weighted by factors and . We divide by to account for the time value of money.
Risk-neutral probabilities
So what are the “weights” and in the previous section? A possibly surprising point is that these can be thought of as probabilities! To see this, let denote the left weight, so
Then observe that
Thus, we can express the value of our call option as an expectation with respect to these pseudo-probabilities and :
This is surprising and really interesting! Here, Equation states the our call option is equal to the time-discounted expectated value of our call option. The expectation is with respect to these pseudo-probabilities and .
These are pseudo-probabilities are called the risk-neutral probabilities. They are so-named because they make Equation an equality rather than an inequality. In the real world, we assume that investors demand more profit for bearing more risk. Put differently, the price of a risky asset today should be less than its expected value tomorrow. In the context of this post, we would expect the equals sign in Equation to be a less-than sign if we replaced the risk neutral probability with the true probability .
This idea of a risk-neutral probability measure is widely used in the options-pricing literature. It is critical for pricing options precisely because it allows for an equality rather than inequality.
Multi-period model
Now let’s generalize. Our goal is to find an equation similar to Equation which generalizes to multiple time periods (to arbitrary ).
To start, let’s focus on the behavior of our stock after two time periods. Here, the stock price has either gone up twice by a factor , down twice by a factor , or up and down by a factor (Figure ). Recall that since the stock can move up and then down or down and then up, there are two ways for the stock to “arrive” at the value .
And as before, the value of the call changes as a function of the underlying stock (Figure ).
Now imagine that our first coin flip was heads, and thus the option’s value is before the second coin flip. At this point, all of the logic from the previous section holds. This is because the coin flips are independent. (If you are unconvinced, simply repeat the logic of the previous section while swapping variable names. Alternatively, observe that the initial time point is relative.) So we can quickly conclude that the value of is equal to its time-discounted, risk-neutral expected value over the next coin toss, just as in Equation . This gives us
Hopefully the notation and is clear: these are the values of the call option after two up moves and after one up move and one down move, respectively. And of course, we could imagine that we flipped a tails on the first coin flip and then repeat our reasoning as before, giving us
And now we can plug and in Equations and into Equation ! This will give us the value of the call option at time zero in terms of its possible values after two periods:
So again we can express the call option today in terms of its risk-neutral expected value! And this looks suspiciously like a binomial expansion for .
Now let’s repeat this logic for . Again, we can say that the value of a call option at time can be expressed in terms of its risk-neutral expected value over the next period. This gives us
Hopefully the notation , etc. is clear in meaning by now. And we can again write the value of the call option at in terms of the call at time :
Again, we see the call option is proportional to a binomial expansion.
At this point, I don’t think it takes a great mathematical leap of intuition to see what is happening. The general formula for the value of the call option at time , in terms of the possible values of the call option at time , is the following:
Note that we are expressing the value of the call option with heads in trials directly in terms of the stock price and strike:
I won’t prove Equation , but one easily could using induction. The key point is that the value of the option today is equal to an interest rate-discounted expected value of the call option in the future, under the risk-neutral probability measure. This expectation is a binomial expansion, where each possible call value is weighted by the probability that the stock takes the associated value . Notice that the true or physical parameter is not in the price! We do not care how likely an up or down move is. We are only interested in the risk-neutral probability .
An example
At this point, we have everything we need to price an option using Equation , so let’s pause and look at a complete example. Here is a Python function to do so.
import numpy as np
from scipy.special import comb as choose
def bopm(S, K, u, d, r0, n):
"""Compute value of a European call option price using the binomial-options
pricing model.
S : stock (float)
K : strike (float)
u : up factor (float)
d : down factor (float)
r0: one-period interest rate (float)
n : number of time points (int)
"""
r0 = 1+r0
assert d <= r0 <= u, "No arbitrage condition not met."
pi = (r0-d) / (u-d)
discount = 1/r0**n
C = 0
for j in range(0, n+1):
S_n = u**j * d**(n-j) * S
p_j = choose(n, j) * pi**j * (1-pi)**(n-j)
C += p_j * max(0, S_n - K)
return discount * C
Suppose the values in our model are:
This in turn fixes the value of :
Again, note that we do not even need to know the true parameter to price the option fairly.
We can plot the value of the stock and call on a binomial tree, alongside the risk-neutral probabilities of the stock reaching each node (Figure ). As a sanity check, the sum of each column should equal unity. What Equation says is that the value of the call option is the dot product of call values and risk-neutral probabilities at the leaf nodes, adjusted by the interest rate after three time periods.
In other words, the call is
This might seem pricey, but the risk-neutral probabilities are rather skewed. Under the risk-neutral measure, the stock is more likely to go up than down. The option should be priced accordingly. As a gut check, what do we expect to happen if the up factor were to decrease, say from to ? We would expect the option value to decrease, since the risk-neutral probability decreases. That’s precisely what happens ().
Binomial option-pricing formula
Equation is an exact formula for pricing an option under the assumptions of our model. In principle, we’re done. However, with a little algebra, we can represent the value of the call in a form that is quite instructive.
To start, let denote the minimum number of upward moves the stock must take over time periods for the call option to end in-the-money:
For example, in Figure , we can see that the call is out-of-the-money for two out of four of the leaf nodes in the binomial tree. Here, is just notation to select the in-the-money leaves. We introduce because it allows us to eliminate the function in the value of the option, since
In words, it allows us to eliminate terms in the summation that are guaranteed to be zero. So we can rewrite the call option’s value starting at as
Here, we can see that we can represent the call as the difference between the stock price and the strike. So let’s distribute and group terms based on their exponents:
Equation says that the call option’s fair price is equal the difference between the stock price and the strike price , both time-discounted by and weighted by the risk-neutral probability . In my mind, the right term is fairly intuitive. It’s simply the strike multiplied by the probability that the option ends in-the-money. The left term is a little trickier since the risk-neutral probabilities are adjusted by the up and down factors. The key is to think about the value of the stock in a risk-neutral world.
In a risk-neutral world, the value of the stock invested in a risk-free asset is equivalent to the value of the stock invested in the market. Formally, this is
This falls out of the definition of (Equation ), and it is completely analogous to how we priced the call in Equation . Again, in the real world, we expect this equality to be an inequality. Investors get paid to take risks. But we price options in a risk-neutral world, and the definition of implies that
In other words, and are more pseudo-probabilities! They are just the return-adjusted risk-neutral probabilities. Let’s name them:
So we can express the expected value of our stock , after one period, under these adjusted risk-neutral probabilities as
As an aside, note that the logic here implies that the stock price is a martingale under the risk-neutral probabilities. At a high level, a martingale is a stochastic process in which the expected value of the process, conditional on available information, is equal to its present value. And that is essentially what Equations and represent.
Now that we understand these new pseudo-probabilities, we can rewrite Equation in terms of them:
And as a final step, observe that each summation is really a survival probability or the probability that a random variable takes a value at least as great as a given value. This can be viewed as one minus the cumulative distribution function (CDF). (See A3 for a bit more discussion of the binomial survival function.) To see this, let be a function denoting the probability that a binomial random variable “survives” to :
Since the CDF of the binomial distribution is
then can be written as
So we can rewrite Equation in terms of binomial survival probabilities. Note that (Cox et al., 1979) refers to as the “complementary binomial distribution function”, but I think that calling it a “survival function” is a bit more clear that we are computing the probability that the option “survives” in the sense that it has a sufficient number of up-moves to end in-the-money.
Taken together, we can write down the binomial options-pricing formula:
At least for me, seeing this formula without context was not be particularly instructive. But now we have the mental model to interpret it. The value of the call option is the difference between the probability-weighted stock price and the probability-weighted strike. Both probabilities capture the likelihood that the option ends in the money, but their terms are slightly different because the stock’s weight also captures the changing value of the stock, via the up and down factors.
Limiting stochastic process
We now have a simple mathematical model for pricing options, but it is not clear how to use it in practice. For example, how do we pick and ? How do these parameters map to the more common notion of a stock’s volatility? How do we pick and , and how do they relate to physical time?
To answer these questions, we need to think about the continuous-time process that is implied by our discrete-time model. What is the limiting stochastic process if we imagine fixing physical time and then letting . Without an answer to this question, it is difficult to argue for any particular choice of or . Thus, before discussing fitting our model to data, we need to understand this continuous-time process.
We’ll do this in two steps. First, I’ll provide some intuition here for what that continuous-time process might look like. I think this exercise is useful towards making the answer less abstract. As we’ll see, our simple binomial model suggests that the true stochastic process for stock prices is geometric Brownian motion. We’ll define what this means.
Second, in the next section, I’ll discuss the Black–Scholes formula, which is an options-pricing formula that assumes the stock price follows geometric Brownian motion. And I’ll prove (in a companion post) that the binomial options-pricing formula converges to Black–Scholes as . And finally, we will be ready to pick values of and , with the criteria that we pick values such that our binomial model converges to Black–Scholes.
Geometric Brownian motion
First, let’s get some intuition for our simple binomial model as becomes large. We assumed that stock prices follow a multiplicative random walk or
But now we’d like to model this as a continuous-time process over physical time . So rather than modeling the random process via a countable set of random variables, we would like to model the process as a real-valued function . But what function makes sense?
Let me suggest the following intuition. A multiplicative random walk is just an additive random walk in log space. And an additive random walk converges to Brownian motion in the limit (as the time intervals between data points goes to zero). The normal distribution in Brownian motion arises via the sum of i.i.d. random variables, through the central limit theorem. This reasoning suggests that a multiplicative random walk should converge to a non-negative or exponentiated Brownian motion. While this reasoning is not formal, I hope it gives some color for how we might have arrived at this idea ourselves, given more time than this blog post allows.
Thus, in the options-pricing literature, the stock price is often defined as geometric Brownian motion, which is non-negative Brownian motion. This is defined as
where is Brownian motion, and thus is Brownian motion with drift:
If we take the log of both sides of Equation , we can reconstruct the underlying Brownian motion
and this implies that and are both lognormally distributed,
Mapping this notation onto our intuition above, I argued that exponentiated Brownian motion makes sense because our simple binomial model well-approximates it when is large, i.e.
(Historically speaking, the causality is backwards; the continuous-time process was already understood, and the binomial model was constructed to converge to it in the limit.)
We can visualize this connection by imagining the time to expiry being fixed, and then increasing . The effect on our binomial tree is that the “mesh” becomes finer and finer. And the distribution of outcomes (where the stock price ends up after ) converges from a binomial distribution to a normal distribution (Figure ). The lognormal distribution arises because it is the log of the stock price that is binomially distributed. This is a deep idea that is worth its own post, but I felt it was unreasonable to discuss this topic without at least some mention of the underlying continuous-time process. Much of the mathematical complexity underpinning Black–Scholes is simply making the intuitions in this section rigorous.
Now that we better understand the continuous-time process, let’s revisit a few details of our discrete-time model. First, let’s think about time. We are concerned with modeling physical time using time points. A natural way to think about our model is to split up our total interval into sub-intervals of length , where
Writing these sub-intervals out explicitly, we have
Now we can re-define to denote the stock move between two sub-intervals:
Hopefully it makes sense that in the limit , these sub-intervals become smaller and smaller, and the discrete-time process converges to the continuous-time process , where
Second, let’s think about our interest rate in terms of physical time. Given the definitions above, we want an interest rate such that
In words, is one plus the riskless interest rate over an interval of length , while is one plus the riskless interest rate for a fixed amount of calendar time . That said, in practice, we compound interest continuously using in place of and in place of . In the exponentiated form, we drop the plus-one convention.
Convergence to Black–Scholes
We are now finally ready for a peak at the famous Black–Scholes equation. We do not have all the mathematical machinery needed to make perfect sense of it from the perspectives of differential equations (PDEs, etc.) or stochastic calculus (Itô-Doeblin’s lemma, etc.), but with a little bit of work, we can show that the model we have constructed so far (Equation ) is just the discrete-time analog of Black–Scholes. My goal here is to make Black–Scholes more intuitive by mapping it onto this much simpler binomial model.
First, let’s just state the Black–Scholes model. Using our notation, the price of a European-style call is:
Without context, this might feel pretty opaque. But with the context of the binomial model, it looks familiar! Just compare the two models:
We can see that both and are survival or complementary distribution functions. In fact, it should be clear from Equation that all we have to do to prove convergence from one equation to the other is to prove that as ,
See this companion post for a proof, which follows the logic in (Hsia, 1983).
An important observation about that proof, which we will use in the next section, is that we did not need to specify the risk-neutral probability in order to prove convergence. Nor did we need to make any assumptions about the true probability . The condition that must hold, however, is the no-arbitrage condition, and this condition relates the stock’s volatility (through and ) to the market rate of return .
Fitting the model parameters
Now that we understand the continuous-time process, we can finally address the question: how do we pick the model parameters , , and ? We’ll assume is known and fixed, given to us by the market.
This is actually a tricky question, and there are have been many proposals. Perhaps the most popular choice that I have seen is using the values proposed by (Cox et al., 1979):
CRR prove that these choices mean the induced binomial model converges to Black–Scholes in the limit. And the values are appealing because they are simple and interpretable. In particular, we can see that if we additively aggregate shocks of size , we recover the stochastic process’s true volatility (Equation ).
However, (Chance, 2007) argues that while CRR prove their binomial model conveges to Black–Scholes in the limit, they do not assume the no-arbitrage condition when specifying and . Thus, these values admit arbitrage in finite ! How meaningful this is in practice is a separate and harder question.
Understanding Chance’s argument is instructive and will help us pick and in a different way. For either CRR or Chance, the initial argument is the same. The continuous-time process is geometric Brownian motion, since the log prices are normally distributed. And the normal distribution is fully characterized by its mean and variance. So our strategy for choosing a sensible and is to first solve for these moments in terms of , , and , and then to judiciously define these parameters such the finite- moments converge to true normal distribution’s moments, and (the values in Equation ). We don’t know the true and , of course, but we can estimate them from data.
That’s a lot, so let’s break it down. Let’s first write the log price at time point as a log return (or as normalized by ):
First, CRR compute the mean and variance of this log return:
See A3 in the companion post for a derivation. They then show that the parameter values in Equation allow for these moments converge to the true moments in the limit:
See A4 for a derivation. The problem, as mentioned above, is that nothing in this specification ensures that , , and are related in a way that avoids arbitrage.
Thus, Chance proposes a different approach and thus a different set of values for and . First, he observes that nothing in Hsia’s proof (again, see the companion post for this proof) relies on specifying the risk-neutral probability . This means that any choice of admits convergence to Black–Scholes. What is required by that proof, however, is the no-arbitrage condition. For example, it is invoked in Equation of the companion post. Thus, while might seem like another free parameter, it is not. And if is fixed by fiat, we then have two equations and two unknowns. The first equation is the definition of the in terms of and , a consequence of the no-arbitrage condition, and the second is a moment-matching equation with :
The only two unknowns in Equation are and . Solving for these values gives us
See A5 for a derivation. If we use , these are the values proposed in (Chriss, 1996), yet another proposal for choosing and .
To summarize this section, we want to solve for model parameters and . Because our proof does not rely on the specific value of , we can fix it to any value we’d like. The real conditions we want to hold are Equations above. This matches the volatility of our model to the volatility of the underlying geometric Brownian motion, and the risk-neutral mean to the risk-free interest rate.
What does this convergence look like in practice? I’ve replicated Chance’s Figure in my Figure . Here, I compare the call price using my implementations of Black–Scholes and my implementation of the binomial options-pricing model using both CRR and Chance’s values for and . The stock and strike are both , the risk-free rate is , and the volatility is .
I’ve also computed the average relative error between the Black–Scholes price and the price from the various configurations at play. These errors are
CRR CRR Chance
0.32% 0.63% (pi = 0.25)
0.24% (pi = 0.5)
0.42% (pi = 0.75)
As we can see, Chance’s choices of and result in value that is closer to Black–Scholes when , and slightly worse for other values. While we know all choices of and converge to the Black–Scholes price in the limit, “in the limit” can be a long time. Chance recommends choosing . However, this reasoning is not formal, and it’s not obvious to me that is the best choice for all particular sets of inputs.
For completeness, here are my two Python implementations of the binomial models:
B = lambda x, n, p: 1 - binom(n, p).cdf(x-1)
def bopm_crr(S, K, vlt, r, t, n):
h = t/n
u = np.exp(vlt * np.sqrt(h))
d = 1/u
r0 = np.exp(r * h)
pi = (r0 - d) / (u - d)
a = np.ceil((np.log(S/K) - n * np.log(d)) / (np.log(u/d)))
rho = (u/r0) * pi
return S * B(a, n, rho) - K * np.exp(-r * t) * B(a, n, pi)
def bopm_chance(S, K, vlt, r, t, n, pi):
h = t/n
g = np.sqrt(h / (pi * (1 - pi)))
denom = pi * np.exp(vlt * g) + (1 - pi)
u = np.exp(r*h + vlt * g) / denom
d = np.exp(r * h) / denom
r0 = np.exp(r * h)
a = np.ceil((np.log(S/K) - n * np.log(d)) / (np.log(u/d)))
rho = (u/r0) * pi
return S * B(a, n, rho) - K * np.exp(-r * t) * B(a, n, pi)
And here is my Python implementation of Black–Scholes:
N = lambda x: norm(0, 1).cdf(x)
def black_scholes(S, K, vlt, r, t):
x = (r + 0.5 * vlt**2) * t
d1 = (np.log(S/K) + x) / (vlt * np.sqrt(t))
d2 = d1 - vlt * np.sqrt(t)
return S * N(d1) - K * np.exp(-r * t) * N(d2)
Note that I use rather than in the Black–Scholes implementation, because I use a continuously compounding interest rate rather than .
A complete example
To wrap up this post, let’s work through a complete example of pricing a call option using the binomial options-pricing model. This will be fun to see and instructive for various details, such as thinking a bit more carefully about , , and . We’ll use Chance’s equations for and (Equation ) and . So that we can compare our price to a market price, we’ll compute the price a real Apple call option, contract AAPL230609C00180000, which has a strike price of .
First, let’s compute our market values. Let’s follow the convention of thinking of the time to expiry in years. Thus is one year. The call option currently expires on 9 July 2023, which is in roughly physical days, so let’s use . The interest rate should be annualized, since we want to be the annual interest rate. The current annual federal funds rate is roughly , so . (Note that we are now dropping the plus one convention since we use compound interest in our implementation.) And Apple’s stock price is trading at roughly . I say “roughly” because I am computing these values on a weekend and using Yahoo! Finance as sourcing.
The last thing we need to do is estimate Apple’s volatility. By “Apple’s
volatility”, I mean that we want to compute of the either the log
return or the log price. It does not matter which since the variance is
invariant under the transformation between the two. To estimate , I downloaded 10 years of Apple stock
price data and then
loaded it into a Pandas data frame df
:
>>> df = pd.read_csv("aapl_historical_prices.csv", index_col=0)
>>> px = df["close"]
>>> px
Date
2013-05-20 15.8189
2013-05-21 15.7021
2013-05-22 15.7626
2013-05-23 15.7907
2013-05-24 15.8982
...
2023-05-15 172.0700
2023-05-16 172.0700
2023-05-17 172.6900
2023-05-18 175.0500
2023-05-19 175.1600
I then computed the log return as
>>> ret = np.log(px) - np.log(px.shift(1))
Notice that the return is a daily return, and therefore the volatility
>>> vlt_daily = ret.std()
0.018026484931514885
is a daily volatility. However, we want to be the annual variance when , so let’s convert the daily volatility to annual volatility by multiplying by the square root of 365. This gives us
>>> vlt_yearly = vlt_daily * np.sqrt(365)
>>> vlt_yearly
0.34439551104789184
And finally, let’s set . This is arbitrary. Bigger means a better approximation to Black–Scholes. Now we can compute the call , using our Python functions above:
>>> C = bopm_chance(S=181, K=180, vlt=vlt_yearly, r=0.05, t=5/365, n=100, pi=0.5)
>>> C
3.4253338645901863
For context, the Black–Scholes price using my function above is
3.497536243693304
. And as of this writing, the bid and ask prices of the Apple call option are
Bid Ask
3.10 3.25
If the “true price” is around or , then our price is off from this market price by roughly . This sanity-check tells us that we probably haven’t done anything too stupid in our naive implementations. Of course, there are many things we could do differently in practice. To a first order, we should take a lot more care in estimating all the inputs to the model.
But my point is that the binomial model produces a fair call option price is that is close to the Black–Scholes price. The difference between these prices and the market price could, in theory, be an arbitrage opportunity—a bad options dealer selling at a bad price—but obviously here the discrepancy is due to both our inputs and the simplicity of our model.
Conclusion
The binomial options pricing model is a simple, discrete-time model for pricing options. In my mind, it is particularly valuable because it provides economic intuition for how to price options without any sophisticated mathematics. We did not need to discuss continous-time martingales or stochastic integrals or Itô-Doeblin’s lemma in order to make real progress. And we covered some pretty fundamental ideas from the options-pricing literature, such as the no-arbitrage condition, replicating portfolio, and risk-neutral measure. And since the binomial model converges to Black–Scholes, we can be confident that the prices from this simple model well-approximate prices from Black–Scholes when is large.
Appendix
A1. Solving for and
We want to solve for and in
To solve for , let’s subtract the bottom line from the top line:
We can then plug this into either line in equation to solve for ,
as desired.
A2. Writing in terms of risk-neutral probabilities
Let’s write the call option in terms of its risk-neutral expected value after one period:
Here the factors and are the risk-neutral probabilities.
A3. Understanding the binomial survival function
The survival (sometimes lifetime) function of a probability distribution is the probability that a random variable takes a value greater than the function argument or
Now if denotes the random variable’s CDF,
then we can write the survival function as the complement of the CDF,
We use instead of as the argument to the CDF because the CDF gives the probability of or fewer successes, whereas we want to find the probability of or more successes. Now what is the CDF of the binomial distribution with the usual parameterization and and for ? It is
This is just the summation of disjoint events, that is a success for trials . And since the binomial distribution must normalize,
then clearly
So concretely, the survival function for the binomial distribution is the probability of heads or heads or heads and so on, starting .
A4. Solving for and in the limit
We want to show that CRR’s parameters induce and to convert to the moments of the continuous-time process in the limit.
Observe a few useful facts. First, CRR’s definitions of and imply that , and therefore
We can write the log return from zero to as
And we can write the variance of that return as
This converges to as .
A5. Solving for Chance’s and
In this section, the term is tedious to write, so let’s call it :
We have two equations and two unknowns:
Let’s solve for , which is
and then plug this value into the other equation to get
Now let’s plug this value back into the equation for (Equation ):
If we plug the value of in to both equations, we get the same values as (Chance, 2007):
as desired.
- Cox, J. C., Ross, S. A., & Rubinstein, M. (1979). Option pricing: A simplified approach. Journal of Financial Economics, 7(3), 229–263.
- Rendleman, R. J. (1979). Two-state option pricing. The Journal of Finance, 34(5), 1093–1110.
- Black, F., & Scholes, M. (1973). The pricing of options and corporate liabilities. Journal of Political Economy, 81(3), 637–654.
- Haug, E. G., & Taleb, N. N. (2011). Option traders use (very) sophisticated heuristics, never the Black–Scholes–Merton formula. Journal of Economic Behavior & Organization, 77(2), 97–106.
- Hsia, C.-C. (1983). On binomial option pricing. Journal of Financial Research, 6(1), 41–46.
- Chance, D. M. (2007). A synthesis of binomial option pricing models for lognormally distributed assets. Available at SSRN 969834.
- Chriss, N. (1996). Black-Scholes and Beyond: Modern Options Pricing. Burr Ridge, IL: Irwin Professional Publishing.