When working with Scipy, lognomal distribution is defined by 3 parameters: the median (loc), the scale (standard deviation or, in our case, the implied volatility) and the shape parameter.

But, which one is the shape parameter used by Black-Scholes to determine option prices?

  • $\begingroup$ The shape parameter $s$ is the volatility $\sigma$, while the other two parameters, loc and scale, are used for scaling purpose. $\endgroup$
    – Gordon
    Mar 9, 2016 at 15:43

1 Answer 1


This is a good question which I got stuck on as well.

Suppose $X$ is lognormal defined as $X\sim \log \mathcal{N}(\mu, \sigma^2)$. With this notation we mean that if we write $X = e^Z$, then $Z$ follows a normal distribution with mean $\mu$ and variance $\sigma^2$.

The mean and variance of $X$ are then $\mu_X = e^{\mu + \frac{1}{2}\sigma^2}$ and $\sigma_X^2 = (e^{\sigma^2} - 1)e^{2\mu + \sigma^2}$.

For many distributions the location and scale parameters are just the standard mean and variance. This is not the case for the lognormal distribution. You can look up the details somewhere else (everything follows from the definition of the PDF), but what it comes down to is (see also here):

  • The lognormal's shape parameters equals the normal's scale parameter (the standard deviation of $Z$: $\sigma_Z$)
  • The lognormal's scale parameter equals the normal's exponentiated location parameter ($e^{\mu_Z}$)
  • The lognormal's location parameter does not have a counterpart on the normal distribution side. A lognormal distribution with non-zero location parameter cannot be written as the exponential of a normal distribution. The distribution has a lower bound at zero, and with a non-zero location parameter this lower bound is shifted left or right.

TLDR: On to python. Here's two ways of sampling from the lognormal distribution with $\mu_Z = 5$ and $\sigma_Z=.2$, one of which shows how you instantiate the lognorm class.

from scipy.stats import lognorm, norm
import numpy as np
import matplotlib.pyplot as plt

mu = 5.
stdev = .2

Z = norm(loc=mu, scale=stdev)
X = lognorm(s=stdev, scale=np.exp(mu))
plt.hist(np.exp(Z.rvs(10000)), bins=100)
plt.hist(X.rvs(10000), bins=100)

Note that loc defaults to zero for $X$.

  • $\begingroup$ When calculating the probability of an option expiring worthless, I need to get the probability of x being below the strike (cfd). Therefore I am using scipy's stats.lognormal.cdf with the following parameters: x=strike, loc=(current underlying price), s=IV... and the scale should be np.exp(current underlying price)? I was also using IV as scale... $\endgroup$
    – Roman Rdgz
    Mar 9, 2016 at 16:19
  • 1
    $\begingroup$ So you need $P(S <= K)$ with $S$ the stock price, $K$ the strike and assuming lognormality on $S$, right? Then take lognorm.cdf(K, s=IV, scale=S_0 * exp(mu)) with mu your drift (e.g. $\mu = r T$ in the risk neutral measure) and S_0 your current underlying price. $\endgroup$
    – Olaf
    Mar 9, 2016 at 16:46
  • $\begingroup$ are you sure about that? Scipy documentation states: "lognorm.pdf(x, s, loc, scale) is identically equivalent to lognorm.pdf(y, s) / scale with y = (x - loc) / scale". It really looked to my as f the scale should be the IV. Moreover, you are not using loc, why? $\endgroup$
    – Roman Rdgz
    Mar 9, 2016 at 18:33
  • $\begingroup$ You can think of loc as the lower bound on the distribution. You know that $S=0$ is the lower bound on $S$, so loc should be zero. $\endgroup$
    – Olaf
    Mar 9, 2016 at 19:19
  • $\begingroup$ As for the difference between scale and shape, you have to look at the pdf, see e.g. the wiki. With that expression you can explicitly identify the scale and shape like I did above; it's just a bit of work. $\endgroup$
    – Olaf
    Mar 9, 2016 at 19:22

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.