Price of a simple autocall - Sebastien Bossu Advanced Equity derivatives

I am reading Advanced Equity Derivates by Sebastien Bossu and trying to do the exercises. In chapter 1 we have the following question :

Consider an exotic option expiring in one, two, or three years on an underlying asset S with the following payoff mechanism:

• If after one year S1 > S0 the option pays off 1 + C and terminates;
• Else if after two years S2 > S0 the option pays off 1 + 2C and terminates;
• Else if after three years S3 > 0.7 × S0 the option pays off max(1 + 3C, S3∕S0);
• Otherwise, the option pays off S3/S0.

Assuming S0 = \$100, zero interest and dividend rates, and 25% volatility, estimate the level of C so that the option is worth 1 using Monte Carlo simulations.

In the solution manual it gives C ≈ 12% without details. I executed the following code ( apologies as it is not clean or efficient, i am just trying to get the answer).

import numpy as np

sigma = 0.25
S0 = 100
N = 100000

simuls = []
for _ in range(N):
S1 = S0 * np.exp(-0.5 * sigma**2 + sigma * np.random.normal())
S2 = S1 * np.exp(-0.5 * sigma**2 + sigma * np.random.normal())
S3 = S2 * np.exp(-0.5 * sigma**2 + sigma * np.random.normal())
simuls.append([S1,S2,S3])

coupon = 0.0765
payoff = []
for simul in simuls:
if simul[0]>S0:
payoff.append(1+coupon)
elif simul[1]>S0:
payoff.append(1+2*coupon)
elif simul[2]>0.7*S0:
payoff.append(max(1+3*coupon, simul[2]/S0))
else:
payoff.append(simul[2]/S0)

print(np.mean(payoff))


I find that a coupon of around 7.65% makes this product worth 1 ( did not solve properly with optimisation). As I am struggling to see where I went wrong I wanted to know if you found 12% and if yes how ? Thank you very much in advance

• Why do you not grow the stock at the risk free rate ?
– Dom
Nov 22, 2022 at 17:25
• I think the terminal condition on the payoff should be paying 100 if 70<S3<100. That gives a 12% coupon. The structure as written is slightly unusual Nov 24, 2022 at 8:57

I had about the same level as you when I tried: $$0.076\%$$.

Code is below: feel free to get inspired by it, as well as giving feedback. That's the best way to collaboratively learn!

import numpy as np
import numpy.random as npr
from statistics import mean

def payoff(path, coupon):
if path[1] > path[0]:
return 1 + coupon
elif path[2] > path[0]:
return 1 + 2 * coupon
elif path[3] > 0.7 * path[0]:
return max(1 + 3 * coupon, path[3]/path[0])
else:
return path[3]/path[0]
testpath = [100, 101, 120, 60]
print(payoff(testpath, 0.1))

spot, volatility, coupon = 100, 0.25, 0.076
nPaths = 500000
path = spot * np.ones((nPaths, 4))
epsilon = npr.randn(nPaths, 3)
for i in range(nPaths):
for j in range(3):
path[[i], [j + 1]] = path[[i], [j]] * np.exp(-0.5 *
volatility**2 + volatility * epsilon[i, j])

print(mean([payoff(path[i], coupon) for i in range(nPaths)]))

• thanks a lot for your answer ! It seems then the 12% coupon might be a typo then. Also as you did it is good to put the payoff in a function so that one can then solve with an optimiser package to get the precise value of the coupon Cheers !
– Leon
Nov 23, 2022 at 17:03