1. PARÁMETROS INICIALES S0 <- 431.54 # Precio actual () K <- 432 # Strike ATM sigma0 <- 0.3628 # Volatilidad inicial r <- 0.042 # Tasa libre de riesgo T_total <- 1 # 1 año

Se eligió Microsoft (MSFT), empresa del S&P 500, por su alta liquidez y disponibilidad de datos confiables. Además, presenta una volatilidad adecuada que permite analizar claramente el comportamiento de la opción y sus griegas. Estas características la hacen apropiada para aplicar el modelo de Black-Scholes.

MSFT <- getSymbols("MSFT", src = "yahoo", auto.assign = FALSE)

S0 <- as.numeric(Cl(last(MSFT)))
K  <- round(S0)


returns <- dailyReturn(MSFT)
vol_inicial <- sd(returns) * sqrt(252)

dias <- seq(21, 252, by = 21)
Tiempos <- dias / 252


t_ref <- c(1/12, 6/12, 1)
rf_ref <- c(0.042, 0.041, 0.0385)

rf <- approx(t_ref, rf_ref, xout = Tiempos, rule = 2)$y



vols <- vol_inicial - 0.02 * (0:(length(Tiempos)-1))
vols <- pmax(vols, 0.08)


set.seed(123)

Z <- rnorm(50000)

S_T <- S0 * exp((rf[length(rf)] - 0.5*vols[1]^2)*1 +
                  vols[1]*sqrt(1)*Z)

S_min <- as.numeric(quantile(S_T, 0.025))
S_max <- as.numeric(quantile(S_T, 0.975))

price_grid <- seq(floor(S_min), ceiling(S_max), by = 2)


bs_all <- function(S, K, r, sigma, T){
  
  d1 <- (log(S/K) + (r + 0.5*sigma^2)*T)/(sigma*sqrt(T))
  d2 <- d1 - sigma*sqrt(T)
  
  call <- S*pnorm(d1) - K*exp(-r*T)*pnorm(d2)
  
  delta <- pnorm(d1)
  gamma <- dnorm(d1)/(S*sigma*sqrt(T))
  vega  <- S*dnorm(d1)*sqrt(T)
  theta <- -(S*dnorm(d1)*sigma)/(2*sqrt(T)) - 
    r*K*exp(-r*T)*pnorm(d2)
  rho   <- K*T*exp(-r*T)*pnorm(d2)
  
  return(c(call, delta, gamma, theta, rho, vega))
}


convexidad_df <- data.frame()

for(i in 1:length(Tiempos)){
  
  valores <- t(sapply(price_grid, function(S){
    bs_all(S, K, rf[i], vols[i], Tiempos[i])
  }))
  
  temp <- data.frame(
    Precio = price_grid,
    Opcion = valores[,1],
    Vencimiento = paste("Mes", i)
  )
  
  convexidad_df <- rbind(convexidad_df, temp)
}

meses_clave <- c(1, 6, 12)
griegas_df <- data.frame()

for(i in meses_clave){
  
  valores <- t(sapply(price_grid, function(S){
    bs_all(S, K, rf[i], vols[i], Tiempos[i])
  }))
  
  temp <- data.frame(
    Precio = price_grid,
    Delta = valores[,2],
    Gamma = valores[,3],
    Theta = valores[,4],
    Rho   = valores[,5],
    Vega  = valores[,6],
    Vencimiento = paste("Mes", i)
  )
  
  griegas_df <- rbind(griegas_df, temp)
}
  1. Convexidad
## Warning in RColorBrewer::brewer.pal(N, "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(N, "Set2"): n too large, allowed maximum for palette Set2 is 8
## Returning the palette you asked for with that many colors

La grafica muestra la convexidad del precio de una opcion call segun la curva, esto implica que el valor de la opcion aumenta a una tasa creciente a medida que sube el precio del activo.

  1. Gamma
plot_ly(griegas_df, x=~Precio, y=~Gamma, color=~Vencimiento,
        type="scatter", mode="lines") %>%
  layout(title="Gamma (Convexidad)")

Gamma es mas alta cuando la opcion esta cerca al strike, lo que indica una mayor sensibilidad, a menor tiempo al vencimiento esa sensibilidad se vuelve mas intensa

  1. Delta
plot_ly(griegas_df, x=~Precio, y=~Delta, color=~Vencimiento,
        type="scatter", mode="lines") %>%
  layout(title="Delta")

Delta mide la sensibilidad del precio se la opcion frente al activo, Es bajo cuando la opcion está fuera del dinero, cercano a 1 cuando esta dentro del dinero y cambia mas rapido cerca del strike

  1. Theta
plot_ly(griegas_df, x=~Precio, y=~Theta, color=~Vencimiento,
        type="scatter", mode="lines") %>%
  layout(title="Theta")

Theta mide la perdida de valor de la opción por el paso del tiempo, Es mas negativo cuando la opcion esta cerca del strike y cuando el vencimiento esta proximo

  1. Rho
plot_ly(griegas_df, x=~Precio, y=~Rho, color=~Vencimiento,
        type="scatter", mode="lines") %>%
  layout(title="Rho")

El Rho muestra que el efecto de la tasa de interes es mayor cuando la opcion esta dentro del dinero y cuando el Tiempo, al vencimiento es mayor

  1. Vega
plot_ly(griegas_df, x=~Precio, y=~Vega, color=~Vencimiento,
        type="scatter", mode="lines") %>%
  layout(title="Vega")

La gráfica de Vega muestra que la opción es más sensible a cambios en la volatilidad cuando el precio del activo se encuentra cercano al strike. Además, se observa que la sensibilidad a la volatilidad es mayor en opciones con vencimientos más largos, reflejando una mayor incertidumbre asociada al mayor tiempo a vencimiento. Para precios muy alejados del strike, la Vega tiende a cero, indicando que la volatilidad tiene un impacto limitado sobre el valor de la opción.

head(convexidad_df)
head(griegas_df)
S0
vol_inicial

Conclusiones

la presente investigacion nos ayuda a entender de forma clara cómo se comporta una opción call sobre Microsoft (MSFT) utilizando el modelo de Black-Scholes. Se observó que el valor de la opción no cambia de manera lineal frente al precio del activo, sino que presenta una forma convexa, lo cual es una característica clave de este tipo de instrumentos. Además, el análisis de las griegas ayudó a ver cómo cambia la sensibilidad de la opción. El delta muestra cómo reacciona ante movimientos del precio, el gamma refleja la curvatura, el theta evidencia la pérdida de valor con el tiempo, y vega y rho permiten entender el efecto de la volatilidad y la tasa de interés. En general, el ejercicio permite comprender mejor cómo distintos factores influyen en el precio de una opción y cómo se pueden analizar desde un enfoque práctico. se recomienda tener en cuenta que las griegas varían con el tiempo y con el precio del activo, por lo que en la práctica es necesario monitorearlas constantemente para una adecuada gestión del riesgo.