Monte Carlo Valuation of a Three-Year Autocallable Equity Payoff
Summary
The document considers a three-year autocallable payoff with annual observation dates. It terminates early when the underlying finishes above its initial level, paying a coupon-linked amount; otherwise, the final payment depends on whether the underlying remains above a downside threshold and on its terminal performance. The question is how to estimate the coupon that makes the product worth par under stated assumptions of zero rates and dividends and constant volatility.
The author simulates successive lognormal price changes and averages the path-dependent payoffs, obtaining a coupon near 7.65% rather than the solution manual’s stated level. A response reports a similar estimate and shares another Monte Carlo implementation. The exchange does not show a root-finding procedure or uncertainty estimates, and finite simulation error can affect the estimate. The example also depends on its simplified pricing assumptions and does not discuss calibration, transaction costs, or other market inputs.
Key ideas
- The payoff checks the underlying at annual dates and can terminate early with a coupon payment.
- If early termination does not occur, the final payoff depends on a downside threshold and terminal asset value.
- Monte Carlo valuation estimates the product value by simulating price paths and averaging their payoffs.
- The question and response report a coupon estimate near 7.65% under the stated model assumptions.
- The exchange gives no convergence analysis, coupon root-finding details, or market calibration.
Tags
Full text
# Price of a simple autocall - Sebastien Bossu Advanced Equity derivatives
# 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
## Answer by siou0107 (score 1)
https://quant.stackexchange.com/a/73862
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)]))
```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.