So I wanted to price the following Express Certificate with this specific payout structure:

If S1 > S0 -> 105.25 , else ->

If S2 > 0.95*S0 -> 110.5 , else ->

If S3 > 0.9*S0 -> 115.75 , else ->

If S4 > 0.85*S0 -> 121 , else ->

If S5 > 0.65*S0 -> 126.25 , else -> 100*(S5/S0)

S0 to S5 are Stock prices in year 0 up to year 5. If the barrier doesn't get hit, the payout happens and the remaining years can subsequently be ignored, if, however, the stock price is at or below the barrier, no payout will be made that year, instead another comparison will be made in a year with a slightly lower barrier and so on. If year 5 is reached and the underlying price is under 65% of the initial underlying value, the buyer must suffer a loss proportional to the drop in stock value (100*S5/S0), if it's above 65% of the initial value, a payout of 126.25 will be achieved.

Here's my mathematica monte carlo pricer for this express certificate:

I'm using the SE Uploader tool, so I generated this code which you can copy (including the Import at the beginning) into your Mathematica App and it will automatically load my notebook into your current notebook.


Here's also the visual representation of my notebook:

Mathematica graphics

r is the risk-free rate, sigma is the implied volatility, n is the number of iterations and summe is a variable that accumulates the payoffs throughout the loops. a is just there so that the s5 value is not recalculated in the same loop, as my s[x_] function changes with every single call.

What I don't get is why I get a price way above 100, which was the initial issue price for this express certificate. Is my geometric brownian motion formula wrong? Have I made a mistake somewhere in the "for" loop? Any suggestions are greatly appreciated! Thanks!

  • $\begingroup$ If you are trying to match an actual traded price, you need something much more sophisticated than a flat vol flat rate no div MC. These products are highly sensitive to skew and dividend assumptions. Assuming there is really no div, at the very least you need a local vol MC to get a price close to reality. It will also be sensitive to the term structure of interest rates here, given the path dependency. Repo is another consideration etc. In other words first you need proper market data, and second you need a more sophisticated diffusion model. $\endgroup$ – Ivan Apr 26 '18 at 16:57
  • $\begingroup$ I've programmed a different Monte Carlo pricer (using the GeometricBrownianProcess function that Mathematica provides) and it delivers a price of about 99. The same risk-free rate was used, as well as the same volatility and both were constant. What I don't understand is, why this program above is not doing what it should. Is my second part of the Exp function wrong? $\endgroup$ – Lumberjack88 Apr 26 '18 at 17:50
  • $\begingroup$ Ok, I see. Should your dt = 1/365 instead of just 1. Your vol looks like an annual one ? $\endgroup$ – Ivan Apr 26 '18 at 18:28
  • $\begingroup$ I found the problem: I shouldn't have used the standard Wiener Process (drift = 0 and volatility = 1), instead, I should have chosen my risk-free rate as the drift and my implied volatility as the volatility. Is this a mistake or was it correct to use the standard Wiener process in my simulation? And does it make sense to use the risk-free rate as .the drift? $\endgroup$ – Lumberjack88 Apr 26 '18 at 18:34

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Browse other questions tagged or ask your own question.