He estado creando una clase para determinar valores de put/call basados en el modelo Black Scholes Merton y me he encontrado con un problema extraño. Por alguna razón mis valores de venta terminan siendo menores que el valor intrínseco de la opción, lo que simplemente no tiene sentido para mí. He revisado mi código, lo he reescrito y he intentado utilizar el código de otra persona para determinar el valor de una opción de venta utilizando BSM. ¿Hay algún error en mi código, o me falta alguna lógica en BSM?
Estoy usando la versión más actualizada de python, NumPy y scipy para esto.
from numpy import exp, log, sqrt
from scipy.stats import norm
insumos básicos
K = 40
T = 0.5 # 1/2 year
r = 0.1
sigma = 0.2
o_t = 'p' # type of option
std_T = sqrt(T)
pv_factor = exp(-r * T)
start = 1
stop = 50
generación de datos de muestra
st = np.linspace(start, stop, stop - start).astype(int) # potential prices at maturity
intrinsic = np.maximum(K - st, 0)
d1 = (log(st / K) + (r + 0.5 * sigma ** 2) * 0.5) / (sigma * sqrt(T))
d2 = d1 - sigma * sqrt(T)
nd1 = norm.cdf(-d1, 0.0, 1.0)
nd2 = norm.cdf(-d2, 0.0, 1.0)
puts = K * exp(-r * T) * nd2 - st * nd1
un simple trazado del valor intrínseco y extrínseco
plt.figure(figsize=(10, 6))
plt.plot(st, intrinsic, 'b-.', lw=2.5, label='intrinsic value')
valor interno de la parcela en la madurez
plt.plot(st, puts, 'r', lw=2.5, label='present value')
valor actual de la opción de trazado
plt.grid(True)
plt.legend(loc=0)
plt.xlabel('index level $S_0$')
plt.ylabel('present value $C(t=0)$')