Este ejercicio analiza el efecto de convexidad en una opción europea tipo Call sobre una acción del S&P 500 (Apple - AAPL), considerando vencimientos mensuales hasta un horizonte de un año.
Se implementa el modelo de Black-Scholes-Merton y se construyen visualizaciones dinámicas con Plotly.
S0 <- 190
K <- 190
# Tiempo (en años)
T_vec <- seq(1, 0, length.out = 13)
# Tasa libre de riesgo interpolada
r_vec <- approx(x=c(0,0.5,1),
y=c(0.043,0.046,0.048),
xout=T_vec)$y
# Volatilidad
sigma_vec <- seq(0.23, 0.25, length.out = 13)
set.seed(123)
n_sim <- 10000
Z <- rnorm(n_sim)
T <- 1
r <- 0.048
sigma <- 0.25
ST <- S0 * exp((r - 0.5*sigma^2)*T + sigma*sqrt(T)*Z)
S_min <- quantile(ST, 0.025)
S_max <- quantile(ST, 0.975)
S_grid <- seq(S_min, S_max, by = 2)
BS_call <- function(S,K,r,sigma,T){
d1 <- (log(S/K)+(r+0.5*sigma^2)*T)/(sigma*sqrt(T))
d2 <- d1 - sigma*sqrt(T)
S*pnorm(d1) - K*exp(-r*T)*pnorm(d2)
}
price_matrix <- sapply(1:length(T_vec), function(i){
BS_call(S_grid, K, r_vec[i], sigma_vec[i], T_vec[i])
})
fig <- plot_ly()
for(i in 1:length(T_vec)){
fig <- fig %>%
add_lines(x = S_grid,
y = price_matrix[,i],
name = paste("T =", round(T_vec[i],2)))
}
fig
greeks <- function(S,K,r,sigma,T){
d1 <- (log(S/K)+(r+0.5*sigma^2)*T)/(sigma*sqrt(T))
d2 <- d1 - sigma*sqrt(T)
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)
data.frame(delta, gamma, vega, theta, rho)
}
idx <- c(1, 7, 13)
greeks_list <- lapply(idx, function(i){
greeks(S_grid, K, r_vec[i], sigma_vec[i], T_vec[i])
})
plot_ly() %>%
add_lines(x=S_grid, y=greeks_list[[1]]$delta, name="T inicial") %>%
add_lines(x=S_grid, y=greeks_list[[2]]$delta, name="T medio") %>%
add_lines(x=S_grid, y=greeks_list[[3]]$delta, name="T final")
plot_ly() %>%
add_lines(x=S_grid, y=greeks_list[[1]]$gamma, name="T inicial") %>%
add_lines(x=S_grid, y=greeks_list[[2]]$gamma, name="T medio") %>%
add_lines(x=S_grid, y=greeks_list[[3]]$gamma, name="T final")
plot_ly() %>%
add_lines(x=S_grid, y=greeks_list[[1]]$vega, name="T inicial") %>%
add_lines(x=S_grid, y=greeks_list[[2]]$vega, name="T medio") %>%
add_lines(x=S_grid, y=greeks_list[[3]]$vega, name="T final")
```