Como se ha mencionado, el moneyness se refiere a la relación entre el precio de la acción y el precio de ejercicio, es decir, $\frac{S}{K}.$ .
Reproduzco los siguientes gráficos utilizando Python 3.
Comparando el gráfico de arriba con el del artículo, muestran comportamientos bastante similares, excepto en la volatilidad cero (obtengo un error de división por cero).
Los códigos fuente son los siguientes y pueden encontrarse en mi github :
from Option import *
import numpy as np
import matplotlib.pyplot as plt
sigma_upper = 10
x = np.linspace(1, sigma_upper, sigma_upper)
d = 0
r = 0
T = 1
sigma = 0.1
K = 1
moneyness = np.arange(0.7, 1.4, 0.1)
for i in moneyness[::-1]:
S = i * K
y = [Option(S, K, r, d, sigma, T).european_call() for sigma in range(1, sigma_upper+1)]
plt.plot(x,y, label = 'moneyness = ' + str(round(i,2)))
plt.xlabel('Volatility')
plt.ylabel('Option Price')
plt.legend();
El Option
El código fuente de script es el siguiente y puede encontrarse en mi github (He extraído sólo las partes necesarias):
from scipy.stats import norm
class Option:
def __init__(self, S, K, r, d, sigma, T):
'''
Parameters:
===========
S: stock price
K: strike price
r: risk-free interest rate
d: dividend
sigma: volatility (implied)
T: time to maturity
Returns:
===========
Forward price, vanilla European call and put option' prices, cash-or-nothing call and put options' prices,
zero coupon bond and forward contract.
'''
self.S = S
self.K = K
self.r = r
self.d = d
self.sigma = sigma
self.T = T
self.d1 = (np.log(self.S/self.K) + (self.r - self.d + self.sigma**2 / 2) * self.T) / (self.sigma * np.sqrt(self.T))
self.d2 = self.d1 - self.sigma * np.sqrt(self.T)
def european_call(self):
'''
output vanilla European call option's price using Black-Scholes formula
'''
return self.S * np.exp(-self.d * self.T) * norm.cdf(self.d1) - self.K * np.exp(-self.r * self.T)*norm.cdf(self.d2)