1. Introducción

Este trabajo analiza la convexidad de una opción call europea sobre la accion Apple, utilizando el modelo de Black-Scholes.
La convexidad se mide mediante la Gamma, que representa la segunda derivada del precio de la opción respecto al precio del activo subyacente.

2. Parámetros iniciales

getSymbols("AAPL", src="yahoo", from="2024-01-01")
## [1] "AAPL"
S0 <- as.numeric(last(Cl(AAPL)))  # Precio actual
K <- round(S0)                    # Strike cercano
r <- 0.05                         # Tasa libre de riesgo
sigma <- 0.25                     # Volatilidad inicial
T_total <- 1                      # 1 año

3. Funciones Black-Scholes

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))
}

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

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

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

theta_fun <- 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_fun <- function(S, K, r, sigma, T){
  K*T*exp(-r*T)*pnorm(d2(S,K,r,sigma,T))
}

4. Simulación mensual

T_seq <- seq(1, 0.01, length.out=12)
sigma_seq <- seq(sigma-0.02, sigma+0.02, length.out=12)
S_seq <- seq(0.5*S0, 1.5*S0, length.out=100)

results <- data.frame()

for(t in 1:length(T_seq)){
  for(s in S_seq){
    
    results <- rbind(results, data.frame(
      S = s,
      Precio = call_price(s, K, r, sigma, T_seq[t]),
      Gamma = gamma_fun(s, K, r, sigma, T_seq[t]),
      Tiempo = paste0("Mes ", t)
    ))
  }
}

5. Convexidad (Precio de la opción)

plot_ly(results, x=~S, y=~Precio, color=~Tiempo,
        type="scatter", mode="lines") %>%
  layout(title="Convexidad de la Opción Call",
         xaxis=list(title="Precio del activo"),
         yaxis=list(title="Precio de la opción"))
## Warning in RColorBrewer::brewer.pal(max(N, 3L), "Set2"): n too large, allowed maximum for palette Set2 is 8
## Returning the palette you asked for with that many colors
## Warning in RColorBrewer::brewer.pal(max(N, 3L), "Set2"): n too large, allowed maximum for palette Set2 is 8
## Returning the palette you asked for with that many colors

La gráfica muestra que el precio de la opción call no aumenta de manera lineal cuando el precio del activo subyacente sube. En cambio, se observa una forma curva, lo que refleja la convexidad de la opción. Esto significa que, a medida que el activo aumenta de valor, el precio de la opción también crece, pero a un ritmo cada vez mayor.

Además, se nota que conforme se acerca la fecha de vencimiento, la curva se vuelve más marcada alrededor del precio strike. Esto indica que la opción se vuelve más sensible a pequeños cambios en el precio del activo en esa zona, especialmente cuando está cerca del dinero (ATM).

6. Gamma (Convexidad real)

plot_ly(results, x=~S, y=~Gamma, color=~Tiempo,
        type="scatter", mode="lines") %>%
  layout(title="Gamma",
         xaxis=list(title="Precio del activo"),
         yaxis=list(title="Gamma"))
## Warning in RColorBrewer::brewer.pal(max(N, 3L), "Set2"): n too large, allowed maximum for palette Set2 is 8
## Returning the palette you asked for with that many colors
## Warning in RColorBrewer::brewer.pal(max(N, 3L), "Set2"): n too large, allowed maximum for palette Set2 is 8
## Returning the palette you asked for with that many colors

La gamma es más alta cuando el precio del activo está cerca del precio de ejercicio (strike), es decir, cuando la opción está at-the-money. En ese punto se puede ver que la convexidad es mayor y el delta cambia más rápido.

También se observa que cuando se acerca la fecha de vencimiento, la gamma se va concentrando más alrededor del strike. Esto hace que la opción sea más sensible a pequeños cambios en el precio del activo, aumentando un poco el riesgo en esa zona.

7. Griegas

meses <- c(1,6,12)
greeks <- data.frame()

for(t in meses){
  for(s in S_seq){
    
    greeks <- rbind(greeks, data.frame(
      S = s,
      Delta = delta_fun(s,K,r,sigma,T_seq[t]),
      Gamma = gamma_fun(s,K,r,sigma,T_seq[t]),
      Vega = vega_fun(s,K,r,sigma,T_seq[t]),
      Theta = theta_fun(s,K,r,sigma,T_seq[t]),
      Rho = rho_fun(s,K,r,sigma,T_seq[t]),
      Tiempo = paste0("Mes ", t)
    ))
  }
}

8. Gráfica Delta

plot_ly(greeks, x=~S, y=~Delta, color=~Tiempo,
        type="scatter", mode="lines") %>%
  layout(title="Delta",
         xaxis=list(title="Precio del activo"),
         yaxis=list(title="Delta"))

El delta presenta una forma sigmoide, variando entre 0 y 1. Para precios bajos del activo, el delta es cercano a 0, mientras que para precios altos se aproxima a 1. Esto refleja que la probabilidad de ejercer la opción aumenta con el precio del activo. Además, a medida que se acerca el vencimiento, la transición del delta se vuelve más abrupta, especialmente cerca del strike.

9. Conclusión

La convexidad de la opción se evidencia en la curvatura de la relación entre el precio del activo subyacente y el precio de la opción.
La Gamma muestra que esta curvatura es mayor cuando la opción está cerca del dinero (at-the-money) y cuando el tiempo al vencimiento es menor.
Esto implica que el riesgo de cambios en el delta aumenta a medida que la opción se acerca al vencimiento.

Básicamente, lo que muestran las gráficas es que la forma en la que cambia el precio de la opción no es siempre la misma.

Se puede ver que la sensibilidad de la opción (delta) y su “curvatura” (gamma) van cambiando con el tiempo. En general, el riesgo no se mantiene fijo, sino que aumenta cuando se acerca la fecha de vencimiento y cuando el precio del activo está cerca del strike (at-the-money).

En otras palabras, la opción se vuelve más “inestable” o sensible en esos momentos.