Black-Scholes-Merton Model

class Bsm(sigma, intr=0.0, divr=0.0, is_fwd=False)[source]

Black-Scholes-Merton (BSM) model for option pricing.

Underlying price is assumed to follow a geometric Brownian motion.

Examples

>>> import numpy as np
>>> import pyfeng as pf
>>> m = pf.Bsm(sigma=0.2, intr=0.05, divr=0.1)
>>> m.price(np.arange(80, 121, 10), 100, 1.2)
array([15.71361973,  9.69250803,  5.52948546,  2.94558338,  1.48139131])
>>> sigma = np.array([0.2, 0.3, 0.5])[:, None]
>>> m = pf.Bsm(sigma, intr=0.05, divr=0.1) # sigma in axis=0
>>> m.price(np.array([90, 100, 110]), 100, 1.2, cp=np.array([-1,1,1]))
array([[ 5.75927238,  5.52948546,  2.94558338],
       [ 9.4592961 ,  9.3881245 ,  6.45745004],
       [16.812035  , 17.10541288, 14.10354768]])
cdf(strike, spot, texp, cp=1)[source]

Cumulative distribution function of the final asset price.

Parameters
  • strike – strike price

  • spot – spot (or forward) price

  • texp – time to expiry

  • cp – -1 (default) for left-tail CDF, -1 for right-tail CDF (i.e., survival function)

Returns

CDF value

d2_var(strike, spot, texp, cp=1)[source]

2nd derivative w.r.t. variance (=sigma^2) Eq. (9) in Hull & White (1987)

Parameters
  • strike – strike price

  • spot – spot (or forward)

  • texp – time to expiry

  • cp – 1/-1 for call/put option

Returns: d^2 price / d var^2

References

d3_var(strike, spot, texp, cp=1)[source]

3rd derivative w.r.t. variance (=sigma^2) Eq. (9) in Hull & White (1987)

Parameters
  • strike – strike price

  • spot – spot (or forward)

  • texp – time to expiry

  • cp – 1/-1 for call/put option

Returns: d^3 price / d var^3

References

delta(strike, spot, texp, cp=1)[source]

Option model delta (sensitivity to price).

Parameters
  • strike – strike price

  • spot – spot (or forward) price

  • texp – time to expiry

  • cp – 1/-1 for call/put option

Returns

delta value

gamma(strike, spot, texp, cp=1)[source]

Option model gamma (2nd derivative to price).

Parameters
  • strike – strike price

  • spot – spot (or forward) price

  • texp – time to expiry

  • cp – 1/-1 for call/put option

Returns

gamma value

impvol(price, strike, spot, texp, cp=1, setval=False)

BSM implied volatility with Newton’s method

Parameters
  • price – option price

  • strike – strike price

  • spot – spot (or forward) price

  • texp – time to expiry

  • cp – 1/-1 for call/put option

  • setval – if True, sigma is set with the solved implied volatility

Returns

implied volatility

moments_vsk(texp=1)[source]

Variance, skewness, and ex-kurtosis. Assume mean=1.

Parameters

texp – time-to-expiry

Returns

(variance, skewness, and ex-kurtosis)

References

https://en.wikipedia.org/wiki/Log-normal_distribution

price_barrier(strike, barrier, spot, texp, cp=1, io=- 1)[source]

Barrier option price under the BSM model

Parameters
  • strike – strike price

  • barrier – knock-in/out barrier price

  • spot – spot price

  • texp – time to expiry

  • cp – 1/-1 for call/put option

  • io – +1 for knock-in, -1 for knock-out

Returns

Barrier option price

static price_formula(strike, spot, sigma, texp, cp=1, intr=0.0, divr=0.0, is_fwd=False)[source]

Black-Scholes-Merton model call/put option pricing formula (static method)

Parameters
  • strike – strike price

  • spot – spot (or forward)

  • sigma – model volatility

  • texp – time to expiry

  • cp – 1/-1 for call/put option

  • intr – interest rate (domestic interest rate)

  • divr – dividend/convenience yield (foreign interest rate)

  • is_fwd – if True, treat spot as forward price. False by default.

Returns

Vanilla option price

theta(strike, spot, texp, cp=1)[source]

Option model theta (sensitivity to time-to-maturity).

Parameters
  • strike – strike price

  • spot – spot (or forward) price

  • texp – time to expiry

  • cp – 1/-1 for call/put option

Returns

theta value

vega(strike, spot, texp, cp=1)[source]

Option model vega (sensitivity to volatility).

Parameters
  • strike – strike price

  • spot – spot (or forward) price

  • texp – time to expiry

  • cp – 1/-1 for call/put option

Returns

vega value

vol_smile(strike, spot, texp, cp=1, model='norm')[source]

Equivalent volatility smile for a given model

Parameters
  • strike – strike price

  • spot – spot price

  • texp – time to expiry

  • cp – 1/-1 for call/put option

  • model – {‘norm’ (default), ‘norm-approx’, ‘norm-grunspan’, ‘bsm’}

Returns

volatility smile under the specified model

class BsmDisp(sigma, beta=1, pivot=0, *args, **kwargs)[source]

Displaced Black-Scholes-Merton model for option pricing. Displace price,

D(F_t) = beta*F_t + (1-beta)*A

is assumed to follow a geometric Brownian motion with volatility beta*sigma.

Examples

>>> import numpy as np
>>> import pyfeng as pf
>>> m = pf.BsmDisp(sigma=0.2, beta=0.5, pivot=100, intr=0.05, divr=0.1)
>>> m.price(np.arange(80, 121, 10), 100, 1.2)
array([15.9543935 ,  9.7886658 ,  5.4274197 ,  2.71430505,  1.22740381])
>>> beta = np.array([0.2, 0.6, 1])[:, None]
>>> m = pf.BsmDisp(0.2, beta=beta, pivot=100) # beta in axis=0
>>> m.vol_smile(np.arange(80, 121, 10), 100, 1.2)
array([[0.21915778, 0.20904587, 0.20038559, 0.19286293, 0.18625174],
       [0.20977955, 0.20461468, 0.20025691, 0.19652101, 0.19327567],
       [0.2       , 0.2       , 0.2       , 0.2       , 0.2       ]])
cdf(strike, spot, texp, cp=1)[source]

Cumulative distribution function of the final asset price.

Parameters
  • strike – strike price

  • spot – spot (or forward) price

  • texp – time to expiry

  • cp – -1 (default) for left-tail CDF, -1 for right-tail CDF (i.e., survival function)

Returns

CDF value

delta(strike, spot, texp, cp=1)[source]

Option model delta (sensitivity to price) by finite difference

Parameters
  • strike – strike price

  • spot – spot (or forward) price

  • texp – time to expiry

  • cp – 1/-1 for call/put option

Returns

delta value

disp_spot(spot)[source]

Displaced spot

Parameters

spot – spot (or forward) price

Returns

Displaces spot

disp_strike(strike, texp)[source]

Displaced strike

Parameters
  • strike – strike price

  • texp – time to expiry

Returns

Displace strike

gamma(strike, spot, texp, cp=1)[source]

Option model gamma (2nd derivative to price) by finite difference

Parameters
  • strike – strike price

  • spot – spot price

  • texp – time to expiry

  • cp – 1/-1 for call/put

Returns

Delta with numerical derivative

impvol(price_in, strike, spot, texp, cp=1, setval=False)[source]

Implied volatility using Brent’s method. Slow but robust implementation.

Parameters
  • price – option price

  • strike – strike price

  • spot – spot (or forward) price

  • texp – time to expiry

  • cp – 1/-1 for call/put

  • setval – if True, sigma is set with the solved implied volatility

Returns

implied volatility

moments_vsk(texp=1)[source]

Variance, skewness, and ex-kurtosis. Assume mean=1.

Parameters

texp – time-to-expiry

Returns

(variance, skewness, and ex-kurtosis)

References

https://en.wikipedia.org/wiki/Log-normal_distribution

price(strike, spot, texp, cp=1)[source]

Call/put option price.

Parameters
  • strike – strike price.

  • spot – spot (or forward) price.

  • texp – time to expiry.

  • cp – 1/-1 for call/put option.

Returns

option price

price_barrier(strike, barrier, spot, *args, **kwargs)[source]

Barrier option price under the BSM model

Parameters
  • strike – strike price

  • barrier – knock-in/out barrier price

  • spot – spot price

  • texp – time to expiry

  • cp – 1/-1 for call/put option

  • io – +1 for knock-in, -1 for knock-out

Returns

Barrier option price

theta(strike, spot, texp, cp=1)[source]

Option model thegta (sensitivity to time-to-maturity) by finite difference

Parameters
  • strike – strike price

  • spot – spot price

  • texp – time to expiry

  • cp – 1/-1 for call/put

Returns

theta value

vega(strike, spot, texp, cp=1)[source]

Option model vega (sensitivity to volatility) by finite difference

Parameters
  • strike – strike price

  • spot – spot (or forward) price

  • texp – time to expiry

  • cp – 1/-1 for call/put option

Returns

vega value

vol_smile(strike, spot, texp, cp=1, model='bsm')[source]

Equivalent volatility smile for a given model

Parameters
  • strike – strike price

  • spot – spot price

  • texp – time to expiry

  • cp – 1/-1 for call/put option

  • model – {‘bsm’, ‘norm’, ‘bsm-approx’, ‘norm-approx’}

Returns

volatility smile under the specified model