Risk-Neutral Probabilities in a Binomial Option Model
Summary
The discussion examines a four-step binomial valuation of a European put on a stock that moves by a fixed amount each month, with a continuously compounded risk-free rate. The proposed method recursively discounts the risk-neutral expected option payoff at each step. Its computed result differs from a textbook answer, prompting a review of the probability formula.
The correction is that the risk-neutral probability uses the stock price grown at the risk-free rate over the time step, less the down-state price, divided by the gap between up- and down-state prices. The original calculation instead discounted the current stock price in the numerator, reversing the risk-free growth relationship. This illustrates a basic consistency condition in a binomial model. The exchange also notes a Python division detail, but the central issue is the probability formula; the example assumes the specified fixed price moves and does not discuss model calibration.
Key ideas
- A binomial option value can be calculated by discounting risk-neutral expected payoffs recursively.
- The risk-neutral probability numerator uses the current stock value grown at the risk-free rate.
- Using a discounted current stock value instead can produce an incorrect probability and option price.
- The model assumes fixed up and down price moves over each time step.
Tags
Full text
# Pricing of European put option with binomial model
# Pricing of European put option with binomial model
This is an exercise from Mark Joshi's book (exercise 3.6):
A stock is worth 100. Each month its value increases or decreases by precisely 10. The riskless bond is worth $e^{rt}$ at time t years with r equal to 5% Price a four-month European put option struck at 110.
At the end of the book, Joshi provides the solution 13.06. Unfortunately that's not what I find: I get 15.22. Since Joshi does not show his computation, I am wondering where the difference comes from. I use the following Python script for the computation:
```
import math
def get_risk_neutral_prob(S, S1, S2, r, delta_t):
Sp = max(S1, S2)
Sm = min(S1,S2)
if Sm == Sp:
return 1/2
return (math.exp(-r*delta_t) * S - Sm)/(Sp-Sm)
def payoff(S):
return max(110-S, 0)
r = 0.05
delta_t = 1/12
def get_price(S, N):
if N == 0:
return payoff(S)
S1 = S+10
S2 = S-10
p = get_risk_neutral_prob(S, S1, S2, r, delta_t)
return math.exp(-r*delta_t) * (p * get_price(S1, N-1) + (1-p) * get_price(S2,N-1))
print(get_price(100,4))
```
As you can see, my computation is straightforward. I first compute the risk-neutral probability, and then the discounted expected value of the payoff, recursively.
For one month, I did it by hand and my result, 10.372, agrees with what the script tells me.
## Answer by user11823918 (score 1)
https://quant.stackexchange.com/a/47463
Answer was provided by Chris Taylor: the formula for the risk-neutral probability was off by a minus sign, it should be $$ p = \frac{e^{r \Delta t} S - S_m}{S_p - S_m} $$
## Answer by DOMiguel (score 0)
https://quant.stackexchange.com/a/49272
I cannot comment (low reputation) so I add an answer. In Python, you should write:
`delta_t = 1.0/12`Shown in full with attribution under the source's licence. Licence: CC BY-SA 4.0 (Stack Exchange)
This summary was written by Stratmill's research agent from the original; it is not a copy of the source.