Laboratorio 1 - Practica de probabilidad y estadistica

Datos_TRM<- read.csv(file = "Historico.csv", header = TRUE, sep = ";", dec = ".", fill = TRUE)
View(Datos_TRM)

head(Datos_TRM)
##       Fecha  Precio
## 1 1/01/2000 1873.77
## 2 2/01/2000 1873.77
## 3 3/01/2000 1873.77
## 4 4/01/2000 1874.35
## 5 5/01/2000 1895.97
## 6 6/01/2000 1912.69
class(Datos_TRM[,"Fecha"])
## [1] "character"

Cambiamos la clase de la fecha de “character” a “Date”

Datos_TRM[,"Fecha"]<-as.Date(Datos_TRM[,"Fecha"],format = "%d/%m/%Y")
class(Datos_TRM[,"Fecha"])
## [1] "Date"

Debemos instalar Plotly

#install.packages("plotly")
#install.packages("ggplot2")
# Cargar la librería ggplot2
library(ggplot2)
library(plotly)
grafica_historica <- ggplot(Datos_TRM, aes(x = Fecha, y = Precio)) +
  geom_point(color = "blue") +  # Cambiar el color de los puntos
  labs(title = "Precio de la TRM a lo largo del tiempo",  # Añadir título
       x = "Fecha", y = "Precio") +  # Añadir etiquetas de los ejes
  theme_minimal() +  # Usar un tema minimalista
  theme(plot.title = element_text(size = 16, face = "bold"),  # Ajustar el tamaño y estilo del título
        axis.text.x = element_text(angle = 45, hjust = 1))  # Rotar las etiquetas del eje x para mayor legibilidad

# Convertir la gráfica a ggplotly
ggplotly(grafica_historica)
#(Datos_TRM[-1,"Fecha"],diff(log(Datos_TRM[,"Precio"])), type = "l", main = "Serie Historica rendimientos diarios TRM")
# Ajustar los márgenes
par(mar = c(5, 5, 4, 2) + 0.1)

# Crear la gráfica sin trazar los datos aún
plot(x = NA, y = NA, 
     type = "n", 
     xlim = c(min(Datos_TRM$Fecha), max(Datos_TRM$Fecha)), 
     ylim = c(min(diff(log(Datos_TRM$Precio))), max(diff(log(Datos_TRM$Precio)))), 
     main = "Serie Histórica de Rendimientos Diarios de TRM",
     xlab = "Fecha",
     ylab = "Rendimiento Diario")

# Ocultar la gráfica original
invisible({
  # Graficar los datos
  lines(Datos_TRM$Fecha[-1], diff(log(Datos_TRM$Precio)), type = "l", col = "blue")
})
# Agregar una leyenda
legend("topright", legend = "Rendimientos Diarios", col = "blue", lty = 1)

Distribucion de frecuencias

# Ajustar el tamaño de la imagen
options(repr.plot.width=8, repr.plot.height=6)

# Crear el histograma
hist(Datos_TRM[, "Precio"], 
     breaks = 30, # Número de barras
     col = "lightblue", # Color de las barras
     main = "Histograma de Precios de TRM", # Título
     xlab = "Precio", # Etiqueta del eje x
     ylab = "Frecuencia Relativa", # Etiqueta del eje y
     freq = FALSE) # Mostrar frecuencias relativas

# Agregar una línea de densidad
lines(density(Datos_TRM[, "Precio"]), col = "red", lwd = 2)

Rtos_TRM<-diff(log(Datos_TRM[,"Precio"]))
# Ajustar el tamaño de la imagen
options(repr.plot.width=8, repr.plot.height=6)

# Crear el histograma
hist(Rtos_TRM, 
     breaks = 50, # Número de barras
     col = "lightblue", # Color de las barras
     main = "Histograma de Rendimientos de TRM", # Título
     xlab = "Rendimiento Diario", # Etiqueta del eje x
     ylab = "Frecuencia Relativa", # Etiqueta del eje y
     freq = FALSE, # Mostrar frecuencias relativas
     xlim = c(-0.02, 0.02)) # Límites del eje x

# Agregar una línea de densidad
lines(density(Rtos_TRM), col = "red", lwd = 2)

#install.packages("moments")
#install.packages("knitr")
# Cargar las librerías necesarias
library(knitr)
library(moments)

# Calcular estadísticas de la TRM
max_precio <- max(Datos_TRM[,"Precio"])
min_precio <- min(Datos_TRM[,"Precio"])
media_precio <- mean(Datos_TRM[,"Precio"])
desviacion_estandar_precio <- sd(Datos_TRM[,"Precio"])
sesgo_precio <- skewness(Datos_TRM[,"Precio"])
curtosis_precio <- kurtosis(Datos_TRM[,"Precio"])
percentiles_precio <- quantile(Datos_TRM[,"Precio"], c(0.01, 0.05, 0.1, 0.5, 0.75, 0.90, 0.95, 0.99))

# Calcular estadísticas de los rendimientos de la TRM
Rtos_TRM <- diff(log(Datos_TRM[,"Precio"]))
max_rtos_trm <- max(Rtos_TRM)
min_rtos_trm <- min(Rtos_TRM)
media_rtos_trm <- mean(Rtos_TRM)
desviacion_estandar_rtos_trm <- sd(Rtos_TRM)
sesgo_rtos_trm <- skewness(Rtos_TRM)
curtosis_rtos_trm <- kurtosis(Rtos_TRM)
percentiles_rtos_trm <- quantile(Rtos_TRM, c(0.01, 0.05, 0.1, 0.5, 0.75, 0.90, 0.95, 0.99))

# Crear una tabla con las estadísticas
tabla_estadisticas <- data.frame(
  Estadística = c("Máximo", "Mínimo", "Media", "Desviación Estándar", "Sesgo", "Curtosis"),
  TRM = c(max_precio, min_precio, media_precio, desviacion_estandar_precio, sesgo_precio, curtosis_precio),
  Rendimientos_TRM = c(max_rtos_trm, min_rtos_trm, media_rtos_trm, desviacion_estandar_rtos_trm, sesgo_rtos_trm, curtosis_rtos_trm)
)

# Mostrar la tabla
kable(tabla_estadisticas, caption = "Estadísticas de la TRM y sus rendimientos")
Estadísticas de la TRM y sus rendimientos
Estadística TRM Rendimientos_TRM
Máximo 5061.210000 0.0593067
Mínimo 1652.410000 -0.0562194
Media 2660.823711 0.0000837
Desviación Estándar 762.341794 0.0059237
Sesgo 0.896888 0.2697665
Curtosis 3.041658 12.8112712

Informe sobre las Estadísticas del Precio de la TRM y sus Rendimientos

Las estadísticas presentadas ofrecen una visión detallada del comportamiento del precio de la Tasa Representativa del Mercado (TRM) y sus rendimientos durante el período analizado. Estos datos nos permiten comprender mejor la distribución, las tendencias y los posibles sesgos en los datos.

Variabilidad del Precio de la TRM:

El análisis del máximo y mínimo revela la amplia gama de precios observados durante el período. Esta variabilidad sugiere fluctuaciones significativas en el precio de la TRM a lo largo del tiempo.

Tendencias y Patrones Observados:

Observamos que la media del precio de la TRM está más cerca del precio mínimo que del máximo. Este hallazgo refleja una tendencia interesante: durante el período analizado, la TRM ha experimentado una evolución desde valores más bajos a valores más altos. Este patrón sugiere un aumento constante en la TRM en los últimos años, en contraste con el rango más bajo observado en el período anterior al año 2015.

Eventos Excepcionales:

Un análisis más detallado revela que el precio mínimo de la TRM podría haber sido influenciado por eventos económicos significativos, como la crisis financiera del año 2008. Este año de crisis se asocia comúnmente con una disminución abrupta en los precios de los activos financieros, lo que podría explicar la observación del precio mínimo en ese momento.

Interpretación de la Media:

Aunque la media del precio de la TRM puede parecer relativamente baja, es importante considerar el contexto histórico y las tendencias actuales del mercado. La baja media puede atribuirse a los valores más bajos predominantes en el pasado, y puede no reflejar completamente la situación actual del mercado.

Por lo anterior, al observar la amplia variabilidad en el precio de la TRM a lo largo del período analizado, se recomienda acortar la ventana de tiempo de análisis. Esto se fundamenta en la presencia de eventos excepcionales, como la crisis financiera del año 2008, que se encuentran muy alejados en el tiempo y podrían distorsionar las estadísticas actuales. Dado que estos eventos pasados pueden tener un impacto significativo en las estadísticas de precios, reducir el período de análisis puede ayudar a centrar el análisis en datos más relevantes y representativos de la situación actual del mercado. De esta manera, se facilita una comprensión más precisa y actualizada de la distribución y tendencias del precio de la TRM, lo que contribuye a una toma de decisiones más informada y precisa.

# Importar paquetes necesarios
#install.packages("magrittr")
#install.packages("dplyr")
#install.packages("stats")
library(magrittr)  # Para usar el operador %>%
library(dplyr)     # Para manipulación de datos
library(stats)     # Para funciones estadísticas
# Definir los datos
valor_activo <- 500000  # Valor del activo en USD
prob_perdida <- 0.03    # Probabilidad de pérdida hasta 3%
prob_ganancia <- 0.05   # Probabilidad de ganancia hasta 5%

# Calcular intervalo de confianza del 95% para el valor en pesos de la importación
confianza_95 <- quantile(Rtos_TRM, c(0.05, 0.95))
intervalo_confianza <- valor_activo * exp(confianza_95)

# Calcular la probabilidad de obtener una pérdida de hasta un 3% en un día
probabilidad_perdida <- sum(Rtos_TRM <= log(1 - prob_perdida))

# Calcular la probabilidad de ganar hasta un 5% en un día
probabilidad_ganancia <- sum(Rtos_TRM >= log(1 + prob_ganancia))

# Imprimir resultados
cat("Intervalo de Confianza del 95% para el valor en pesos de la importación:\n")
## Intervalo de Confianza del 95% para el valor en pesos de la importación:
print(intervalo_confianza)
##       5%      95% 
## 495527.5 504803.9
cat("\nProbabilidad de obtener una pérdida de hasta un 3% en un día:\n")
## 
## Probabilidad de obtener una pérdida de hasta un 3% en un día:
print(probabilidad_perdida/100)
## [1] 0.12
cat("\nProbabilidad de ganar hasta un 5% en un día:\n")
## 
## Probabilidad de ganar hasta un 5% en un día:
print(probabilidad_ganancia/100)
## [1] 0.02

La probabilidada de obtener una perdida de hasta el 3% en un dia es del 12% y la probabilidad de tener una ganacia de hasta un 5% en un dia es del 2%

# Definir el valor de la inversión en COP
valor_inversion <- 10000000

# Calcular el rendimiento diario en COP
rendimientos_cop <- valor_inversion * exp(Rtos_TRM) - valor_inversion

# Calcular la probabilidad de obtener pérdidas entre -500.000 y 500.000 COP en un día
probabilidad_perdidas <- sum(rendimientos_cop >= -500000 & rendimientos_cop <= 500000) / length(rendimientos_cop)

# Imprimir el resultado
cat("La probabilidad de obtener pérdidas entre -500.000 y 500.000 COP en un día es:", probabilidad_perdidas)
## La probabilidad de obtener pérdidas entre -500.000 y 500.000 COP en un día es: 0.9995462

Simulacion montecarlo

Datos_futuroTRM<- read.csv(file = "TRMH24F.csv", header = TRUE, sep = ";", dec = ".", fill = TRUE)

View(Datos_futuroTRM)

# Parámetros del problema

contratos <- 10
Numero_iteraciones <- 10000
valor_contrato <- 50000

precio_actual <- 4198

deposito_cop <- 150000000

mu <- 0.01/25

sigma <- 0.03/25
ExposicionTotal <- (contratos*valor_contrato*precio_actual)

garantia_inicial<-150000000

mantenimiento <- 130000000

trm_cierre <- Datos_futuroTRM$Precio.Cierre
 
 
Rtos_futuro<-diff(log(Datos_futuroTRM[,"Precio.Cierre"]))

futuro_SIMULADA=matrix(,25,Numero_iteraciones)

futuro_Inicial=Datos_futuroTRM[length(Datos_futuroTRM[,"Precio.Cierre"]), "Precio.Cierre"]
 
futuro_SIMULADA[1,]=futuro_Inicial
 
for(j in 1:Numero_iteraciones){

  for(i in 2:25){

    futuro_SIMULADA[i,j]=futuro_Inicial*exp(rnorm(1,mean = mu,sd=sigma))

  }

}
 
 

# Graficar las series de tiempo
matplot(futuro_SIMULADA, type = "l",
        main = "Futuro Simulada", xlab = "Días", ylab = "Valor")

# Calcular el promedio de cada fila
promedio_SM <-data.frame(Promedio = rowMeans(futuro_SIMULADA)) 
promedio_SM
##    Promedio
## 1  4198.410
## 2  4200.157
## 3  4200.116
## 4  4200.071
## 5  4200.011
## 6  4200.138
## 7  4200.099
## 8  4200.115
## 9  4200.122
## 10 4200.094
## 11 4200.058
## 12 4200.131
## 13 4200.106
## 14 4200.051
## 15 4200.071
## 16 4200.155
## 17 4200.031
## 18 4200.196
## 19 4200.100
## 20 4200.119
## 21 4200.157
## 22 4200.129
## 23 4200.119
## 24 4200.095
## 25 4200.122
n <- 25
Diferencia_pf <- -diff(promedio_SM$Promedio)
liquidacion_diaria <- Diferencia_pf*valor_contrato*contratos 

# Definir el número de datos
n <- 25

# Crear un vector para almacenar los datos
valores_cuenta_margen <- numeric(25)

# Definir el primer dato
valores_cuenta_margen[1] <- 150000000


# Calcular los datos restantes
for (i in 2:n) {
  valores_cuenta_margen[i] <- valores_cuenta_margen[i-1] + liquidacion_diaria
}

print(valores_cuenta_margen)
##  [1] 150000000 149126453 148252906 147379359 146505812 145632266 144758719
##  [8] 143885172 143011625 142138078 141264531 140390984 139517437 138643890
## [15] 137770343 136896797 136023250 135149703 134276156 133402609 132529062
## [22] 131655515 130781968 129908421 129034874
# Calcular el intervalo de predicción del 90%
intervalo_prediccion_90 <- quantile(valores_cuenta_margen, c(0.05, 0.95))

# Imprimir el intervalo de predicción del 90%
print(intervalo_prediccion_90)
##        5%       95% 
## 130083131 148951744
# Calcular la probabilidad de perder más de 10,000,000 COP en un mes
prob_perdida <- mean(valores_cuenta_margen < 150000000-10000000)

# Imprimir la probabilidad
print(prob_perdida)
## [1] 0.52
# Supongamos que tenemos una variable llamada 'valores_cuenta_margen' que contiene los posibles valores de la cuenta de margen para dentro de un mes

# Calcular la probabilidad de ser llamado al margen si el margen mínimo es de 130,000,000 COP
prob_llamado_margen <- mean(valores_cuenta_margen < 130000000)

# Imprimir la probabilidad
print(prob_llamado_margen)
## [1] 0.08

Laboratorio 2 Práctica sobre MBG y precios Futuros

futuro_trm=read.csv("FuturoTRM.csv",sep = ";", dec = ".", fill = TRUE)
datos=read.csv("historicotrm.csv",sep = ";", dec = ".", fill = TRUE)
head(datos)
##        Fecha     TRM
## 1 01/01/2000 1873.77
## 2 02/01/2000 1873.77
## 3 03/01/2000 1873.77
## 4 04/01/2000 1874.35
## 5 05/01/2000 1895.97
## 6 06/01/2000 1912.69
options(scipen = 999)
class(datos[,"Fecha"])
## [1] "character"
class(futuro_trm[,"Fecha"])
## [1] "character"

Cambiamos la clase de la fecha de “character” a “Date”

datos[,"Fecha"]<-as.Date(datos[,"Fecha"],format = "%d/%m/%Y")
class(datos[,"Fecha"])
## [1] "Date"
futuro_trm[,"Fecha"]<-as.Date(futuro_trm[,"Fecha"],format = "%d/%m/%Y")
class(futuro_trm[,"Fecha"])
## [1] "Date"
Rtos_trm<-diff(log(datos[,"TRM"]))
#install.packages("moments")
#install.packages("knitr")

library(knitr)
library(moments)
library(quantmod)

# Calcular estadísticas de la TRM
max_TRM <- max(datos[,"TRM"])
min_TRM <- min(datos[,"TRM"])
media_TRM <- mean(datos[,"TRM"])
SD_TRM <- sd(datos[,"TRM"])
sesgo_TRM <- skewness(datos[,"TRM"])
curtosis_TRM <- kurtosis(datos[,"TRM"])
percentiles_TRM <- quantile(datos[,"TRM"], c(0.01, 0.05, 0.1, 0.5, 0.75, 0.90, 0.95, 0.99))

# Calcular rendimientos diarios de la TRM
rtos_trm <- diff(log(datos[,"TRM"]))
media_rtos_trm <- mean(rtos_trm)
SD_rtos_trm <- sd(rtos_trm)
sesgo_rtos_trm <- skewness(rtos_trm)
curtosis_rtos_trm <- kurtosis(rtos_trm)
percentiles_rtos_trm <- quantile(rtos_trm, c(0.01, 0.05, 0.1, 0.5, 0.75, 0.90, 0.95, 0.99))

# Calcular rendimiento y volatilidad anual de los rendimientos
Rto_anual <- media_rtos_trm * sqrt(250)
Vol_Anual_Rtos <- SD_rtos_trm * sqrt(250)
Rto_anual_trm <- media_TRM * sqrt(250)
Vol_Anual_Rtos_trm <- SD_TRM * sqrt(250)


# Crear tabla de análisis
tabla_Analisis <- data.frame(
  Estadística = c("media", "desviación estándar","Rendimiento anual","Volatilidad anual", "sesgo", "curtosis", "mínimo", "máximo", "percentil 1", "percentil 5", "percentil 10", "mediana", "percentil 75", "percentil 90", "percentil 95", "percentil 99"),
  TRM = c(media_TRM, SD_TRM, Rto_anual_trm, Vol_Anual_Rtos_trm, sesgo_TRM, curtosis_TRM, min_TRM, max_TRM, percentiles_TRM),
  Rendimientos_TRM = c(media_rtos_trm, SD_rtos_trm,Rto_anual, Vol_Anual_Rtos, sesgo_rtos_trm, curtosis_rtos_trm, min(rtos_trm), max(rtos_trm), percentiles_rtos_trm)
)


# Mostrar la tabla
kable(tabla_Analisis, caption = "Estadísticas de la TRM y sus rendimientos")
Estadísticas de la TRM y sus rendimientos
Estadística TRM Rendimientos_TRM
media 2553.4016743 0.0001039
desviación estándar 643.2769974 0.0057839
Rendimiento anual 40372.8253604 0.0016426
Volatilidad anual 10171.1023909 0.0914510
sesgo 0.7478894 0.2649411
curtosis 2.6851841 13.8843845
mínimo 1652.4100000 -0.0562194
máximo 4627.4600000 0.0593067
percentil 1 1761.4850000 -0.0163474
percentil 5 1789.5400000 -0.0085343
percentil 10 1830.7700000 -0.0054629
mediana 2345.4700000 0.0000000
percentil 75 2954.1575000 0.0013157
percentil 90 3580.3500000 0.0057931
percentil 95 3830.2500000 0.0093273
percentil 99 4129.8700000 0.0183285
# Calcula el tamaño de la muestra
n <- length(rtos_trm)

# Calcula el intervalo de confianza del 95% para la media de los rendimientos
error_estandar <- SD_rtos_trm / sqrt(n)
margen <- 1.96 * error_estandar
intervalo_confianza <- c(media_rtos_trm - margen, media_rtos_trm + margen)

# Muestra el intervalo de confianza
print(intervalo_confianza)
## [1] -0.00002058077  0.00022836004

TRM PROYECTADA

Utilizaremos el MGB para realizar la siguiente simulación

# Parámetros iniciales
S <- tail(datos[, 2], 1)  # Precio de la TRM del 17 de septiembre de 2022
dt <- 1/12  # Intervalo de tiempo (en años) - aquí se asume que se está trabajando con meses
Numero_periodos <- 6  # Número de períodos de tiempo en la simulación
Numero_iteraciones <- 10000  # Número de iteraciones

Sigma <- Vol_Anual_Rtos  # Volatilidad histórica de la serie de los rendimientos
mu <- media_rtos_trm  # Media histórica de la serie de los rendimientos

# Crear matriz para almacenar los resultados de la simulación
TRM <- matrix(0, nrow = Numero_periodos, ncol = Numero_iteraciones)
TRM[1, ] <- S  # Iniciar la simulación con el precio de la TRM del 17 de septiembre de 2022

# Simulación de la TRM
for (j in 1:Numero_iteraciones) {
  for (i in 2:Numero_periodos) {
    # Generar el cambio en la TRM usando el modelo MBG
    Cambio_TRM <- TRM[i - 1, j] * (mu * dt + Sigma * rnorm(1) * sqrt(dt))
    # Actualizar el valor de la TRM para el siguiente período
    TRM[i, j] <- TRM[i - 1, j] + Cambio_TRM
  }
}


# Graficar los resultados con una mejor visualización
matplot(TRM, type = "l", col = adjustcolor("deepskyblue", alpha.f = 0.3), lty = 1, 
        xlab = "Períodos", ylab = "TRM", main = "Simulación de la TRM")

max_simulacion <- mean(max(TRM))
min_simulacion <- mean(min(TRM))
media_simulacion = mean(TRM)
SD_simulacion <- sd(TRM)
sesgo_simulacion <- mean(skewness(TRM))
curtosis_simulacion <- mean(kurtosis(TRM))
percentiles_simulacion <- quantile(TRM[,1], c(0.01, 0.05, 0.1, 0.5, 0.75, 0.90, 0.95, 0.99))
# Crear tabla de análisis
tabla_Analisis_simulacion <- data.frame(
  Estadística = c("media", "desviación estándar", "sesgo", "curtosis", "mínimo", "máximo"),
  simulacion = c(media_simulacion, SD_simulacion, sesgo_simulacion, curtosis_simulacion, min_simulacion, max_simulacion)
)


# Mostrar la tabla
kable(tabla_Analisis_simulacion, caption = "Estadísticas simulacion")
Estadísticas simulacion
Estadística simulacion
media 4436.8343928
desviación estándar 185.6582343
sesgo 0.0183784
curtosis 2.0640185
mínimo 3525.7335364
máximo 5458.2993810

Podemos concluir que se espera que el TRM futuro tenga una media alrededor de 4436.27, con una desviación estándar de aproximadamente 185.15, lo que indica cierta variabilidad en los posibles valores. La distribución parece tener una leve asimetría hacia la derecha y una distribución leptocúrtica con colas pesadas. Además, el rango esperado de valores se sitúa entre aproximadamente 3555.92 y 5641.05.

Distribución empirica

# Cargar biblioteca plotly
library(plotly)

# Calcular la densidad de la TRM
densidad_TRM <- density(datos[,"TRM"])

# Crear la gráfica interactiva
plot_ly(x = densidad_TRM$x, y = densidad_TRM$y, type = "scatter", mode = "lines", 
        name = "Densidad", fill = "tozeroy", 
        hoverinfo = "x+y", line = list(color = "blue")) %>%
  layout(title = "Distribución empírica de la TRM",
         xaxis = list(title = "TRM"),
         yaxis = list(title = "Densidad"))
# Graficar la distribución empírica y la densidad estimada
hist(TRM, breaks = 30, freq = FALSE, main = "Distribución Empírica y Densidad Estimada de los Precios Futuros",
     xlab = "Precio Futuro de la TRM", col = "skyblue", border = "white")
lines(density(TRM), col = "red", lwd = 2)
legend("topright", legend = c("Densidad Estimada"), col = c("red"), lty = 1, lwd = 2)

# Calcular los cuantiles al 2.5% y 97.5%
cuantil_inf <- quantile(TRM, 0.025)
cuantil_sup <- quantile(TRM, 0.975)

# Graficar los resultados
abline(v = cuantil_inf, col = "green", lty = 2)
abline(v = cuantil_sup, col = "green", lty = 2)
text(cuantil_inf, 0.01, sprintf("Cuántil 2.5%%: %.2f", cuantil_inf), pos = 4, col = "green")
text(cuantil_sup, 0.01, sprintf("Cuántil 97.5%%: %.2f", cuantil_sup), pos = 2, col = "green")

Cuotas_USD=c(91738,90992,90246,89500,88754)

Cuotas_COP=TRM[2,]*Cuotas_USD[1]

for(j in 2:length(Cuotas_USD)){
Cuotas_COP=rbind(Cuotas_COP,TRM[j+1,]*Cuotas_USD[j])
}

media_cuotas=vector()
volatilidad_cuotas=vector()
percentil_5_cuotas=vector()
percentil_95_cuotas=vector()

for(l in 1:5){
media_cuotas[l]=mean(TRM[l+1,]*Cuotas_USD[l])
volatilidad_cuotas[l]=sd(TRM[l+1,]*Cuotas_USD[l])
percentil_5_cuotas[l]=quantile(TRM[l+1,]*Cuotas_USD[l],0.05)
percentil_95_cuotas[l]=quantile(TRM[l+1,]*Cuotas_USD[l],0.95)
}

matplot(Cuotas_COP,type = "l", col = "lightcyan3", main="Estimado Cuotas en COP", ylab = "Valor Cuota", xlab = "cuota")
lines(percentil_5_cuotas, type = "l", col="blue")
lines(percentil_95_cuotas, type = "l",col = "red")
lines(media_cuotas, type = "l", col = "darkgreen")

print("Volatilidad de cada cuota  en millones de COP")
## [1] "Volatilidad de cada cuota  en millones de COP"
print(volatilidad_cuotas/1000000)
## [1] 10.67102 15.17737 18.35967 21.05770 23.26830

UTILIDAD POR USD

proporcion_cobertura=0.7
Precio_Entrega=4066

Utilidad_POR_USD=TRM[-1,]-Precio_Entrega


matplot(Utilidad_POR_USD,type="l", col="blue")

UTILIDAD TOTAL

Utilidad_total=Utilidad_POR_USD[1,]*Cuotas_USD[1]*0.7

for(j in 2:length(Cuotas_USD)){
Utilidad_total=rbind(Utilidad_total,Utilidad_POR_USD[j,]*Cuotas_USD[j]*0.7)
}

matplot(Utilidad_total,type="l", col = "lightblue")

Cuotas_COP_CON_C=Cuotas_COP-Utilidad_total

media_cuotas_COP_CON_C=vector()
volatilidad_cuotas_COP_CON_C=vector()
percentil_5_cuotas_COP_CON_C=vector()
percentil_95_cuotas_COP_CON_C=vector()

for(l in 1:5){
media_cuotas_COP_CON_C[l]=mean(Cuotas_COP_CON_C[l,])
volatilidad_cuotas_COP_CON_C[l]=sd(Cuotas_COP_CON_C[l,])
percentil_5_cuotas_COP_CON_C[l]=quantile(Cuotas_COP_CON_C[l,],0.05)
percentil_95_cuotas_COP_CON_C[l]=quantile(Cuotas_COP_CON_C[l,],0.95)
}

matplot(Cuotas_COP_CON_C,type = "l", col="lightcyan3", main="Estimado Cuotas en COP", ylab = "Valor Cuota", xlab = "cuota")
lines(percentil_5_cuotas_COP_CON_C, type = "l")
lines(percentil_95_cuotas_COP_CON_C, type = "l")
lines(media_cuotas_COP_CON_C, type = "l")

print("Volatilidad de cada cuota con cobertura  en millones de COP")
## [1] "Volatilidad de cada cuota con cobertura  en millones de COP"
print(volatilidad_cuotas_COP_CON_C/1000000)
## [1] 3.201305 4.553212 5.507900 6.317309 6.980490

RESULTADOS

Valor real observado del pago de cuotas en cop

Fechas_pago=c("2022-10-17","2022-11-17","2022-12-17","2023-01-17","2023-02-17")

TRM_OBSERVADA=vector()
for(j in 1:5){TRM_OBSERVADA[j]=futuro_trm[which(futuro_trm[,1]==Fechas_pago[j]),2]}

Cuota_Real_COP=TRM_OBSERVADA*Cuotas_USD


matplot(Cuotas_COP,type = "l", col="lightcyan3", main="Estimado Cuotas en COP", ylab = "Valor Cuota", xlab = "cuota")
lines(percentil_5_cuotas, type = "l")
lines(percentil_95_cuotas, type = "l")
lines(media_cuotas, type = "l")
lines(Cuota_Real_COP, type = "l",lwd=2)

print(Cuota_Real_COP)
## [1] 425373511 447926318 433404610 420112105 440781653

Beneficio real observado

Utilidad_POR_USD_Observada=TRM_OBSERVADA-Precio_Entrega
Utilidad_total_observada= Cuotas_USD*Utilidad_POR_USD_Observada

Valor real con cobertura

Valor_Observado_Cuotas_con_cobertura=Cuota_Real_COP-Utilidad_total_observada

matplot(Cuotas_COP_CON_C,type = "l", col="lightcyan3", main="Estimado Cuotas en COP", ylab = "Valor Cuota", xlab = "cuota")
lines(percentil_5_cuotas_COP_CON_C, type = "l")
lines(percentil_95_cuotas_COP_CON_C, type = "l")
lines(media_cuotas_COP_CON_C, type = "l")
lines(Valor_Observado_Cuotas_con_cobertura, type = "l", lwd=2)

# Número de cuotas
cuotas <- 5
# Tasa de interés mensual (AMV)
tasa_interes <- 0.10 / 12
# Calcular el valor presente de los flujos de efectivo en USD
valor_presente_usd <- sum(Cuotas_USD / (1 + tasa_interes)^(1:cuotas))
# Imprimir el valor presente en USD
cat("Valor Presente de los Flujos de Efectivo en USD:", valor_presente_usd, "USD\n")
## Valor Presente de los Flujos de Efectivo en USD: 440225.4 USD
# Tasa de cambio actual
tasa_cambio <- 4066

# Convertir el valor presente de los flujos de efectivo a COP
valor_presente_cop <- valor_presente_usd * tasa_cambio

# Imprimir el valor presente en COP
cat("Valor Presente de los Flujos de Efectivo en COP:", valor_presente_cop, "COP\n")
## Valor Presente de los Flujos de Efectivo en COP: 1789956417 COP
# Cobertura del 70%
cobertura <- 0.70

# Calcular el monto a cubrir con los contratos de futuros TRM__F
monto_cubierto <- valor_presente_cop * cobertura

# Imprimir el monto cubierto
cat("Monto Cubierto con Contratos de Futuros TRM__F:", monto_cubierto, "COP\n")
## Monto Cubierto con Contratos de Futuros TRM__F: 1252969492 COP
# Calcular el margen
margen <- valor_presente_cop - monto_cubierto

# Imprimir el margen
cat("Margen Utilizando Contratos de Futuros TRM__F:", margen, "COP\n")
## Margen Utilizando Contratos de Futuros TRM__F: 536986925 COP
# Calcular la probabilidad de ser llamado al margen si solo se deposita en la cuenta el margen inicial
margen_inicial <- 1790000*0.7*4066  # Se asume que el margen inicial es igual a la utilidad total

prob_llamada_al_margen <- sum(Cuotas_COP_CON_C[,1] < margen_inicial) / Numero_iteraciones

cat("La probabilidad de ser llamado al margen si solo se deposita en la cuenta el margen inicial es:", prob_llamada_al_margen, "\n")
## La probabilidad de ser llamado al margen si solo se deposita en la cuenta el margen inicial es: 0.0005
# Calcular el margen inicial necesario para que la probabilidad de ser llamado al margen antes de cubrir el primer flujo sea menor al 1%
margen_inicial_min <- 0
margen_inicial_max <- max(Cuotas_COP_CON_C[1,])  # Se establece el valor máximo como el valor inicial de la cartera

while (TRUE) {
  margen_inicial_actual <- (margen_inicial_min + margen_inicial_max) / 2
  
  prob_llamada_al_margen_actual <- sum(Cuotas_COP_CON_C[,1] < margen_inicial_actual) / Numero_iteraciones
  
  if (prob_llamada_al_margen_actual < 0.01) {
    break
  } else {
    margen_inicial_max <- margen_inicial_actual
  }
}

cat("El margen inicial necesario para que la probabilidad de ser llamado al margen antes de cubrir el primer flujo sea menor al 1% es:", margen_inicial_actual, "\n")
## El margen inicial necesario para que la probabilidad de ser llamado al margen antes de cubrir el primer flujo sea menor al 1% es: 198102993

Margen inicial en dolares

margen_inicial_usd=margen_inicial_actual/4066
margen_inicial_usd
## [1] 48721.84

Cargamos la base de datos los historicos de TES de estados unidos y TES de colombia

TESUSA=read.csv("TES USA.csv",sep = ";", dec = ".", fill = TRUE)
TESCOP=read.csv("TES Colombia.csv",sep = ",", dec = ".", fill = TRUE)
head(TESUSA)
##        Date X10.anos TREASURY.20.Yr.CMT
## 1 2/01/2019   0.0290             0.0283
## 2 3/01/2019   0.0284             0.0275
## 3 4/01/2019   0.0291             0.0283
## 4 7/01/2019   0.0293             0.0286
## 5 8/01/2019   0.0294             0.0288
## 6 9/01/2019   0.0297             0.0290
head(TESCOP)
##        Fecha  X10.anos
## 1  2/01/2003 0.1469065
## 2  3/01/2003 0.1447118
## 3  7/01/2003 0.1556985
## 4  8/01/2003 0.1463437
## 5  9/01/2003 0.1554297
## 6 10/01/2003 0.1535416
class(TESCOP[,"Fecha"])
## [1] "character"
class(TESUSA[,"Date"])
## [1] "character"

Cambiamos la clase de la fecha de “character” a “Date”

TESCOP[,"Fecha"]<-as.Date(TESCOP[,"Fecha"],format = "%d/%m/%Y")
class(TESCOP[,"Fecha"])
## [1] "Date"
TESUSA[,"Date"]<-as.Date(TESUSA[,"Date"],format = "%d/%m/%Y")
class(TESUSA[,"Date"])
## [1] "Date"
Inicio_muestra_COP=which(TESCOP[,1]=="2020-09-17")
Fin_muestra_COP=which(TESCOP[,1]=="2022-09-16")


TESCOP_2020_2022=TESCOP[Inicio_muestra_COP :Fin_muestra_COP,]
Inicio_muestra_USA=which(TESUSA[,1]=="2020-09-17")
Fin_muestra_USA=which(TESUSA[,1]=="2022-09-16")


TESUSA_2020_2022=TESUSA[Inicio_muestra_USA :Fin_muestra_USA,]

MODELO VASICEK

Realizamos la simulacion con el modelo vasicek para la tasas de Estados unidos y de colombia

# Cargar paquetes necesarios
library(MASS)
## 
## Attaching package: 'MASS'
## The following object is masked from 'package:dplyr':
## 
##     select
## The following object is masked from 'package:plotly':
## 
##     select
library(knitr)

# Parámetros del modelo
theta <- 0.08  # Media a largo plazo
r0_us <-  tail(TESUSA_2020_2022[, 2], 1)  # Tasa inicial para el mercado estadounidense
r0_col <- tail(TESCOP_2020_2022[, 2], 1)  # Tasa inicial para el mercado colombiano
sigma_us <- sd(TESUSA_2020_2022[,"X10.anos"])  # Desviación estándar para el mercado estadounidense
sigma_col <- sd(TESCOP_2020_2022[,"X10.anos"])  # Desviación estándar para el mercado colombiano
k <- 0.3  # Velocidad de reversión

# Función para simular tasas con el modelo Vasicek
simular_tasas <- function(r0, sigma, k, theta, periodos, iteraciones) {
  tasas_simuladas <- matrix(NA, nrow = iteraciones, ncol = periodos)
  for (i in 1:iteraciones) {
    tasas_simuladas[i, 1] <- r0
    for (t in 2:periodos) {
      drift <- k * (theta - tasas_simuladas[i, t - 1])
      shock <- mvrnorm(1, mu = 0, Sigma = 1)
      tasas_simuladas[i, t] <- tasas_simuladas[i, t - 1] + drift + sigma * shock
    }
  }
  return(tasas_simuladas)
}

# Simulación de tasas para el mercado estadounidense
periodos <- 10
iteraciones <- 10
tasas_us_simuladas <- simular_tasas(r0_us, sigma_us, k, theta, periodos, iteraciones)

# Simulación de tasas para el mercado colombiano
tasas_col_simuladas <- simular_tasas(r0_col, sigma_col, k, theta, periodos, iteraciones)

# Mostrar un resumen de los resultados
cat("### Resumen de la simulación de tasas\n\n")
## ### Resumen de la simulación de tasas
cat("Se simularon", iteraciones, "escenarios para", periodos, "periodos.\n\n")
## Se simularon 10 escenarios para 10 periodos.
# Mostrar solo una muestra de las tasas simuladas en lugar de todas
muestras <- sample(1:iteraciones, 10)  # Seleccionar tres muestras aleatorias
cat("### Muestra de tasas simuladas\n\n")
## ### Muestra de tasas simuladas
cat("#### Mercado estadounidense\n\n")
## #### Mercado estadounidense
knitr::kable(tasas_us_simuladas[muestras, ], caption = "Muestra de tasas simuladas para el mercado estadounidense")
Muestra de tasas simuladas para el mercado estadounidense
0.0373 0.0466253 0.0680088 0.0648730 0.0643890 0.0730079 0.0843300 0.0799145 0.0804143 0.0736654
0.0373 0.0387647 0.0532827 0.0615512 0.0600979 0.0752985 0.0684520 0.0719909 0.0729909 0.0852556
0.0373 0.0505673 0.0627371 0.0675569 0.0890537 0.0916259 0.0909555 0.0935371 0.0823374 0.0849245
0.0373 0.0455668 0.0530723 0.0637359 0.0714163 0.0724192 0.0805555 0.0768082 0.0725090 0.0793328
0.0373 0.0448670 0.0531762 0.0615947 0.0670996 0.0622020 0.0624517 0.0674005 0.0795783 0.0898048
0.0373 0.0459696 0.0568819 0.0712794 0.0686468 0.0779503 0.0905335 0.0787675 0.0686652 0.0668421
0.0373 0.0612780 0.0728351 0.0722570 0.0688486 0.0706730 0.0593488 0.0670887 0.0677966 0.0710418
0.0373 0.0465292 0.0656432 0.0739329 0.0676692 0.0662933 0.0734095 0.0872053 0.0793660 0.0900553
0.0373 0.0564380 0.0835432 0.0817531 0.0873235 0.0804690 0.0808684 0.0783518 0.0653642 0.0657223
0.0373 0.0561036 0.0654386 0.0625068 0.0705817 0.0775877 0.0758965 0.0719348 0.0764354 0.0704500
cat("\n\n")
cat("#### Mercado colombiano\n\n")
## #### Mercado colombiano
knitr::kable(tasas_col_simuladas[muestras, ], caption = "Muestra de tasas simuladas para el mercado colombiano")
Muestra de tasas simuladas para el mercado colombiano
0.1258525 0.1248638 0.0757679 0.0567695 0.0880809 0.0954990 0.0820941 0.1164881 0.0852007 0.0996064
0.1258525 0.1080464 0.0727210 0.0694260 0.0675113 0.0678931 0.0804290 0.0750089 0.1017048 0.1118707
0.1258525 0.1213287 0.0998776 0.0986567 0.1050403 0.0891674 0.0818071 0.0943003 0.0871418 0.0760047
0.1258525 0.1037560 0.0599182 0.0260950 0.0381932 0.0107169 0.0299677 0.0628832 0.0832987 0.0683611
0.1258525 0.1470985 0.1105860 0.0846116 0.0847282 0.0361222 0.0552973 0.0405830 0.0420691 0.0800701
0.1258525 0.1172763 0.1268378 0.1064488 0.0858939 0.0776651 0.1073986 0.1216092 0.1253857 0.0981961
0.1258525 0.1241394 0.1209362 0.1084674 0.0685234 0.1118333 0.1038998 0.0768468 0.0746047 0.1211600
0.1258525 0.1074173 0.0944208 0.0927184 0.0660844 0.0750965 0.0852318 0.1071964 0.1448808 0.1230383
0.1258525 0.1014975 0.1078121 0.1365603 0.1493017 0.1287205 0.0986217 0.0934711 0.0654204 0.0762470
0.1258525 0.0789835 0.0824596 0.0924145 0.0900669 0.0610919 0.0781442 0.0485311 0.0417399 0.0388345
## function to find ZCB price using Vasicek model
VasicekZCBprice <- 
function(r0, k, theta, r0_us, T){
  b.vas <- (1/k)*(1-exp(-T*k)) 
  a.vas <- (theta-r0_us^2/(2*k^2))*(T-b.vas)+(r0_us^2)/(4*k)*b.vas^2
  return(exp(-a.vas-b.vas*r0))
}
 
 
r0 <- seq(0.00, 0.20, 0.05)
n <- length(r0)
yield <- matrix(0, 10, n)
for(i in 1:n){
  for(T in 1:10){
    yield[T,i] <- -log(VasicekZCBprice(r0[i], k, theta, r0_us, T))/T
  }
}
 
maturity <- seq(1, 10, 1)
matplot(maturity, yield, type="l", col="black", lty=1, main="Yield Curve USA")
abline(h=theta, col="red", lty=2)

## function to find ZCB price using Vasicek model
VasicekZCBprice <- 
function(r0, k, theta, r0_col, T){
  b.vas <- (1/k)*(1-exp(-T*k)) 
  a.vas <- (theta-r0_col^2/(2*k^2))*(T-b.vas)+(r0_col^2)/(4*k)*b.vas^2
  return(exp(-a.vas-b.vas*r0))
}
 
 
r0 <- seq(0.00, 0.20, 0.05)
n <- length(r0)
yield <- matrix(0, 10, n)
for(i in 1:n){
  for(T in 1:10){
    yield[T,i] <- -log(VasicekZCBprice(r0[i], k, theta, r0_col, T))/T
  }
}
 
maturity <- seq(1, 10, 1)
matplot(maturity, yield, type="l", col="black", lty=1, main="Yield Curve COP")
abline(h=theta, col="red", lty=2)


Laboratorio 3 Práctica sobre opciones y árboles binomiales

Se planea invertir 10,000 USD, en tres acciones pertenecientes al mismo indice bursatil, por lo que se requiere crear un portafolio optimo de inversión, con un limite de fecha establecida en el 01/06/2023

Instalamos y llamamos las librerias necesarias

#install.packages("rlang") 
#install.packages("tidyquant")
#install.packages("plotly")
#install.packages("timetk")
#install.packages("htmltools")
#install.packages("roptions")
#install.packages("FinancialMath")
library(rlang)
library(tidyquant) # To download the data
library(plotly) # To create interactive charts
library(timetk) # To manipulate the data series
library(dplyr)
library(tidyr)
library(forcats)
library(quantmod)
library(ggplot2)
library(roptions)
library(FinancialMath)

Para la creación de la cartera, elegiremos las acciones de Landstar System, Inc. (LSTR), Ormat Technologies, Inc. (ORA), Smartsheet Inc. (SMAR), de las cuales descargaremos los datos de precio para el periodo de 5 años (01 de junio de 2018 al 01 de junio de 2023)

tick <- c('SMAR', 'LSTR', 'ORA')

price_data <- tq_get(tick,
                     from = '2018-06-01',
                     to = '2023-06-01',
                     get = 'stock.prices')

Calculamos los rendimientos diarios de estas acciones y visualizamos las primeras filas

log_ret_tidy <- price_data %>%
  group_by(symbol) %>%
  tq_transmute(select = adjusted,
               mutate_fun = periodReturn,
               period = 'daily',
               col_rename = 'ret',
               type = 'log')


log_ret_xts <- log_ret_tidy %>%
  spread(symbol, value = ret) %>%
  tk_xts()

head(log_ret_xts)
##                    LSTR           ORA         SMAR
## 2018-06-01  0.000000000  0.0000000000  0.000000000
## 2018-06-04 -0.029813818 -0.0066252886  0.010225442
## 2018-06-05 -0.004907335 -0.0048996334  0.086917167
## 2018-06-06  0.005352230  0.0017669491 -0.006932463
## 2018-06-07  0.005766298 -0.0043240650 -0.010489580
## 2018-06-08  0.010120928  0.0009843462 -0.028522473

Calculamos la media diaria de cada acción

mean_ret <- colMeans(log_ret_xts)
print(round(mean_ret, 5))
##    LSTR     ORA    SMAR 
## 0.00040 0.00042 0.00050

Calculamos la varianza historica de cada acción

Var_ret <- apply(log_ret_xts, 2, var)
print(round(Var_ret, 5))
##    LSTR     ORA    SMAR 
## 0.00034 0.00055 0.00144

Calculamos la desviación estandar de cada acción

Desviación <- apply(log_ret_xts, 2, sd)
print(round(Desviación, 5))
##    LSTR     ORA    SMAR 
## 0.01832 0.02346 0.03790

Calculamos la matriz de covarianza anualizada para todas las acciones

cov_mat <- cov(log_ret_xts) * 252

print(round(cov_mat,4))
##        LSTR    ORA   SMAR
## LSTR 0.0846 0.0395 0.0474
## ORA  0.0395 0.1386 0.0502
## SMAR 0.0474 0.0502 0.3619

Calculamos pesos aleatorios para comprobar los pasos de 1 sola cartera, con el fin de calcular la rentabilidad y el riesgo de la cartera

wts <- runif(n = length(tick))
wts <- wts/sum(wts)

print(wts)
## [1] 0.67827175 0.29600927 0.02571897
sum(wts)
## [1] 1

Calculamos los rendimientos anualizados

port_returns <- (sum(wts * mean_ret) + 1)^252 - 1

print(port_returns)
## [1] 0.1087726

Calculamos el riesgo de la cartera

port_risk <- sqrt(t(wts) %*% (cov_mat %*% wts))

print(port_risk)
##           [,1]
## [1,] 0.2637452

Para calcular el Ratio Sharpe, asumimos una tasa libre de riesgo 0%

sharpe_ratio <- port_returns/port_risk

print(sharpe_ratio)
##           [,1]
## [1,] 0.4124157

Ahora para realizar la optimización ejecutaremos 5000 carteras aleatorias, por lo que crearemos vectores vacios y matrices para almacenar los valores

num_port <- 5000

# Creamos la matrix

all_wts <- matrix(nrow = num_port,
                  ncol = length(tick))

# Creamos los vectores vacios para el retorno, la desviación estandar y el Ratio Sharpe del portafolio

port_returns <- vector('numeric', length = num_port)

port_risk <- vector('numeric', length = num_port)

sharpe_ratio <- vector('numeric', length = num_port)

Ejecutamos la simulación de las 5000 carteras

for (i in seq_along(port_returns)) {
  
  wts <- runif(length(tick))
  wts <- wts/sum(wts)
  
  all_wts[i,] <- wts
  
  port_ret <- sum(wts * mean_ret)
  port_ret <- ((port_ret + 1)^252) - 1
  
  port_returns[i] <- port_ret
  
  port_sd <- sqrt(t(wts) %*% (cov_mat  %*% wts))
  port_risk[i] <- port_sd
  
  sr <- port_ret/port_sd
  sharpe_ratio[i] <- sr
  
}

Creamos una tabla para almacenar todos los valores, donde tendremos las ponderaciones de cada accion, el riesgo, la rentabilidad y el Ratio Sharpe de cada acción.

portfolio_values <- tibble(Return = port_returns,
                  Risk = port_risk,
                  SharpeRatio = sharpe_ratio)


all_wts <- tk_tbl(all_wts)

colnames(all_wts) <- colnames(log_ret_xts)

# Combing all the values together
portfolio_values <- tk_tbl(cbind(all_wts, portfolio_values))

head(portfolio_values)
## # A tibble: 6 × 6
##     LSTR   ORA  SMAR Return  Risk SharpeRatio
##    <dbl> <dbl> <dbl>  <dbl> <dbl>       <dbl>
## 1 0.292  0.226 0.481  0.122 0.357       0.341
## 2 0.132  0.262 0.606  0.126 0.412       0.305
## 3 0.316  0.403 0.281  0.117 0.299       0.391
## 4 0.583  0.292 0.124  0.112 0.265       0.421
## 5 0.0577 0.486 0.456  0.123 0.368       0.334
## 6 0.258  0.404 0.338  0.119 0.316       0.376

Hallamos la cartera de minima varianza y la cartera con el Ratio Sharpe mas alto

min_var <- portfolio_values[which.min(portfolio_values$Risk),]

head(min_var)
## # A tibble: 1 × 6
##    LSTR   ORA   SMAR Return  Risk SharpeRatio
##   <dbl> <dbl>  <dbl>  <dbl> <dbl>       <dbl>
## 1 0.626 0.298 0.0764  0.110 0.263       0.420
max_sr <- portfolio_values[which.max(portfolio_values$SharpeRatio),]

head(max_sr)
## # A tibble: 1 × 6
##    LSTR   ORA  SMAR Return  Risk SharpeRatio
##   <dbl> <dbl> <dbl>  <dbl> <dbl>       <dbl>
## 1 0.575 0.311 0.114  0.111 0.264       0.421

Graficamos la cartera de varianza minima

p <- min_var %>%
  gather(LSTR:SMAR, key = Asset,
         value = Weights) %>%
  mutate(Asset = as.factor(Asset)) %>%
  ggplot(aes(x = fct_reorder(Asset,Weights), y = Weights, fill = Asset)) +
  geom_bar(stat = 'identity') +
  theme_minimal() +
  labs(x = 'Acciones', y = 'Dolares', title = "Cartera de minima varianza") +
  scale_y_continuous(labels = scales::percent) 

ggplotly(p)

Graficamos la cartera con el Ratio Sharpe mas alto

p <- max_sr %>%
  gather(LSTR:SMAR, key = Asset,
         value = Weights) %>%
  mutate(Asset = as.factor(Asset)) %>%
  ggplot(aes(x = fct_reorder(Asset,Weights), y = Weights, fill = Asset)) +
  geom_bar(stat = 'identity') +
  theme_minimal() +
  labs(x = 'Acciones', y = 'Dolares', title = "Cartera con Ratio Sharpe mas alto") +
  scale_y_continuous(labels = scales::percent) 

ggplotly(p)

Graficamos todas las carteras aleatorias y visualizar la frontera eficiente.

p <- portfolio_values %>%
  ggplot(aes(x = Risk, y = Return, color = SharpeRatio)) +
  geom_point() +
  theme_classic() +
  scale_y_continuous(labels = scales::percent) +
  scale_x_continuous(labels = scales::percent) +
  labs(x = 'Riesgo Anualizado',
       y = 'Retornos Anualizados',
       title = "Optimización del portafolio y cartera eficiente") +
  geom_point(aes(x = Risk,
                 y = Return), data = min_var, color = 'gray') +
  geom_point(aes(x = Risk,
                 y = Return), data = max_sr, color = 'red') +
  annotate('text', x = 0.25, y = 0.162, label = "Tangency Portfolio") +
  annotate('text', x = 0.27, y = 0.05, label = "Minimum variance portfolio") +
  annotate(geom = 'segment', x = 0.25, xend = 0.2627,  y = 0.13, 
           yend = 0.11, color = 'red', arrow = arrow(type = "open")) +
  annotate(geom = 'segment', x = 0.27, xend = 0.2644,  y = 0.105, 
           yend = 0.1116, color = 'gray', arrow = arrow(type = "open"))
  

ggplotly(p)

Con base a lo expuesto, el Sharpe Ratio óptimo de inversión se sitúa en 0.4214653. Esto se fundamenta en la desviación estándar histórica de las acciones, que asciende a 0.00034 para Landstar System, Inc. (LSTR), 0.00055 para Ormat Technologies, Inc. (ORA) y 0.00144 para Smartsheet Inc. (SMAR) Este análisis revela una dispersión mínima en los retornos de las acciones en torno a la media, la cual también es notablemente baja, registrando valores de 0.00040 para Landstar System, Inc. (LSTR), 0.00042 para Ormat Technologies, Inc. (ORA) y 0.00050 para Smartsheet Inc. (SMAR)

Tomando en cuenta el Sharpe Ratio óptimo de inversión mencionado anteriormente, se concluye que la distribución óptima de los 10,000 USD sería invertir 5,727.076 dólares en Landstar System, Inc. (LSTR), 3,083.227 en Ormat Technologies, Inc. (ORA) y 1,189.697 en Smartsheet Inc. (SMAR)

Creacion del modelo del arbol binomial para ORA

Opcion de compra riesgo 1

r<- 0.0462
sigma=0.3706
T=1
N= 4
delta_t=T/N
tree = matrix(0, nrow=N+1, ncol=N+1)
build_stock_tree <- function(S, sigma, delta_t, N) {
  tree = matrix(0, nrow=N+1, ncol=N+1)
  U = exp(sigma*sqrt(delta_t))
  D = exp(-sigma*sqrt(delta_t))
  for (i in 1:(N+1)) {
    for (j in 1:i) {
      tree[i, j] = S * U^(j-1) * D^((i-1)-(j-1))
    }  }
  return(tree)
}
riesgo1 <- build_stock_tree(S=37.87, sigma=0.3706, delta_t=1/4, N=4)
riesgo1
##          [,1]     [,2]     [,3]     [,4]     [,5]
## [1,] 37.87000  0.00000  0.00000  0.00000  0.00000
## [2,] 31.46448 45.57955  0.00000  0.00000  0.00000
## [3,] 26.14242 37.87000 54.85862  0.00000  0.00000
## [4,] 21.72056 31.46448 45.57955 66.02670  0.00000
## [5,] 18.04664 26.14242 37.87000 54.85862 79.46838
k <- 40
intrinsecValue <- riesgo1[5,] - k
intrinsecValue[intrinsecValue<0] <- 0
intrinsecValue
## [1]  0.00000  0.00000  0.00000 14.85862 39.46838
q_prob <- function(r, delta_t, sigma) {
  u = exp(sigma*sqrt(delta_t))
  d = exp(-sigma*sqrt(delta_t))
    return((exp(r*delta_t) - d)/(u-d))
}
value_binomial_option <- function(tree, sigma, delta_t, r, X, type) {
  q = q_prob(r, delta_t, sigma)
  option_tree = matrix(0, nrow=nrow(tree), ncol=ncol(tree))
  if(type == 'put') {
    option_tree[nrow(option_tree),] = pmax(X - tree[nrow(tree),], 0)
  } else {  option_tree[nrow(option_tree),] = pmax(tree[nrow(tree),] - X, 0)
  }
  for (i in (nrow(tree)-1):1) {
    for(j in 1:i) {
     option_tree[i,j]=((1-q)*option_tree[i+1,j] +        q*option_tree[i+1,j+1])/exp(r*delta_t)
    }
  }
  return(option_tree)
  
option_tree[i, j] = ((1-q)*option_tree[i+1,j] +q*option_tree[i+1,j+1])/exp(r*delta_t)  
}
binomial_option <- function(type, sigma, T, r, X, S, N) {
  q <- q_prob(r=r, delta_t=T/N, sigma=sigma)
  tree <- build_stock_tree(S=S, sigma=sigma, delta_t=T/N, N=N)
  option <- value_binomial_option(tree, sigma=sigma, delta_t=T/N, r=r, X=X, type=type)
  return(list(q=q, stock=tree, option=option, price=option[1,1]))
}
Arbol <- binomial_option(type="call", sigma, T, r, X=k, 37.87, 4)
Arbol
## $q
## [1] 0.4849748
## 
## $stock
##          [,1]     [,2]     [,3]     [,4]     [,5]
## [1,] 37.87000  0.00000  0.00000  0.00000  0.00000
## [2,] 31.46448 45.57955  0.00000  0.00000  0.00000
## [3,] 26.14242 37.87000 54.85862  0.00000  0.00000
## [4,] 21.72056 31.46448 45.57955 66.02670  0.00000
## [5,] 18.04664 26.14242 37.87000 54.85862 79.46838
## 
## $option
##          [,1]     [,2]      [,3]     [,4]     [,5]
## [1,] 5.418743 0.000000  0.000000  0.00000  0.00000
## [2,] 1.637146 9.564456  0.000000  0.00000  0.00000
## [3,] 0.000000 3.414951 16.324108  0.00000  0.00000
## [4,] 0.000000 0.000000  7.123303 26.48604  0.00000
## [5,] 0.000000 0.000000  0.000000 14.85862 39.46838
## 
## $price
## [1] 5.418743

1. K=40 Sigma= 37.06%

# Define an array with strike prices between 80 and 120

strikes <- seq(20, 60)

option_price_vary_function <- function(strike) { option = binomial_option(type='call', sigma=sigma, T=1, r=r, X=strike, S=k, N=4)
  return(option$price)
}

# Use the sapply command to pass each value of the strikes array into the option_price_vary_strike function:

values <- sapply(strikes, option_price_vary_function)

# Create a data frame with the Strikes prices and the option prices (values) from above

data <- as.data.frame(list(strikes=strikes, values=values)) 

head(data)
##   strikes   values
## 1      20 20.96602
## 2      21 20.07835
## 3      22 19.19068
## 4      23 18.30301
## 5      24 17.41534
## 6      25 16.52767
ggplot(data=data) + geom_line(aes(x=strikes, y=values)) + labs(title="Call Value", x="Strikes", y="Value") +   geom_vline(xintercept = 40, linetype="dotted",  color = "red", size=1.5)

2. k=25 sigma=5.6660

sigma=5.6660
k=25

strikes <- seq(5, 45)

option_price_vary_function <- function(strike) { option = binomial_option(type='call', sigma=sigma, T=1, r=r, X=strike, S=k, N=4)
  return(option$price)
}

# Use the sapply command to pass each value of the strikes array into the option_price_vary_strike function:

values <- sapply(strikes, option_price_vary_function)

# Create a data frame with the Strikes prices and the option prices (values) from above

data <- as.data.frame(list(strikes=strikes, values=values)) 

head(data)
##   strikes   values
## 1       5 24.90015
## 2       6 24.88336
## 3       7 24.86656
## 4       8 24.84976
## 5       9 24.83296
## 6      10 24.81617
ggplot(data=data) + geom_line(aes(x=strikes, y=values)) + labs(title="Call Value", x="Strikes", y="Value") +   geom_vline(xintercept = 25, linetype="dotted",  color = "red", size=1.5)

3. k=70 sigma=1.4854

sigma=1.4854
k=70

strikes <- seq(50, 90)

option_price_vary_function <- function(strike) { option = binomial_option(type='call', sigma=sigma, T=1, r=r, X=strike, S=k, N=4)
  return(option$price)
}

# Use the sapply command to pass each value of the strikes array into the option_price_vary_strike function:

values <- sapply(strikes, option_price_vary_function)

# Create a data frame with the Strikes prices and the option prices (values) from above

data <- as.data.frame(list(strikes=strikes, values=values)) 

head(data)
##   strikes   values
## 1      50 44.16553
## 2      51 43.78292
## 3      52 43.40031
## 4      53 43.01770
## 5      54 42.63510
## 6      55 42.25249
ggplot(data=data) + geom_line(aes(x=strikes, y=values)) + labs(title="Call Value", x="Strikes", y="Value") +   geom_vline(xintercept = 70, linetype="dotted",  color = "red", size=1.5)

4. k=40 sigma=0.3286

sigma=0.3286
k=40

strikes <- seq(20, 60)

option_price_vary_function <- function(strike) { option = binomial_option(type='put', sigma=sigma, T=1, r=r, X=strike, S=k, N=4)
  return(option$price)
}

# Use the sapply command to pass each value of the strikes array into the option_price_vary_strike function:

values <- sapply(strikes, option_price_vary_function)

# Create a data frame with the Strikes prices and the option prices (values) from above

data <- as.data.frame(list(strikes=strikes, values=values)) 

head(data)
##   strikes     values
## 1      20 0.00000000
## 2      21 0.01674599
## 3      22 0.07923613
## 4      23 0.14172626
## 5      24 0.20421639
## 6      25 0.26670653
ggplot(data=data) + geom_line(aes(x=strikes, y=values)) + labs(title="Put Value", x="Strikes", y="Value") +   geom_vline(xintercept = 40, linetype="dotted",  color = "red", size=1.5)

5. k=20 sigma=1.6738

sigma=1.6738
k=20

strikes <- seq(0, 40)

option_price_vary_function <- function(strike) { option = binomial_option(type='put', sigma=sigma, T=1, r=r, X=strike, S=k, N=4)
  return(option$price)
}

# Use the sapply command to pass each value of the strikes array into the option_price_vary_strike function:

values <- sapply(strikes, option_price_vary_function)

# Create a data frame with the Strikes prices and the option prices (values) from above

data <- as.data.frame(list(strikes=strikes, values=values)) 

head(data)
##   strikes     values
## 1       0 0.00000000
## 2       1 0.06480615
## 3       2 0.28328316
## 4       3 0.50176018
## 5       4 0.81739404
## 6       5 1.42552980
ggplot(data=data) + geom_line(aes(x=strikes, y=values)) + labs(title="put Value", x="Strikes", y="Value") +   geom_vline(xintercept = 20, linetype="dotted",  color = "red", size=1.5)

6. k=55 sigma=1.3604

sigma=1.3604
k=55

strikes <- seq(35, 75)

option_price_vary_function <- function(strike) { option = binomial_option(type='put', sigma=sigma, T=1, r=r, X=strike, S=k, N=4)
  return(option$price)
}

# Use the sapply command to pass each value of the strikes array into the option_price_vary_strike function:

values <- sapply(strikes, option_price_vary_function)

# Create a data frame with the Strikes prices and the option prices (values) from above

data <- as.data.frame(list(strikes=strikes, values=values)) 

head(data)
##   strikes   values
## 1      35 13.29068
## 2      36 13.83819
## 3      37 14.38570
## 4      38 14.93322
## 5      39 15.48073
## 6      40 16.02824
ggplot(data=data) + geom_line(aes(x=strikes, y=values)) + labs(title="put Value", x="Strikes", y="Value") +   geom_vline(xintercept = 55, linetype="dotted",  color = "red", size=1.5)

7. k=40 sigma=0.3152694

sigma=0.3152694
k=40

strikes <- seq(20, 60)

option_price_vary_function <- function(strike) { option = binomial_option(type='call', sigma=sigma, T=1, r=r, X=strike, S=k, N=4)
  return(option$price)
}

# Use the sapply command to pass each value of the strikes array into the option_price_vary_strike function:

values <- sapply(strikes, option_price_vary_function)

# Create a data frame with the Strikes prices and the option prices (values) from above

data <- as.data.frame(list(strikes=strikes, values=values)) 

head(data)
##   strikes   values
## 1      20 20.90298
## 2      21 19.94813
## 3      22 19.03642
## 4      23 18.14251
## 5      24 17.24860
## 6      25 16.35470
ggplot(data=data) + geom_line(aes(x=strikes, y=values)) + labs(title="Call Value", x="Strikes", y="Value") +   geom_vline(xintercept = 40, linetype="dotted",  color = "red", size=1.5)

8. k=40 sigma=0.3152694

sigma=0.3152694
k=40

strikes <- seq(20, 60)

option_price_vary_function <- function(strike) { option = binomial_option(type='put', sigma=sigma, T=1, r=r, X=strike, S=k, N=4)
  return(option$price)
}

# Use the sapply command to pass each value of the strikes array into the option_price_vary_strike function:

values <- sapply(strikes, option_price_vary_function)

# Create a data frame with the Strikes prices and the option prices (values) from above

data <- as.data.frame(list(strikes=strikes, values=values)) 

head(data)
##   strikes     values
## 1      20 0.00000000
## 2      21 0.00000000
## 3      22 0.04313678
## 4      23 0.10408137
## 5      24 0.16502595
## 6      25 0.22597054
ggplot(data=data) + geom_line(aes(x=strikes, y=values)) + labs(title="put Value", x="Strikes", y="Value") +   geom_vline(xintercept = 40, linetype="dotted",  color = "red", size=1.5)

9. k=40 sigma=0.03790

sigma=0.03790
k=40

strikes <- seq(20, 60)

option_price_vary_function <- function(strike) { option = binomial_option(type='call', sigma=sigma, T=1, r=r, X=strike, S=k, N=4)
  return(option$price)
}

# Use the sapply command to pass each value of the strikes array into the option_price_vary_strike function:

values <- sapply(strikes, option_price_vary_function)

# Create a data frame with the Strikes prices and the option prices (values) from above

data <- as.data.frame(list(strikes=strikes, values=values)) 

head(data)
##   strikes   values
## 1      20 20.90298
## 2      21 19.94813
## 3      22 18.99328
## 4      23 18.03843
## 5      24 17.08358
## 6      25 16.12873
ggplot(data=data) + geom_line(aes(x=strikes, y=values)) + labs(title="Call Value", x="Strikes", y="Value") +   geom_vline(xintercept = 40, linetype="dotted",  color = "red", size=1.5)

10. k=40 sigma=0.03790

sigma=0.03790
k=40

strikes <- seq(20, 60)

option_price_vary_function <- function(strike) { option = binomial_option(type='put', sigma=sigma, T=1, r=r, X=strike, S=k, N=4)
  return(option$price)
}

# Use the sapply command to pass each value of the strikes array into the option_price_vary_strike function:

values <- sapply(strikes, option_price_vary_function)

# Create a data frame with the Strikes prices and the option prices (values) from above

data <- as.data.frame(list(strikes=strikes, values=values)) 

head(data)
##   strikes values
## 1      20      0
## 2      21      0
## 3      22      0
## 4      23      0
## 5      24      0
## 6      25      0
ggplot(data=data) + geom_line(aes(x=strikes, y=values)) + labs(title="put Value", x="Strikes", y="Value") +   geom_vline(xintercept = 40, linetype="dotted",  color = "red", size=1.5)

Creación de las Coberturas

Para la creación de las coberturas descargaremos los datos de precio desde el 01 de junio de 2023, hasta la fecha, de las acciones de Landstar System, Inc. (LSTR), Ormat Technologies, Inc. (ORA), Smartsheet Inc. (SMAR)

tick <- c('SMAR', 'LSTR', 'ORA')

price_data <- tq_get(tick,
                     from = '2023-06-01',
                     to = '2024-04-19',
                     get = 'stock.prices')

Calculamos los rendimientos diarios de estas acciones y visualizamos las primeras filas

log_ret_tidy <- price_data %>%
  group_by(symbol) %>%
  tq_transmute(select = adjusted,
               mutate_fun = periodReturn,
               period = 'daily',
               col_rename = 'ret',
               type = 'log')


log_ret_xts <- log_ret_tidy %>%
  spread(symbol, value = ret) %>%
  tk_xts()

head(log_ret_xts)
##                    LSTR           ORA         SMAR
## 2023-06-01  0.000000000  0.0000000000  0.000000000
## 2023-06-02  0.019088162  0.0151207832 -0.009622374
## 2023-06-05 -0.030966280 -0.0001162746  0.013891956
## 2023-06-06  0.030966280  0.0085727936  0.046962545
## 2023-06-07  0.026743156  0.0090716778 -0.052863487
## 2023-06-08 -0.001011513  0.0025116955 -0.192000938

Definimos los rendimientos diarios de cada activo y los porcentajes de inversión

# Crear vector para almacenar el capital actual al final de cada trimestre

capital_inicial <- 10000
porcentajes_inversion <- c(0.5755869, 0.3078440, 0.1165691)
inversion_inicial <- porcentajes_inversion*capital_inicial
LSTR <- as.vector(log_ret_xts$LSTR)
ORA <- as.vector(log_ret_xts$ORA)
SMAR <- as.vector(log_ret_xts$SMAR)



valor_inversion1 <- c()
valor_inversion2 <- c()
valor_inversion3 <- c()
valor <- c()
inversion_inicial <- as.vector(inversion_inicial)



# Simulación
p_y_g <- data.frame(Trimestre = numeric(), Pyg = numeric())
for (i in 1:length(log_ret_xts$LSTR)) {
    
    valor_inversion1[i] <- inversion_inicial[1]*(1 + LSTR[i])
    valor_inversion2[i] <- inversion_inicial[2]*(1 + ORA[i])
    valor_inversion3[i] <- inversion_inicial[3]*(1 + SMAR[i])

 }

 trimestre1<- sum(valor_inversion1[63],valor_inversion2[63],valor_inversion3[63]) - sum(inversion_inicial)
     trimestre2<- sum(valor_inversion1[126],valor_inversion2[126],valor_inversion3[126]) - sum(inversion_inicial)
      trimestre3<- sum(valor_inversion1[189],valor_inversion2[189],valor_inversion3[189]) - sum(inversion_inicial)
       trimestre4<- sum(valor_inversion1[222],valor_inversion2[222],valor_inversion3[222]) - sum(inversion_inicial)
  
# Crear los vectores con los datos
trimestre <- c("trimestre1", "trimestre2", "trimestre3", "trimestre4")
PyG <- c(
  sum(valor_inversion1[63], valor_inversion2[63], valor_inversion3[63]) - capital_inicial,
  sum(valor_inversion1[126], valor_inversion2[126], valor_inversion3[126]) - capital_inicial,
  sum(valor_inversion1[189], valor_inversion2[189], valor_inversion3[189]) - capital_inicial,
  sum(valor_inversion1[222], valor_inversion2[222], valor_inversion3[222]) - capital_inicial
)

# Crear la tabla
tabla_trimestres <- data.frame(Trimestre = trimestre, PyG = PyG)

# Imprimir la tabla
print(tabla_trimestres)
##    Trimestre         PyG
## 1 trimestre1 -10.3786527
## 2 trimestre2 -15.2423049
## 3 trimestre3 -53.0263727
## 4 trimestre4  -0.7479121

Utilizamos la Funicion Bullspread

bullspread.call <- function(S,K1,K2,precio1,precio2){
  
  if(K1>=S) stop("K1 debe ser menor a S.")
  if(S>=K2) stop("K2 debe ser mayor a S.")
  
  #larga
  callP1 = precio1
  #corto
  callP2 = precio2
  
  stock=unique(round(seq(0,K1,length.out=6)))
  stock=c(stock,round(seq(K1,K2,length.out=4)))
  stock=c(stock,round(seq(K2,K2+K1,length.out=6)))
  stock=unique(stock)
  payoff=rep(0,length(stock))
  profit=rep(0,length(stock))
  
  
  for(i in 1:length(stock)){
    if(stock[i]<=K1) payoff[i]=0
    if(stock[i]>=K2) payoff[i]=K2-K1
    if(stock[i]<K2 & stock[i]>K1) payoff[i]=stock[i]-K1
    profit[i]=payoff[i]+(callP2-callP1)
  }
  
  data <- data.frame(stock,payoff,profit)
  return(data)
} 

Posición call Larga & Corta Para el Bull Spread Call

# Posición larga en call
long.callpayoff <- function(s,k,v,r,t){
  data.frame("payoff" = pmax(0,s-k), "stock" = s) %>% 
    mutate("profit" = payoff - v*exp(-r*t))
}

# Posición corta en call
short.callpayoff <- function(s,k,v,r,t){
  data.frame("payoff" = pmin(k-s,0),"stock" = s) %>% 
    mutate("profit" = payoff + v*exp(-r*t))}

Construcción de la Bull Spread Call

bull.spread <- bullspread.call(38.28,35,43.75,0.0462,0.25)
# Extraemos la St
s <- bull.spread$stock

# Call larga
long.call <- long.callpayoff(s,35,1,0,0)
# Call corta
short.call <- short.callpayoff(s,40,1,0,0)

Gráfico Bull Spread Call

g1 <- ggplot(bull.spread[4:10,]) + geom_line(aes(long.call$stock[4:10],long.call$profit[4:10],color = "blue"),linetype="dashed"
                                             ,size=1) 
g1 <- g1 + geom_line(aes(short.call$stock[4:10],short.call$profit[4:10], color = "red"),linetype="dashed",size=1) 
g1 <- g1 + geom_line(aes(bull.spread$stock[4:10],bull.spread$profit[4:10],color = "green"),size=1)
g1 <- g1 + ggtitle("Estrategia Bull Spreads") + xlab("stock") + ylab("Profit") + theme_bw()
g1 <- g1 + geom_hline(yintercept=0, linetype="dashed",color = "orange", size=1)
g1 <- g1 + scale_color_manual(name = " ",labels = c("Call larga", "Bull Spread", "Call corta"),values =                                      c("blue"="blue","green"="green","red" = "red"))
g1 <- g1 + theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank(),legend.position="bottom") 
g1 


Laboratorio 4 Práctica de BSM y Swaps

1.Estrategias de inversión con Black Scholes Merton

Necesitamos las siguientes librerias

#install.packages("timetk")
#install.packages("tidyquant")
library(rlang)
library(tidyquant)
library(timetk)
library(quantmod)
library(RQuantLib)
library(dplyr)
library(MASS)
library(knitr)
library(moments)
library(sde)
library(readxl)

Seleccionamos las acciones de Pfizer (PFE) y American Airlines Group Inc. (AAL). Con estas bases de datos que obtuvimos de yahoo finance realizaremos la simulacion

getSymbols(c("AAL", "PFE"), from = Sys.Date() - 1825, to = Sys.Date(), src = "yahoo")
## [1] "AAL" "PFE"
# Calcular los rendimientos diarios
rendimientos_AAL <- dailyReturn(AAL$AAL.Adjusted)
rendimientos_PFE <- dailyReturn(PFE$PFE.Adjusted)
# Calcular la volatilidad histórica (anualizada)
sigma_AAL <- sd(rendimientos_AAL) * sqrt(252)
sigma_PFE <- sd(rendimientos_PFE) * sqrt(252)
# Imprimir la volatilidad histórica
cat("Volatilidad Histórica Anualizada AAL:", sigma_AAL, "\n")
## Volatilidad Histórica Anualizada AAL: 0.6186286
cat("Volatilidad Histórica Anualizada PFE:", sigma_PFE, "\n")
## Volatilidad Histórica Anualizada PFE: 0.2714934

American Airlines Group Inc. (AAL)

# Función con parámetros iniciales

black_scholes_merton <- function(So, K, r, VencimientoDias, sigma, Stcall, Stput) {
  
  Ano <- 252
  
  #Definir los vencimientos a partir de un número de días establecido
  VencimientoDias = seq(from = VencimientoDias, by = 30, length.out = 3)
  
  #Definir un conjunto de Volatilidad a partir de un valor sigma inicial
  sigma = seq(from=sigma, by = sigma_AAL, length.out = 3)
  
  ## Cálculo del vencimiento
  T <- VencimientoDias / Ano
  
  
  
  #Definir d1 y d2
  d1 <- (log(So/K) + (r + ((sigma^2)/2)) * T) / (sigma * sqrt(T))
  d2 <- (log(So/K) + (r - ((sigma^2)/2)) * T) / (sigma * sqrt(T))
  
  
  # Definir N1 y N2 para la posición Call y Put
  Nd1 <- pnorm(d1)
  Nd2 <- pnorm(d2)
  Nd1P <- pnorm(-d1)
  Nd2P <- pnorm(-d2)
  
  #Valoración Call
  Call <- So * Nd1 - (K * exp(-r * T) * Nd2)
  
  #Valoración Put
  Put <- (K * exp(-r * T) * Nd2P) - So * Nd1P

  ##Crear vector de varios precios st a partir de un stc dado  
  St <- seq(from = Stcall, by = 0.5, length.out = 60)
  num_filas <- length(St)
  num_columnas <- length(sigma)
  
  ## Matriz resultados de la Valoración Call
  resultadosCall <- matrix(NA, nrow = num_filas, ncol = num_columnas)
  
  
  ## 
  for (i in 1:num_filas) {
    for (j in 1:num_columnas) {
      resultado <- (St[i] * pnorm((log(St[i]/K) + (r + ((sigma[j]^2)/2)) * T[j]) / (sigma[j] * sqrt(T[j]))) -
                      K * exp(-r * T[j]) * pnorm((log(St[i]/K) + (r - ((sigma[j]^2)/2)) * T[j]) / (sigma[j] * sqrt(T[j])))) /
        Call[j]
      resultadosCall[i, j] <- resultado
    }
  }
  
  #Definir el nombre de las columnas
  colnames(resultadosCall) <- paste("Vto a", VencimientoDias, "días")
  
  ##Crear vector de varios precios st a partir de un stp dado
  StP <- seq(from = Stput, by = 0.5, length.out = 60)
  
  #matriz de resultados de la valoración Put
  resultadosPut <- matrix(NA, nrow = num_filas, ncol = num_columnas)
  
  for (i in 1:num_filas) {
    for (j in 1:num_columnas) {
      resultado <- (K * exp(-r * T[j]) * pnorm(-(log(StP[i]/K) + (r - ((sigma[j]^2)/2)) * T[j]) / (sigma[j] * sqrt(T[j])))
                    - StP[i] * pnorm(-(log(StP[i]/K) + (r + ((sigma[j]^2)/2)) * T[j]) / (sigma[j] * sqrt(T[j])))) /
        Put[j]
      resultadosPut[i, j] <- resultado
    }
  }
  
  colnames(resultadosPut) <- paste("Vto a", VencimientoDias, "días")
  
  #incluir columna de los valores de St para la posición Call en la matriz de resultados
  CallTable <- cbind(St, resultadosCall)
  
  # definir la tabla como un dataframe para evitar error en el tipo de datos
  CallTable <- as.data.frame(CallTable)
  
  #Proceso similar al anterior realizado ahora para la posición Put
  PutTable <- cbind(StP, resultadosPut)
  PutTable <- as.data.frame(PutTable)
  
  # Graficar Call
  colores <- rainbow(num_columnas)
  matplot(1:num_filas, resultadosCall, type = "l", col = colores, lty = 1, xlab = "Índice", ylab = "Valor", main = "Gráfico de Líneas de Resultados Call")
  legend("topleft", legend = colnames(resultadosCall), col = colores, lty = 1, cex = 0.4)
  grid()
  png(filename = "CallPlot.png")
  dev.off()
  
  # Graficar Put
  colores <- rainbow(num_columnas)
  matplot(1:num_filas, resultadosPut, type = "l", col = colores, lty = 1, xlab = "Índice", ylab = "Valor", main = "Gráfico de Líneas de Resultados Put")
  legend("topright", legend = colnames(resultadosPut), col = colores, lty = 1, cex = 0.4)
  grid()
  png(filename = "PutPlot.png")
  dev.off()
  
  return(list(CallTable = CallTable, PutTable = PutTable))
}

# Obtener el último precio ajustado de cada acción
ultimo_ajustado_AAL <- tail(Ad(AAL), 1)

# Llamada a la función con valores específicos y gráficas
resultado <- black_scholes_merton(So = 13.44, K = 13, r = 0.0446, VencimientoDias = 30, sigma = sigma_AAL, Stcall = 1, Stput = 1)

print(resultado$CallTable)
##      St                                Vto a 30 días Vto a 60 días
## 1   1.0  0.00000000000000000000000000000000008827502 0.00000152218
## 2   1.5  0.00000000000000000000000019488050146713580 0.00003435707
## 3   2.0  0.00000000000000000009677794851576443068038 0.00024490935
## 4   2.5  0.00000000000000074686765485316258840475800 0.00097859773
## 5   3.0  0.00000000000050989240340437523872282876702 0.00277995819
## 6   3.5  0.00000000007335761573583578666959970071559 0.00632747859
## 7   4.0  0.00000000362741825438722341684930072780446 0.01234966963
## 8   4.5  0.00000008320416928161885349035653547389302 0.02155247051
## 9   5.0  0.00000107637560673508018212630316101652284 0.03456876242
## 10  5.5  0.00000897560071640100629476038962550887845 0.05192971917
## 11  6.0  0.00005304092700089676684985229293545216933 0.07405341155
## 12  6.5  0.00023808397177442304688300966919456413962 0.10124535714
## 13  7.0  0.00085512999810238073811197168083708675113 0.13370645427
## 14  7.5  0.00255775637144231527894677746814977581380 0.17154487547
## 15  8.0  0.00657293806094124202776818322035978781059 0.21478956213
## 16  8.5  0.01487605789328545063954223337532312143594 0.26340380981
## 17  9.0  0.03024828286906691351965115188704658066854 0.31729805185
## 18  9.5  0.05616314104137813678629953528798068873584 0.37634137204
## 19 10.0  0.09650470369116546931476108284186921082437 0.44037155420
## 20 10.5  0.15517460514186351416832110317045589908957 0.50920364716
## 21 11.0  0.23567568526816334850693124280951451510191 0.58263712358
## 22 11.5  0.34075839818086167687383181146287824958563 0.66046176219
## 23 12.0  0.47218953241535749354440554270695429295301 0.74246240539
## 24 12.5  0.63066583392182784528756656072800979018211 0.82842274652
## 25 13.0  0.81586150495285836292680414771893993020058 0.91812829443
## 26 13.5  1.02657637941888468802176248573232442140579 1.01136864944
## 27 14.0  1.26094275773485775538063080603023990988731 1.10793920980
## 28 14.5  1.51665098630009476110558352957013994455338 1.20764241196
## 29 15.0  1.79116259887055773170061456767143681645393 1.31028859290
## 30 15.5  2.08189100915884495179852820001542568206787 1.41569654895
## 31 16.0  2.38634030078770820182398892939090728759766 1.52369385361
## 32 16.5  2.70220092688789748081035213544964790344238 1.63411698578
## 33 17.0  3.02740658468229861810527836496476083993912 1.74681131100
## 34 17.5  3.36015939835961097159611199458595365285873 1.86163095049
## 35 18.0  3.69893141968623018200901242380496114492416 1.97843856605
## 36 18.5  4.04245001715588880841778518515639007091522 2.09710508380
## 37 19.0  4.38967356799840580094951292267069220542908 2.21750937477
## 38 19.5  4.73976244115243616761290468275547027587891 2.33953790712
## 39 20.0  5.09204885543740104481003072578459978103638 2.46308438126
## 40 20.5  5.44600797652506685153639409691095352172852 2.58804935699
## 41 21.0  5.80123164434043836479304445674642920494080 2.71433987958
## 42 21.5  6.15740540362492971837582445004954934120178 2.84186911000
## 43 22.0  6.51428901555660644362433231435716152191162 2.97055596340
## 44 22.5  6.87170031452705565300220769131556153297424 3.10032475865
## 45 23.0  7.22950209653796527220492862397804856300354 3.23110488111
## 46 23.5  7.58759164400582886145230077090673148632050 3.36283045983
## 47 24.0  7.94589247329422931898079696111381053924561 3.49544006023
## 48 24.5  8.30434791116042880787517788121476769447327 3.62887639258
## 49 25.0  8.66291614673590437689654208952561020851135 3.76308603637
## 50 25.5  9.02156645469757378918984613846987485885620 3.89801918057
## 51 26.0  9.38027633539555694142109132371842861175537 4.03362937928
## 52 26.5  9.73902936454351397799200640292838215827942 4.16987332248
## 53 27.0 10.09781358648275251255199691513553261756897 4.30671062119
## 54 27.5 10.45662032023696674798429739894345402717590 4.44410360659
## 55 28.0 10.81544327665703342233882722212001681327820 4.58201714226
## 56 28.5 11.17427790844644164280907716602087020874023 4.72041844896
## 57 29.0 11.53312093349493849814280110877007246017456 4.85927694134
## 58 29.5 11.89196998651681447256578394444659352302551 4.99856407565
## 59 30.0 12.25082336523978021602943044854328036308289 5.13825320811
## 60 30.5 12.60967984598632796178208081983029842376709 5.27831946301
##    Vto a 90 días
## 1    0.002203194
## 2    0.007484289
## 3    0.016694648
## 4    0.029999574
## 5    0.047334050
## 6    0.068525219
## 7    0.093353926
## 8    0.121586215
## 9    0.152989520
## 10   0.187340807
## 11   0.224430379
## 12   0.264063335
## 13   0.306059734
## 14   0.350254094
## 15   0.396494541
## 16   0.444641822
## 17   0.494568268
## 18   0.546156792
## 19   0.599299931
## 20   0.653898960
## 21   0.709863087
## 22   0.767108705
## 23   0.825558735
## 24   0.885142018
## 25   0.945792776
## 26   1.007450124
## 27   1.070057635
## 28   1.133562944
## 29   1.197917398
## 30   1.263075730
## 31   1.328995782
## 32   1.395638238
## 33   1.462966394
## 34   1.530945945
## 35   1.599544795
## 36   1.668732882
## 37   1.738482021
## 38   1.808765761
## 39   1.879559254
## 40   1.950839137
## 41   2.022583420
## 42   2.094771393
## 43   2.167383530
## 44   2.240401408
## 45   2.313807631
## 46   2.387585757
## 47   2.461720240
## 48   2.536196364
## 49   2.611000191
## 50   2.686118512
## 51   2.761538800
## 52   2.837249163
## 53   2.913238311
## 54   2.989495513
## 55   3.066010567
## 56   3.142773768
## 57   3.219775873
## 58   3.297008081
## 59   3.374462005
## 60   3.452129645
print(resultado$PutTable)
##     StP  Vto a 30 días Vto a 60 días Vto a 90 días
## 1   1.0 13.49002043913     4.1779178     2.2698256
## 2   1.5 12.92469311776     4.0018624     2.1796436
## 3   2.0 12.35936579640     3.8260208     2.0938784
## 4   2.5 11.79403847503     3.6508088     2.0127158
## 5   3.0 11.22871115366     3.4768815     1.9360827
## 6   3.5 10.66338383240     3.3050554     1.8637848
## 7   4.0 10.09805651663     3.1362072     1.7955758
## 8   4.5  9.53272932062     2.9711863     1.7311927
## 9   5.0  8.96740356382     2.8107542     1.6703740
## 10  5.5  8.40208868629     2.6555502     1.6128691
## 11  6.0  7.83683078205     2.5060773     1.5584422
## 12  6.5  7.27179496331     2.3627031     1.5068743
## 13  7.0  6.70743968893     2.2256695     1.4579631
## 14  7.5  6.14479455459     2.0951065     1.4115225
## 15  8.0  5.58579244255     1.9710490     1.3673819
## 16  8.5  5.03354521946     1.8534529     1.3253848
## 17  9.0  4.49243412252     1.7422102     1.2853875
## 18  9.5  3.96793108147     1.6371637     1.2472586
## 19 10.0  3.46615476437     1.5381179     1.2108771
## 20 10.5  2.99325150673     1.4448504     1.1761322
## 21 11.0  2.55473941389     1.3571198     1.1429218
## 22 11.5  2.15495134034     1.2746733     1.1111518
## 23 12.0  1.79667054925     1.1972518     1.0807357
## 24 12.5  1.48099464076     1.1245952     1.0515935
## 25 13.0  1.20741037809     1.0564452     1.0236511
## 26 13.5  0.97402711160     0.9925488     0.9968403
## 27 14.0  0.77790261061     0.9326597     0.9710975
## 28 14.5  0.61539842392     0.8765402     0.9463639
## 29 15.0  0.48251564649     0.8239620     0.9225848
## 30 15.5  0.37517956863     0.7747072     0.8997094
## 31 16.0  0.28945831506     0.7285681     0.8776901
## 32 16.5  0.22171360276     0.6853482     0.8564830
## 33 17.0  0.16869033679     0.6448612     0.8360465
## 34 17.5  0.12755628144     0.6069317     0.8163423
## 35 18.0  0.09590442426     0.5713943     0.7973343
## 36 18.5  0.07172995914     0.5380938     0.7789886
## 37 19.0  0.05339199346     0.5068844     0.7612735
## 38 19.5  0.03956783683     0.4776296     0.7441594
## 39 20.0  0.02920551798     0.4502012     0.7276183
## 40 20.5  0.02147825316     0.4244799     0.7116239
## 41 21.0  0.01574305828     0.4003535     0.6961515
## 42 21.5  0.01150456465     0.3777178     0.6811779
## 43 22.0  0.00838431844     0.3564750     0.6666811
## 44 22.5  0.00609534993     0.3365342     0.6526403
## 45 23.0  0.00442151846     0.3178103     0.6390361
## 46 23.5  0.00320101062     0.3002241     0.6258500
## 47 24.0  0.00231333996     0.2837017     0.6130644
## 48 24.5  0.00166922780     0.2681741     0.6006628
## 49 25.0  0.00120280850     0.2535770     0.5886296
## 50 25.5  0.00086567974     0.2398506     0.5769499
## 51 26.0  0.00062239731     0.2269389     0.5656097
## 52 26.5  0.00044708763     0.2147897     0.5545955
## 53 27.0  0.00032091668     0.2033546     0.5438947
## 54 27.5  0.00023020913     0.1925881     0.5334952
## 55 28.0  0.00016505751     0.1824481     0.5233855
## 56 28.5  0.00011829838     0.1728950     0.5135548
## 57 29.0  0.00008476134     0.1638920     0.5039926
## 58 29.5  0.00006072031     0.1554048     0.4946891
## 59 30.0  0.00004349366     0.1474014     0.4856348
## 60 30.5  0.00003115370     0.1398517     0.4768208

Pfizer (PFE)

# Función con parámetros iniciales

black_scholes_merton <- function(So, K, r, VencimientoDias, sigma, Stcall, Stput) {
  
  Ano <- 252
  
  #Definir los vencimientos a partir de un número de días establecido
  VencimientoDias = seq(from = VencimientoDias, by = 30, length.out = 3)
  
  #Definir un conjunto de Volatilidad a partir de un valor sigma inicial
  sigma = seq(from=sigma, by = sigma_PFE, length.out = 3)
  
  ## Cálculo del vencimiento
  T <- VencimientoDias / Ano
  
  
  #Definir d1 y d2
  d1 <- (log(So/K) + (r + ((sigma^2)/2)) * T) / (sigma * sqrt(T))
  d2 <- (log(So/K) + (r - ((sigma^2)/2)) * T) / (sigma * sqrt(T))
  
  
  # Definir N1 y N2 para la posición Call y Put
  Nd1 <- pnorm(d1)
  Nd2 <- pnorm(d2)
  Nd1P <- pnorm(-d1)
  Nd2P <- pnorm(-d2)
  
  #Valoración Call
  Call <- So * Nd1 - (K * exp(-r * T) * Nd2)
  
  #Valoración Put
  Put <- (K * exp(-r * T) * Nd2P) - So * Nd1P

  ##Crear vector de varios precios st a partir de un stc dado  
  St <- seq(from = Stcall, by = 0.5, length.out = 60)
  num_filas <- length(St)
  num_columnas <- length(sigma)
  
  ## Matriz resultados de la Valoración Call
  resultadosCall <- matrix(NA, nrow = num_filas, ncol = num_columnas)
  
  
  ## 
  for (i in 1:num_filas) {
    for (j in 1:num_columnas) {
      resultado <- (St[i] * pnorm((log(St[i]/K) + (r + ((sigma[j]^2)/2)) * T[j]) / (sigma[j] * sqrt(T[j]))) -
                      K * exp(-r * T[j]) * pnorm((log(St[i]/K) + (r - ((sigma[j]^2)/2)) * T[j]) / (sigma[j] * sqrt(T[j])))) /
        Call[j]
      resultadosCall[i, j] <- resultado
    }
  }
  
  #Definir el nombre de las columnas
  colnames(resultadosCall) <- paste("Vto a", VencimientoDias, "días")
  
  ##Crear vector de varios precios st a partir de un stp dado
  StP <- seq(from = Stput, by = 0.5, length.out = 60)
  
  #matriz de resultados de la valoración Put
  resultadosPut <- matrix(NA, nrow = num_filas, ncol = num_columnas)
  
  for (i in 1:num_filas) {
    for (j in 1:num_columnas) {
      resultado <- (K * exp(-r * T[j]) * pnorm(-(log(StP[i]/K) + (r - ((sigma[j]^2)/2)) * T[j]) / (sigma[j] * sqrt(T[j])))
                    - StP[i] * pnorm(-(log(StP[i]/K) + (r + ((sigma[j]^2)/2)) * T[j]) / (sigma[j] * sqrt(T[j])))) /
        Put[j]
      resultadosPut[i, j] <- resultado
    }
  }
  
  colnames(resultadosPut) <- paste("Vto a", VencimientoDias, "días")
  
  #incluir columna de los valores de St para la posición Call en la matriz de resultados
  CallTable <- cbind(St, resultadosCall)
  
  # definir la tabla como un dataframe para evitar error en el tipo de datos
  CallTable <- as.data.frame(CallTable)
  
  #Proceso similar al anterior realizado ahora para la posición Put
  PutTable <- cbind(StP, resultadosPut)
  PutTable <- as.data.frame(PutTable)
  
  # Graficar Call
  colores <- rainbow(num_columnas)
  matplot(1:num_filas, resultadosCall, type = "l", col = colores, lty = 1, xlab = "Índice", ylab = "Valor", main = "Gráfico de Líneas de Resultados Call")
  legend("topleft", legend = colnames(resultadosCall), col = colores, lty = 1, cex = 0.4)
  grid()
  png(filename = "CallPlot.png")
  dev.off()
  
  # Graficar Put
  colores <- rainbow(num_columnas)
  matplot(1:num_filas, resultadosPut, type = "l", col = colores, lty = 1, xlab = "Índice", ylab = "Valor", main = "Gráfico de Líneas de Resultados Put")
  legend("topright", legend = colnames(resultadosPut), col = colores, lty = 1, cex = 0.4)
  grid()
  png(filename = "PutPlot.png")
  dev.off()
  
  return(list(CallTable = CallTable, PutTable = PutTable))
}

# Llamada a la función con valores específicos y gráficas
resultado <- black_scholes_merton(So = 28.3, K = 28, r = 0.0446, VencimientoDias = 30, sigma = sigma_PFE, Stcall = 13, Stput = 13)

print(resultado$CallTable)
##      St              Vto a 30 días Vto a 60 días Vto a 90 días
## 1  13.0  0.00000000000000003429656  0.0009653013    0.04158251
## 2  13.5  0.00000000000000094113214  0.0015839770    0.05059900
## 3  14.0  0.00000000000001972364887  0.0025106909    0.06086521
## 4  14.5  0.00000000000032350533632  0.0038562027    0.07244810
## 5  15.0  0.00000000000424354556093  0.0057551283    0.08540836
## 6  15.5  0.00000000004538124939637  0.0083666204    0.09980024
## 7  16.0  0.00000000040250284304689  0.0118740823    0.11567136
## 8  16.5  0.00000000300657204686785  0.0164838740    0.13306278
## 9  17.0  0.00000001917667464165211  0.0224230403    0.15200907
## 10 17.5  0.00000010574839041914474  0.0299361488    0.17253844
## 11 18.0  0.00000050986815060505709  0.0392813814    0.19467300
## 12 18.5  0.00000217149616268171301  0.0507260576    0.21842901
## 13 19.0  0.00000824543798860459605  0.0645417905    0.24381718
## 14 19.5  0.00002815193700882047102  0.0809994825    0.27084304
## 15 20.0  0.00008710033307374678174  0.1003643627    0.29950724
## 16 20.5  0.00024595264558212494169  0.1228912467    0.32980592
## 17 21.0  0.00063806284059441178980  0.1488201761    0.36173110
## 18 21.5  0.00153002943088202669752  0.1783725626    0.39527100
## 19 22.0  0.00341045472234106005968  0.2117479270    0.43041043
## 20 22.5  0.00710364530952895673055  0.2491212904    0.46713110
## 21 23.0  0.01389420912677228822640  0.2906412443    0.50541196
## 22 23.5  0.02563656984595266349891  0.3364286939    0.54522955
## 23 24.0  0.04481529962953297030470  0.3865762504    0.58655824
## 24 24.5  0.07452273086068102181390  0.4411482233    0.62937055
## 25 25.0  0.11833206857278638635123  0.5001811546    0.67363742
## 26 25.5  0.18006560232522594855453  0.5636848223    0.71932845
## 27 26.0  0.26348292821172630828741  0.6316436388    0.76641212
## 28 26.5  0.37193553519900901527251  0.7040183665    0.81485601
## 29 27.0  0.50804479991631967816801  0.7807480749    0.86462700
## 30 27.5  0.67345705823884227658738  0.8617522673    0.91569145
## 31 28.0  0.86871332051194150025708  0.9469331096    0.96801535
## 32 28.5  1.09324753332368507230399  1.0361777041    1.02156449
## 33 29.0  1.34550289279181067847446  1.1293603543    1.07630456
## 34 29.5  1.62313665185406863500361  1.2263447787    1.13220131
## 35 30.0  1.92327372632819937336990  1.3269862361    1.18922063
## 36 30.5  2.24276875610641379665822  1.4311335363    1.24732865
## 37 31.0  2.57844319604841087922864  1.5386309122    1.30649185
## 38 31.5  2.92727523758171859213917  1.6493197416    1.36667707
## 39 32.0  3.28653252008822116536635  1.7630401070    1.42785167
## 40 32.5  3.65384806995661604034353  1.8796321907    1.48998349
## 41 33.0  4.02724725337798794555511  1.9989375050    1.55304096
## 42 33.5  4.40513741237152522955967  2.1207999596    1.61699312
## 43 34.0  4.78627274480078757079582  2.2450667744    1.68180966
## 44 34.5  5.16970577365296257710270  2.3715892440    1.74746094
## 45 35.0  5.55473438460174318009877  2.5002233638    1.81391802
## 46 35.5  5.94085069657252251573709  2.6308303299    1.88115266
## 47 36.0  6.32769551796254781095286  2.7632769211    1.94913737
## 48 36.5  6.71502012585178409409536  2.8974357781    2.01784537
## 49 37.0  7.10265567751096948967415  3.0331855877    2.08725064
## 50 37.5  7.49048968021023409136205  3.1704111860    2.15732790
## 51 38.0  7.87844849689628201616642  3.3090035895    2.22805260
## 52 38.5  8.26648472358936103887572  3.4488599652    2.29940094
## 53 39.0  8.65456832279260090956541  3.5898835483    2.37134985
## 54 39.5  9.04268054460862025223378  3.7319835168    2.44387698
## 55 40.0  9.43080985049493669691856  3.8750748310    2.51696071
## 56 40.5  9.81894923512535733323148  4.0190780440    2.59058012
## 57 41.0 10.20709449975333704685454  4.1639190908    2.66471498
## 58 41.5 10.59524315841138530913668  4.3095290609    2.73934573
## 59 42.0 10.98339375627695169157505  4.4558439600    2.81445350
## 60 42.5 11.37154545136781358394273  4.6028044636    2.89002007
print(resultado$PutTable)
##     StP   Vto a 30 días Vto a 60 días Vto a 90 días
## 1  13.0 17.683176237275    5.52335701     2.9552723
## 2  13.5 17.087852344379    5.33633916     2.8657627
## 3  14.0 16.492528451482    5.14969826     2.7776881
## 4  14.5 15.897204558586    4.96356987     2.6911254
## 5  15.0 15.301880665695    4.77811871     2.6061444
## 6  15.5 14.706556772862    4.59353954     2.5228072
## 7  16.0 14.111232880513    4.41005680     2.4411687
## 8  16.5 13.515908991610    4.22792303     2.3612759
## 9  17.0 12.920585123514    4.04741606     2.2831685
## 10 17.5 12.325261363396    3.86883519     2.2068790
## 11 18.0 11.729938090312    3.69249636     2.1324327
## 12 18.5 11.134616745912    3.51872669     2.0598483
## 13 19.0 10.539302168832    3.34785857     1.9891381
## 14 19.5  9.944008807227    3.18022352     1.9203084
## 15 20.0  9.348775325542    3.01614611     1.8533601
## 16 20.5  8.753695069978    2.85593816     1.7882885
## 17 21.0  8.158972570167    2.69989342     1.7250847
## 18 21.5  7.565016717546    2.54828284     1.6637351
## 19 22.0  6.972576898518    2.40135058     1.6042221
## 20 22.5  6.382917380864    2.25931083     1.5465249
## 21 23.0  5.798008412585    2.12234541     1.4906193
## 22 23.5  5.220694187960    1.99060229     1.4364782
## 23 24.0  4.654785381989    1.86419480     1.3840723
## 24 24.5  4.105024812726    1.74320163     1.3333701
## 25 25.0  3.576892829383    1.62766750     1.2843381
## 26 25.5  3.076251810799    1.51760438     1.2369415
## 27 26.0  2.608867980658    1.41299320     1.1911440
## 28 26.5  2.179881634507    1.31378593     1.1469085
## 29 27.0  1.793313269128    1.21990802     1.1041968
## 30 27.5  1.451687927287    1.13126096     1.0629704
## 31 28.0  1.155835375424    1.04772502     1.0231903
## 32 28.5  0.904887437674    0.96916204     0.9848170
## 33 29.0  0.696456389613    0.89541821     0.9478113
## 34 29.5  0.526949078344    0.82632676     0.9121338
## 35 30.0  0.391955886959    0.76171056     0.8777453
## 36 30.5  0.286652666933    0.70138458     0.8446070
## 37 31.0  0.206164372700    0.64515822     0.8126803
## 38 31.5  0.145856351035    0.59283737     0.7819272
## 39 32.0  0.101537885138    0.54422632     0.7523102
## 40 32.5  0.069578665011    0.49912950     0.7237924
## 41 33.0  0.046950125893    0.45735296     0.6963375
## 42 33.5  0.031209552680    0.41870569     0.6699099
## 43 34.0  0.020446215174    0.38300072     0.6444749
## 44 34.5  0.013206934828    0.35005609     0.6199985
## 45 35.0  0.008414854406    0.31969556     0.5964473
## 46 35.5  0.005291018986    0.29174928     0.5737890
## 47 36.0  0.003284523877    0.26605421     0.5519919
## 48 36.5  0.002013894059    0.24245451     0.5310255
## 49 37.0  0.001220169548    0.22080172     0.5108597
## 50 37.5  0.000730816321    0.20095491     0.4914655
## 51 38.0  0.000432894659    0.18278071     0.4728148
## 52 38.5  0.000253699426    0.16615328     0.4548802
## 53 39.0  0.000147161064    0.15095420     0.4376352
## 54 39.5  0.000084522202    0.13707234     0.4210542
## 55 40.0  0.000048085775    0.12440363     0.4051124
## 56 40.5  0.000027107469    0.11285084     0.3897856
## 57 41.0  0.000015147520    0.10232334     0.3750508
## 58 41.5  0.000008393113    0.09273680     0.3608853
## 59 42.0  0.000004612937    0.08401290     0.3472676
## 60 42.5  0.000002515614    0.07607906     0.3341768

Valore los precios de las opciones mediante el modelo de Black, Scholes y Merton. Calcule y analice las griegas

BScall <- function(t=0,T,S,K,r,q=0,sigma,isPut=0) {
# t and T are measured in years; all parameters are annualized
# q is the continuous dividend yield
d1 <- (log(S/K)+(r-q+sigma^2/2)*(T-t))/(sigma*sqrt(T-t))
d2 <- d1-sigma*sqrt(T-t)
binary <- pnorm(-d2)*exp(-r*T)

# Call Delta at t
Delta <- exp(-q*(T-t))*pnorm(d1)
Gamma <- exp(-q*(T-t))*exp(-d1^2/2)/sqrt(2*pi)/S/sigma/sqrt(T-t)
Vega <- S*exp(-q*(T-t))/sqrt(2*pi)*exp(-d1^2/2)*sqrt(T-t)
Theta <- -S*exp(-q*(T-t))*sigma/sqrt(T-t)/2*dnorm(d1) - r*K*exp(-r*(T-t))*pnorm(d2) + 
    q*S*exp(-q*(T-t))*pnorm(d1)
Rho <- (T-t)*K*exp(-r*(T-t))*pnorm(d2)


# Black-Scholes formula for Calls
BSprice <- -K*exp(-r*(T-t))*pnorm(d2)+S*Delta

if (isPut==1) {
    Delta <- -exp(-q*(T-t))*pnorm(-d1)
    BSprice <- S*Delta+K*exp(-r*(T-t))*pnorm(-d2)
    Theta <- -S*exp(-q*(T-t))*sigma/sqrt(T-t)/2*dnorm(d1) + r*K*exp(-r*(T-t))*pnorm(-d2) - 
    q*S*exp(-q*(T-t))*pnorm(-d1)
    Rho <- -(T-t)*K*exp(-r*(T-t))*pnorm(-d2)
}
Bank <- BSprice-Delta*S

return (list(Delta=Delta,Gamma=Gamma,Theta=Theta,Vega=Vega,Rho=Rho,Price=BSprice,d1=d1,d2=d2,B=Bank))
}

Griegas American Airlines Group Inc. (AAL)

Call

# con Precio strike (K) = 15

Call1AAL= BScall(t=0,T=3/12,S=tail(AAL$AAL.Adjusted,1),K=15,r=0.0446,q=0,sigma=sigma_AAL,isPut=0)

# con Precio strike (K) = 12

Call2AAL= BScall(t=0,T=3/12,S=tail(AAL$AAL.Adjusted,1),K=12,r=0.0446,q=0,sigma=sigma_AAL,isPut=0)

# con Precio strike (K) = 10
Call3AAl= BScall(t=0,T=3/12,S=tail(AAL$AAL.Adjusted,1),K=10,r=0.0446,q=0,sigma=sigma_AAL,isPut=0)

resultados <- data.frame(
  Metric = names(Call1AAL),
  Call1 = as.numeric(Call1AAL),
  Call2 = as.numeric(Call2AAL),
  Call3 = as.numeric(Call3AAl)
)

colnames(resultados) <- c("Griegas Call AAL", "Strike_15", "Strike_12", "Strike_10")

# Mostrar la tabla
resultados
##   Griegas Call AAL   Strike_15   Strike_12   Strike_10
## 1            Delta  0.25197029  0.52117835  0.73974162
## 2            Gamma  0.08970738  0.11199527  0.09123444
## 3            Theta -2.37873311 -3.04528914 -2.58688476
## 4             Vega  1.83482163  2.29068505  1.86605520
## 5              Rho  0.60867022  1.18342203  1.55882546
## 6            Price  0.46297747  1.25986290  2.27172681
## 7               d1 -0.66830240  0.05311121  0.64254904
## 8               d2 -0.97761671 -0.25620310  0.33323473
## 9                B -2.43468088 -4.73368811 -6.23530184

Put

# con Precio strike (K) = 15

Put1AAL= BScall(t=0,T=3/12,S=tail(AAL$AAL.Adjusted,1),K=15,r=0.0446,q=0,sigma=sigma_AAL,isPut=1)

# con Precio strike (K) = 12

Put2AAL= BScall(t=0,T=3/12,S=tail(AAL$AAL.Adjusted,1),K=12,r=0.0446,q=0,sigma=sigma_AAL,isPut=1)

# con Precio strike (K) = 10

Put3AAl= BScall(t=0,T=3/12,S=tail(AAL$AAL.Adjusted,1),K=10,r=0.0446,q=0,sigma=sigma_AAL,isPut=1)

resultados <- data.frame(
  Metric = names(Put1AAL),
  Call1 = as.numeric(Put1AAL),
  Call2 = as.numeric(Put2AAL),
  Call3 = as.numeric(Put3AAl)
)

colnames(resultados) <- c("Griegas Put AAL", "Strike_15", "Strike_12", "Strike_10")

# Mostrar la tabla
resultados
##   Griegas Put AAL   Strike_15   Strike_12   Strike_10
## 1           Delta -0.74802971 -0.47882165 -0.26025838
## 2           Gamma  0.08970738  0.11199527  0.09123444
## 3           Theta -1.71715103 -2.51602348 -2.14583004
## 4            Vega  1.83482163  2.29068505  1.86605520
## 5             Rho -3.09974952 -1.78331376 -0.91345437
## 6           Price  3.79665643  1.62680607  0.66084612
## 7              d1 -0.66830240  0.05311121  0.64254904
## 8              d2 -0.97761671 -0.25620310  0.33323473
## 9               B 12.39899808  7.13325506  3.65381747

Pfizer (PFE)

Call

# con Precio strike (K) = 30

Call1PFE= BScall(t=0,T=3/12,S=tail(PFE$PFE.Adjusted,1),K=30,r=0.0446,q=0,sigma=sigma_PFE,isPut=0)

# con Precio strike (K) = 27

Call2PFE= BScall(t=0,T=3/12,S=tail(PFE$PFE.Adjusted,1),K=27,r=0.0446,q=0,sigma=sigma_PFE,isPut=0)

# con Precio strike (K) = 25

Call3PFE= BScall(t=0,T=3/12,S=tail(PFE$PFE.Adjusted,1),K=25,r=0.0446,q=0,sigma=sigma_PFE,isPut=0)

resultados <- data.frame(
  Metric = names(Call1PFE),
  Call1 = as.numeric(Call1PFE),
  Call2 = as.numeric(Call2PFE),
  Call3 = as.numeric(Call3PFE)
)

colnames(resultados) <- c("Griegas Call PFE", "Strike_30", "Strike_27", "Strike_25")

# Mostrar la tabla
resultados
##   Griegas Call PFE   Strike_30    Strike_27    Strike_25
## 1            Delta   0.4259841   0.72225298   0.87626031
## 2            Gamma   0.1007727   0.08618497   0.05253819
## 3            Theta  -3.5449145  -3.41282928  -2.52361128
## 4             Vega   5.6181672   4.80488719   2.92905013
## 5              Rho   2.7708727   4.50582277   5.23080499
## 6            Price   1.1252138   2.67647915   4.19040030
## 7               d1  -0.1866077   0.58954752   1.15649342
## 8               d2  -0.3223544   0.45380081   1.02074672
## 9                B -11.0834909 -18.02329106 -20.92321994

Put

# con Precio strike (K) = 30

Put1PFE= BScall(t=0,T=3/12,S=tail(PFE$PFE.Adjusted,1),K=30,r=0.0446,q=0,sigma=sigma_PFE,isPut=1)

# con Precio strike (K) = 27

Put2PFE= BScall(t=0,T=3/12,S=tail(PFE$PFE.Adjusted,1),K=27,r=0.0446,q=0,sigma=sigma_PFE,isPut=1)

# con Precio strike (K) = 25

Put3PFE= BScall(t=0,T=3/12,S=tail(PFE$PFE.Adjusted,1),K=25,r=0.0446,q=0,sigma=sigma_PFE,isPut=1)

resultados <- data.frame(
  Metric = names(Put1PFE),
  Call1 = as.numeric(Put1PFE),
  Call2 = as.numeric(Put2PFE),
  Call3 = as.numeric(Put3PFE)
)

colnames(resultados) <- c("Griegas Put PFE", "Strike_30", "Strike_27", "Strike_25")

# Mostrar la tabla
resultados
##   Griegas Put PFE  Strike_30   Strike_27   Strike_25
## 1           Delta -0.5740159 -0.27774702 -0.12373969
## 2           Gamma  0.1007727  0.08618497  0.05253819
## 3           Theta -2.2217504 -2.22198153 -1.42097447
## 4            Vega  5.6181672  4.80488719  2.92905013
## 5             Rho -4.6459668 -2.16933277 -0.94989458
## 6           Price  2.1325719  0.71710144  0.25319872
## 7              d1 -0.1866077  0.58954752  1.15649342
## 8              d2 -0.3223544  0.45380081  1.02074672
## 9               B 18.5838670  8.67733107  3.79957833

Valore los precios de las opciones mediante el modelo de Black, Scholes y Merton, pero modificando la tasa de variación implícita. Calcule y analice las griegas

American Airlines Group Inc. (AAL)

Call

# con Precio strike (K) = 15 y sigma= sigma_AAL+0.05

Call1Sigma1= BScall(t=0,T=3/12,S=tail(AAL$AAL.Adjusted,1),K=15,r=0.0446,q=0,sigma=sigma_AAL+0.05,isPut=0)

# con Precio strike (K) = 12 y sigma= sigma_AAL-0.05

Call2Sigma2= BScall(t=0,T=3/12,S=tail(AAL$AAL.Adjusted,1),K=12,r=0.0446,q=0,sigma=sigma_AAL-0.05,isPut=0)

# con Precio strike (K) = 10 y sigma= sigma_AAL-0.1

Call3Sigma3= BScall(t=0,T=3/12,S=tail(AAL$AAL.Adjusted,1),K=10,r=0.0446,q=0,sigma=sigma_AAL-0.1,isPut=0)

resultados <- data.frame(
  Metric = names(Call1Sigma1),
  Call1 = as.numeric(Call1Sigma1),
  Call2 = as.numeric(Call2Sigma2),
  Call3 = as.numeric(Call3Sigma3)
)

colnames(resultados) <- c("Griegas Call AAL", "Strike_15_Sigma+0.05", "Strike_12_Sigma-0.05", "Strike_10_Sigma-0.1")

# Mostrar la tabla
resultados
##   Griegas Call AAL Strike_15_Sigma+0.05 Strike_12_Sigma-0.05
## 1            Delta           0.27616860           0.51263725
## 2            Gamma           0.08697059           0.12195386
## 3            Theta          -2.68784045          -2.81931848
## 4             Vega           1.92261825           2.29276713
## 5              Rho           0.65473808           1.18751388
## 6            Price           0.55698654           1.14527283
## 7               d1          -0.59426154           0.03168219
## 8               d2          -0.92857585          -0.25263212
## 9                B          -2.61895234          -4.75005554
##   Strike_10_Sigma-0.1
## 1           0.7616507
## 2           0.1038535
## 3          -2.1446201
## 4           1.7807917
## 5           1.6674947
## 6           2.0890045
## 7           0.7116225
## 8           0.4523082
## 9          -6.6699787

Put

# con Precio strike (K) = 15 y sigma= sigma_AAL+0.05

Put1Sigma1= BScall(t=0,T=3/12,S=tail(AAL$AAL.Adjusted,1),K=15,r=0.0446,q=0,sigma=sigma_AAL+0.05,isPut=1)

# con Precio strike (K) = 12 y sigma= sigma_AAL-0.05

Put2Sigma2= BScall(t=0,T=3/12,S=tail(AAL$AAL.Adjusted,1),K=12,r=0.0446,q=0,sigma=sigma_AAL-0.05,isPut=1)

# con Precio strike (K) = 10 y sigma= sigma_AAL-0.1

Put3Sigma3= BScall(t=0,T=3/12,S=tail(AAL$AAL.Adjusted,1),K=10,r=0.0446,q=0,sigma=sigma_AAL-0.1,isPut=1)

resultados <- data.frame(
  Metric = names(Put1Sigma1),
  Call1 = as.numeric(Put1Sigma1),
  Call2 = as.numeric(Put2Sigma2),
  Call3 = as.numeric(Put3Sigma3)
)

colnames(resultados) <- c("Griegas Put AAL", "Strike_15_Sigma+0.05", "Strike_12_Sigma-0.05", "Strike_10_Sigma-0.1")

# Mostrar la tabla
resultados
##   Griegas Put AAL Strike_15_Sigma+0.05 Strike_12_Sigma-0.05 Strike_10_Sigma-0.1
## 1           Delta          -0.72383140          -0.48736275          -0.2383493
## 2           Gamma           0.08697059           0.12195386           0.1038535
## 3           Theta          -2.02625836          -2.29005282          -1.7035654
## 4            Vega           1.92261825           2.29276713           1.7807917
## 5             Rho          -3.05368166          -1.77922191          -0.8047851
## 6           Price           3.89066550           1.51221600           0.4781238
## 7              d1          -0.59426154           0.03168219           0.7116225
## 8              d2          -0.92857585          -0.25263212           0.4523082
## 9               B          12.21472663           7.11688763           3.2191406

Pfizer (PFE)

Call

# con Precio strike (K) = 30 y sigma= sigma_PFE+0.3

Call1Sigma1PFE= BScall(t=0,T=3/12,S=tail(PFE$PFE.Adjusted,1),K=30,r=0.0446,q=0,sigma=sigma_PFE+0.3,isPut=0)

# con Precio strike (K) = 27 y sigma= sigma_PFE+0.1

Call2Sigma2PFE= BScall(t=0,T=3/12,S=tail(PFE$PFE.Adjusted,1),K=27,r=0.0446,q=0,sigma=sigma_PFE+0.1,isPut=0)

# con Precio strike (K) = 25 y sigma= sigma_PFE-0.1

Call3Sigma3PFE= BScall(t=0,T=3/12,S=tail(PFE$PFE.Adjusted,1),K=25,r=0.0446,q=0,sigma=sigma_PFE-0.1,isPut=0)

resultados <- data.frame(
  Metric = names(Call1Sigma1PFE),
  Call1 = as.numeric(Call1Sigma1PFE),
  Call2 = as.numeric(Call2Sigma2PFE),
  Call3 = as.numeric(Call3Sigma3PFE)
)

colnames(resultados) <- c("Griegas Call PFE", "Strike_30_Sigma+0.3", "Strike_27_Sigma+0.1", "Strike_25_Sigma-0.1")

# Mostrar la tabla
resultados
##   Griegas Call PFE Strike_30_Sigma+0.3 Strike_27_Sigma+0.1 Strike_25_Sigma-0.1
## 1            Delta          0.50876792          0.68229329          0.96132570
## 2            Gamma          0.04870211          0.06697304          0.03411702
## 3            Theta         -7.05664412         -4.52653558         -1.46353159
## 4             Vega          5.71546209          5.10908946          1.20146450
## 5              Rho          2.93691808          4.09500761          5.89375046
## 6            Price          2.83361633          3.17449528          3.97659250
## 7               d1          0.02197970          0.47412130          1.76628167
## 8               d2         -0.26376701          0.28837459          1.68053496
## 9                B        -11.74767232        -16.38003044        -23.57500185

Put

# con Precio strike (K) = 30 y sigma= sigma_PFE+0.3

Put1Sigma1PFE= BScall(t=0,T=3/12,S=tail(PFE$PFE.Adjusted,1),K=30,r=0.0446,q=0,sigma=sigma_PFE+0.3,isPut=1)

# con Precio strike (K) = 27 y sigma= sigma_PFE+0.1

Put2Sigma2PFE= BScall(t=0,T=3/12,S=tail(PFE$PFE.Adjusted,1),K=27,r=0.0446,q=0,sigma=sigma_PFE+0.1,isPut=1)

# con Precio strike (K) = 25 y sigma= sigma_PFE-0.1

Put3Sigma3PFE= BScall(t=0,T=3/12,S=tail(PFE$PFE.Adjusted,1),K=25,r=0.0446,q=0,sigma=sigma_PFE-0.1,isPut=1)

resultados <- data.frame(
  Metric = names(Put1Sigma1PFE),
  Call1 = as.numeric(Put1Sigma1PFE),
  Call2 = as.numeric(Put2Sigma2PFE),
  Call3 = as.numeric(Put3Sigma3PFE)
)

colnames(resultados) <- c("Griegas Put PFE", "Strike_30_Sigma+0.3", "Strike_27_Sigma+0.1", "Strike_25_Sigma-0.1")

# Mostrar la tabla
resultados
##   Griegas Put PFE Strike_30_Sigma+0.3 Strike_27_Sigma+0.1 Strike_25_Sigma-0.1
## 1           Delta         -0.49123208         -0.31770671         -0.03867430
## 2           Gamma          0.04870211          0.06697304          0.03411702
## 3           Theta         -5.73347996         -3.33568783         -0.36089479
## 4            Vega          5.71546209          5.10908946          1.20146450
## 5             Rho         -4.47992140         -2.58014792         -0.28694911
## 6           Price          3.84097441          1.21511756          0.03939092
## 7              d1          0.02197970          0.47412130          1.76628167
## 8              d2         -0.26376701          0.28837459          1.68053496
## 9               B         17.91968561         10.32059169          1.14779642

Valore los precios de las opciones mediante el modelo de Black, Scholes y Merton, pero modificando la tasa de interés (una con intervalo de crecimiento y decrecimiento de 2%, hasta llegar a un total de 10 puntos de distancia, otra con una simulación de Vasicek de la tasa de interés)

American Airlines Group Inc. (AAL) con intervalo de crecimiento y decrecimiento de 2%

# Función con parámetros iniciales

black_scholes_merton <- function(So, K, r, VencimientoDias, sigma, Stcall, Stput) {
  
  Ano <- 252
  
  VencimientoDias=30
  
  sigma= sigma_AAL
  
  #Definir los vencimientos a partir de un número de días establecido
  k = seq(from = , by = 12.44, length.out = 3)
  
  #Definir un conjunto de Volatilidad a partir de un valor sigma inicial
  r = seq(from=r, by = 0.0046 , length.out = 0.2)
  
  ## Cálculo del vencimiento
  T <- VencimientoDias / Ano
  
  
  
  #Definir d1 y d2
  d1 <- (log(So/K) + (r + ((sigma^2)/2)) * T) / (sigma * sqrt(T))
  d2 <- (log(So/K) + (r - ((sigma^2)/2)) * T) / (sigma * sqrt(T))
  
  
  # Definir N1 y N2 para la posición Call y Put
  Nd1 <- pnorm(d1)
  Nd2 <- pnorm(d2)
  Nd1P <- pnorm(-d1)
  Nd2P <- pnorm(-d2)
  
  #Valoración Call
  Call <- So * Nd1 - (K * exp(-r * T) * Nd2)
  
  #Valoración Put
  Put <- (K * exp(-r * T) * Nd2P) - So * Nd1P

  ##Crear vector de varios precios st a partir de un stc dado  
  St <- seq(from = Stcall, by = 0.5, length.out = 60)
  num_filas <- length(St)
  num_columnas <- length(sigma)
  
  ## Matriz resultados de la Valoración Call
  resultadosCall <- matrix(NA, nrow = num_filas, ncol = num_columnas)
  
  
  ## 
  for (i in 1:num_filas) {
    for (j in 1:num_columnas) {
      resultado <- (St[i] * pnorm((log(St[i]/K) + (r + ((sigma[j]^2)/2)) * T[j]) / (sigma[j] * sqrt(T[j]))) -
                      K * exp(-r * T[j]) * pnorm((log(St[i]/K) + (r - ((sigma[j]^2)/2)) * T[j]) / (sigma[j] * sqrt(T[j])))) /
        Call[j]
      resultadosCall[i, j] <- resultado
    }
  }
  
  #Definir el nombre de las columnas
  colnames(resultadosCall) <- paste("Vto a", VencimientoDias, "días")
  
  ##Crear vector de varios precios st a partir de un stp dado
  StP <- seq(from = Stput, by = 0.5, length.out = 60)
  
  #matriz de resultados de la valoración Put
  resultadosPut <- matrix(NA, nrow = num_filas, ncol = num_columnas)
  
  for (i in 1:num_filas) {
    for (j in 1:num_columnas) {
      resultado <- (K * exp(-r * T[j]) * pnorm(-(log(StP[i]/K) + (r - ((sigma[j]^2)/2)) * T[j]) / (sigma[j] * sqrt(T[j])))
                    - StP[i] * pnorm(-(log(StP[i]/K) + (r + ((sigma[j]^2)/2)) * T[j]) / (sigma[j] * sqrt(T[j])))) /
        Put[j]
      resultadosPut[i, j] <- resultado
    }
  }
  
  colnames(resultadosPut) <- paste("Vto a", VencimientoDias, "días")
  
  #incluir columna de los valores de St para la posición Call en la matriz de resultados
  CallTable <- cbind(St, resultadosCall)
  
  # definir la tabla como un dataframe para evitar error en el tipo de datos
  CallTable <- as.data.frame(CallTable)
  
  #Proceso similar al anterior realizado ahora para la posición Put
  PutTable <- cbind(StP, resultadosPut)
  PutTable <- as.data.frame(PutTable)
  
  # Graficar Call
  colores <- rainbow(num_columnas)
  matplot(1:num_filas, resultadosCall, type = "l", col = colores, lty = 1, xlab = "Índice", ylab = "Valor", main = "Gráfico de Líneas de Resultados Call")
  legend("topleft", legend = colnames(resultadosCall), col = colores, lty = 1, cex = 0.4)
  grid()
  png(filename = "CallPlot.png")
  dev.off()
  
  # Graficar Put
  colores <- rainbow(num_columnas)
  matplot(1:num_filas, resultadosPut, type = "l", col = colores, lty = 1, xlab = "Índice", ylab = "Valor", main = "Gráfico de Líneas de Resultados Put")
  legend("topright", legend = colnames(resultadosPut), col = colores, lty = 1, cex = 0.4)
  grid()
  png(filename = "PutPlot.png")
  dev.off()
  
  return(list(CallTable = CallTable, PutTable = PutTable))
}

# Obtener el último precio ajustado de cada acción
ultimo_ajustado_AAL <- tail(Ad(AAL), 1)

# Llamada a la función con valores específicos y gráficas
resultado <- black_scholes_merton(So = 13.44, K = 13, r = 0.0446, VencimientoDias = 30, sigma = sigma_AAL, Stcall = 1, Stput = 1)

print(resultado$CallTable)
##      St                                Vto a 30 días
## 1   1.0  0.00000000000000000000000000000000008827502
## 2   1.5  0.00000000000000000000000019488050146713580
## 3   2.0  0.00000000000000000009677794851576443068038
## 4   2.5  0.00000000000000074686765485316258840475800
## 5   3.0  0.00000000000050989240340437523872282876702
## 6   3.5  0.00000000007335761573583578666959970071559
## 7   4.0  0.00000000362741825438722341684930072780446
## 8   4.5  0.00000008320416928161885349035653547389302
## 9   5.0  0.00000107637560673508018212630316101652284
## 10  5.5  0.00000897560071640100629476038962550887845
## 11  6.0  0.00005304092700089676684985229293545216933
## 12  6.5  0.00023808397177442304688300966919456413962
## 13  7.0  0.00085512999810238073811197168083708675113
## 14  7.5  0.00255775637144231527894677746814977581380
## 15  8.0  0.00657293806094124202776818322035978781059
## 16  8.5  0.01487605789328545063954223337532312143594
## 17  9.0  0.03024828286906691351965115188704658066854
## 18  9.5  0.05616314104137813678629953528798068873584
## 19 10.0  0.09650470369116546931476108284186921082437
## 20 10.5  0.15517460514186351416832110317045589908957
## 21 11.0  0.23567568526816334850693124280951451510191
## 22 11.5  0.34075839818086167687383181146287824958563
## 23 12.0  0.47218953241535749354440554270695429295301
## 24 12.5  0.63066583392182784528756656072800979018211
## 25 13.0  0.81586150495285836292680414771893993020058
## 26 13.5  1.02657637941888468802176248573232442140579
## 27 14.0  1.26094275773485775538063080603023990988731
## 28 14.5  1.51665098630009476110558352957013994455338
## 29 15.0  1.79116259887055773170061456767143681645393
## 30 15.5  2.08189100915884495179852820001542568206787
## 31 16.0  2.38634030078770820182398892939090728759766
## 32 16.5  2.70220092688789748081035213544964790344238
## 33 17.0  3.02740658468229861810527836496476083993912
## 34 17.5  3.36015939835961097159611199458595365285873
## 35 18.0  3.69893141968623018200901242380496114492416
## 36 18.5  4.04245001715588880841778518515639007091522
## 37 19.0  4.38967356799840580094951292267069220542908
## 38 19.5  4.73976244115243616761290468275547027587891
## 39 20.0  5.09204885543740104481003072578459978103638
## 40 20.5  5.44600797652506685153639409691095352172852
## 41 21.0  5.80123164434043836479304445674642920494080
## 42 21.5  6.15740540362492971837582445004954934120178
## 43 22.0  6.51428901555660644362433231435716152191162
## 44 22.5  6.87170031452705565300220769131556153297424
## 45 23.0  7.22950209653796527220492862397804856300354
## 46 23.5  7.58759164400582886145230077090673148632050
## 47 24.0  7.94589247329422931898079696111381053924561
## 48 24.5  8.30434791116042880787517788121476769447327
## 49 25.0  8.66291614673590437689654208952561020851135
## 50 25.5  9.02156645469757378918984613846987485885620
## 51 26.0  9.38027633539555694142109132371842861175537
## 52 26.5  9.73902936454351397799200640292838215827942
## 53 27.0 10.09781358648275251255199691513553261756897
## 54 27.5 10.45662032023696674798429739894345402717590
## 55 28.0 10.81544327665703342233882722212001681327820
## 56 28.5 11.17427790844644164280907716602087020874023
## 57 29.0 11.53312093349493849814280110877007246017456
## 58 29.5 11.89196998651681447256578394444659352302551
## 59 30.0 12.25082336523978021602943044854328036308289
## 60 30.5 12.60967984598632796178208081983029842376709
print(resultado$PutTable)
##     StP  Vto a 30 días
## 1   1.0 13.49002043913
## 2   1.5 12.92469311776
## 3   2.0 12.35936579640
## 4   2.5 11.79403847503
## 5   3.0 11.22871115366
## 6   3.5 10.66338383240
## 7   4.0 10.09805651663
## 8   4.5  9.53272932062
## 9   5.0  8.96740356382
## 10  5.5  8.40208868629
## 11  6.0  7.83683078205
## 12  6.5  7.27179496331
## 13  7.0  6.70743968893
## 14  7.5  6.14479455459
## 15  8.0  5.58579244255
## 16  8.5  5.03354521946
## 17  9.0  4.49243412252
## 18  9.5  3.96793108147
## 19 10.0  3.46615476437
## 20 10.5  2.99325150673
## 21 11.0  2.55473941389
## 22 11.5  2.15495134034
## 23 12.0  1.79667054925
## 24 12.5  1.48099464076
## 25 13.0  1.20741037809
## 26 13.5  0.97402711160
## 27 14.0  0.77790261061
## 28 14.5  0.61539842392
## 29 15.0  0.48251564649
## 30 15.5  0.37517956863
## 31 16.0  0.28945831506
## 32 16.5  0.22171360276
## 33 17.0  0.16869033679
## 34 17.5  0.12755628144
## 35 18.0  0.09590442426
## 36 18.5  0.07172995914
## 37 19.0  0.05339199346
## 38 19.5  0.03956783683
## 39 20.0  0.02920551798
## 40 20.5  0.02147825316
## 41 21.0  0.01574305828
## 42 21.5  0.01150456465
## 43 22.0  0.00838431844
## 44 22.5  0.00609534993
## 45 23.0  0.00442151846
## 46 23.5  0.00320101062
## 47 24.0  0.00231333996
## 48 24.5  0.00166922780
## 49 25.0  0.00120280850
## 50 25.5  0.00086567974
## 51 26.0  0.00062239731
## 52 26.5  0.00044708763
## 53 27.0  0.00032091668
## 54 27.5  0.00023020913
## 55 28.0  0.00016505751
## 56 28.5  0.00011829838
## 57 29.0  0.00008476134
## 58 29.5  0.00006072031
## 59 30.0  0.00004349366
## 60 30.5  0.00003115370

Valore los precios de las opciones mediante el modelo de Black, Scholes y Merton, pero modificando la tasa de interés (una con intervalo de crecimiento y decrecimiento de 2%, hasta llegar a un total de 10 puntos de distancia, otra con una simulación de Vasicek de la tasa de interés)

BScall3 <- function(t=0,T,S,K,r,q=0,sigma,isPut=0) {
# t and T are measured in years; all parameters are annualized
# q is the continuous dividend yield
d1 <- (log(S/K)+(r-q+sigma^2/2)*(T-t))/(sigma*sqrt(T-t))
d2 <- d1-sigma*sqrt(T-t)
binary <- pnorm(-d2)*exp(-r*T)

# Call Delta at t
Delta <- exp(-q*(T-t))*pnorm(d1)

# Black-Scholes formula for Calls
BSprice <- -K*exp(-r*(T-t))*pnorm(d2)+S*Delta

if (isPut==1) {
    Delta <- -exp(-q*(T-t))*pnorm(-d1)
    BSprice <- S*Delta+K*exp(-r*(T-t))*pnorm(-d2)
}

return (list(Delta=Delta,d1=d1,d2=d2,Price=BSprice))
}


# Función que cambia la tasa de interés r y calcula el valor de la opción usando BScall3
calcular_valores_con_diferentes_r <- function(t, T, S, K, r_inicial, q, sigma, isPut, incremento, max_incremento) {
  resultados <- data.frame(r = numeric(), valor_opcion = numeric())
  for (r in seq(r_inicial, r_inicial + max_incremento, by = incremento)) {
    valor_opcion <- BScall3(t=t, T=T, S=S, K=K, r=r, q=q, sigma=sigma, isPut=isPut)
    resultados <- rbind(resultados, data.frame(r = r,valor_opcion))
  
  }
  return(resultados)
}

American Airlines Group Inc. (AAL)

Call con precio striker 15

# Definimos los parámetros iniciales
S <- tail(AAL$AAL.Adjusted, 1)[[1]]
K <- 15  
r_inicial <- 0.0046
sigma <- sigma_AAL
isPut <- 0
incremento <- 0.01
max_incremento <- 0.15
 
# Llamamos a la función para calcular los valores de la opción con diferentes tasas de interés
resultados <- calcular_valores_con_diferentes_r(t=0, T=3/12, S, K, r_inicial, q=0, sigma, isPut, incremento, max_incremento)
 
colnames(resultados) <- c("r", "Delta", "d1", "d2","Prices")

# Mostrar los resultados en una tabla organizada
print(resultados)
##         r     Delta         d1         d2    Prices
## 1  0.0046 0.2417664 -0.7006320 -1.0099463 0.4390994
## 2  0.0146 0.2442961 -0.6925496 -1.0018639 0.4449814
## 3  0.0246 0.2468401 -0.6844672 -0.9937815 0.4509216
## 4  0.0346 0.2493982 -0.6763848 -0.9856991 0.4569202
## 5  0.0446 0.2519703 -0.6683024 -0.9776167 0.4629775
## 6  0.0546 0.2545563 -0.6602200 -0.9695343 0.4690937
## 7  0.0646 0.2571562 -0.6521376 -0.9614519 0.4752691
## 8  0.0746 0.2597698 -0.6440552 -0.9533695 0.4815039
## 9  0.0846 0.2623971 -0.6359728 -0.9452871 0.4877984
## 10 0.0946 0.2650379 -0.6278904 -0.9372047 0.4941528
## 11 0.1046 0.2676921 -0.6198080 -0.9291223 0.5005674
## 12 0.1146 0.2703596 -0.6117256 -0.9210400 0.5070424
## 13 0.1246 0.2730404 -0.6036433 -0.9129576 0.5135779
## 14 0.1346 0.2757343 -0.5955609 -0.9048752 0.5201744
## 15 0.1446 0.2784412 -0.5874785 -0.8967928 0.5268319
## 16 0.1546 0.2811610 -0.5793961 -0.8887104 0.5335506

Call con precio striker 12

# Definimos los parámetros iniciales
S <- tail(AAL$AAL.Adjusted, 1)[[1]]
K <- 12
r_inicial <- 0.0046
sigma <- sigma_AAL
isPut <- 0
incremento <- 0.01
max_incremento <- 0.15
 
# Llamamos a la función para calcular los valores de la opción con diferentes tasas de interés
resultados <- calcular_valores_con_diferentes_r(t=0, T=3/12, S, K, r_inicial, q=0, sigma, isPut, incremento, max_incremento)
 
colnames(resultados) <- c("r", "Delta", "d1", "d2","Prices")

# Mostrar los resultados en una tabla organizada
print(resultados)
##         r     Delta         d1         d2   Prices
## 1  0.0046 0.5082901 0.02078163 -0.2885327 1.213032
## 2  0.0146 0.5115135 0.02886403 -0.2804503 1.224645
## 3  0.0246 0.5147361 0.03694642 -0.2723679 1.236321
## 4  0.0346 0.5179578 0.04502881 -0.2642855 1.248060
## 5  0.0446 0.5211783 0.05311121 -0.2562031 1.259863
## 6  0.0546 0.5243975 0.06119360 -0.2481207 1.271729
## 7  0.0646 0.5276150 0.06927599 -0.2400383 1.283657
## 8  0.0746 0.5308308 0.07735839 -0.2319559 1.295648
## 9  0.0846 0.5340445 0.08544078 -0.2238735 1.307702
## 10 0.0946 0.5372560 0.09352318 -0.2157911 1.319817
## 11 0.1046 0.5404651 0.10160557 -0.2077087 1.331995
## 12 0.1146 0.5436716 0.10968796 -0.1996263 1.344234
## 13 0.1246 0.5468752 0.11777036 -0.1915440 1.356534
## 14 0.1346 0.5500758 0.12585275 -0.1834616 1.368896
## 15 0.1446 0.5532731 0.13393514 -0.1753792 1.381319
## 16 0.1546 0.5564669 0.14201754 -0.1672968 1.393803

Call con precio striker 10

# Definimos los parámetros iniciales
S <- tail(AAL$AAL.Adjusted, 1)[[1]]
K <- 10
r_inicial <- 0.0046
sigma <- sigma_AAL
isPut <- 0
incremento <- 0.01
max_incremento <- 0.15
 
# Llamamos a la función para calcular los valores de la opción con diferentes tasas de interés
resultados <- calcular_valores_con_diferentes_r(t=0, T=3/12, S, K, r_inicial, q=0, sigma, isPut, incremento, max_incremento)
 
colnames(resultados) <- c("r", "Delta", "d1", "d2","Prices")

# Mostrar los resultados en una tabla organizada
print(resultados)
##         r     Delta        d1        d2   Prices
## 1  0.0046 0.7291418 0.6102195 0.3009052 2.209670
## 2  0.0146 0.7318118 0.6183019 0.3089876 2.225128
## 3  0.0246 0.7344685 0.6263843 0.3170699 2.240624
## 4  0.0346 0.7371118 0.6344666 0.3251523 2.256157
## 5  0.0446 0.7397416 0.6425490 0.3332347 2.271727
## 6  0.0546 0.7423578 0.6506314 0.3413171 2.287333
## 7  0.0646 0.7449602 0.6587138 0.3493995 2.302976
## 8  0.0746 0.7475488 0.6667962 0.3574819 2.318653
## 9  0.0846 0.7501236 0.6748786 0.3655643 2.334366
## 10 0.0946 0.7526843 0.6829610 0.3736467 2.350113
## 11 0.1046 0.7552309 0.6910434 0.3817291 2.365895
## 12 0.1146 0.7577633 0.6991258 0.3898115 2.381710
## 13 0.1246 0.7602814 0.7072082 0.3978939 2.397557
## 14 0.1346 0.7627852 0.7152906 0.4059763 2.413438
## 15 0.1446 0.7652746 0.7233730 0.4140587 2.429350
## 16 0.1546 0.7677495 0.7314554 0.4221411 2.445294

Put con precio striker 15

# Definimos los parámetros iniciales
S <- tail(AAL$AAL.Adjusted, 1)[[1]]
K <- 15  
r_inicial <- 0.0046
sigma <- sigma_AAL
isPut <- 1
incremento <- 0.01
max_incremento <- 0.15
 
# Llamamos a la función para calcular los valores de la opción con diferentes tasas de interés
resultados <- calcular_valores_con_diferentes_r(t=0, T=3/12, S, K, r_inicial, q=0, sigma, isPut, incremento, max_incremento)
 
colnames(resultados) <- c("r", "Delta", "d1", "d2","Prices")

# Mostrar los resultados en una tabla organizada
print(resultados)
##         r      Delta         d1         d2   Prices
## 1  0.0046 -0.7582336 -0.7006320 -1.0099463 3.921859
## 2  0.0146 -0.7557039 -0.6925496 -1.0018639 3.890331
## 3  0.0246 -0.7531599 -0.6844672 -0.9937815 3.858955
## 4  0.0346 -0.7506018 -0.6763848 -0.9856991 3.827730
## 5  0.0446 -0.7480297 -0.6683024 -0.9776167 3.796656
## 6  0.0546 -0.7454437 -0.6602200 -0.9695343 3.765735
## 7  0.0646 -0.7428438 -0.6521376 -0.9614519 3.734965
## 8  0.0746 -0.7402302 -0.6440552 -0.9533695 3.704346
## 9  0.0846 -0.7376029 -0.6359728 -0.9452871 3.673880
## 10 0.0946 -0.7349621 -0.6278904 -0.9372047 3.643565
## 11 0.1046 -0.7323079 -0.6198080 -0.9291223 3.613402
## 12 0.1146 -0.7296404 -0.6117256 -0.9210400 3.583390
## 13 0.1246 -0.7269596 -0.6036433 -0.9129576 3.553530
## 14 0.1346 -0.7242657 -0.5955609 -0.9048752 3.523822
## 15 0.1446 -0.7215588 -0.5874785 -0.8967928 3.494266
## 16 0.1546 -0.7188390 -0.5793961 -0.8887104 3.464861

Put con precio striker 12

# Definimos los parámetros iniciales
S <- tail(AAL$AAL.Adjusted, 1)[[1]]
K <- 12
r_inicial <- 0.0046
sigma <- sigma_AAL
isPut <- 1
incremento <- 0.01
max_incremento <- 0.15
 
# Llamamos a la función para calcular los valores de la opción con diferentes tasas de interés
resultados <- calcular_valores_con_diferentes_r(t=0, T=3/12, S, K, r_inicial, q=0, sigma, isPut, incremento, max_incremento)
 
colnames(resultados) <- c("r", "Delta", "d1", "d2","Prices")

# Mostrar los resultados en una tabla organizada
print(resultados)
##         r      Delta         d1         d2   Prices
## 1  0.0046 -0.4917099 0.02078163 -0.2885327 1.699240
## 2  0.0146 -0.4884865 0.02886403 -0.2804503 1.680924
## 3  0.0246 -0.4852639 0.03694642 -0.2723679 1.662747
## 4  0.0346 -0.4820422 0.04502881 -0.2642855 1.644708
## 5  0.0446 -0.4788217 0.05311121 -0.2562031 1.626806
## 6  0.0546 -0.4756025 0.06119360 -0.2481207 1.609041
## 7  0.0646 -0.4723850 0.06927599 -0.2400383 1.591414
## 8  0.0746 -0.4691692 0.07735839 -0.2319559 1.573922
## 9  0.0846 -0.4659555 0.08544078 -0.2238735 1.556567
## 10 0.0946 -0.4627440 0.09352318 -0.2157911 1.539347
## 11 0.1046 -0.4595349 0.10160557 -0.2077087 1.522262
## 12 0.1146 -0.4563284 0.10968796 -0.1996263 1.505312
## 13 0.1246 -0.4531248 0.11777036 -0.1915440 1.488496
## 14 0.1346 -0.4499242 0.12585275 -0.1834616 1.471815
## 15 0.1446 -0.4467269 0.13393514 -0.1753792 1.455267
## 16 0.1546 -0.4435331 0.14201754 -0.1672968 1.438851

Put con precio striker 10

# Definimos los parámetros iniciales
S <- tail(AAL$AAL.Adjusted, 1)[[1]]
K <- 10
r_inicial <- 0.0046
sigma <- sigma_AAL
isPut <- 1
incremento <- 0.01
max_incremento <- 0.15
 
# Llamamos a la función para calcular los valores de la opción con diferentes tasas de interés
resultados <- calcular_valores_con_diferentes_r(t=0, T=3/12, S, K, r_inicial, q=0, sigma, isPut, incremento, max_incremento)
 
colnames(resultados) <- c("r", "Delta", "d1", "d2","Prices")

# Mostrar los resultados en una tabla organizada
print(resultados)
##         r      Delta        d1        d2    Prices
## 1  0.0046 -0.2708582 0.6102195 0.3009052 0.6981771
## 2  0.0146 -0.2681882 0.6183019 0.3089876 0.6886947
## 3  0.0246 -0.2655315 0.6263843 0.3170699 0.6793125
## 4  0.0346 -0.2628882 0.6344666 0.3251523 0.6700299
## 5  0.0446 -0.2602584 0.6425490 0.3332347 0.6608461
## 6  0.0546 -0.2576422 0.6506314 0.3413171 0.6517606
## 7  0.0646 -0.2550398 0.6587138 0.3493995 0.6427727
## 8  0.0746 -0.2524512 0.6667962 0.3574819 0.6338817
## 9  0.0846 -0.2498764 0.6748786 0.3655643 0.6250871
## 10 0.0946 -0.2473157 0.6829610 0.3736467 0.6163882
## 11 0.1046 -0.2447691 0.6910434 0.3817291 0.6077843
## 12 0.1146 -0.2422367 0.6991258 0.3898115 0.5992748
## 13 0.1246 -0.2397186 0.7072082 0.3978939 0.5908591
## 14 0.1346 -0.2372148 0.7152906 0.4059763 0.5825365
## 15 0.1446 -0.2347254 0.7233730 0.4140587 0.5743064
## 16 0.1546 -0.2322505 0.7314554 0.4221411 0.5661680

Pfizer (PFE)

Call con precio striker 30

# Definimos los parámetros iniciales
S <- tail(PFE$PFE.Adjusted,1)[[1]]
K <- 30  
r_inicial <- 0.0046
sigma <- sigma_AAL
isPut <- 0
incremento <- 0.01
max_incremento <- 0.15
 
# Llamamos a la función para calcular los valores de la opción con diferentes tasas de interés
resultados <- calcular_valores_con_diferentes_r(t=0, T=3/12, S, K, r_inicial, q=0, sigma, isPut, incremento, max_incremento)
 
colnames(resultados) <- c("r", "Delta", "d1", "d2","Prices")

# Mostrar los resultados en una tabla organizada
print(resultados)
##         r     Delta         d1         d2   Prices
## 1  0.0046 0.5042467 0.01064518 -0.2986691 2.987016
## 2  0.0146 0.5074708 0.01872757 -0.2905867 3.015757
## 3  0.0246 0.5106943 0.02680997 -0.2825043 3.044657
## 4  0.0346 0.5139172 0.03489236 -0.2744219 3.073716
## 5  0.0446 0.5171392 0.04297475 -0.2663396 3.102933
## 6  0.0546 0.5203600 0.05105715 -0.2582572 3.132307
## 7  0.0646 0.5235795 0.05913954 -0.2501748 3.161839
## 8  0.0746 0.5267975 0.06722193 -0.2420924 3.191527
## 9  0.0846 0.5300137 0.07530433 -0.2340100 3.221371
## 10 0.0946 0.5332280 0.08338672 -0.2259276 3.251371
## 11 0.1046 0.5364401 0.09146912 -0.2178452 3.281525
## 12 0.1146 0.5396498 0.09955151 -0.2097628 3.311835
## 13 0.1246 0.5428569 0.10763390 -0.2016804 3.342298
## 14 0.1346 0.5460613 0.11571630 -0.1935980 3.372914
## 15 0.1446 0.5492627 0.12379869 -0.1855156 3.403684
## 16 0.1546 0.5524608 0.13188108 -0.1774332 3.434605

Call con precio striker 27

# Definimos los parámetros iniciales
S <- tail(PFE$PFE.Adjusted,1)[[1]]
K <- 27
r_inicial <- 0.0046
sigma <- sigma_AAL
isPut <- 0
incremento <- 0.01
max_incremento <- 0.15
 
# Llamamos a la función para calcular los valores de la opción con diferentes tasas de interés
resultados <- calcular_valores_con_diferentes_r(t=0, T=3/12, S, K, r_inicial, q=0, sigma, isPut, incremento, max_incremento)
 
colnames(resultados) <- c("r", "Delta", "d1", "d2","Prices")

# Mostrar los resultados en una tabla organizada
print(resultados)
##         r     Delta        d1         d2   Prices
## 1  0.0046 0.6373076 0.3512712 0.04195693 4.329466
## 2  0.0146 0.6403347 0.3593536 0.05003933 4.364370
## 3  0.0246 0.6433531 0.3674360 0.05812172 4.399404
## 4  0.0346 0.6463625 0.3755184 0.06620412 4.434565
## 5  0.0446 0.6493628 0.3836008 0.07428651 4.469854
## 6  0.0546 0.6523539 0.3916832 0.08236890 4.505270
## 7  0.0646 0.6553354 0.3997656 0.09045130 4.540810
## 8  0.0746 0.6583074 0.4078480 0.09853369 4.576475
## 9  0.0846 0.6612695 0.4159304 0.10661608 4.612263
## 10 0.0946 0.6642218 0.4240128 0.11469848 4.648173
## 11 0.1046 0.6671639 0.4320952 0.12278087 4.684205
## 12 0.1146 0.6700957 0.4401776 0.13086326 4.720356
## 13 0.1246 0.6730172 0.4482600 0.13894566 4.756627
## 14 0.1346 0.6759281 0.4563424 0.14702805 4.793016
## 15 0.1446 0.6788283 0.4644248 0.15511045 4.829522
## 16 0.1546 0.6817176 0.4725071 0.16319284 4.866144

Call con precio striker 25

# Definimos los parámetros iniciales
S <- tail(PFE$PFE.Adjusted,1)[[1]]
K <- 25
r_inicial <- 0.0046
sigma <- sigma_AAL
isPut <- 0
incremento <- 0.01
max_incremento <- 0.15
 
# Llamamos a la función para calcular los valores de la opción con diferentes tasas de interés
resultados <- calcular_valores_con_diferentes_r(t=0, T=3/12, S, K, r_inicial, q=0, sigma, isPut, incremento, max_incremento)
 
colnames(resultados) <- c("r", "Delta", "d1", "d2","Prices")

# Mostrar los resultados en una tabla organizada
print(resultados)
##         r     Delta        d1        d2   Prices
## 1  0.0046 0.7257745 0.6000830 0.2907687 5.458705
## 2  0.0146 0.7284611 0.6081654 0.2988511 5.497108
## 3  0.0246 0.7311345 0.6162478 0.3069335 5.535607
## 4  0.0346 0.7337946 0.6243302 0.3150159 5.574201
## 5  0.0446 0.7364413 0.6324126 0.3230983 5.612888
## 6  0.0546 0.7390746 0.6404950 0.3311807 5.651668
## 7  0.0646 0.7416942 0.6485774 0.3392631 5.690539
## 8  0.0746 0.7443001 0.6566598 0.3473455 5.729500
## 9  0.0846 0.7468923 0.6647422 0.3554279 5.768549
## 10 0.0946 0.7494705 0.6728246 0.3635102 5.807686
## 11 0.1046 0.7520348 0.6809070 0.3715926 5.846910
## 12 0.1146 0.7545850 0.6889893 0.3796750 5.886218
## 13 0.1246 0.7571211 0.6970717 0.3877574 5.925610
## 14 0.1346 0.7596428 0.7051541 0.3958398 5.965085
## 15 0.1446 0.7621503 0.7132365 0.4039222 6.004641
## 16 0.1546 0.7646433 0.7213189 0.4120046 6.044278

Put con precio striker 30

# Definimos los parámetros iniciales
S <- tail(PFE$PFE.Adjusted,1)[[1]]
K <- 30  
r_inicial <- 0.0046
sigma <- sigma_AAL
isPut <- 1
incremento <- 0.01
max_incremento <- 0.15
 
# Llamamos a la función para calcular los valores de la opción con diferentes tasas de interés
resultados <- calcular_valores_con_diferentes_r(t=0, T=3/12, S, K, r_inicial, q=0, sigma, isPut, incremento, max_incremento)
 
colnames(resultados) <- c("r", "Delta", "d1", "d2","Prices")

# Mostrar los resultados en una tabla organizada
print(resultados)
##         r      Delta         d1         d2   Prices
## 1  0.0046 -0.4957533 0.01064518 -0.2986691 4.292536
## 2  0.0146 -0.4925292 0.01872757 -0.2905867 4.246457
## 3  0.0246 -0.4893057 0.02680997 -0.2825043 4.200724
## 4  0.0346 -0.4860828 0.03489236 -0.2744219 4.155335
## 5  0.0446 -0.4828608 0.04297475 -0.2663396 4.110291
## 6  0.0546 -0.4796400 0.05105715 -0.2582572 4.065589
## 7  0.0646 -0.4764205 0.05913954 -0.2501748 4.021230
## 8  0.0746 -0.4732025 0.06722193 -0.2420924 3.977212
## 9  0.0846 -0.4699863 0.07530433 -0.2340100 3.933534
## 10 0.0946 -0.4667720 0.08338672 -0.2259276 3.890195
## 11 0.1046 -0.4635599 0.09146912 -0.2178452 3.847194
## 12 0.1146 -0.4603502 0.09955151 -0.2097628 3.804530
## 13 0.1246 -0.4571431 0.10763390 -0.2016804 3.762203
## 14 0.1346 -0.4539387 0.11571630 -0.1935980 3.720211
## 15 0.1446 -0.4507373 0.12379869 -0.1855156 3.678552
## 16 0.1546 -0.4475392 0.13188108 -0.1774332 3.637227

Put con precio striker 27

# Definimos los parámetros iniciales
S <- tail(PFE$PFE.Adjusted,1)[[1]]
K <- 27
r_inicial <- 0.0046
sigma <- sigma_AAL
isPut <- 1
incremento <- 0.01
max_incremento <- 0.15
 
# Llamamos a la función para calcular los valores de la opción con diferentes tasas de interés
resultados <- calcular_valores_con_diferentes_r(t=0, T=3/12, S, K, r_inicial, q=0, sigma, isPut, incremento, max_incremento)
 
colnames(resultados) <- c("r", "Delta", "d1", "d2","Prices")

# Mostrar los resultados en una tabla organizada
print(resultados)
##         r      Delta        d1         d2   Prices
## 1  0.0046 -0.3626924 0.3512712 0.04195693 2.638434
## 2  0.0146 -0.3596653 0.3593536 0.05003933 2.606000
## 3  0.0246 -0.3566469 0.3674360 0.05812172 2.573864
## 4  0.0346 -0.3536375 0.3755184 0.06620412 2.542023
## 5  0.0446 -0.3506372 0.3836008 0.07428651 2.510477
## 6  0.0546 -0.3476461 0.3916832 0.08236890 2.479224
## 7  0.0646 -0.3446646 0.3997656 0.09045130 2.448262
## 8  0.0746 -0.3416926 0.4078480 0.09853369 2.417591
## 9  0.0846 -0.3387305 0.4159304 0.10661608 2.387209
## 10 0.0946 -0.3357782 0.4240128 0.11469848 2.357115
## 11 0.1046 -0.3328361 0.4320952 0.12278087 2.327306
## 12 0.1146 -0.3299043 0.4401776 0.13086326 2.297782
## 13 0.1246 -0.3269828 0.4482600 0.13894566 2.268542
## 14 0.1346 -0.3240719 0.4563424 0.14702805 2.239583
## 15 0.1446 -0.3211717 0.4644248 0.15511045 2.210904
## 16 0.1546 -0.3182824 0.4725071 0.16319284 2.182504

Put con precio striker 25

# Definimos los parámetros iniciales
S <- tail(PFE$PFE.Adjusted,1)[[1]]
K <- 25
r_inicial <- 0.0046
sigma <- sigma_AAL
isPut <- 1
incremento <- 0.01
max_incremento <- 0.15
 
# Llamamos a la función para calcular los valores de la opción con diferentes tasas de interés
resultados <- calcular_valores_con_diferentes_r(t=0, T=3/12, S, K, r_inicial, q=0, sigma, isPut, incremento, max_incremento)
 
colnames(resultados) <- c("r", "Delta", "d1", "d2","Prices")

# Mostrar los resultados en una tabla organizada
print(resultados)
##         r      Delta        d1        d2   Prices
## 1  0.0046 -0.2742255 0.6000830 0.2907687 1.769971
## 2  0.0146 -0.2715389 0.6081654 0.2988511 1.746024
## 3  0.0246 -0.2688655 0.6162478 0.3069335 1.722329
## 4  0.0346 -0.2662054 0.6243302 0.3150159 1.698884
## 5  0.0446 -0.2635587 0.6324126 0.3230983 1.675687
## 6  0.0546 -0.2609254 0.6404950 0.3311807 1.652737
## 7  0.0646 -0.2583058 0.6485774 0.3392631 1.630032
## 8  0.0746 -0.2556999 0.6566598 0.3473455 1.607571
## 9  0.0846 -0.2531077 0.6647422 0.3554279 1.585352
## 10 0.0946 -0.2505295 0.6728246 0.3635102 1.563373
## 11 0.1046 -0.2479652 0.6809070 0.3715926 1.541634
## 12 0.1146 -0.2454150 0.6889893 0.3796750 1.520131
## 13 0.1246 -0.2428789 0.6970717 0.3877574 1.498864
## 14 0.1346 -0.2403572 0.7051541 0.3958398 1.477832
## 15 0.1446 -0.2378497 0.7132365 0.4039222 1.457032
## 16 0.1546 -0.2353567 0.7213189 0.4120046 1.436462

Seleccione una opción Call y una Put cercanas al promedio del precio de la acción en el periodo de la muestra y genere la siguiente estrategia:

Largo en la acción. largo en la call. Corto en la put. Calcule el PyG diario en todo el periodo de la muestra, asumiendo que el precio de las opciones no cambia.

American Airlines Group Inc. (AAL)

K_AAL <- 15

PreciosAAL<- data.frame(AAL$AAL.Adjusted)

# Inicializar el PyG diario
pyg_AmericanAirlines <- numeric(length(PreciosAAL$AAL.Adjusted) - 1)

# Calcular el PyG diario
for (i in 1:(length(PreciosAAL$AAL.Adjusted) - 1)) {
  StAAL <- PreciosAAL$AAL.Adjusted[i]
  St1AAL <- PreciosAAL$AAL.Adjusted[i + 1]

  # Largo en la acción
  largo_accionAAL <- (St1AAL - StAAL)
  
  # Largo en la call
  largo_callAAL <- max((St1AAL - K_AAL), 0) - max((StAAL - K_AAL), 0)
  
  # Corto en la put
  corto_putAAL <- -max((K_AAL - St1AAL), 0) + max((K_AAL - StAAL), 0)
  
  # PyG diario de la estrategia
    pyg_AmericanAirlines[i] <- largo_accionAAL + largo_callAAL + corto_putAAL
}

PYGAAL <- data.frame(Dia = 1:length(pyg_AmericanAirlines), PyG = pyg_AmericanAirlines)
knitr::kable(PYGAAL, caption = "PYG American Airlines")
PYG American Airlines
Dia PyG
1 2.4542542
2 0.0395813
3 1.0687866
4 -0.3166733
5 -0.3562660
6 1.0292091
7 3.9386787
8 -0.8114853
9 -0.2375107
10 -0.0791702
11 1.3656769
12 -2.0979958
13 -1.1479568
14 0.4948120
15 -1.1083755
16 0.3958473
17 1.3656731
18 0.9104500
19 0.5343933
20 -1.3656731
21 1.0489998
22 -0.5146027
23 0.6531372
24 -0.8510590
25 1.1479492
26 0.1781311
27 1.4844284
28 -0.3364716
29 1.2073364
30 -1.9000702
31 0.9500427
32 -1.3062973
33 -0.3562622
34 1.6427612
35 1.7021484
36 -5.7793770
37 -0.8510704
38 -0.9896202
39 -0.0593758
40 -0.3958473
41 -1.3260841
42 -0.7719002
43 -1.8209000
44 -0.1390343
45 0.5362740
46 0.8937874
47 -0.5958557
48 -2.2642670
49 -0.2582054
50 -2.8005409
51 -1.3704758
52 0.7547569
53 0.6157188
54 -0.5362701
55 1.1718521
56 0.2184868
57 -2.2046852
58 -0.4568214
59 -1.4697876
60 1.7478561
61 1.9663353
62 -0.0198631
63 0.3972397
64 0.9732361
65 1.3704796
66 0.1986198
67 1.2910309
68 1.3506126
69 1.2711639
70 0.3575172
71 0.0198631
72 -4.3299141
73 1.7279930
74 -0.0794487
75 -0.5958595
76 -0.6157227
77 -0.9732361
78 -0.9930992
79 0.8739281
80 -0.4965477
81 -0.3575172
82 -0.0794487
83 -0.3376541
84 -2.8402596
85 -0.1986237
86 1.1122742
87 0.0000000
88 0.8540611
89 1.6088219
90 0.2184830
91 0.3575172
92 0.5164108
93 1.2910309
94 -0.4369698
95 -0.2383423
96 0.5759964
97 0.7944832
98 -0.7150345
99 0.0595894
100 2.2245369
101 2.8799896
102 0.9930992
103 -0.8739281
104 -1.2513008
105 -0.4568329
106 0.9930992
107 0.7746239
108 0.6575661
109 -0.4383812
110 -0.1394844
111 -0.2590408
112 -0.3387489
113 -2.1321220
114 -1.7136688
115 0.2191925
116 0.1793365
117 -0.5180855
118 1.3749199
119 -2.1121941
120 -0.5977898
121 1.4944763
122 0.6177139
123 0.1195602
124 -0.1992607
125 -0.4184570
126 -1.3151398
127 -1.5741806
128 0.1793327
129 -0.2789650
130 0.9763908
131 -0.4782333
132 -0.9763908
133 -0.2789688
134 1.7136650
135 -0.4782333
136 0.8767624
137 0.7173500
138 -0.5579376
139 1.0959473
140 0.9763947
141 0.5180817
142 -0.2391129
143 0.9763908
144 -2.4509430
145 -0.2789726
146 0.7572060
147 0.8169785
148 -2.8693962
149 -0.6575699
150 -0.1992645
151 1.2354355
152 0.2191925
153 -1.2553635
154 0.1394844
155 0.2789726
156 0.0996284
157 1.2952156
158 0.3387451
159 -2.3911591
160 0.2391129
161 2.9491005
162 -2.3114586
163 -3.0487289
164 1.5741806
165 -0.1992645
166 1.8332253
167 -1.7535172
168 0.6376419
169 2.7400017
170 1.3400002
171 -1.6000023
172 0.1599998
173 0.8200035
174 2.0999985
175 1.2599983
176 -0.7599983
177 -1.7799988
178 -1.1400032
179 -0.5999985
180 0.3600006
181 -1.3800011
182 -4.7399979
183 -4.6599998
184 -1.6200027
185 -3.4199982
186 -3.1000023
187 -0.3799973
188 -2.0200005
189 1.3600006
190 -4.9799995
191 -0.1400013
192 -2.4400005
193 4.5000000
194 -1.4799995
195 -5.6200008
196 1.7200012
197 3.2199993
198 -0.6800003
199 -7.8600006
200 -2.7199993
201 0.1800003
202 -0.2600002
203 7.3400002
204 2.9400005
205 0.5399990
206 -3.2399998
207 -3.5799999
208 -0.1200008
209 -3.0000000
210 -1.2599983
211 -1.3400002
212 0.2199993
213 1.4400005
214 2.2199993
215 2.3600006
216 -1.8999996
217 0.7799988
218 0.6800003
219 -2.4400005
220 1.0000000
221 -1.0199986
222 -0.1200008
223 -1.4599991
224 -0.0400009
225 0.1200008
226 -0.5799999
227 2.4799995
228 2.7399998
229 -1.2399998
230 -2.7399998
231 -1.6400013
232 -0.6199989
233 -0.5200005
234 0.5799999
235 1.2000008
236 -0.0799999
237 -0.9000015
238 -1.0799999
239 0.0799999
240 -0.2199993
241 1.6599998
242 -0.4599991
243 0.4599991
244 0.0400009
245 -0.3800011
246 2.8800011
247 1.6799984
248 -2.0000000
249 -0.9599991
250 1.2199993
251 0.2200012
252 1.2600002
253 9.7399979
254 3.7400017
255 3.4399986
256 -3.5200005
257 -3.0599976
258 -5.2800007
259 4.7199993
260 -0.0799980
261 0.6599998
262 -0.1000023
263 -0.9799995
264 -0.9799995
265 -2.1599998
266 -1.8400002
267 -1.9200001
268 0.2600002
269 -1.5799999
270 1.8799992
271 -0.5000000
272 -0.5199986
273 -0.6200008
274 0.6000004
275 -1.7800007
276 0.1599998
277 -1.6199989
278 1.5199986
279 -0.6199989
280 -0.1200008
281 3.7399998
282 -1.9799995
283 -1.0799999
284 -0.8799992
285 0.0000000
286 -0.2200012
287 0.8200016
288 -0.7600002
289 0.0000000
290 0.7600002
291 -0.7400017
292 -0.4399986
293 -0.1200008
294 -0.0799999
295 0.7800007
296 2.1800003
297 0.9599991
298 -0.0200005
299 1.9400005
300 -0.5400009
301 -0.3799992
302 -0.4799995
303 0.0599995
304 -1.4200001
305 -0.0399990
306 0.1599998
307 -0.3600006
308 -0.6800003
309 2.5599995
310 -0.5999985
311 -0.7000008
312 0.9799995
313 0.6200008
314 -1.0799999
315 0.1000004
316 0.2599983
317 0.2600002
318 0.5000000
319 0.0400009
320 -1.1599998
321 -0.0799999
322 -0.1200008
323 0.6200008
324 -0.2399998
325 1.3199997
326 -0.3400002
327 -0.8800011
328 -1.9599991
329 0.2600002
330 -0.8199997
331 -0.3199997
332 1.0399990
333 0.9400005
334 -1.0200005
335 0.0799999
336 0.5799999
337 0.8400002
338 0.2399998
339 -1.1800003
340 1.0799999
341 0.1800003
342 0.0799999
343 -0.5599995
344 -1.3999996
345 0.2799988
346 -0.2600002
347 0.4600010
348 0.2000008
349 0.4799995
350 -0.1000004
351 0.7999992
352 -1.0999985
353 -1.6000004
354 -1.1400013
355 -0.5599995
356 0.4200001
357 0.2399998
358 -0.1800003
359 0.1200008
360 -0.4799995
361 1.1800003
362 -0.2800007
363 3.4799995
364 -1.6399994
365 -0.6800003
366 -0.6000004
367 1.0000000
368 1.1000004
369 -0.1800003
370 0.0799999
371 0.1000004
372 -0.5200005
373 2.0600014
374 2.5199986
375 0.2399998
376 0.0799999
377 -1.6999989
378 0.2800007
379 1.1799984
380 2.4600010
381 0.6199989
382 1.6199989
383 0.8400002
384 -0.9399986
385 1.6599998
386 -1.8800011
387 -0.6999969
388 0.6199989
389 -0.2999992
390 -0.1200027
391 -0.5799980
392 -0.8199997
393 -1.2400017
394 0.8200016
395 -0.4600010
396 0.7999992
397 -0.3999996
398 0.5799999
399 -0.7599983
400 -1.2800007
401 0.6000004
402 0.1800003
403 -0.2800007
404 -0.5000000
405 -0.2600002
406 0.7600002
407 0.2999992
408 1.8200016
409 -1.3600006
410 0.4200001
411 0.3999996
412 -0.6800003
413 -0.0200005
414 -0.7799988
415 0.1999989
416 2.0599995
417 3.0800018
418 -1.8600006
419 -0.6599998
420 -0.5000000
421 2.0200005
422 -0.4000015
423 -0.4199982
424 1.1599998
425 -0.6599998
426 -0.0600014
427 -0.8400002
428 0.5600014
429 1.0999985
430 0.3400002
431 -0.5600014
432 1.9400024
433 3.5200005
434 0.4399986
435 2.3199997
436 -1.9199982
437 0.1599998
438 0.4799995
439 0.5200005
440 1.4599991
441 -1.8600006
442 -1.5799980
443 2.0399971
444 0.2600021
445 0.2999992
446 0.7999992
447 2.4400024
448 3.5999985
449 -1.4000015
450 1.3800011
451 -0.9199982
452 0.5399971
453 -2.2799988
454 -3.1199989
455 -0.9200020
456 1.9200020
457 0.3199997
458 -0.0400009
459 2.4200020
460 -0.4400024
461 -0.0799980
462 0.7399979
463 -0.3400002
464 -0.2599983
465 -0.5600014
466 -0.2199974
467 -1.2600021
468 -0.7000008
469 -0.3799973
470 -0.4800034
471 -0.1999969
472 -0.9600029
473 -2.3599968
474 1.2799988
475 -1.8800011
476 2.0800018
477 1.8600006
478 -0.5600014
479 -0.1199989
480 -0.8000031
481 0.8400002
482 0.4600029
483 -1.0600014
484 0.2999992
485 -0.1599998
486 1.0200005
487 0.0000000
488 -0.8600006
489 -1.6199989
490 0.8999977
491 2.3800011
492 1.9000015
493 0.4199982
494 -1.1800003
495 -0.7399979
496 -0.0600014
497 0.8400002
498 0.4399986
499 1.3800011
500 1.0600014
501 -0.3800011
502 0.8600006
503 2.2999992
504 -1.7799988
505 -1.2600021
506 -0.0999985
507 -0.0600014
508 -0.7399979
509 -0.7800026
510 0.1400032
511 -1.0800018
512 -0.3999977
513 0.0799980
514 -1.2000008
515 0.1200027
516 0.3199997
517 -0.6800003
518 0.1800003
519 0.2999992
520 -0.2600021
521 -1.6599998
522 -0.6199989
523 0.2599983
524 0.6000023
525 -0.0600014
526 -0.9399986
527 -1.4000015
528 0.0800018
529 1.0799980
530 -0.0999985
531 -1.6399994
532 1.2000008
533 -0.3200035
534 -1.3399963
535 -1.6400032
536 3.1800003
537 1.6800003
538 -0.4799995
539 0.0800018
540 1.7599983
541 -1.2400017
542 0.3400002
543 -0.9199982
544 -1.5800018
545 -0.6399994
546 -0.2199974
547 -1.0000000
548 2.9199982
549 0.2200012
550 -0.9200020
551 0.7600021
552 0.5799980
553 -1.5999985
554 -1.1800003
555 -0.1599998
556 -0.8400002
557 -0.4000015
558 -0.8199997
559 -0.4599991
560 1.2200012
561 1.4399986
562 0.6399994
563 -0.5000000
564 0.6399994
565 -1.4199982
566 0.8600006
567 -0.6000023
568 0.2400017
569 -0.7799988
570 0.3199997
571 -0.8000031
572 2.1400032
573 -2.5000000
574 0.7199974
575 -0.2000008
576 0.3400002
577 1.0200005
578 -0.3199997
579 1.2000008
580 -1.1399994
581 1.5200005
582 0.7599983
583 0.9799995
584 0.1599998
585 -0.0799980
586 -0.8400002
587 -0.9799995
588 2.2599983
589 -0.5200005
590 0.1599998
591 -1.8599968
592 -0.7400017
593 -0.2000008
594 0.1199989
595 0.3200035
596 -1.3600006
597 0.0599976
598 0.6800003
599 -0.2799988
600 -0.6199989
601 -0.0200005
602 0.7399979
603 -1.4799995
604 0.1599998
605 0.3199997
606 -0.7199974
607 0.3199997
608 0.0200005
609 1.1399994
610 0.1199989
611 1.5999985
612 0.0000000
613 2.3800011
614 0.8600006
615 0.0200005
616 -1.3800011
617 -0.4799995
618 -2.0799980
619 0.0599976
620 -0.9599991
621 0.0400009
622 -0.9400024
623 -0.2199974
624 0.6999969
625 -0.3199997
626 -0.0200005
627 -3.4199982
628 -0.0200005
629 -0.0999985
630 -2.8199997
631 2.2799988
632 -1.5999985
633 2.6199989
634 -0.0800018
635 0.6800003
636 -0.1800003
637 -0.2599983
638 -1.7799988
639 -0.4200020
640 0.1599998
641 -0.9399986
642 0.8600006
643 0.6999969
644 1.6400032
645 0.2799988
646 0.0000000
647 -0.1800003
648 0.7400017
649 -0.9800034
650 0.0400009
651 -0.2200012
652 1.5800018
653 0.5400009
654 -0.6800003
655 -0.2200012
656 1.4200020
657 -0.9799995
658 0.4599991
659 -1.0400009
660 1.6800003
661 -1.7000008
662 -1.1800003
663 -1.1800003
664 -1.0999985
665 -0.9200020
666 0.2200012
667 0.0999985
668 -0.4399986
669 -0.9200001
670 -0.2799988
671 1.6599979
672 0.7200012
673 0.2599983
674 -0.7799988
675 -0.2399979
676 1.6599998
677 1.9599991
678 1.0000000
679 -0.1000023
680 -2.1999969
681 -0.3600006
682 2.8199997
683 -0.0400009
684 -1.2000008
685 -0.6999969
686 -0.8800011
687 -1.5800018
688 0.6399994
689 1.0000000
690 -0.4199982
691 -1.9199982
692 0.1599998
693 -1.3200016
694 -2.2399998
695 -3.5000000
696 1.3400002
697 1.5799999
698 -0.2000008
699 -0.3599987
700 0.4599991
701 2.6399994
702 1.7999992
703 0.1599998
704 0.4000015
705 -1.3199997
706 0.9399986
707 -0.7000008
708 1.0200005
709 0.5800018
710 0.5799980
711 1.7200012
712 -0.2200012
713 0.4000015
714 -0.0200005
715 -0.0200005
716 -0.7799988
717 -0.9200020
718 -0.8599968
719 -0.7200012
720 0.7599983
721 0.3199997
722 3.6400032
723 0.0999985
724 -0.9199982
725 2.0999985
726 -0.2200012
727 1.4799995
728 -0.0799980
729 -0.4000015
730 -2.4199982
731 0.3999977
732 0.9200020
733 -1.3199997
734 -0.4200020
735 1.1399994
736 0.9800034
737 -2.1599998
738 -1.4000015
739 -3.0400009
740 0.5000000
741 -1.1999989
742 -0.9600010
743 2.1800003
744 -0.0600014
745 2.5400009
746 -1.8600006
747 -0.2799988
748 -0.9799995
749 0.9799995
750 -2.5000000
751 1.2599983
752 2.2200012
753 1.7799988
754 -0.5199966
755 -1.1599998
756 0.3399963
757 -2.4799995
758 0.1599998
759 0.7800026
760 -1.0800018
761 -1.3599987
762 -1.5200005
763 -2.7800007
764 -0.7399998
765 0.7200012
766 -2.3000011
767 1.5599995
768 0.2000008
769 0.1200008
770 -0.2400017
771 1.8400002
772 -0.6799984
773 -0.1200008
774 -0.9400005
775 -0.6999989
776 0.8999996
777 1.5000000
778 0.0200005
779 0.4200001
780 -0.2600002
781 -1.0799999
782 2.6800003
783 -0.9200001
784 -0.1200008
785 0.4400005
786 0.1399994
787 1.2399998
788 0.1000004
789 -2.2600002
790 -0.7999992
791 0.1399994
792 -0.6399994
793 1.0799999
794 -0.4200001
795 -0.1000004
796 1.1399994
797 -0.4399986
798 1.1399994
799 0.4599991
800 -0.2399998
801 0.5600014
802 -0.8000011
803 0.8999996
804 -0.1599998
805 0.5200005
806 0.1599998
807 0.3400002
808 -1.0799999
809 -0.2399998
810 -1.3400002
811 -0.9200001
812 0.2199993
813 0.3400002
814 0.8600006
815 -1.3600006
816 -0.4599991
817 -0.3600006
818 -0.6800003
819 -0.1199989
820 0.1199989
821 0.4600010
822 1.3400002
823 0.1399994
824 0.4599991
825 0.5600014
826 -1.5799999
827 0.6999989
828 0.4800014
829 -1.0400009
830 0.9200001
831 -0.4799995
832 -1.4800014
833 -1.0399990
834 -1.0000000
835 -0.7000008
836 0.8200016
837 0.9599991
838 -1.0000000
839 -0.4200001
840 -0.2399998
841 2.0599995
842 -0.1599998
843 -0.2800007
844 -1.0999985
845 -0.2600002
846 0.4200001
847 0.8799992
848 0.7000008
849 0.1199989
850 0.1800003
851 1.0000000
852 0.5799999
853 -1.0599995
854 0.5000000
855 0.7800007
856 0.3799992
857 -0.5799999
858 -0.0599995
859 0.0599995
860 0.3600006
861 -0.1400013
862 -1.0599995
863 0.2999992
864 0.7600002
865 0.4200001
866 -0.1399994
867 -0.5400009
868 1.9000015
869 -0.1000004
870 -0.3999996
871 -0.1400013
872 -1.0399990
873 -0.2800007
874 0.2000008
875 -0.3999996
876 0.2599983
877 0.8800011
878 0.1599998
879 -1.3400002
880 0.6200008
881 0.5799999
882 -0.9000015
883 -0.0199986
884 0.2799988
885 0.4400005
886 -1.5599995
887 0.1000004
888 -0.1400013
889 1.3400002
890 -1.4799995
891 -0.2199993
892 -0.8400002
893 -0.2399998
894 -0.6600018
895 0.1000004
896 1.0000000
897 -0.9399986
898 0.2999992
899 -0.3600006
900 -0.4200001
901 0.7600002
902 0.0400009
903 0.0399990
904 1.7000008
905 0.7999992
906 0.3800011
907 0.8599987
908 1.1599998
909 0.3000011
910 2.9799995
911 0.3800011
912 0.1199989
913 -0.8800011
914 -0.7199974
915 0.1199989
916 -0.3400002
917 -0.2999992
918 0.4799995
919 0.7000008
920 -0.3600006
921 -0.9400005
922 0.3599987
923 1.1000023
924 0.7399979
925 -0.0799980
926 -0.2000008
927 0.0799980
928 0.0200005
929 -0.6199989
930 -0.7599983
931 0.4599991
932 0.5600014
933 0.0199966
934 -0.8199997
935 -0.0599976
936 -1.3400021
937 -0.2599983
938 0.6199989
939 -0.6199989
940 0.1399994
941 0.6999989
942 0.1000023
943 0.1800003
944 0.4799995
945 -0.4799995
946 0.4799995
947 0.4599991
948 -1.4200001
949 -0.8400002
950 -1.2199993
951 -0.3800011
952 -1.6000004
953 0.5200005
954 -0.2800007
955 -0.0399990
956 0.8199997
957 -1.1000004
958 -0.3799992
959 0.1800003
960 0.4399986
961 0.0799999
962 0.7400017
963 0.2399998
964 0.5599995
965 -0.6599998
966 -0.5200005
967 -0.5399990
968 0.2399998
969 0.2799988
970 0.3400002
971 -2.6399994
972 -0.1000004
973 -0.3199997
974 0.6200008
975 0.3799992
976 0.6800003
977 -0.6200008
978 0.1599998
979 -0.1599998
980 -0.9599991
981 -0.2000008
982 0.2800007
983 1.5200005
984 0.5000000
985 -0.2399998
986 0.0399990
987 -0.5599995
988 0.7199993
989 0.9799995
990 0.2200012
991 -0.2600002
992 -0.5400009
993 -0.0999985
994 0.5199986
995 -0.1599998
996 1.4200001
997 0.2800007
998 -0.4600010
999 -0.8799992
1000 -0.6200008
1001 -0.5399990
1002 1.1599998
1003 -0.0599995
1004 0.5399990
1005 0.3199997
1006 -0.1599998
1007 0.3400002
1008 -0.1199989
1009 0.2399998
1010 0.4599991
1011 0.2800007
1012 0.5399990
1013 0.9000015
1014 0.5799980
1015 0.5600014
1016 0.1199989
1017 -0.3400002
1018 -0.3199997
1019 -0.0400009
1020 0.1200027
1021 -0.2000008
1022 0.3600006
1023 1.8199997
1024 0.3999977
1025 0.1000023
1026 0.6800003
1027 0.3199997
1028 0.4399986
1029 -0.8800011
1030 0.9400024
1031 0.4399986
1032 0.4599991
1033 -0.4599991
1034 -0.2399979
1035 -0.6200027
1036 0.0800018
1037 1.0000000
1038 -0.1599998
1039 -2.3199997
1040 -0.0400009
1041 -1.0800018
1042 -0.4599991
1043 0.2200012
1044 -0.3800011
1045 0.4400024
1046 -0.0800018
1047 -1.0400009
1048 -0.5599995
1049 0.0599995
1050 -0.2799988
1051 0.2999992
1052 0.3800011
1053 -0.8400002
1054 0.0000000
1055 -0.2200012
1056 0.4600010
1057 -0.6599998
1058 -0.2200012
1059 -0.7799988
1060 -0.0200005
1061 0.2399998
1062 -0.6599998
1063 -0.1000004
1064 -0.4200001
1065 0.0200005
1066 0.2999992
1067 0.3400002
1068 -0.2599983
1069 -0.0800018
1070 -0.0999985
1071 -0.7600002
1072 0.0599995
1073 -0.6599998
1074 -0.0400009
1075 0.2200012
1076 0.0399990
1077 -1.5999985
1078 -0.1000004
1079 0.1000004
1080 -0.4000015
1081 0.1599998
1082 -0.2599983
1083 0.0000000
1084 -0.3200016
1085 0.0200005
1086 -0.4200001
1087 -0.1800003
1088 0.6200008
1089 -0.2199993
1090 -0.1200008
1091 -0.9200001
1092 0.8799992
1093 0.2400017
1094 -0.1800003
1095 -1.0400009
1096 0.0400009
1097 0.4399986
1098 -0.8399982
1099 -0.6800003
1100 0.4399986
1101 0.0000000
1102 -1.1599998
1103 0.1800003
1104 -0.7399998
1105 0.4200001
1106 -0.1599998
1107 -0.3400002
1108 0.2199993
1109 -0.4599991
1110 0.5200005
1111 -0.0600014
1112 -0.0199986
1113 0.5199986
1114 1.1599998
1115 -0.6399994
1116 0.1800003
1117 0.5200005
1118 -0.5200005
1119 0.1000004
1120 -0.0400009
1121 0.9400005
1122 0.3400002
1123 -0.4600010
1124 0.2000008
1125 0.2199993
1126 -0.5399990
1127 0.3600006
1128 0.0000000
1129 -0.2600002
1130 -0.0200005
1131 0.1199989
1132 0.4000015
1133 1.1800003
1134 0.6599998
1135 -0.4400005
1136 0.6999989
1137 0.8600006
1138 -0.2999992
1139 -0.0799999
1140 0.6399994
1141 0.1000004
1142 1.0000000
1143 -0.2000008
1144 -0.5000000
1145 0.1200008
1146 -0.6400013
1147 0.7400017
1148 -0.0799999
1149 -0.4000015
1150 -0.2399998
1151 -0.0200005
1152 -0.4799995
1153 -0.6000004
1154 -0.9799995
1155 0.2800007
1156 1.0200005
1157 1.9599991
1158 -0.3999996
1159 -0.0599995
1160 0.4799995
1161 -2.7600002
1162 -0.0400009
1163 -0.5199986
1164 1.7799988
1165 -0.3199997
1166 -0.0799999
1167 0.7600002
1168 -0.1399994
1169 2.8599987
1170 -0.4599991
1171 -0.3800011
1172 -0.8199997
1173 -0.6000004
1174 0.2200012
1175 0.4400005
1176 -0.6000004
1177 1.2799988
1178 0.0200005
1179 0.0799999
1180 -0.1399994
1181 0.1000004
1182 -0.6400013
1183 0.5000000
1184 0.0799999
1185 -0.5199986
1186 0.1199989
1187 0.1800003
1188 0.8999996
1189 -0.2199993
1190 0.2999992
1191 0.5200005
1192 -0.1599998
1193 0.4400005
1194 -0.0400009
1195 -1.6999989
1196 -0.2800007
1197 0.4200001
1198 0.0399990
1199 -0.4399986
1200 -0.0600014
1201 -1.3799992
1202 0.0799999
1203 -0.0200005
1204 -0.0599995
1205 0.2999992
1206 -0.3599987
1207 1.2799988
1208 0.4200001
1209 0.0799999
1210 0.2000008
1211 0.0000000
1212 0.7600002
1213 0.1000004
1214 0.1199989
1215 -2.0200005
1216 -0.4799995
1217 -0.6599998
1218 -0.1399994
1219 0.2799988
1220 0.1000004
1221 -1.0799999
1222 0.4200001
1223 -0.9400005
1224 -0.4200001
1225 0.1800003
1226 1.7200012
1227 0.2600002
1228 0.1799984
1229 0.8400002
1230 -0.6000004
1231 -0.6199989
1232 0.4200001
1233 -0.5000000
1234 0.1999989
1235 -0.9399986
1236 0.1399994
1237 0.5599995
1238 -0.0199986
1239 1.5999985
1240 -0.7999992
1241 0.3400002
1242 0.1199989
1243 -0.1599998
1244 1.0600014
1245 0.5199986
1246 -0.5000000
1247 -0.2999992
1248 -0.1200008
1249 -0.4199982
1250 -0.9800014
1251 0.1400013
1252 -0.5600014
1253 0.0400009
1254 -0.8000011
1255 -3.6399994
1256 -0.3600006
1257 0.1200008

Pfizer (PFE)

K_PFE <- 30

PreciosPFE<- data.frame(PFE$PFE.Adjusted)

# Inicializar el PyG diario
pygPfizer <- numeric(length(PreciosPFE$PFE.Adjusted) - 1)

# Calcular el PyG diario
for (i in 1:(length(PreciosPFE$PFE.Adjusted) - 1)) {
  StPFE <- PreciosPFE$PFE.Adjusted[i]
  St1PFE <- PreciosPFE$PFE.Adjusted[i + 1]

  # Largo en la acción
  largo_accionPFE <- (St1PFE - StPFE)
  
  # Largo en la call
  largo_callPFE <- max((St1PFE - K_PFE), 0) - max((StPFE - K_PFE), 0)
  
  # Corto en la put
  corto_putPFE <- -max((K_PFE - St1PFE), 0) + max((K_PFE - StPFE), 0)
  
  # PyG diario de la estrategia
    pygPfizer[i] <- largo_accionPFE + largo_callPFE + corto_putPFE
}

PYGPFE <- data.frame(Dia = 1:length(pygPfizer), PyG = pygPfizer)
knitr::kable(PYGPFE, caption = "PYG Pfizer")
PYG Pfizer
Dia PyG
1 0.3869934
2 0.3560486
3 0.3250732
4 0.2322083
5 -0.6191940
6 0.6346817
7 -0.8978653
8 0.4024887
9 0.1857681
10 0.2941208
11 0.6656418
12 0.1547928
13 0.1083603
14 0.1393280
15 0.0000000
16 -1.1919556
17 0.6811142
18 -0.1702881
19 0.6966095
20 0.6966019
21 0.2786560
22 -0.7430573
23 -0.9597855
24 0.1083832
25 1.0681152
26 -1.6718369
27 -0.8978424
28 0.5418091
29 0.1547775
30 -0.1702728
31 0.4953461
32 -0.4488983
33 0.0773926
34 0.4179840
35 -0.3096313
36 -0.3405380
37 0.6501694
38 -2.5387650
39 -4.1176758
40 0.0773849
41 -0.3593674
42 -0.3906288
43 -1.6249847
44 -0.0156174
45 -0.5781136
46 0.4531136
47 -0.8124847
48 -1.4999962
49 -0.2968788
50 -1.4999809
51 0.3749886
52 0.2656288
53 0.8281136
54 -0.8906212
55 0.4062653
56 0.3281097
57 -1.1562424
58 0.7812462
59 -0.7812462
60 1.1562424
61 0.3906250
62 0.3437462
63 0.8906212
64 -0.4531288
65 0.7968674
66 0.2500191
67 0.5156021
68 0.8593750
69 0.0468712
70 -0.2031212
71 -0.5781250
72 -0.1250000
73 -0.5156021
74 -0.1875229
75 0.2031364
76 0.2812500
77 -0.7031288
78 -0.3593712
79 -0.1718636
80 -0.1875114
81 0.6875000
82 -0.4531136
83 -0.7812576
84 -1.1406097
85 1.1718674
86 0.7500000
87 -0.1562614
88 -0.6249962
89 0.4062576
90 0.1562500
91 0.4999924
92 0.2968636
93 0.3125191
94 -0.2500191
95 0.1875000
96 0.0000000
97 0.0000000
98 -0.0468674
99 0.5312462
100 -0.5937462
101 0.5937462
102 0.7968674
103 1.4531059
104 0.4218788
105 -0.1718750
106 0.0312386
107 -0.5624847
108 -0.8593597
109 0.2031212
110 -0.5363808
111 0.2208595
112 -0.1893044
113 0.0630951
114 -0.5837097
115 -0.0788803
116 1.1516418
117 -0.0946465
118 0.6941299
119 -0.9623260
120 1.0885315
121 0.9307785
122 0.5521469
123 -0.6152496
124 0.5363884
125 -0.1735382
126 -0.3628502
127 -0.3786163
128 0.1419868
129 -0.1735497
130 0.4101791
131 0.0473328
132 0.2524109
133 -0.4101753
134 0.5048256
135 -0.3312912
136 1.2778435
137 -0.3786011
138 -0.0158005
139 0.1262016
140 0.4101753
141 0.1419945
142 -0.0473251
143 0.1419945
144 -0.0946693
145 -0.6468048
146 0.4259377
147 -0.0631027
148 -0.3312759
149 -0.0788994
150 -0.2050781
151 0.4890556
152 -0.2682037
153 0.9465675
154 -0.1261940
155 1.0411797
156 0.9465714
157 -0.0946503
158 -0.1577492
159 -0.2682076
160 -0.2366524
161 0.8203468
162 -1.4040565
163 0.5363998
164 -3.1867294
165 -0.8834648
166 -0.2071724
167 0.2709312
168 0.4303055
169 0.2868652
170 0.7649689
171 0.1434441
172 -0.3346825
173 -0.3824806
174 0.4462318
175 -0.5578003
176 -1.2909050
177 -0.6693649
178 -0.3027992
179 -0.1434364
180 -0.6056061
181 -0.2071686
182 -1.6733932
183 -1.1793518
184 1.2590408
185 -0.9881096
186 -1.0837173
187 2.3268204
188 -0.9243584
189 3.3467827
190 -1.4980850
191 -0.7012291
192 -2.0080681
193 1.3227692
194 -3.8567543
195 -3.4264717
196 4.2870712
197 -4.0320854
198 3.1555443
199 0.3187408
200 -3.0917816
201 -2.2471275
202 -0.8287354
203 1.9283905
204 0.0796852
205 3.1874008
206 -1.3546486
207 2.8208694
208 -0.0478134
209 -1.4184074
210 1.7849617
211 1.2271538
212 1.4821358
213 -1.5299530
214 1.5777702
215 1.2590370
216 -0.3984451
217 2.0718117
218 -0.7490273
219 -0.1434288
220 1.6415138
221 -1.3227730
222 -0.7331047
223 1.0040245
224 0.7012329
225 1.0996552
226 1.5140114
227 -0.6693420
228 0.3346672
229 0.3825073
230 -1.1474876
231 -0.0318527
232 1.4183960
233 0.0000000
234 -1.8832397
235 0.4184914
236 1.4164619
237 -1.1911011
238 -0.4989891
239 1.4003525
240 -0.2575150
241 0.4989471
242 -0.6277428
243 -0.0804787
244 -0.5955429
245 0.3862991
246 -0.0160980
247 -0.1287651
248 1.2393913
249 0.0160942
250 -4.3941765
251 1.1267052
252 0.0000000
253 -0.2414360
254 -0.0322037
255 0.9657784
256 -0.6116524
257 -0.4667778
258 -4.2171249
259 0.7243195
260 -0.6277390
261 0.0643845
262 0.2575340
263 -0.5150681
264 0.2897148
265 -0.4989700
266 -0.5472488
267 -0.9335670
268 0.2092552
269 -0.4506989
270 0.9657516
271 0.0965767
272 1.6739845
273 1.2393761
274 0.0000000
275 -0.7726021
276 -0.4506836
277 -0.4667702
278 0.5955276
279 2.2212372
280 0.0321922
281 0.7887001
282 -0.1931572
283 1.0462379
284 0.4024086
285 0.3058090
286 3.0099297
287 -0.2414474
288 -1.2071953
289 -0.1931267
290 2.3821907
291 0.3862915
292 -0.2275505
293 -0.4225845
294 -0.2112694
295 0.0649834
296 0.0975227
297 -0.2925491
298 0.2925491
299 -0.0975227
300 -0.9751663
301 0.8776474
302 -0.2600365
303 -0.1787910
304 0.4713631
305 0.0162430
306 -0.1625366
307 0.7476463
308 0.2600517
309 -0.0650253
310 -0.6988907
311 -0.5851059
312 -0.3088074
313 0.0812759
314 -0.1950340
315 -1.4790573
316 0.5201035
317 -1.3002586
318 -0.0650063
319 -0.6988831
320 0.4063377
321 -0.8614311
322 0.6826324
323 1.5278053
324 -0.0812759
325 -0.2925453
326 0.0649986
327 -0.3088036
328 -0.9914474
329 0.3738289
330 -0.4063263
331 -0.3900795
332 0.4713364
333 0.5526047
334 -0.3575630
335 0.8614197
336 -0.5363617
337 0.0162544
338 0.6013832
339 -0.9426956
340 0.4875946
341 0.6826401
342 -0.1625443
343 0.0487595
344 0.1300354
345 -0.0650177
346 -0.5038528
347 2.2754517
348 -0.2437973
349 -0.5038567
350 -0.6663780
351 0.5688667
352 1.2189980
353 -0.4225845
354 -0.7964134
355 -3.2181282
356 -0.2763138
357 0.3250656
358 1.2189865
359 -0.0650139
360 1.8528709
361 -0.9195442
362 0.0164185
363 4.5977097
364 -0.8538666
365 -0.2955627
366 -1.5599365
367 1.7569885
368 -2.1182365
369 1.0774384
370 0.4846115
371 -0.2250137
372 0.8826790
373 -0.3115463
374 0.1384621
375 -0.1211433
376 1.2114792
377 1.8691788
378 1.9037857
379 2.4056702
380 -1.2288055
381 0.4326630
382 1.5749512
383 2.2672043
384 -1.2287750
385 -0.2077103
386 -1.0557022
387 -3.3056564
388 -0.8653412
389 -1.5057068
390 0.3288116
391 -0.6057358
392 -0.5192261
393 -1.1076393
394 1.2114983
395 -0.2942200
396 -0.7788277
397 0.3980598
398 -0.5365105
399 0.1211510
400 0.0000000
401 0.6576538
402 -0.5538177
403 0.3288498
404 0.1211472
405 1.1076431
406 -1.0211105
407 -0.5538216
408 -0.1903992
409 -0.0865135
410 0.0519028
411 -0.3980522
412 -0.0346069
413 0.1211281
414 1.2634354
415 0.0519104
416 -1.8518486
417 0.0174942
418 0.0699806
419 -0.1749611
420 -1.4171066
421 -0.2624283
422 0.0874634
423 0.0524902
424 -0.1749535
425 0.2624397
426 -0.4023972
427 -0.5423546
428 0.5073662
429 -0.0525017
430 0.3499107
431 -0.5773506
432 -0.2099266
433 -0.3149147
434 -0.6123428
435 -0.2799301
436 0.1224670
437 -0.5773354
438 0.3499069
439 -0.3149223
440 1.5395889
441 -0.3324089
442 0.3324089
443 -0.0699883
444 0.1749649
445 0.8397713
446 -0.3848953
447 0.4023933
448 0.8222771
449 0.7348061
450 -0.0699883
451 -0.0349846
452 -0.4198952
453 0.8222847
454 -1.1197014
455 0.4373779
456 0.1049843
457 1.0147095
458 0.6473427
459 -0.8922539
460 0.2099228
461 0.1224747
462 -0.0349846
463 -0.4024010
464 -0.2449226
465 0.0874748
466 1.1196785
467 0.6473389
468 0.3324203
469 0.0174789
470 0.7523117
471 1.6970520
472 0.6298141
473 0.1749420
474 0.8747787
475 -1.5570831
476 0.0349960
477 0.0349960
478 -0.4023972
479 0.6298294
480 -0.3673935
481 0.0874786
482 2.0644608
483 0.2099228
484 0.0349808
485 -0.6890106
486 0.6890182
487 0.4947052
488 -0.9010620
489 0.6007080
490 0.7243805
491 -0.1413422
492 0.1590042
493 -0.1060104
494 -0.3886871
495 0.5123672
496 -0.3003540
497 -0.2473373
498 -0.8480530
499 -0.7243881
500 -0.4770126
501 0.1413345
502 -0.4063568
503 0.5123749
504 0.3180008
505 0.3180313
506 -0.2826843
507 -0.2473602
508 1.6961136
509 1.5370789
510 -0.9363861
511 -0.9187164
512 -0.0706711
513 -0.5123596
514 0.3180008
515 -1.1837234
516 1.0777283
517 0.3356934
518 -0.9893875
519 0.2473526
520 -0.3710403
521 0.2473526
522 -0.0353317
523 0.1060028
524 0.7067184
525 0.3003311
526 -0.7773666
527 0.1059952
528 -0.1766586
529 0.6360321
530 0.2649994
531 -0.1943283
532 0.5300217
533 0.2473526
534 0.4593582
535 -0.3533554
536 1.5900955
537 -0.0530090
538 0.7950592
539 0.3710251
540 0.2296677
541 0.5123749
542 2.3851395
543 -0.4813385
544 0.0356445
545 2.0501709
546 3.0663834
547 -0.8735733
548 -0.2317429
549 0.0178299
550 1.6223297
551 3.9399185
552 -3.3516159
553 1.6579895
554 2.2106171
555 0.7666092
556 2.6919861
557 -1.9788818
558 -0.9092255
559 -0.1426163
560 2.1571579
561 -2.7632904
562 -1.5510178
563 -0.2317734
564 -1.3905487
565 0.2852402
566 -1.2301254
567 -0.0534668
568 1.4262085
569 0.0000000
570 -0.1604462
571 -0.4278641
572 -0.8557358
573 -0.7844238
574 -1.8005829
575 0.2317657
576 0.1069565
577 -0.5348282
578 -1.0340042
579 0.5526581
580 -0.4991837
581 0.0534897
582 0.4278641
583 -0.4457016
584 -0.6596222
585 -0.9448700
586 0.8735657
587 -0.9270477
588 -0.1426239
589 -0.9092178
590 -0.1782684
591 -0.5348282
592 1.2835846
593 -0.5169983
594 -0.6952820
595 -0.3743896
596 -0.7665939
597 0.4457016
598 -0.3208923
599 -0.3030701
600 1.3727264
601 1.2657700
602 0.1069489
603 0.5348511
604 -0.0178375
605 0.7309647
606 -1.0518494
607 0.3743668
608 0.9983673
609 -0.1782837
610 3.2268143
611 -1.1231384
612 -1.0430984
613 8.5604782
614 -0.5035477
615 -1.8523712
616 3.0932846
617 2.0861816
618 -0.8093033
619 -0.1438675
620 -0.0899277
621 2.2840042
622 0.9711533
623 -1.0970612
624 0.7193832
625 -0.2158051
626 -0.3417206
627 5.5930939
628 -2.8774719
629 2.3919144
630 1.7085037
631 -2.9494095
632 2.2120438
633 -5.0175858
634 0.4316177
635 -0.5754929
636 1.2229309
637 1.2588806
638 4.3521805
639 0.6114731
640 5.8628387
641 4.4061432
642 -3.1832047
643 2.7695694
644 -3.7227402
645 1.0790634
646 -1.5106812
647 0.8812332
648 -2.1401291
649 -0.7733231
650 1.4747162
651 1.1689682
652 -4.3162079
653 -3.8126526
654 1.9782562
655 -1.4207611
656 1.5826187
657 0.9351807
658 0.8092880
659 -0.0719299
660 -1.9962463
661 -1.0610809
662 -1.5106506
663 -1.0251160
664 0.9171829
665 -2.2659836
666 -2.2480469
667 1.7984161
668 0.8452682
669 1.3771973
670 1.7396011
671 -2.9718399
672 0.6885986
673 1.4315796
674 -0.8698196
675 -0.6886063
676 0.3805618
677 -2.7362823
678 -0.4167786
679 -1.5765228
680 0.3261642
681 -1.7758408
682 -0.0181198
683 -0.1993256
684 -1.4134369
685 -0.6704788
686 -1.8120956
687 -1.1959686
688 -1.6490250
689 3.1892853
690 -1.4134293
691 -2.1563950
692 3.5335999
693 0.2355652
694 1.4859161
695 -1.2140961
696 -0.9785385
697 2.3738480
698 0.8154449
699 1.9389420
700 3.5879440
701 -0.0725021
702 1.2865982
703 2.3919754
704 0.4892578
705 -0.5798721
706 -2.0839005
707 -1.5402832
708 0.7248383
709 0.3442993
710 0.9060364
711 -0.9785309
712 -0.5436249
713 -1.2140884
714 -0.3624268
715 -1.1416092
716 0.5436172
717 2.9536972
718 4.1497116
719 0.0181122
720 -2.2469940
721 -1.4859238
722 -0.0181198
723 0.0362549
724 -2.3194809
725 -3.0080719
726 -0.7792053
727 -1.1597519
728 -1.7758560
729 1.4859314
730 0.1449661
731 1.2865829
732 1.3953171
733 -2.6094131
734 -1.3228226
735 1.7214737
736 0.6704865
737 -2.1926422
738 1.0691376
739 -0.7248459
740 1.5402985
741 -0.0724945
742 2.4480133
743 -0.8586349
744 1.3701553
745 1.2240067
746 -1.7172546
747 0.4567184
748 3.3249130
749 0.7490158
750 0.9682312
751 0.5480728
752 0.5115280
753 -0.1461639
754 -1.5893707
755 -1.2240143
756 0.5663300
757 0.9499741
758 0.1096191
759 1.2788162
760 -0.8951721
761 -3.0874176
762 -3.3066406
763 -3.7633591
764 0.0182571
765 1.0778732
766 -1.8816910
767 -1.7355194
768 2.8864517
769 1.7538071
770 1.8634033
771 2.7403107
772 0.5297928
773 -2.2287979
774 0.5115433
775 2.7220383
776 -0.2192230
777 -1.2240067
778 2.0278168
779 1.2240067
780 -0.4567184
781 -0.5115280
782 -1.5528259
783 -0.4567184
784 -0.7307510
785 0.6576691
786 -1.8268661
787 1.1326523
788 -1.0047760
789 0.5480652
790 0.2009583
791 0.9865112
792 0.9682388
793 -0.6393967
794 -1.5280762
795 -0.3866196
796 0.1840973
797 -1.6937714
798 0.3129883
799 0.0000000
800 -1.0862045
801 0.5522995
802 0.3866196
803 0.3129807
804 -3.0561447
805 3.3507156
806 -0.6627731
807 0.2025070
808 -1.0862045
809 -1.2703323
810 1.0493927
811 -0.4602509
812 -1.6385498
813 -1.0677948
814 0.8652878
815 -1.9883423
816 -1.0862122
817 -0.6996078
818 -1.1414337
819 2.5774612
820 -1.7121658
821 0.1104431
822 0.6812057
823 1.7490005
824 1.3991852
825 -0.1472931
826 -2.8904495
827 -0.0736084
828 -0.3866425
829 0.1656952
830 -1.0862122
831 -1.2335052
832 -1.5648880
833 1.1966705
834 -0.9020996
835 -0.4602661
836 0.4786758
837 0.6259537
838 -0.4970856
839 -0.7364273
840 0.6996078
841 0.5891342
842 -0.6259613
843 -1.8962784
844 -1.4176025
845 -1.0494003
846 0.3129730
847 0.2025223
848 1.7490005
849 -0.2209320
850 1.4544220
851 0.8100739
852 -1.8042450
853 -0.3682022
854 3.7557373
855 1.0862198
856 0.0920486
857 0.8653030
858 -0.5891342
859 3.1113739
860 -1.6201401
861 2.6879349
862 -1.7305756
863 -0.1856918
864 1.2069473
865 -0.2414017
866 0.4827728
867 -1.1697845
868 1.2254944
869 0.4085083
870 3.0452042
871 -1.2440872
872 -0.9655533
873 0.5199280
874 -0.1856842
875 -0.0928497
876 1.6711502
877 -0.4270782
878 0.6684647
879 0.6684570
880 -0.1485367
881 1.1883545
882 1.7639923
883 -0.3156662
884 -0.3342361
885 -1.8939590
886 0.9841309
887 2.8594971
888 -0.1113968
889 0.8170013
890 1.6897049
891 2.6181335
892 -1.6154404
893 -4.1035843
894 -0.0742722
895 -0.0742722
896 0.6313171
897 -0.0371399
898 0.3527985
899 -1.2997742
900 -0.6127625
901 0.9841385
902 -0.1671295
903 0.0371323
904 -2.0982132
905 -0.8727036
906 2.3395844
907 -4.6977615
908 -1.4297562
909 -0.3156509
910 0.4827576
911 0.2599640
912 -3.2865753
913 -2.0053711
914 -0.0742874
915 0.2785187
916 -0.2413788
917 -0.5013351
918 0.6684570
919 -0.7682877
920 -0.8619919
921 -0.4497223
922 1.1430588
923 -0.3560333
924 0.6933289
925 -0.5246658
926 -0.5621796
927 -0.3185577
928 0.7308197
929 -1.1992798
930 1.0118942
931 0.2061157
932 -0.5059433
933 -0.7495499
934 -0.6933365
935 0.4872055
936 -0.9556808
937 -0.5996399
938 -0.1499023
939 -1.0306244
940 -1.8176651
941 -0.3935013
942 -0.7308197
943 0.8245010
944 0.9931564
945 -0.0749512
946 -1.4428940
947 -0.4122467
948 -1.2367630
949 -0.1311646
950 0.8807220
951 0.0749512
952 0.7120743
953 0.1686478
954 -0.5059509
955 1.3304596
956 -0.2810898
957 -1.2180099
958 0.3185577
959 0.3935165
960 -0.3185577
961 -0.4309921
962 0.4871979
963 0.2436142
964 0.7870178
965 1.0306320
966 -0.8432388
967 1.2180099
968 -0.0936813
969 0.4309845
970 0.1124268
971 -0.7870255
972 0.1874008
973 -0.5246964
974 -0.0187302
975 -1.1805420
976 -0.5809021
977 -0.7308121
978 0.6745911
979 -0.5621643
980 -1.0868378
981 -1.3117218
982 0.2061310
983 0.2810745
984 0.5996323
985 -0.2810669
986 -1.1430664
987 -0.4122467
988 0.4872055
989 0.3372879
990 -0.3560257
991 -0.3373032
992 -0.5871811
993 -0.4356689
994 -0.3598785
995 -0.2841187
996 -0.4924850
997 -0.5114136
998 0.5492935
999 3.7504272
1000 1.6857910
1001 -1.9130859
1002 -1.5153275
1003 -0.4356537
1004 -1.1175461
1005 1.9130859
1006 0.0000000
1007 0.6440125
1008 0.5493011
1009 -0.5303574
1010 0.9849548
1011 0.3788300
1012 -0.2273026
1013 1.7615662
1014 0.7197800
1015 -1.7426224
1016 0.7387238
1017 0.5871887
1018 -1.3637924
1019 -0.8334198
1020 -0.3220139
1021 -0.8144913
1022 -2.6707458
1023 -0.8902512
1024 -0.2462311
1025 -0.3220139
1026 1.0607224
1027 -0.0568161
1028 -0.3598938
1029 -1.5721436
1030 -0.1894150
1031 0.2841110
1032 0.6440201
1033 -0.0568237
1034 0.1325912
1035 0.4924774
1036 -0.8713074
1037 0.7197723
1038 0.3788223
1039 0.6250763
1040 1.1933212
1041 0.2083511
1042 -0.8523636
1043 0.2841187
1044 -1.1491470
1045 -0.2489929
1046 -0.0191422
1047 -0.8618622
1048 -0.4979706
1049 -0.6703415
1050 0.0383072
1051 1.2640610
1052 -0.0766068
1053 0.3830566
1054 -0.2298279
1055 0.6128693
1056 0.0574570
1057 -1.3023605
1058 0.1723633
1059 1.9727173
1060 0.2872849
1061 0.6703415
1062 -0.3255920
1063 -0.3447495
1064 -0.9576263
1065 0.4213562
1066 -0.3255997
1067 -0.1148987
1068 -0.4788208
1069 -0.9959335
1070 0.7660980
1071 -0.7660980
1072 -1.9344101
1073 -0.1723709
1074 -0.0574570
1075 -0.5937347
1076 0.4022141
1077 -0.1340714
1078 0.1340714
1079 -0.1532288
1080 -0.8235550
1081 0.6703339
1082 -0.7086487
1083 -1.4747391
1084 -0.3064423
1085 0.5554276
1086 -1.1108475
1087 -0.5745811
1088 -0.0191498
1089 2.0684700
1090 1.4747467
1091 -0.0766068
1092 -1.1299973
1093 0.3064423
1094 -0.6511841
1095 0.1340599
1096 -0.0574608
1097 -0.1149101
1098 -0.3639030
1099 -1.5513496
1100 2.2216949
1101 -0.9959297
1102 -2.5664406
1103 -0.4213600
1104 -1.0342369
1105 0.3638954
1106 -0.7852516
1107 0.5745735
1108 0.8235588
1109 -2.0110092
1110 0.8427048
1111 0.0191536
1112 -0.0957603
1113 -0.0191536
1114 1.4555931
1115 -0.1532211
1116 0.1340675
1117 -0.8235588
1118 -1.4169846
1119 -0.3882141
1120 -0.9705429
1121 0.5435028
1122 1.8052025
1123 -0.8152504
1124 0.2911606
1125 0.1164627
1126 0.6211472
1127 0.0388184
1128 0.3493958
1129 -0.6987877
1130 -0.8734818
1131 0.7570152
1132 0.7570229
1133 -3.0280800
1134 0.7182007
1135 -0.3688049
1136 -0.5823250
1137 -0.3105736
1138 0.2911644
1139 -0.2717514
1140 -0.1164665
1141 -3.7268677
1142 -1.0287704
1143 0.9705391
1144 0.8346634
1145 2.1351852
1146 -1.0287743
1147 1.3199348
1148 0.1746941
1149 0.0194130
1150 0.3882141
1151 0.3493958
1152 0.0000000
1153 1.8246117
1154 0.0000000
1155 -1.2422867
1156 0.7376060
1157 0.2135201
1158 -0.3493958
1159 -0.7958374
1160 -1.1452408
1161 0.5823250
1162 -0.7376099
1163 -0.3299828
1164 -0.1164627
1165 0.3688049
1166 0.0582314
1167 0.2329330
1168 -0.1941147
1169 -0.8669243
1170 0.0000000
1171 0.0197029
1172 -0.9063301
1173 0.1182175
1174 0.4137611
1175 -0.7093048
1176 -0.7093048
1177 1.8323669
1178 0.1182175
1179 0.0197029
1180 -0.0197029
1181 0.1970291
1182 -1.3594971
1183 0.2758408
1184 0.7881165
1185 0.2167320
1186 -0.0591125
1187 0.1576233
1188 -0.2364349
1189 0.4137611
1190 -1.1427650
1191 -0.5713844
1192 0.2955475
1193 -0.9457436
1194 0.0591125
1195 -1.3792038
1196 0.3743553
1197 2.1870193
1198 -0.7881126
1199 0.8472176
1200 2.2658348
1201 -0.7093048
1202 0.4137573
1203 -0.1773262
1204 -0.3743515
1205 -0.4334641
1206 -0.1773262
1207 0.1379242
1208 -0.0788155
1209 -0.5910835
1210 0.1379204
1211 0.3152428
1212 0.3743553
1213 -0.0591087
1214 -0.0591087
1215 -0.3349495
1216 -0.6501961
1217 -1.1230621
1218 0.0197029
1219 -0.1576195
1220 0.3940582
1221 -0.9063339
1222 0.0394058
1223 -0.9457359
1224 0.0985107
1225 -0.4334602
1226 -0.5319786
1227 -0.0591087
1228 1.2018738
1229 0.5122757
1230 0.1182175
1231 -0.0985146
1232 -1.9899902
1233 0.2758408
1234 0.4728661
1235 -0.0394020
1236 3.0736465
1237 1.0245514
1238 0.2167282
1239 0.6896019
1240 -0.7684135
1241 0.9851456
1242 0.6599998
1243 -0.3400002
1244 0.8600006
1245 -0.1200027
1246 0.8800011
1247 0.2000008
1248 -0.5600014
1249 -0.2199974
1250 0.0599976
1251 2.0800018
1252 -1.8199997
1253 0.3799973
1254 -1.1599998
1255 -0.9599991
1256 0.7600021
1257 0.9199982

2.Estrategias de inversión con SWAPS

Usted piensa realizar una inversión de 100 millones de dólares usando un contrato swap 5 años semi-semi, con tasa de 3.33%, la flotante se asume de la tasa Secured Overnight Financing Rate (SORF), pero como no conoce los valores de las tasas futuras del SORF para los próximos 5 años en pagos, se sugiere simule las tasas que se obtendrán en esos flujos. Para ello

  1. Calcule por medio del modelo de Vasicek la tasas SORF para los próximos 5 años en pagos semestrales. Use información de mercado
datosSORF=read.csv("SORF.csv",sep = ";", dec = ".", fill = TRUE)
head(datosSORF)
##       Fecha   Rate
## 1 2/04/2018 0.0180
## 2 3/04/2018 0.0183
## 3 4/04/2018 0.0174
## 4 5/04/2018 0.0175
## 5 6/04/2018 0.0175
## 6 9/04/2018 0.0175
options(scipen = 999)
class(datosSORF[,"Fecha"])
## [1] "character"
datosSORF[,"Fecha"]<-as.Date(datosSORF[,"Fecha"],format = "%d/%m/%Y")
class(datosSORF[,"Fecha"])
## [1] "Date"
media_SORF <- mean(datosSORF[,"Rate"])
SD_SORF <- sd(datosSORF[,"Rate"])
# Parámetros del modelo de Vasicek
alpha <- 0.01    # Velocidad de reversión a la media
beta <- media_SORF    # Media de largo plazo de la tasa de interés
sigma <- SD_SORF   # Volatilidad de la tasa de interés
r0 <- tail(datosSORF[, 2], 1)    # Tasa de interés inicial

# Configuración de la simulación
horizonte <- 4.5           # Años
n_periodos <- 2 * horizonte  # Pagos semestrales
dt <- 1 / 2              # Incremento de tiempo (en años)

# Crear un vector de tiempo
tiempo <- seq(0, horizonte, by = dt)

# Simulación de la tasa de interés usando el modelo de Vasicek
set.seed(123)  # Para reproducibilidad
tasas <- numeric(length(tiempo))
tasas[1] <- r0

for (i in 2:length(tiempo)) {
  dt_i <- tiempo[i] - tiempo[i - 1]
  dW <- rnorm(1, mean = 0, sd = sqrt(dt_i))
  tasas[i] <- tasas[i - 1] + alpha * (beta - tasas[i - 1]) * dt_i + sigma * dW
}

# Crear un data frame con los resultados
resultados <- data.frame(
  Semestre = 1:length(tiempo),
  Tiempo = tiempo,
  Tasa = tasas
)

# Mostrar la tabla de resultados
print(resultados)
##    Semestre Tiempo       Tasa
## 1         1    0.0 0.05330000
## 2         2    0.5 0.04550463
## 3         3    1.0 0.04224689
## 4         4    1.5 0.06337006
## 5         5    2.0 0.06411833
## 6         6    2.5 0.06566344
## 7         7    3.0 0.08879911
## 8         8    3.5 0.09473759
## 9         9    4.0 0.07713858
## 10       10    4.5 0.06750275
# Graficar los resultados
plot(tiempo, tasas, type = "l", col = "blue", lwd = 2,
     xlab = "Tiempo (años)", ylab = "Tasa de Interés",
     main = "Simulación del Modelo de Vasicek")
grid()

Establezca el flujo de pagos de la tasa flotante y la tasa fija y realice la valuación de los pagos

Inversión<- 100000000
tasaAnual<- 0.033
tasaSemestral<-((1+tasaAnual)^(180/360))-1

PagoTasafija<-Inversión*tasaSemestral
# Calcular los pagos multiplicando la inversión inicial por las tasas simuladas
pagos <- Inversión * tasas
Neto=pagos-PagoTasafija


# Crear un data frame con los resultados
resultados <- data.frame(
  Semestre = 1:length(tiempo),
  TasaSemestreAnterior = tasas,
  PagoVariable = pagos,
  Pagofijo= PagoTasafija,
  Neto= Neto
  
)

# Mostrar la tabla de resultados
print(resultados)
##    Semestre TasaSemestreAnterior PagoVariable Pagofijo    Neto
## 1         1           0.05330000      5330000  1636608 3693392
## 2         2           0.04550463      4550463  1636608 2913855
## 3         3           0.04224689      4224689  1636608 2588081
## 4         4           0.06337006      6337006  1636608 4700398
## 5         5           0.06411833      6411833  1636608 4775226
## 6         6           0.06566344      6566344  1636608 4929737
## 7         7           0.08879911      8879911  1636608 7243303
## 8         8           0.09473759      9473759  1636608 7837152
## 9         9           0.07713858      7713858  1636608 6077250
## 10       10           0.06750275      6750275  1636608 5113668

Analice sobre la posición, quien obtiene ventaja en los pagos según la posición de tasa y porque?

La posición con tasa SORF variable ofrece una clara ventaja en los pagos en comparación con la tasa fija pactada. Esto se debe a que la tasa SORF actual está significativamente por encima de la tasa fija acordada, y no se anticipa que la tasa SORF descienda al nivel de la tasa fija o por debajo de ella en el futuro previsible.