• View the 2024 QuantNet ranking of the Best UK Quant MSc Programs.

  • C++ Programming for Financial Engineering
    Highly recommended by thousands of MFE students. Covers essential C++ topics with applications to financial engineering. Learn more Join!
    Python for Finance with Intro to Data Science
    Gain practical understanding of Python to read, understand, and write professional Python code for your first day on the job. Learn more Join!
    An Intuition-Based Options Primer for FE
    Ideal for entry level positions interviews and graduate studies, specializing in options trading arbitrage and options valuation models. Learn more Join!

Two prices for one call option problem


I have started to learn mathematical finance and I find out about this problem:

I find out that there exists options that are priced in assets and are settled in cash, but also in assets terms. (So instead of getting 800$, you would get 800/1600 = 0.5 assets, where 1600 is the current price of the asset).

How should I price these options? I came up with two approaches.

One approach is to use Black Scholes model and find price in USD and the convert it to amount of asset by dividing it by current price of the asset.

But I also come up with a second approach. Instead of BS, I can directly calculate the price in asset terms. I can simulate the brownian motion and then calculate the price as:

[math]x = E_{p}[max(0, \frac{(p-K)}{p}][/math]

  • K is strike price
But the second approach gives me different value for ATM options than the first approach.

- S = 20
- K = 20
- r = 0
- T = 7/365.2425
- vol = 1.3

First approach:
In USD = $1.43 = 0.0715 in asset

Second Apporach:
In Asset = 0.05758 in asset = $1.15

Brownian motion:
def MCSIM(S,t,r,vol,M=1000000):
    N = 1
    T = t
    dt = T/N
    nudt = (r - 0.5*vol**2)*dt
    volsdt = vol*np.sqrt(dt)
    lnS = np.log(S)

    Z = np.random.normal(size=(N,M))
    delta_lnSt = nudt + volsdt*Z
    lnSt = lnS + np.cumsum(delta_lnSt,axis=0)
    lnSt = np.concatenate((np.full(shape=(1,M),fill_value=lnS), lnSt))

    ST = np.exp(lnSt).T[:,1]
    return ST

Pricing functions:
# first Approach (Black Scholes))
def option1A(S,K,t,r,vol,M=1000000):
    paths = MCSIM(S,t,r,vol,M=M)
    return np.maximum(0, paths - K).mean()*np.exp(-r*t)/S

# Second Approach
def option2A(S,K,t,r,vol,M=1000000):
    paths = MCSIM(S,t,r,vol,M=M)
    return np.maximum(0, (paths - K)/paths).mean()
Last edited: