S0 <- 270.23
K <- 270
sigma0 <- 0.2782
r <- 0.042
T_total <- 1

Para el desarrollo del ejercicio se utilizaron varios parámetros clave. En primer lugar, S_0=270.23corresponde al precio actual del activo subyacente, que sirve como punto de referencia inicial. El strike K=270se eligió cercano a este valor, lo que indica que la opción está at-the-money y permite analizar un escenario de riesgo moderado. La volatilidad inicial σ_0=0.2782representa la incertidumbre o variabilidad esperada en el precio del activo. Por su parte, la tasa libre de riesgo r=0.042se utiliza para descontar los flujos futuros en el modelo. Finalmente, T=1indica que el tiempo al vencimiento de la opción es de un año, lo cual permite evaluar su comportamiento en un horizonte de mediano plazo.

d1 <- function(S, K, r, sigma, T){
  (log(S/K) + (r + 0.5*sigma^2)*T)/(sigma*sqrt(T))
}

d2 <- function(S, K, r, sigma, T){
  d1(S,K,r,sigma,T) - sigma*sqrt(T)
}

call_price <- function(S,K,r,sigma,T){
  S*pnorm(d1(S,K,r,sigma,T)) - 
    K*exp(-r*T)*pnorm(d2(S,K,r,sigma,T))
}

delta <- function(S,K,r,sigma,T){
  pnorm(d1(S,K,r,sigma,T))
}

gamma <- function(S,K,r,sigma,T){
  dnorm(d1(S,K,r,sigma,T))/(S*sigma*sqrt(T))
}

vega <- function(S,K,r,sigma,T){
  S*dnorm(d1(S,K,r,sigma,T))*sqrt(T)
}

theta <- function(S,K,r,sigma,T){
  -S*dnorm(d1(S,K,r,sigma,T))*sigma/(2*sqrt(T)) - 
    r*K*exp(-r*T)*pnorm(d2(S,K,r,sigma,T))
}

rho <- function(S,K,r,sigma,T){
  K*T*exp(-r*T)*pnorm(d2(S,K,r,sigma,T))
}


S_min <- S0 * exp(-2*sigma0*sqrt(T_total))
S_max <- S0 * exp(2*sigma0*sqrt(T_total))
S_range <- seq(S_min, S_max, by = 2)

meses <- seq(1,12)
T_values <- (12 - meses + 1)/12


sigmas <- seq(sigma0, sigma0 - 0.02*11, length.out = 12)

crear_tabla <- function(T, sigma){
  
  data.frame(
    S = S_range,
    Precio = sapply(S_range, function(S) call_price(S,K,r,sigma,T)),
    Delta = sapply(S_range, function(S) delta(S,K,r,sigma,T)),
    Gamma = sapply(S_range, function(S) gamma(S,K,r,sigma,T)),
    Vega  = sapply(S_range, function(S) vega(S,K,r,sigma,T)),
    Theta = sapply(S_range, function(S) theta(S,K,r,sigma,T)),
    Rho   = sapply(S_range, function(S) rho(S,K,r,sigma,T))
  )
}

TABLAS PARA MES 1, 6 Y 12

tabla_1  <- crear_tabla(T_values[1],  sigmas[1])
tabla_6  <- crear_tabla(T_values[6],  sigmas[6])
tabla_12 <- crear_tabla(T_values[12], sigmas[12])

fig_precio <- plot_ly(tabla_1, x = ~S, y = ~Precio, type = 'scatter', mode = 'lines') %>%
  add_trace(data = tabla_6, x = ~S, y = ~Precio) %>%
  add_trace(data = tabla_12, x = ~S, y = ~Precio) %>%
  plotly::layout(title = "Convexidad de la Opción (Precio vs Subyacente)",
                 xaxis = list(title = "Precio del Activo"),
                 yaxis = list(title = "Precio de la Opción"))

fig_precio

La gráfica del precio muestra un comportamiento no lineal o convexo, típico de una opción call. Se observa que cuando el precio del activo es bajo, la opción vale poco; pero al superar el strike, su valor aumenta de forma más rápida. Esto confirma la convexidad positiva. Además, a medida que se acerca el vencimiento, la curva se hace más pronunciada cerca del strike, lo que indica mayor sensibilidad en el corto plazo.

GRÁFICA GAMMA (CONVEXIDAD REAL)

fig_gamma <- plot_ly(tabla_1, x = ~S, y = ~Gamma, type = 'scatter', mode = 'lines',
                     name = "Mes 1") %>%
  add_trace(data = tabla_6, x = ~S, y = ~Gamma, name = "Mes 6") %>%
  add_trace(data = tabla_12, x = ~S, y = ~Gamma, name = "Mes 12") %>%
  layout(title = "Gamma (Convexidad)",
         xaxis = list(title = "Precio del Activo"),
         yaxis = list(title = "Gamma"))

fig_gamma

La gamma alcanza su valor máximo cuando el precio del activo es cercano al strike (S≈K), es decir, cuando la opción está at-the-money. En este punto, la opción es más sensible a pequeños cambios en el precio del activo y la convexidad es mayor. Además, se observa que a medida que se acerca el vencimiento, la gamma aumenta alrededor del strike, mientras que en los extremos tiende a disminuir

GRÁFICAS GRIEGAS

plot_greek <- function(tabla, greek_name){
  
  plot_ly(tabla, x = ~S, y = tabla[[greek_name]],
          type = 'scatter', mode = 'lines',
          name = greek_name) %>%
    layout(title = paste("Gráfica de", greek_name),
           xaxis = list(title = "Precio del Activo"),
           yaxis = list(title = greek_name))
}
plot_greek(tabla_1, "Delta")

El delta se encuentra entre 0 y 1 y aumenta a medida que sube el precio del activo. Esto indica la probabilidad de que la opción termine in-the-money.

plot_greek(tabla_1, "Vega")

La vega es mayor cerca del strike y disminuye a medida que se acerca el vencimiento, lo que indica que la opción pierde sensibilidad a la volatilidad con el tiempo.

plot_greek(tabla_1, "Theta")

La theta suele ser negativa, ya que representa la pérdida de valor de la opción por el paso del tiempo. Además, este efecto se vuelve más fuerte cuando la opción está cerca del vencimiento.

plot_greek(tabla_1, "Rho")

La rho es positiva en las opciones call y refleja que el valor de la opción aumenta cuando suben las tasas de interés.

Conclusión

La opción presenta una convexidad positiva, ya que su valor aumenta de forma no lineal cuando sube el precio del activo. La mayor sensibilidad se observa cuando está at-the-money, lo cual se refleja en una gamma más alta en esa zona. Además, a medida que se acerca el vencimiento, la convexidad se vuelve más pronunciada cerca del strike, aumentando la sensibilidad ante pequeños cambios. En cuanto a las griegas, su comportamiento es consistente con la teoría, destacándose que la vega disminuye y el efecto del theta aumenta con el paso del tiempo.

Recomendación

Se recomienda trabajar con opciones at-the-money, ya que ahí se observa mejor la convexidad y la sensibilidad del precio. También es clave tener en cuenta el paso del tiempo, porque la pérdida de valor (theta) puede afectar bastante la rentabilidad. Para estrategias de cobertura, es importante fijarse en la gamma, ya que muestra el riesgo frente a cambios en el precio del activo. Además, es mejor usar datos reales de mercado, como tasas y volatilidad, para obtener resultados más precisos. Por último, hay que considerar que el modelo de Black-Scholes parte de supuestos ideales, por lo que en la práctica pueden presentarse diferencias.