La aproximación de la volatilidad implícita de las opciones europeas puede hacerse de varias maneras: ésta es sólo una. A continuación se muestra una implementación en python que utiliza Newton Raphson . Puede utilizar el implied_volatility
para encontrar la volatilidad implícita aproximada. A continuación, puede comprobarlo introduciendo el resultado en la función option_price
función.
import numpy as np
from scipy.stats import norm
"""
right = 'C' or 'P'
s = Spot Price
k = Strike Price
t = Days to expiration
rfr = Risk-free Rate
sigma = volatility
div = Annual dividend rate. Defaulted to zero.
price = Known option price. Needed for implied_volatility function
"""
def d_one(s, k, t, rfr, sigma, div=0):
"""d1 calculation"""
d_1 = (np.log(s / k) +
(rfr - div + sigma ** 2 / 2) * t) / (sigma * np.sqrt(t))
return d_1
def d_two(s, k, t, rfr, sigma, div=0):
"""d2 calculation"""
d_2 = d_one(s, k, t, rfr, sigma, div) - sigma * np.sqrt(t)
return d_2
def nd_one(right, s, k, t, rfr, sigma, div=0):
"""nd1 calculation"""
if right == 'C':
nd_1 = norm.cdf(d_one(s, k, t, rfr, sigma, div), 0, 1)
elif right == 'P':
nd_1 = norm.cdf(-d_one(s, k, t, rfr, sigma, div), 0, 1)
return nd_1
def nd_two(right, s, k, t, rfr, sigma, div=0):
"""nd2 calculation"""
if right == 'C':
nd_2 = norm.cdf(d_two(s, k, t, rfr, sigma, div), 0, 1)
elif right == 'P':
nd_2 = norm.cdf(-d_two(s, k, t, rfr, sigma, div), 0, 1)
return nd_2
def option_price(right, s, k, t, rfr, sigma, div=0):
"""option price"""
right = right.upper()
t /= 365
if right == 'C':
price = (s * np.exp(-div * t) *
nd_one(right, s, k, t, rfr, sigma, div)
- k * np.exp(-rfr * t) *
nd_two(right, s, k, t, rfr, sigma, div))
elif right == 'P':
price = (k * np.exp(-rfr * t) *
nd_two(right, s, k, t, rfr, sigma, div)
- s * np.exp(-div * t) *
nd_one(right, s, k, t, rfr, sigma, div))
return price
def option_vega(s, k, t, rfr, sigma, div=0):
"""option vega"""
t /= 365
vega = (.01 * s * np.exp(-div * t) * np.sqrt(t)
* norm.pdf(d_one(s, k, t, rfr, sigma, div)))
return vega
def implied_volatility(right, s, k, t, rfr, price, div=0):
"""implied volatility approximation"""
epsilon = 0.00000001
sigma = 1.0
def newton_raphson(right, s, k, t, rfr, sigma, price, epsilon, div=0):
diff = option_price(right, s, k, t, rfr, sigma, div) - price
while diff > epsilon:
sigma = (sigma -
(option_price(right, s, k, t, rfr, sigma, div) - price) /
(option_vega(s, k, t, rfr, sigma, div) * 100))
diff = np.abs(
option_price(right, s, k, t, rfr, sigma, div) - price)
return sigma
iv = newton_raphson(right, s, k, t, rfr, sigma, price, epsilon, div)
return iv
0 votos
Se le da $C_M$ (el precio de mercado de la opción) y se prueban varios valores de $\sigma$ que dan las correspondientes $C_{BS}$ (el resultado de introducir sigma en la fórmula BS). Cuando el valor absoluto de la diferencia entre $C_M$ y el precio Black Scholes $C_{BS}$ es lo suficientemente pequeño (digamos <0,001) ha encontrado el IV correcto.
0 votos
@AlexC Parte de mi objetivo es calcular en última instancia el valor de mercado de la opción, por lo que no sería un dato en mi situación. ¿Existe alguna forma de obtenerlo sin tener que comparar por ensayo y error con otra fuente?
1 votos
@Pez: Hola. Si no tienes el valor de mercado de la opción, entonces no puedes calcular la volatilidad implícita. necesitas el valor de mercado. si no tienes el valor de mercado, entonces generalmente pones precio a la opción construyendo algún tipo de estimación de volatilidad y enchufándola. Así, en este último caso, si dos personas tienen estimaciones de volatilidad diferentes, entonces cada una obtendrá valores de mercado diferentes para la opción.
0 votos
@markleeds gracias, así que la única opción es tomar el valor de mercado actual de la opción de una fuente externa (como CBOE o un corredor?) Y la ingeniería inversa el IV? No tengo mucha experiencia en este campo así que me parece raro que no haya forma de derivar sin tener ya la respuesta para comparar. ¡Casi parece un Catch 22!
0 votos
Emmanuel Derman escribió un documento hace varios años que utilicé para hacer el cálculo en un puesto anterior... básicamente daba una implementación paso a paso, y no recuerdo que la implementación fuera tan difícil. Si yo fuera tú, buscaría una copia para ver si puedo encontrarla.
0 votos
¿Ha encontrado ya una respuesta a esto? Tengo códigos de Python para esto. Voy a publicar si usted todavía los necesita.
0 votos
@Pez: Hola. Sólo para que lo entiendas, no hay ninguna trampa real al respecto. necesitas el valor real de la opción o necesitas la volatilidad implícita. el valor real es generalmente visto como el precio de mercado, así que eso es lo que se utiliza para obtener el vol implícito. Si los operadores de opciones tienen intuición-experiencia, podrían ser capaces de decir "oh, ese vol implícito es demasiado alto (bajo) por lo que el precio de la acción que sea va a disminuir (aumentar)".
0 votos
@amdopt ¡Por favor, publica tu código!
0 votos
@markleeds Gracias, eso tiene sentido. Tendré que sacar los precios de las opciones de alguna fuente y derivar el IV de eso entonces. Tengo que leer un poco más supongo para asegurarme de que entiendo todo
0 votos
@pez: Hace mucho tiempo que no miro un texto de opciones y estoy saliendo de dudas, pero nunca encontré una mejor exposición de las opciones que la de "options markets" de mark rubenstein. Hull recibe mucho bombo y creo que está bien para lo que pretende pero, para mí, rubenstein es el mejor para entender REALMENTE las opciones. Recuerdo que no sabía nada sobre ellas y leer ese libro con mucho cuidado (está repleto de información) me abrió los ojos.
0 votos
@pez: No es un mal precio teniendo en cuenta el precio de los textos hoy en día. amazon.com/Mercados de opciones-John-C-Cox/dp/0136382053/