LABORATORIO #1

TEMA1:PROBABILIDAD Y ESTADÍSTICA

A continuacion se mostrara el codigo de ejecucion en R-Studio y el analisis correspondiente a cada calculo.

library(quantmod)
library(zoo)
library(TTR)
library(xts)
library(knitr)
library(tidyverse)
library(ggplot2)
library(dplyr)
library(timetk)

datos = read.table("trm.txt", head = T)

class(datos[,"Fecha"])
## [1] "character"
#Se convierte a formato de fecha la columna "Fecha"
datos[,"Fecha"]<-as.Date(datos[,"Fecha"],format = "%d/%m/%Y")
class(datos[,"Fecha"])
## [1] "Date"

Analizamos la serie diaria de la TRM desde 2000-02-21, hasta 2024-02-21.

Calculamos los rendimientos diarios continuos:

#Rendimientos diarios
Rtos_TRM<-diff(log(datos[,"TRM"]))

Graficos

Precio de la TRM

plot(datos, col="blue", type = "l", main = "Serie Historica TRM")

Rendimientos diarios de la TRM

plot(datos[-1,"Fecha"],diff(log(datos[,"TRM"])), type = "l", main = "Serie Historica rendimientos diarios TRM")

Histograma de precios

hist(datos[,"TRM"], breaks = 30, col = "gray", main = "Histograma de precios", freq = FALSE)

Histograma de rendimientos

hist(Rtos_TRM, breaks = 50, col = "gray", main = "Histograma de rendimientos", freq = FALSE, xlim = c(-0.02,0.02))

Histograma con la distribucion normal

hist(Rtos_TRM, breaks = 50, col = "gray", main = "Histograma de rendimientos", freq = FALSE, xlim = c(-0.02,0.02))
curve(dnorm(x,mean=mean(Rtos_TRM),sd=sd(Rtos_TRM)),-0.02,0.02,add = T,col="blue")

Aqui podemos ver como la distribucion tiende a ser mesocurtica con respecto a la normal.

Estadistica basica

Sobre el precio

library(fBasics)

max(datos[,"TRM"])
## [1] 5061.21
min(datos[,"TRM"])
## [1] 1652.41
mean(datos[,"TRM"])
## [1] 2665.341
sd(datos[,"TRM"])
## [1] 762.6734
skewness(datos[,"TRM"])
## [1] 0.8888884
## attr(,"method")
## [1] "moment"
kurtosis(datos[,"TRM"])
## [1] 0.02819978
## attr(,"method")
## [1] "excess"
estadistica_precios=cbind(c("Max", "Min", "Mean", "Desv", "Sesgo", "Kurtosis"), precios=c(max(datos[,"TRM"]),min(datos[,"TRM"]),mean(datos[,"TRM"]),sd(datos[,"TRM"]),skewness(datos[,"TRM"]),kurtosis(datos[,"TRM"])))
estadistica_precios
##                 precios             
## [1,] "Max"      "5061.21"           
## [2,] "Min"      "1652.41"           
## [3,] "Mean"     "2665.34054066385"  
## [4,] "Desv"     "762.673362792541"  
## [5,] "Sesgo"    "0.888888384719638" 
## [6,] "Kurtosis" "0.0281997844014694"
#Percentiles
quantile(datos[,"TRM"],c(0.01,0.05,0.1,0.5,0.75,0.90,0.95,0.99))
##       1%       5%      10%      50%      75%      90%      95%      99% 
## 1762.278 1791.610 1836.340 2393.580 3058.525 3860.472 4095.444 4802.480

Sobre los rendimientos

basicStats(Rtos_TRM)
##                Rtos_TRM
## nobs        8766.000000
## NAs            0.000000
## Minimum       -0.056219
## Maximum        0.059307
## 1. Quartile   -0.001429
## 3. Quartile    0.001299
## Mean           0.000080
## Median         0.000000
## Sum            0.697796
## SE Mean        0.000063
## LCL Mean      -0.000045
## UCL Mean       0.000204
## Variance       0.000035
## Stdev          0.005933
## Skewness       0.269912
## Kurtosis       9.794342
mean(Rtos_TRM)
## [1] 7.96026e-05
sd(Rtos_TRM)
## [1] 0.005933046
quantile(Rtos_TRM,c(0.01,0.05,0.1,0.5,0.75,0.90,0.95,0.99))
##           1%           5%          10%          50%          75%          90% 
## -0.016772987 -0.008995564 -0.005731670  0.000000000  0.001298514  0.005973884 
##          95%          99% 
##  0.009576499  0.019049738

Analisis tecnico y estadistico

Los calculos estadisticos que hemos realizado nos ofrecen un panorama mas detallado sobre el comportamiento de la TRM a lo largo del periodo.

. El sesgo en los rendimientos fue de 0.2699 lo que nos indica que existe una leve asimetria dentro de la distribucion normal.Indicando que la distribucion tiene unas colas levemente mas pesadas a la derecha. Dentro del supuesto de la normalidad.

· La curtosis es mayor es de 9.7943, es decir, es mayor a 3 y nos indica que hay un exceso de curtosis dentro de la distribucion.Si una distribucion tiene una curtosis positiva, significa que tiene un pico mas pronunciado en comparacion con la distribucion normal. Esto nos indica que los valores de los datos estan mas concentrados alrededor de la media y hay menos valores atipicos.

· Aqui la distribución ya tiende a ser mesocurtica.

Media y Desviación estándar

mean(Rtos_TRM)
## [1] 7.96026e-05
sd(Rtos_TRM)
## [1] 0.005933046

La media arroja un valor bajo, muy cerca a cero, lo cual nos puede estar indicando varias razones:

Estabilidad de precios: Una media cercana a cero sugiere que, en promedio, los precios no estan cambiando significativamente con el tiempo.

Falta de variabilidad: Una baja desviacion estándar nos puede indicar que los precios tienden a estar cerca de la media, lo que sugiere que hay poca variabilidad en los datos. En otras palabras, los precios tienden a permanecer cerca del promedio, lo que podria indicar poca volatilidad.

Periodo de estancamiento: Tambien nos puede indicar una media cercana a cero y una baja desviacion estandar podrian indicar periodos de estancamiento economico.

Comparacion de cuantiles

qqnorm(Rtos_TRM)
qqline(Rtos_TRM)

cuantiles<-c(0.01,0.025,0.05,0.1,0.25,0.40,0.45,0.5,0.75,0.9,0.95,0.975,0.99)
qnorm(cuantiles,mean = mean(Rtos_TRM),sd=sd(Rtos_TRM))
##  [1] -0.0137227254 -0.0115489530 -0.0096793889 -0.0075239012 -0.0039221758
##  [6] -0.0014235173 -0.0006659519  0.0000796026  0.0040813810  0.0076831064
## [11]  0.0098385941  0.0117081582  0.0138819306
quantile(Rtos_TRM, cuantiles)
##           1%         2.5%           5%          10%          25%          40% 
## -0.016772987 -0.012667605 -0.008995564 -0.005731670 -0.001428904  0.000000000 
##          45%          50%          75%          90%          95%        97.5% 
##  0.000000000  0.000000000  0.001298514  0.005973884  0.009576499  0.013224682 
##          99% 
##  0.019049738

Simulacion MONTECARLO

Realice una simulacion con 10.0000 iteraciones para el valor de la TRM para el viernes 17 de febrero de 2017 (dos dias adelante de la ultima fecha de la muestra).

Numero_iteraciones=10000
TRM_SIMULADA=matrix(,3,Numero_iteraciones)
TRM_Inicial=datos[length(datos[,"TRM"]), "TRM"]

TRM_SIMULADA[1,]=TRM_Inicial

for(j in 1:Numero_iteraciones){
  for(i in 2:3){
    TRM_SIMULADA[i,j]=TRM_Inicial*exp(rnorm(1,mean = mean(Rtos_TRM),sd=sd(Rtos_TRM)))
  }
}


matplot(TRM_SIMULADA,type = "l", col = "gray", main="TRM  SIMULADA")

#Histograma TRM SIMULADA
hist(TRM_SIMULADA[2,],15, main = "HISTOGRAMA SIMULACIoN TRM", col ="gray")

base=t(TRM_SIMULADA)

#Posiciones
posicion=(base[,3]-base[,1])

#Largo
posicion_largo=sum(posicion>0)
posicion_largo
## [1] 5034
#Corto
posicion_corto=sum(posicion<0)
posicion_corto
## [1] 4966
#Probabilidad de las posiciones
prob_largo = posicion_largo/(posicion_largo+posicion_corto)
prob_largo
## [1] 0.5034
prob_corto = posicion_corto/(posicion_largo+posicion_corto)
prob_corto
## [1] 0.4966
#Calculamos los promedios de los cortos y los largos
posicion_largo= posicion[posicion > 0]

prom_largo=mean(posicion_largo)
prom_largo
## [1] 18.73507
posicion_corto= posicion[posicion < 0]

prom_corto= abs(mean(posicion_corto)) #Valor absoluto
prom_corto
## [1] 18.00449
#Payoffs = Compensacion
payoff_corto<-(prom_corto*10000)
payoff_corto
## [1] 180044.9
payoff_largo<-(prom_largo*10000)
payoff_largo
## [1] 187350.7

SOLUCIoN DE PREGUNTAS DEL EJERCICIO - PARTE 1

1.¿Como se analiza estadisticamente el precio de la TRM en este lapso de informacion?

R/: Para analizar estadisticamente el precio de la (TRM) en Colombia en un lapso de tiempo desde el año 2000 hasta la fecha, asignando probabilidades basadas en frecuencia y bajo el supuesto de que los rendimientos siguen una distribucion normal, hacemos lo siguiente:

Descargamos los datos historicos de la TRM para el periodo de tiempo desde la pagina del Banco de la Republica.

Luego calculamos los rendimientos de los precios teniendo en cuenta que los rendimientos van a seguir una distribucion log-normal.

Calculamos los parametros de la distribucion normal como la media y desviacion estandar basados en los rendimientos.

Luego realiamos el analisis estadistico basico donde tenemos en cuenta la media, desvicion, sesgo y curtosis principalmente para analizar si la distribucion de los precios es mesocurtica o leptocurtica y si los valores estan o no muy alejados de la media.

Luego hacemos un analisis grafico donde hacemos histograma de frecuencias, grafico de precios y rendimientos.

Podemos utilizar los parametros anteriores para asignar probabilidades a pronosticos que queremos hacer.

2.¿Como se analiza estadisticamente el precio de la TRM en este lapso de informacion?

R/: No es estrictamente necesario acortar la informacion cuando se analiza un periodo de 20 años de variacion en la (TRM), especialmente si el objetivo es comprender la evolucion a largo plazo de esta variable y su comportamiento estadistico a lo largo del tiempo. Sin embargo, la nececesidad de acortar la informacion puede depender de varios factores, incluyendo la volatilidad de la TRM y la relevancia de los datos para la toma de decisiones.

Por otro lado, si la TRM ha experimentado una alta volatilidad en los Ultimos 20 años, puede ser beneficioso acortar la informacion para centrarnos en periodos mas recientes donde los datos son mas relevantes y representativos de las condiciones actuales del mercado.

3.Sabiendo que el valor del activo es al dia de hoy, estime un intervalo de confianza del 95% para el valor en pesos de una importacion de 500.000 USD. ¿Cual es la probabilidad de obtener una perdida de hasta un 3% en un dia? y la probabilidad de ganar hasta un 5% en un dia?

qnorm(c(0.05,0.95),mean = mean(Rtos_TRM),sd=sd(Rtos_TRM))
## [1] -0.009679389  0.009838594

Probabilidad de obtener una perdida de hasta un 3% en un dia.

pnorm(-0.03,mean =mean(Rtos_TRM),sd=sd(Rtos_TRM))
## [1] 1.990732e-07

Probabilidad de ganar hasta un 5% en un dia.

pnorm(0.05,mean =mean(Rtos_TRM),sd=sd(Rtos_TRM))
## [1] 1

4.¿Si usted invierte 10.000.000 COP cual es la probabilidad de obtener perdidas entre -500.000 Y 500.000 COP en un dia?

inversion=10000000
perdida=-500000
ganancia=500000
#Suponiendo una distribucion normal.
media=mean(Rtos_TRM)
sd=sd(Rtos_TRM)

#Probabilidades
prob_perdida=pnorm(perdida, mean=media,sd=sd)
prob_ganancia=pnorm(ganancia, mean=media,sd=sd)

probabilidad_perdida = prob_ganancia - prob_perdida

De acuerdo a los calculos, la probabilidad es de 1.

SIMULACIoN DE MONTECARLO- EJERCICIO DE FUTUROS

Usted toma una posicion corta en 10 contratos de futuros de la TRM (TRMH24F) y que tienen un precio actual de4198 COP por cada USD. Sabiendo que cada contrato es de 50.000 USD y que usted deposita 150.000.000 de COP en la cuenta de margen, realice una simulacion de Montecarlo con 10.000 iteraciones bajo el supuesto de que los rendimientos continuos mensuales del futuro, siguen una distribucion normal con media de 1% y desviacion estandar del 3%, para determinar:

datos1 = read.table("TRMH.BD.txt", head = T)

head(datos1)
##        Fecha    TRMH
## 1  1/08/2023 4230.00
## 2 15/08/2023 4328.39
## 3 29/08/2023 4293.11
## 4  5/09/2023 4269.00
## 5  6/09/2023 4269.95
## 6  7/09/2023 4228.60
class(datos1[,"Fecha"])
## [1] "character"
#Se convierte a formato de fecha la columna "Fecha"
datos1[,"Fecha"]<-as.Date(datos1[,"Fecha"],format = "%d/%m/%Y")
class(datos1[,"Fecha"])
## [1] "Date"

Analizamos la serie futura TRMH24F desde 2023-08-01, hasta 2024-02-01.

Calculamos los rendimientos diarios continuos, la media y desviacon estandar.

Rtos_TRMH<-diff(log(datos1[,"TRMH"]))

media_futuro=mean(Rtos_TRMH)
desviacion_futuro=sd(Rtos_TRMH)

Simulacion del futuro TRMH24F

Numero_iteraciones=10000
TRM_Inicial1=4198
TRM_SIMULADA1=matrix(,3,Numero_iteraciones)

TRM_SIMULADA1[1,]=TRM_Inicial1

for(j in 1:Numero_iteraciones){
  for(i in 2:3){
    TRM_SIMULADA1[i,j]=TRM_Inicial1*exp(rnorm(1,mean = media_futuro,sd=desviacion_futuro))
  }
}

matplot(TRM_SIMULADA1,type = "l", col = "blue", main="TRM FUTURO SIMULADO")

#Histograma TRM SIMULADA
hist(TRM_SIMULADA1[2,],20, main = "HISTOGRAMA SIMULACION FUTURO", col="brown")

base1=t(TRM_SIMULADA1)

Posicion en futuro TRMH24F

posicion1=(base1[,3]-base1[,1])

#Largo
posicion_largo1=sum(posicion1>0)
posicion_largo1
## [1] 4845
#Corto
posicion_corto1=sum(posicion1<0)
posicion_corto1
## [1] 5155

Probabilidades para cada posicion

prob_largo1 = posicion_largo1/(posicion_largo1+posicion_corto1)
prob_largo1
## [1] 0.4845
prob_corto1 = posicion_corto1/(posicion_largo1+posicion_corto1)
prob_corto1
## [1] 0.5155

Calculamos los promedios de los cortos y los largos

posicion_largo1= posicion1[posicion1 > 0]

prom_largo1=mean(posicion_largo1)
prom_largo1
## [1] 41.71588
posicion_corto1= posicion1[posicion1 < 0]

prom_corto1= abs(mean(posicion_corto1)) #Valor absoluto
prom_corto1
## [1] 43.79129
payoff_corto1<-(prom_corto1*50000)
payoff_corto1
## [1] 2189564
payoff_largo1<-(prom_largo1*50000)
payoff_largo1
## [1] 2085794

Calculo margen y Liquidacion del contrato

Numero_de_contratos = 10
Precio_inicial = 4198
Nominal_contrato = 50000    
Exposicion_Total = Numero_de_contratos*Nominal_contrato*Precio_inicial
Exposicion_Contrato = Exposicion_Total/Numero_de_contratos
Valor_garantia_minima = 130000000
Valor_cuenta_de_margen=150000000

Solucion a las preguntas sobre futuros

1.Un intervalo de prediccion del 90% del valor de la cuenta de margen para dentro de un mes.

media1=0.01
desvest=0.03

cuenta_margen <- numeric(Numero_iteraciones)
for (j in 1:Numero_iteraciones) {
  precio_futuro = TRM_SIMULADA1[3, j]
  valor_contratos = Numero_de_contratos * Nominal_contrato * precio_futuro
  cuenta_margen[j] = Valor_cuenta_de_margen + valor_contratos - (Numero_de_contratos * Nominal_contrato * Precio_inicial)
}

#Intervalo de predicci?n

qnorm(c(0.10,0.90),mean = media1,sd=desvest)
## [1] -0.02844655  0.04844655

2.La probabilidad de perder mas de 10.000.000 COP en un mes..

prob_perdida <- 10000000/150000000

pnorm(-prob_perdida,mean =media1,sd=desvest)
## [1] 0.005300922

3.Si el margen minimo es de 130.000.000 COP ?Cu?l es la probabilidad de ser llamado al margen?

prob_margen_call <- mean(cuenta_margen < Valor_garantia_minima)
prob_margen_call*100
## [1] 24.26

La probabilidad de ser llamado al margen es aproximadamente del 25%

LABORATORIO #2

TEMA: MBG Y PRECIOS FUTUROS

A continuacion, realizaremos una practica de simulaciones con MBG y precios futuros, se mostrara el codigo de ejecucion en R-Studio y el analisis correspondiente a cada calculo.

Cargar datos.

datos_trm = read.table("trm_cm.txt", head = T)

# Tamaño de la muestra
n <- nrow(datos_trm)

#Vector de precios
precios = datos_trm[,-1]
precios = ts(precios)

#Precio actual de la TRM
s = tail(precios,1)
s = as.numeric(s)
s
## [1] 4435.84
# Verificar que el formato de la fecha sea correcto.
datos_trm[,"Fecha"]<-as.Date(datos_trm[,"Fecha"],format = "%d/%m/%Y")
datos_trm <- datos_trm %>% arrange(Fecha)

Media y desviacion de los precios de la TRM

mean_precios <- mean(precios)
sd_precios <- sd(precios)

Vector de rendimientos diarios

Rtos_diarios = diff(log(precios))

#Vector rendimientos anuales
Rtos_anuales = (Rtos_diarios) * 252

# MEDIA de rendimientos diaria
media_diaria = mean(Rtos_diarios)
media_diaria
## [1] 9.985647e-05

Volatilidad diaria(SIGMA/DESVIACIoN)

volatilidad_diaria = sd(Rtos_diarios)
volatilidad_diaria
## [1] 0.005793936
#Volatilidad anual
Volatilidad_Anual = sd(Rtos_diarios) * 252

Media de rendimientos anual

media_Anual = mean(Rtos_diarios) * 252
media_Anual
## [1] 0.02516383

Grafica de la TRM.

plot(datos_trm[,"Fecha"],datos_trm[,"TRM"], type = "l", col = "blue", main = "Serie Historica TRM")

Primera parte

1. En una tabla, calcule e interprete la estadistica descriptiva (media, desviacion estandar, rendimiento anual, volatilidad anual, cuantiles, sesgo, curtosis, minimo y maximo).

Estadistica basica

Sobre Precios:

max(datos_trm[,"TRM"])
## [1] 4627.46
min(datos_trm[,"TRM"])
## [1] 1652.41
mean(datos_trm[,"TRM"])
## [1] 2557.236
sd(datos_trm[,"TRM"])
## [1] 643.4042
skewness(datos_trm[,"TRM"])
## [1] 0.7396229
## attr(,"method")
## [1] "moment"
kurtosis(datos_trm[,"TRM"])
## [1] -0.3242297
## attr(,"method")
## [1] "excess"
estad_precios=cbind(Estadistica=c("Max", "Min", "Mean", "Desv", "Sesgo", "Kurtosis"), Precios=c(max(datos_trm[,"TRM"]),min(datos_trm[,"TRM"]),mean(datos_trm[,"TRM"]),sd(datos_trm[,"TRM"]),skewness(datos_trm[,"TRM"]),kurtosis(datos_trm[,"TRM"])))
kable(estad_precios)
Estadistica Precios
Max 4627.46
Min 1652.41
Mean 2557.23567738023
Desv 643.404192995458
Sesgo 0.739622931866897
Kurtosis -0.324229650715073
#Cuantiles precios
quantile(datos_trm[,"TRM"],c(0.01,0.05,0.1,0.5,0.75,0.90,0.95,0.99))
##       1%       5%      10%      50%      75%      90%      95%      99% 
## 1761.332 1789.422 1829.806 2348.690 2956.060 3585.096 3830.822 4129.870

Sobre Rendimientos:

max(Rtos_diarios)
## [1] 0.05930667
min(Rtos_diarios)
## [1] -0.05621935
mean(Rtos_diarios)
## [1] 9.985647e-05
sd(Rtos_diarios)
## [1] 0.005793936
skewness(Rtos_diarios)
## [1] 0.2648758
## attr(,"method")
## [1] "moment"
kurtosis(Rtos_diarios)
## [1] 10.86486
## attr(,"method")
## [1] "excess"
estad_rendimientos=cbind(Estadistica=c("Max", "Min", "Mean", "Desv", "Sesgo", "Kurtosis"), Rendimientos=c(max(Rtos_diarios),min(Rtos_diarios),mean(Rtos_diarios),sd(Rtos_diarios),skewness(Rtos_diarios),kurtosis(Rtos_diarios)))
kable(estad_rendimientos)
Estadistica Rendimientos
Max 0.0593066743064448
Min -0.0562193503314647
Mean 9.98564672132738e-05
Desv 0.00579393554029575
Sesgo 0.264875847430311
Kurtosis 10.8648621122529
#Comparacion de cuantiles

qqnorm(Rtos_diarios)
qqline(Rtos_diarios)

#Cuantiles rendimientos
quantile(Rtos_diarios,c(0.01,0.05,0.1,0.5,0.75,0.90,0.95,0.99))
##           1%           5%          10%          50%          75%          90% 
## -0.016423437 -0.008573411 -0.005472213  0.000000000  0.001321027  0.005783864 
##          95%          99% 
##  0.009335290  0.018358968

2.Calcule de manera teorica un intervalo de confianza al 95% sobre los posibles precios futuros de la TRM.

#Para los precios
qnorm(c(0.05,0.95),mean = mean(precios),sd=sd(precios))
## [1] 1498.930 3615.541
#Para los rendimientos
qnorm(c(0.05,0.95),mean = mean(Rtos_diarios),sd=sd(Rtos_diarios))
## [1] -0.009430319  0.009630032

3. Realizando una simulacion MBG con S=Precio de la TRM del 17 de septiembre de 2022, y t=180, volatilidad = historica de la serie, mu = historica de la serie, iteraciones = 10000, de los posibles precios futuros.

Simulacion MBG

# Definir los parametros
S =s  # Precio de la TRM del 17 de septiembre de 2022
t <- 180   # Tiempo en dias
volatilidad <- volatilidad_diaria  # Volatilidad historica de la serie
mu <- media_diaria  # Tasa de crecimiento/rendimiento historica de la serie
iteraciones <- 10000  # Numero de iteraciones

# Crear una funcion para simular el MBG
set.seed(123) #Establecer una semilla
simular_MB <- function(S, t, volatilidad, mu, iteraciones) {
  precios_futuros <- numeric(iteraciones)
  for (i in 1:iteraciones) {
    W_t <- rnorm(1, mean = 0, sd = sqrt(t))  # Generar un valor del proceso Browniano
    S_t <- S * exp((mu - 0.5 * volatilidad^2) * t + volatilidad * W_t)  # Calcular el precio futuro
    precios_futuros[i] <- S_t
  }
  return(precios_futuros)
}

precios_simulados = simular_MB(S, t, volatilidad, mu, iteraciones)

# Ver los primeros 5 precios simulados
head(precios_simulados, 5)
## [1] 4310.707 4422.819 5082.657 4527.413 4548.147

3.a. Grafique la distribucion empirica

Grafico del histograma y densidad

hist(precios_simulados, breaks = 30, prob = TRUE, col = "skyblue", main = "Distribucion Empirica de Precios Futuros", xlab = "Precio Futuro", ylab = "Densidad")

# Curva de densidad
densidad <- density(precios_simulados)
lines(densidad, col = "red", lwd = 2)

La grafica nos muestra la distribucion empirica de los precios futuros simulados.Esta tiende a ser mesocurtica. La curva de densidad (en rojo) nos da una idea de la forma de la distribucion.

3.b. Calcule los cuantiles al 2.5% y 97.5% de los posibles precios.

cuantil_2_5 <- quantile(precios_simulados, 0.025)
cuantil_97_5 <- quantile(precios_simulados, 0.975)

3.c. Grafique sus resultados.

hist(precios_simulados, breaks = 30, prob = TRUE, col = "skyblue", main = "Distribución Empirica de Precios Futuros", xlab = "Precio Futuro", ylab = "Densidad")

# Curva de densidad
densidad <- density(precios_simulados)
lines(densidad, col = "red", lwd = 2)
abline(v = cuantil_2_5, col = "blue", lty = 2)
abline(v = cuantil_97_5, col = "blue", lty = 2)

# Mostrar los cuantiles en la leyenda
legend("topright", legend = c("Distribucion Empirica", "Densidad", "Cuantiles al 2.5% y 97.5%"), fill = c("skyblue", "red", NA), lty = c(0, 1, 2), col = c(NA, "red", "blue"), lwd = c(0, 2, 1), bty = "n", title = "Datos")

# Imprimir los cuantiles
cat("Cuantil al 2.5%:", cuantil_2_5, "\n")
## Cuantil al 2.5%: 3861.165
cat("Cuantil al 97.5%:", cuantil_97_5, "\n")
## Cuantil al 97.5%: 5240.09

Existe una probabilidad del 95% de que el precio futuro esta dentro del rango de 3865.042 y 5242.569 pesos.

3.d. Que puede concluir sobre los posibles precios futuros?

Cuantil al 2.5%: 3,865.042: Podemos decir que el 2.5% de los precios futuros simulados son inferiores o iguales a $3,865.042. En otras palabras, hay un 2.5% de probabilidad de que el precio futuro sea igual o inferior a este valor.

Cuantil al 97.5%: 5242.569: Esto nos indica que el 97.5% de los precios futuros simulados son inferiores o iguales a $5,242.569. Por lo tanto, hay un 97.5% de probabilidad de que el precio futuro sea igual o inferior a este valor.

Precio actual de la TRM:

s
## [1] 4435.84

Conclusiones

Dado que el ultimo precio conocido (s) es de 4,435.84, y los cuantiles al 2.5% y 97.5% son 3,865.042 y $5,242.569 respectivamente, podemos inferir lo siguiente:

-El rango entre estos cuantiles nos proporciona una estimacionn de la incertidumbre asociada con los posibles precios futuros. Cuanto mas amplio sea este rango, mayor sera la incertidumbre.

-Dado que el precio actual es $4435.84 y cae dentro de este rango, podemos concluir que, en general, es recomendable que el precio futuro esta en linea con el precio actual, pero hay una cierta variabilidad y riesgo asociados con el pronostico debido a la volatilidad de los precios y otros factores inherentes.

-Basandonos en este analisis, concluimos que los precios futuros de la TRM estan sujetos a una considerable incertidumbre y variabilidad, lo que es un reflejo de las fluctuaciones historicas y de la naturaleza impredecible de los mercados financieros. Aunque las simulaciones proporcionan una guia sobre lo que podria esperarse en terminos de movimientos de precios, la realidad del mercado podria desviarse significativamente de estos rangos proyectados debido a eventos inesperados o cambios en las condiciones economicas.

Segunda Parte

Proyecte la TRM por medio de simulacion MBG con 1000 iteraciones, los parametros del ejercicio se ejecutan a traves de los valores historicos de desviacion estandar, promedio de los rendimientos de la serie.

S <- 4066  # Tasa de cambio actual en COP
t <- 180/252  # Proyeccion a futuro en terminos anuales (para 180 dias)
mu <- mean(Rtos_diarios, na.rm = TRUE) * 252  # Rendimiento anual estimado
sigma <- sd(Rtos_diarios, na.rm = TRUE) * sqrt(252)  # Volatilidad anual estimada

iteraciones <- 1000  # Numero de iteraciones para la nueva simulacion

precios_simulados_TRM <- numeric(iteraciones)

set.seed(123)  # Garantiza la reproducibilidad
for(i in 1:iteraciones) {
  Z <- rnorm(1)  # Generar un valor aleatorio de una distribucion normal estandar
  
  precios_simulados_TRM[i] <- S * exp((mu - 0.5 * sigma^2) * t + sigma * sqrt(t) * Z)
  
}

CI_inferior <- quantile(precios_simulados_TRM, probs = 0.025)
CI_superior <- quantile(precios_simulados_TRM, probs = 0.975)
cat("El intervalo de confianza del 95% para el precio futuro de la TRM es de:", CI_inferior, "a", CI_superior, "\n")
## El intervalo de confianza del 95% para el precio futuro de la TRM es de: 3549.079 a 4835.697

Simule el flujo de caja total esperado para las cuotas sin cobertura de un futuro.

pagos_usd <- c(91738, 90992, 90246, 89500, 88754)
fechas <- as.Date(c("2022-10-17", "2022-11-17", "2022-12-17", "2023-01-17", "2023-02-17"))

S <- 4066  # Tasa de cambio actual en COP
mu <- 0.0001039  # Media de rendimientos
sigma <- 0.091816  # Desviacion estandar de los rendimientos
dias <- as.numeric(difftime(fechas, as.Date("2022-09-17"), units = "days"))  # Dias hasta cada pago

iteraciones <- 1000  # Numero de iteraciones para la simulacion

set.seed(123)
flujo_caja_total <- numeric(iteraciones)

for (i in 1:iteraciones) {
  flujo_caja <- 0
  for (j in 1:length(pagos_usd)) {
    t <- dias[j] / 365
    TRM_futura <- S * exp((mu - 0.5 * sigma^2) * t + sigma * sqrt(t) * rnorm(1))
    flujo_caja <- flujo_caja + pagos_usd[j] * TRM_futura
  }
  flujo_caja_total[i] <- flujo_caja
}

media_flujo_caja <- mean(flujo_caja_total)
CI_inferior <- quantile(flujo_caja_total, probs = 0.025)
CI_superior <- quantile(flujo_caja_total, probs = 0.975)

cat("El flujo de caja total esperado promedio es:", media_flujo_caja, "COP\n")
## El flujo de caja total esperado promedio es: 1834672565 COP
cat("El intervalo de confianza del 95% para el flujo de caja total esperado es de:", CI_inferior, "a", CI_superior, "COP\n")
## El intervalo de confianza del 95% para el flujo de caja total esperado es de: 1766560152 a 1903628808 COP

Simule el flujo de caja total esperado para las cuotas con cobertura de un futuro.

pagos_usd <- c(91738, 90992, 90246, 89500, 88754)
fechas <- as.Date(c("2022-10-17", "2022-11-17", "2022-12-17", "2023-01-17", "2023-02-17"))
S <- 4066
cobertura <- 0.70
exposicion <- 1 - cobertura

mu <- 0.0001039
sigma <- 0.091816
dias <- as.numeric(difftime(fechas, as.Date("2022-09-17"), units = "days"))
iteraciones <- 1000

set.seed(123)
flujo_caja_total_con_cobertura <- numeric(iteraciones)

for (i in 1:iteraciones) {
  flujo_caja_con_cobertura <- 0
  for (j in 1:length(pagos_usd)) {
    t <- dias[j] / 365
    TRM_futura <- S * exp((mu - 0.5 * sigma^2) * t + sigma * sqrt(t) * rnorm(1))
    pago_cubierto <- pagos_usd[j] * cobertura * S
    
    pago_no_cubierto <- pagos_usd[j] * exposicion * TRM_futura
    
    flujo_caja_con_cobertura <- flujo_caja_con_cobertura + pago_cubierto + pago_no_cubierto
  }
  flujo_caja_total_con_cobertura[i] <- flujo_caja_con_cobertura
}

media_flujo_caja_con_cobertura <- mean(flujo_caja_total_con_cobertura)
CI_inferior_con_cobertura <- quantile(flujo_caja_total_con_cobertura, probs = 0.025)
CI_superior_con_cobertura <- quantile(flujo_caja_total_con_cobertura, probs = 0.975)

cat("El flujo de caja total esperado promedio con cobertura es:", media_flujo_caja_con_cobertura, "COP\n")
## El flujo de caja total esperado promedio con cobertura es: 1834692595 COP
cat("El intervalo de confianza del 95% para el flujo de caja total esperado con cobertura es de:", CI_inferior_con_cobertura, "a", CI_superior_con_cobertura, "COP\n")
## El intervalo de confianza del 95% para el flujo de caja total esperado con cobertura es de: 1814258872 a 1855379468 COP

Obtenga los beneficios reales de las series de la pregunta 2 y 3.

media_flujo_caja_sin_cobertura <- mean(flujo_caja_total)
media_flujo_caja_con_cobertura <- mean(flujo_caja_total_con_cobertura)

beneficio_real <- media_flujo_caja_con_cobertura - media_flujo_caja_sin_cobertura

cat("El beneficio real obtenido de aplicar la cobertura es:", beneficio_real, "COP\n")
## El beneficio real obtenido de aplicar la cobertura es: 20030.65 COP
CI_inferior_sin_cobertura <- quantile(flujo_caja_total, probs = 0.025)
CI_superior_sin_cobertura <- quantile(flujo_caja_total, probs = 0.975)
CI_inferior_con_cobertura <- quantile(flujo_caja_total_con_cobertura, probs = 0.025)
CI_superior_con_cobertura <- quantile(flujo_caja_total_con_cobertura, probs = 0.975)

cat("El intervalo de confianza del 95% para el flujo de caja total esperado sin cobertura es de:", CI_inferior_sin_cobertura, "a", CI_superior_sin_cobertura, "COP\n")
## El intervalo de confianza del 95% para el flujo de caja total esperado sin cobertura es de: 1766560152 a 1903628808 COP
cat("El intervalo de confianza del 95% para el flujo de caja total esperado con cobertura es de:", CI_inferior_con_cobertura, "a", CI_superior_con_cobertura, "COP\n")
## El intervalo de confianza del 95% para el flujo de caja total esperado con cobertura es de: 1814258872 a 1855379468 COP

Realizar la cuenta de margen con el flujo de caja operado.

diferencia_flujo_caja <- flujo_caja_total_con_cobertura - flujo_caja_total
media_diferencia_flujo_caja <- mean(diferencia_flujo_caja)

porcentaje_margen <- 0.10
requerimiento_margen <- porcentaje_margen * media_diferencia_flujo_caja

cat("La diferencia promedio del flujo de caja debido a la cobertura es:", media_diferencia_flujo_caja, "COP\n")
## La diferencia promedio del flujo de caja debido a la cobertura es: 20030.65 COP
cat("El requerimiento de margen, asumiendo un 10% de la diferencia promedio, es:", requerimiento_margen, "COP\n")
## El requerimiento de margen, asumiendo un 10% de la diferencia promedio, es: 2003.065 COP

Cual es la probabilidad de ser llamado al margen si solo se deposita en la cuenta el margen inicial?

margen_inicial <- 0.10 * media_flujo_caja_sin_cobertura
veces_bajo_margen <- sum(flujo_caja_total_con_cobertura < margen_inicial)

probabilidad_llamado_margen <- veces_bajo_margen / iteraciones

cat("La probabilidad de ser llamado al margen si solo se deposita el margen inicial es:", probabilidad_llamado_margen * 100, "%\n")
## La probabilidad de ser llamado al margen si solo se deposita el margen inicial es: 0 %

Cuanto deberia de haber en la cuenta de margen al inicio para que la probabilidad de ser llamado al margen antes de cubrir el primer flujo sea menor al 1%?

calcular_probabilidad_llamado_margen <- function(margen_inicial, flujo_caja_total_con_cobertura) {
  veces_bajo_margen <- sum(flujo_caja_total_con_cobertura < margen_inicial)
  probabilidad_llamado_margen <- veces_bajo_margen / length(flujo_caja_total_con_cobertura)
  return(probabilidad_llamado_margen)
}

margen_inicial <- 0
probabilidad_objetivo <- 0.01

while (TRUE) {
  probabilidad <- calcular_probabilidad_llamado_margen(margen_inicial, flujo_caja_total_con_cobertura)
  if (probabilidad < probabilidad_objetivo) {
    break
  }
  margen_inicial <- margen_inicial + 10000
}

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, "COP\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: 0 COP

Tercera parte

1. Como resultan las tasas simuladas con 10 iteraciones, para los siguientes 10 periodos, a 252 dias.

r0 <- 0.05
k <- 0.3
theta <- 0.08
sigma <- 0.03
dt <- 1/252

iteraciones <- 10
periodos <- 10
t <- seq(0, periodos*dt, by = dt)

tasas_simuladas <- matrix(NA, nrow = iteraciones, ncol = length(t))

set.seed(123)

for (i in 1:iteraciones) {
  tasas_simuladas[i, 1] <- r0
  for (j in 2:length(t)) {
    dW <- rnorm(1, mean = 0, sd = sqrt(dt))
    dR <- k * (theta - tasas_simuladas[i, j-1]) * dt + sigma * dW
    tasas_simuladas[i, j] <- tasas_simuladas[i, j-1] + dR
  }
}
print(tasas_simuladas)
##       [,1]       [,2]       [,3]       [,4]       [,5]       [,6]       [,7]
##  [1,] 0.05 0.04897651 0.04857845 0.05156154 0.05172865 0.05200663 0.05528113
##  [2,] 0.05 0.05234901 0.05306191 0.05385137 0.05409167 0.05307207 0.05648108
##  [3,] 0.05 0.04801772 0.04764386 0.04574341 0.04440672 0.04326788 0.04012405
##  [4,] 0.05 0.05084166 0.05031874 0.05204570 0.05373849 0.05532240 0.05665319
##  [5,] 0.05 0.04872284 0.04836715 0.04601343 0.05015284 0.05247120 0.05038150
##  [6,] 0.05 0.05051444 0.05049559 0.05044970 0.05307130 0.05267669 0.05557507
##  [7,] 0.05 0.05075317 0.04983868 0.04924488 0.04735657 0.04536994 0.04598478
##  [8,] 0.05 0.04910775 0.04478061 0.04672321 0.04542256 0.04416351 0.04614432
##  [9,] 0.05 0.05004661 0.05081038 0.05014465 0.05139795 0.05101531 0.05167683
## [10,] 0.05 0.05191326 0.05298307 0.05346639 0.05231135 0.05491570 0.05381118
##             [,8]       [,9]      [,10]      [,11]
##  [1,] 0.05618160 0.05381922 0.05255235 0.05174281
##  [2,] 0.05744992 0.05376021 0.05511689 0.05425302
##  [3,] 0.04175480 0.04209017 0.03998443 0.04240155
##  [4,] 0.05772779 0.05763730 0.05708571 0.05639396
##  [5,] 0.04965538 0.04880961 0.05032073 0.05019851
##  [6,] 0.05267728 0.05381463 0.05407986 0.05451881
##  [7,] 0.04687231 0.04701192 0.04879411 0.05270556
##  [8,] 0.04564645 0.04338041 0.04376663 0.04354729
##  [9,] 0.05378338 0.05463700 0.05405125 0.05625318
## [10,] 0.05797603 0.06089861 0.06047592 0.05855941

2. Como quedan las curvas yield de ambas tasas en los periodos descritos.

rendimientos <- apply(tasas_simuladas, 2, function(x) c(0, diff(x) / x[-length(x)]))

periodos_secuencia <- seq(0, periodos*dt, by = dt)[-1]

plot(periodos_secuencia, rendimientos[,1], type = "l", col = "blue", ylim = c(min(rendimientos), max(rendimientos)),
     xlab = "Tiempo", ylab = "Rendimiento", main = "Curvas de Rendimiento de Tasas Simuladas")
for (i in 2:iteraciones) {
  lines(periodos_secuencia, rendimientos[,i], col = "blue")
}

LABORATORIO #3

TEMA: OPCIONES Y ARBOLES BINOMIALES

A continuacion, mostraremos la ejecucion correspondiente en R-Studio para establecer el uso adecuado de una inversion 10.000 dolares, ademas de la cobertura en opciones de acciones financieras.

PARTE 1: Creacion del portafolio Optimo.

Descargamos los datos de precios

library(timetk)
library(tidyquant)
tick <- c('TXN', 'FTNT', 'DLTR')

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

Calculamos los rendimientos diarios

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


#Miramos las primeras filas
head(log_ret_tidy)
## # A tibble: 6 × 3
## # Groups:   symbol [1]
##   symbol date            ret
##   <chr>  <date>        <dbl>
## 1 TXN    2013-01-02  0      
## 2 TXN    2013-01-03 -0.0131 
## 3 TXN    2013-01-04 -0.00220
## 4 TXN    2013-01-07  0.00314
## 5 TXN    2013-01-08 -0.0117 
## 6 TXN    2013-01-09  0.0142
Usaremos la spread()funcion para convertirlo a un formato amplio y tambien lo convertiremos en un objeto de serie temporal usando xts()la funcion
library(timetk)
log_ret_xts <- log_ret_tidy %>%
  spread(symbol, value = ret) %>%
  tk_xts()

head(log_ret_xts)
##                    DLTR         FTNT          TXN
## 2013-01-02  0.000000000  0.000000000  0.000000000
## 2013-01-03 -0.010582159 -0.091871076 -0.013084532
## 2013-01-04  0.003539811 -0.001035183 -0.002197429
## 2013-01-07  0.008544917 -0.013031186  0.003137755
## 2013-01-08 -0.024060950  0.001572750 -0.011659171
## 2013-01-09 -0.021506154  0.004703402  0.014162420

Calculamos los rendimientos diarios de cada activo

mean_ret <- colMeans(log_ret_xts)
print(round(mean_ret, 5))
##    DLTR    FTNT     TXN 
## 0.00046 0.00106 0.00075

Calculamos la matriz de covarianza

cov_mat <- cov(log_ret_xts) * 252

print(round(cov_mat,4))
##        DLTR   FTNT    TXN
## DLTR 0.1024 0.0296 0.0264
## FTNT 0.0296 0.1526 0.0482
## TXN  0.0264 0.0482 0.0736

Creamos pesos aleatorios en cada accion

wts <- runif(n = length(tick))
print(wts)
## [1] 0.2387260 0.9623589 0.6013657
print(sum(wts))
## [1] 1.802451
#Ajustamos a que sumen el 100%
wts <- wts/sum(wts)
print(wts)
## [1] 0.1324452 0.5339169 0.3336378
sum(wts)
## [1] 1

Calculamos los rendimientos anualizados de la cartera

port_returns <- (sum(wts * mean_ret) + 1)^252 - 1
port_returns
## [1] 0.2474924

Calcularemos el riesgo de la cartera (Desviacion estandar). Esta sera la desviacion estandar anualizada de la cartera

port_risk <- sqrt(t(wts) %*% (cov_mat %*% wts))
print(port_risk)
##           [,1]
## [1,] 0.2777969

Indice de Sharpe: Asumiremos una tasa libre de riesgo del 0% para calcular el Indice de Sharpe.

sharpe_ratio <- port_returns/port_risk
print(sharpe_ratio)
##           [,1]
## [1,] 0.8909114

Calculamos los precios aleatorios

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

Calculamos los rendimientos de la cartera

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

Calculamos el riesgo de la cartera

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

Calculamos el indice de Sharpe

sharpe_ratio <- port_returns/port_risk

print(wts)
## [1] 0.2864699 0.2239194 0.4896108
print(port_returns)
## [1] 0.2041661
print(port_risk)
##           [,1]
## [1,] 0.2355217
print(sharpe_ratio)
##           [,1]
## [1,] 0.8668674

OPTIMIZACION

SIMULACION PARA LA OPTIMIZACION.

Creamos los vectores para almacenar la informacion

num_port <- 5000

#Creamos una matriz para almacenar los pesos aleatorios
all_wts <- matrix(nrow = num_port,
                  ncol = length(tick))

#Creamos el vector para almacenar la rentabilidad de la cartera
port_returns <- vector('numeric', length = num_port)

#Creamos el vector para almacenar la Desviacion Estandar
port_risk <- vector('numeric', length = num_port)

#Creamos el vector para almacenar el indice de Sharpe
sharpe_ratio <- vector('numeric', length = num_port)

#Ejecutamos el bucle 5000 veces
for (i in seq_along(port_returns)) {
  
  wts <- runif(length(tick))
  wts <- wts/sum(wts)
  
  #Almacenamiento de peso en la matriz
  all_wts[i,] <- wts
  
  #Rentabilidad de la cartera
  port_ret <- sum(wts * mean_ret)
  port_ret <- ((port_ret + 1)^252) - 1
  
  #Almacenamiento rentabilidad de la cartera
  port_returns[i] <- port_ret
  
  #Crear y almacenar el riesgo de la cartera
  port_sd <- sqrt(t(wts) %*% (cov_mat  %*% wts))
  port_risk[i] <- port_sd
  
  #Creacion y almacenamiento de Ratios Sharpe de 
  #cartera asumiendo una tasa libre de riesgo del 0%
  sr <- port_ret/port_sd
  sharpe_ratio[i] <- sr
  
}

Almacenar los valores en una tabla

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


#Convertir una matriz en un tibble y cambiar los nombres de las columnas
all_wts <- tk_tbl(all_wts)
colnames(all_wts) <- colnames(log_ret_xts)

#Combinando todos los valores juntos
portfolio_values <- tk_tbl(cbind(all_wts, portfolio_values))

head(portfolio_values)
## # A tibble: 6 × 6
##    DLTR  FTNT    TXN Return  Risk SharpeRatio
##   <dbl> <dbl>  <dbl>  <dbl> <dbl>       <dbl>
## 1 0.442 0.350 0.207   0.203 0.251       0.808
## 2 0.190 0.531 0.279   0.242 0.275       0.881
## 3 0.230 0.719 0.0508  0.257 0.314       0.819
## 4 0.479 0.241 0.280   0.189 0.242       0.782
## 5 0.406 0.454 0.140   0.216 0.264       0.816
## 6 0.405 0.307 0.289   0.202 0.244       0.829
View(portfolio_values)

Calculamos la varianza minima de la cartera

min_var <- portfolio_values[which.min(portfolio_values$Risk),]
min_var
## # A tibble: 1 × 6
##    DLTR  FTNT   TXN Return  Risk SharpeRatio
##   <dbl> <dbl> <dbl>  <dbl> <dbl>       <dbl>
## 1 0.356 0.120 0.524  0.188 0.232       0.812

Calculamos la cartera con mayor ratio de nitidez

max_sr <- portfolio_values[which.max(portfolio_values$SharpeRatio),]
max_sr
## # A tibble: 1 × 6
##     DLTR  FTNT   TXN Return  Risk SharpeRatio
##    <dbl> <dbl> <dbl>  <dbl> <dbl>       <dbl>
## 1 0.0886 0.391 0.520  0.238 0.261       0.910

Tracemos los pesos de cada cartera. Primero con la cartera de minima varianza

p <- min_var %>%
  gather(DLTR:TXN, 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 = 'Assets', y = 'Pesos', title = "Pesos del portafolio de varianza minima") +
  scale_y_continuous(labels = scales::percent) 


#veamos la cartera de tangencia o la cartera con el indice de 
#nitidez mas alto
p <- max_sr %>%
  gather(DLTR:TXN, 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 = 'Accion', y = 'Pesos optimos', title = "Distribucion Optima del Portafolio") +
  scale_y_continuous(labels = scales::percent) +
  
  # Agregar etiquetas de texto para los pesos
  geom_text(aes(label = paste("Peso:", scales::percent(Weights,2))), 
            position = position_stack(vjust = 0.5), color = "white")

p

Finalmente, tracemos todas las carteras aleatorias y visualicemos 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 = 'Annualized Risk',
       y = 'Annualized Returns',
       title = "Optimizacion del portafolio y Frontera Eficiente") +
  geom_point(aes(x = Risk,
                 y = Return), data = min_var, color = 'red') +
  geom_point(aes(x = Risk,
                 y = Return), data = max_sr, color = 'red') +
  annotate('text', x = 0.20, y = 0.42, label = "Portafolio de Tangencia") +
  annotate('text', x = 0.18, y = 0.01, label = "Portafolio de varianza minima") +
  annotate(geom = 'segment', x = 0.14, xend = 0.135,  y = 0.01, 
           yend = 0.06, color = 'red', arrow = arrow(type = "open")) +
  annotate(geom = 'segment', x = 0.22, xend = 0.2275,  y = 0.405, 
           yend = 0.365, color = 'red', arrow = arrow(type = "open"))


p

PREGUNTAS PARTE 1.

1. Analisis tecnico de los activos para fundamentar el como supone invertira el dinero.

Risk (Riesgo del portafolio o volatilidad del portafolio):

El valor del riesgo del portafolio es 0.2753271.Este valor representa la volatilidad del portafolio, es decir, cuanto fluctua el valor del portafolio en relacion con su media. Un valor mas alto indica un mayor nivel de riesgo, lo que significa que el portafolio experimenta fluctuaciones mas amplias en su valor. Para interpretar este valor, es importante considerar la tolerancia del inversionistaal riesgo. Si es mas conservador, es posible que desee un riesgo mas bajo, mientras que si es más tolerante al riesgo, podria aceptar un riesgo mas alto en busca de mayores rendimientos.

Indice de Sharpe (Sharpe Ratio):

El valor del indice de Sharpe es 0.8289797.El indice de Sharpe mide la relacion entre el rendimiento adicional obtenido por unidad de riesgo asumido. Un valor más alto indica un mejor rendimiento ajustado por riesgo. Este valor te proporciona una medida de la eficiencia del portafolio en terminos de como esta generando rendimientos en relacion con el nivel de riesgo asumido. Un Sharpe Ratio por encima de 1 es considerado bueno, mientras que por encima de 2 es excelente.

Para invertir los 10.000 USD, podriamos ajustar la asignacion de fondos entre los activos para equilibrar el rendimiento potencial con el nivel de riesgo que se esta dispuesto a asumir como inversionista.

2. ¿Cuales son los pesos optimos de inversion para sus cuatro acciones?, analice.

El rendimiento del portafolio es de 0.2282406 y la volatilidad de 0.2753271, por lo tanto, para obtener este portafolio los pesos se tienen que distribuir de la siguiente forma: 8% aproximadamente en DLTR, 40% en FTNT, 0% en ISA y 52% en TXN.

3. ¿Cual es el valor de Sharpe Ratio Optimo de inversion, ¿cual es el valor de la varianza historica de cada activo, que significa?

El Sharpe optimo de la cartera de inversion es 0.8189793. Este valor indica que por cada unidad de riesgo asumida en el portafolio, se esta obteniendo un rendimiento de aproximadamente 0.8189793 unidades.Este Sharpe Ratio de 0.8189793 puede considerarse “optimo” en relacion con el nivel de riesgo asumido en el portafolio y las condiciones del mercado. El valor de varianza historica de cada activo es el siguiente: TXN=0.523: los rendimientos de TXN han experimentado una mayor dispersion en el pasado en comparacion con los otros dos activos. FTNT=0.394: tiene una varianza historica de 0.394, que es menor que la de TXN pero mayor que la de DLTR. Esto sugiere que FTNT ha experimentado una dispersion moderada en sus rendimientos en el pasado. DLTR=0.0826:DLTR tiene la varianza historica mas baja de 0.0826, lo que indica que los rendimientos de DLTR han sido relativamente menos volatiles en comparacion con TXN y FTNT.

PARTE 2: Creacion de Arboles binomiales a traves del modelo Cox-Ross-Rubinstein (CRR).

library(ggplot2)
library(derivmkts)
library(options)
library(Deriv)
library(quantmod)
library(OptionPricing)

# Especificacion de los simbolos bursátiles y el periodo de tiempo
symbols <- c('TXN', 'FTNT', 'DLTR')
start_date <- "2023-06-01"
end_date <- "2024-04-17"


# Obtenemos los precios historicos de acciones
getSymbols(symbols, src = "yahoo", from = "2023-06-01", to = "2024-04-17")
## [1] "TXN"  "FTNT" "DLTR"
# Ver las filas mas recientes de los datos descargados
tail(TXN)
##            TXN.Open TXN.High TXN.Low TXN.Close TXN.Volume TXN.Adjusted
## 2024-04-09   171.00   173.52  170.13    173.46    4830700     172.2188
## 2024-04-10   169.87   170.41  167.90    168.92    5662800     167.7112
## 2024-04-11   169.90   171.85  168.13    171.20    4352100     169.9749
## 2024-04-12   168.42   169.43  165.77    166.33    5472400     165.1398
## 2024-04-15   168.29   169.34  165.32    166.35    4739500     165.1596
## 2024-04-16   167.48   168.52  166.82    167.59    3389000     166.3907
tail(FTNT)
##            FTNT.Open FTNT.High FTNT.Low FTNT.Close FTNT.Volume FTNT.Adjusted
## 2024-04-09     69.14     69.14    67.80      68.22     2799600         68.22
## 2024-04-10     67.08     68.50    67.08      68.13     3641300         68.13
## 2024-04-11     68.61     68.86    67.44      68.22     2917900         68.22
## 2024-04-12     67.47     67.72    65.93      66.45     5132600         66.45
## 2024-04-15     67.08     67.19    64.58      64.73     4911100         64.73
## 2024-04-16     64.62     65.57    64.26      64.48     3015000         64.48
tail(DLTR)
##            DLTR.Open DLTR.High DLTR.Low DLTR.Close DLTR.Volume DLTR.Adjusted
## 2024-04-09    128.01    128.93   126.58     127.33     2093600        127.33
## 2024-04-10    125.46    129.26   124.91     128.73     2436800        128.73
## 2024-04-11    130.00    131.42   128.72     130.25     2005600        130.25
## 2024-04-12    129.15    129.63   124.98     125.19     3462800        125.19
## 2024-04-15    127.19    128.00   125.32     125.36     2201900        125.36
## 2024-04-16    124.81    125.72   123.34     124.06     1936700        124.06
#Crear la columna de precio de cierre ajustado
TXN= Ad(TXN)
FTNT= Ad(FTNT)
DLTR= Ad(DLTR)

Precio actual de las acciones

s_txn = tail(TXN,1)
s_ftnt = tail(FTNT,1)
s_dltr = tail(DLTR,1)
s_txn = as.numeric(s_txn)
s_ftnt = as.numeric(s_ftnt)
s_dltr = as.numeric(s_dltr)
s_txn
## [1] 166.3907
s_ftnt
## [1] 64.48
s_dltr
## [1] 124.06

Media de los precios

media_precios_txn <- mean(TXN)
media_precios_ftnt <- mean(FTNT)
media_precios_dltr <- mean(DLTR)

Valoracion con la volatilidad historica (Volatilidad de la parte 1 = 0.2496516

v_hist=0.2496516

PUNTO 1. a: VALUACIoN DE OPCIONES CALL Y PUT (Volatilidad Historica)

Formula de valoracion de opciones de Black-Scholes

bs_option_price_quantmod <- function(type, underlying, strike, expire, rate, volatility, div = 0) {
  T <- expire
  S <- underlying
  K <- strike
  r <- rate
  sigma <- v_hist
  D <- div
  
  d1 <- (log(S / K) + (r - D + 0.5 * sigma^2) * T) / (sigma * sqrt(T))
  d2 <- d1 - sigma * sqrt(T)
  
  if (type == "call") {
    option_price <- S * exp(-D * T) * pnorm(d1) - K * exp(-r * T) * pnorm(d2)
  } else if (type == "put") {
    option_price <- K * exp(-r * T) * pnorm(-d2) - S * exp(-D * T) * pnorm(-d1)
  } else {
    stop("Invalid option type. Use 'call' or 'put'.")
  }
  
  return(option_price)
}

ACCIoN TXN

Usando una estrategia de opciones a corto plazo de tres meses (0,25 = ~90 dias)

underlying_price <- s_txn # Precio actual de la accion
strike_price <- 175 # Precio strike
time_to_expiry <- 0.25 # Tiempo vencimiento en años (son 90 dias)
risk_free_rate <- 0.0112584 # Tasa libre de riesgo
dividend_yield <- 0.0293 # Dividendos de la accion (2.93%)Los dividendos de TXN se pagan trimestralmente.
volatility <- v_hist # Volatilidad Historica

# Calculamos el precio de la opcion de compra de Black-Scholes para TXN
txn_bs_call_price <- bs_option_price_quantmod(type = "call",
                                               underlying = underlying_price,
                                               strike = strike_price,
                                               expire = time_to_expiry,
                                               rate = risk_free_rate,
                                               volatility = v_hist,
                                               div = dividend_yield)

# Imprimimos el resultado
print(paste("TXN Precio de opción de compra (con quantmod):", txn_bs_call_price))
## [1] "TXN Precio de opción de compra (con quantmod): 4.59141696444379"

Calculamos el precio de la opcion Black-Scholes con tasa de interes variable

black_scholes_with_rate_change <- function(S, K, T, r, r_new, sigma, type = "call") {
  d1 <- (log(S / K) + ((r_new + (sigma^2) / 2) * T)) / (sigma * sqrt(T))
  d2 <- d1 - sigma * sqrt(T)
  
  if (type == "call") {
    option_price <- S * pnorm(d1) - K * exp(-r_new * T) * pnorm(d2)
  } else {
    option_price <- K * exp(-r_new * T) * pnorm(-d2) - S * pnorm(-d1)
  }
  
  return(option_price)
}


# Establecer parametros
S <- s_txn  # Precio actual de TXN
K <- 175  # Precio Strike
r <- 0.0112584  # Tasa libre de riesgo inicial
sigma <- v_hist  #Volatilidad Historica

# Definir un rango de puntos de tiempo (por ejemplo, de 0 a 1 con incrementos de 0,1)
T <- seq(0, 1, 0.1)

# Calcule los precios de las opciones en diferentes momentos con la tasa de interess inicial
option_prices_initial_rate <- sapply(T, function(t) black_scholes_with_rate_change(S, K, t, r, r, sigma))

# Nueva tasa de interes (caida de 25 puntos basicos)
r_new <- r - 0.0025  # Ajuste por caida de 25 puntos basicos

# Calcular los precios de las opciones en diferentes momentos con la nueva tasa de interes
option_prices_new_rate <- sapply(T, function(t) black_scholes_with_rate_change(S, K, t, r, r_new, sigma))

# Crear un nuevo data frames para trazar
df_initial_rate <- data.frame(Time = T, OptionPrice = option_prices_initial_rate, RateType = "Initial Rate")
df_new_rate <- data.frame(Time = T, OptionPrice = option_prices_new_rate, RateType = "New Rate")

# Combinar los data frames
df_combined <- rbind(df_initial_rate, df_new_rate)

Trazamos la evolucion del precio de la opcion a lo largo del tiempo con tasas de interes tanto iniciales como nuevas

ggplot(df_combined, aes(x = Time, y = OptionPrice, color = RateType)) +
  geom_line() +
  labs(title = "Evolucion del precio de la opcion TXN a lo largo del tiempo con cambio de tasa de interes.",
       x = "Tiempo hasta el vencimiento (anos)",
       y = "Precio de la opcion") +
  theme_minimal() +
  scale_color_manual(values = c("blue", "red"))

ACCIoN FTNT

Usando una estrategia de opciones a corto plazo de tres meses (0,25 = ~90 dias)

underlying_price <- s_ftnt # Precio actual de la accion
strike_price <- 64 # Precio strike
time_to_expiry <- 0.25 # Tiempo vencimiento en años (son 90 dias)
risk_free_rate <- 0.0112584 # Tasa libre de riesgo
dividend_yield <- 0 # Dividendos de la accion - NO PAGA DIVIDENDOS A SUS ACCIONISTAS
volatility <- v_hist # Volatilidad Historica

# Calculamos el precio de la opcion de compra de Black-Scholes para FTNT
ftnt_bs_call_price <- bs_option_price_quantmod(type = "call",
                                              underlying = underlying_price,
                                              strike = strike_price,
                                              expire = time_to_expiry,
                                              rate = risk_free_rate,
                                              volatility = v_hist,
                                              div = dividend_yield)

# Imprimimos el resultado
print(paste("FTNT Precio de opcion de compra (con quantmod):", ftnt_bs_call_price))
## [1] "FTNT Precio de opcion de compra (con quantmod): 3.53325272180764"

Calculamos el precio de la opcion Black-Scholes con tasa de interes variable

black_scholes_with_rate_change <- function(S, K, T, r, r_new, sigma, type = "call") {
  d1 <- (log(S / K) + ((r_new + (sigma^2) / 2) * T)) / (sigma * sqrt(T))
  d2 <- d1 - sigma * sqrt(T)
  
  if (type == "call") {
    option_price <- S * pnorm(d1) - K * exp(-r_new * T) * pnorm(d2)
  } else {
    option_price <- K * exp(-r_new * T) * pnorm(-d2) - S * pnorm(-d1)
  }
  
  return(option_price)
}


# Establecer parametros
S <- s_ftnt  # Precio actual de FTNT
K <- 64  # Precio Strike
r <- 0.0112584  # Tasa libre de riesgo inicial
sigma <- v_hist  #Volatilidad Historica

# Definir un rango de puntos de tiempo (por ejemplo, de 0 a 1 con incrementos de 0,1)
T <- seq(0, 1, 0.1)

# Calcule los precios de las opciones en diferentes momentos con la tasa de interes inicial
option_prices_initial_rate <- sapply(T, function(t) black_scholes_with_rate_change(S, K, t, r, r, sigma))

# Nueva tasa de interes (caida de 25 puntos basicos)
r_new <- r - 0.0025  # Ajuste por caida de 25 puntos basicos

# Calcular los precios de las opciones en diferentes momentos con la nueva tasa de interes
option_prices_new_rate <- sapply(T, function(t) black_scholes_with_rate_change(S, K, t, r, r_new, sigma))

# Crear un nuevo data frames para trazar
df_initial_rate <- data.frame(Time = T, OptionPrice = option_prices_initial_rate, RateType = "Initial Rate")
df_new_rate <- data.frame(Time = T, OptionPrice = option_prices_new_rate, RateType = "New Rate")

# Combinar los data frames
df_combined <- rbind(df_initial_rate, df_new_rate)

Trazamos la evolucion del precio de la opcion a lo largo del tiempo con tasas de interes tanto iniciales como nuevas

ggplot(df_combined, aes(x = Time, y = OptionPrice, color = RateType)) +
  geom_line() +
  labs(title = "Evolucion del precio de la opcion FTNT a lo largo del tiempo con cambio de tasa de interes.",
       x = "Tiempo hasta el vencimiento (anos)",
       y = "Precio de la opcion") +
  theme_minimal() +
  scale_color_manual(values = c("blue", "red"))

ACCIoN DLTR

Usando una estrategia de opciones a corto plazo de tres meses (0,25 = ~90 dias)

underlying_price <- s_dltr # Precio actual de la accion
strike_price <- 120 # Precio strike
time_to_expiry <- 0.25 # Tiempo vencimiento en años (son 90 dias)
risk_free_rate <- 0.0112584 # Tasa libre de riesgo
dividend_yield <- 0 # Dividendos de la accion - NO PAGA DIVIDENDOS A SUS ACCIONISTAS
volatility <- v_hist # Volatilidad Historica

# Calculamos el precio de la opcion de compra de Black-Scholes para DLTR
dltr_bs_call_price <- bs_option_price_quantmod(type = "call",
                                               underlying = underlying_price,
                                               strike = strike_price,
                                               expire = time_to_expiry,
                                               rate = risk_free_rate,
                                               volatility = v_hist,
                                               div = dividend_yield)

# Imprimimos el resultado
print(paste("DLTR Precio de opcion de compra:", dltr_bs_call_price))
## [1] "DLTR Precio de opcion de compra: 8.51452389650376"
# Funcion para calcular el precio de la opcion Black-Scholes con tasa de interes variable
black_scholes_with_rate_change <- function(S, K, T, r, r_new, sigma, type = "call") {
  d1 <- (log(S / K) + ((r_new + (sigma^2) / 2) * T)) / (sigma * sqrt(T))
  d2 <- d1 - sigma * sqrt(T)
  
  if (type == "call") {
    option_price <- S * pnorm(d1) - K * exp(-r_new * T) * pnorm(d2)
  } else {
    option_price <- K * exp(-r_new * T) * pnorm(-d2) - S * pnorm(-d1)
  }
  
  return(option_price)
}


# Establecer parametros
S <- s_dltr  # Precio actual de DLTR
K <- 120  # Precio Strike
r <- 0.0112584  # Tasa libre de riesgo inicial
sigma <- v_hist  #Volatilidad Historica

# Definir un rango de puntos de tiempo (por ejemplo, de 0 a 1 con incrementos de 0,1)
T <- seq(0, 1, 0.1)

# Calcule los precios de las opciones en diferentes momentos con la tasa de interes inicial
option_prices_initial_rate <- sapply(T, function(t) black_scholes_with_rate_change(S, K, t, r, r, sigma))

# Nueva tasa de interes (caida de 25 puntos basicos)
r_new <- r - 0.0025  # Ajuste por caida de 25 puntos basicos

# Calcular los precios de las opciones en diferentes momentos con la nueva tasa de interes
option_prices_new_rate <- sapply(T, function(t) black_scholes_with_rate_change(S, K, t, r, r_new, sigma))

# Crear un nuevo data frames para trazar
df_initial_rate <- data.frame(Time = T, OptionPrice = option_prices_initial_rate, RateType = "Initial Rate")
df_new_rate <- data.frame(Time = T, OptionPrice = option_prices_new_rate, RateType = "New Rate")

# Combinar los data frames
df_combined <- rbind(df_initial_rate, df_new_rate)

Trazamos la evolucion del precio de la opcion a lo largo del tiempo con tasas de interes tanto iniciales como nuevas

ggplot(df_combined, aes(x = Time, y = OptionPrice, color = RateType)) +
  geom_line() +
  labs(title = "Evolucion del precio de la opcion DLTR a lo largo del tiempo con cambio de tasa de interes.",
       x = "Tiempo hasta el vencimiento (anos)",
       y = "Precio de la opcion") +
  theme_minimal() +
  scale_color_manual(values = c("blue", "red"))

TXN

Modelo Cox Ross Rubinstein para TXN

Funcion para calcular el precio de la opcion usando logica similar a CRR

crr_option_price <- function(S0, X, T, r, sigma, n, type = "call") {
  delta_t <- T / n
  u <- exp(sigma * sqrt(delta_t))
  d <- 1 / u
  p <- (exp(r * delta_t) - d) / (u - d)
  
    # Generar precios de acciones al vencimiento
  ST <- S0 * u^(n:0) * d^(0:n)
  
  # Calcular los pagos de las opciones al vencimiento
  payoff <- pmax(ST - X, 0)  # Para una opcion call
  
  # Induccion hacia atras para calcular el precio de la opcion en t=0
  for (i in (n - 1):0) {
    payoff <- exp(-r * delta_t) * (p * payoff[2:(i + 2)] + (1 - p) * payoff[1:(i + 1)])
  }
  
  return(payoff[1])
}

Establecemos los Parametros

underlying_price_txn <- s_txn
strike_price_txn <- 175
time_to_expiry_txn <- 0.25
risk_free_rate_txn <- 0.0112584
dividend_yield_txn <- 0.0293/0.25
volatility_txn <- v_hist
n_txn <- 3   # Numero de periodos

# Calcular el precio de la opcion de compra de TXN utilizando un modelo similar al CRR
txn_crr_price <- crr_option_price(underlying_price_txn, 
                                   strike_price_txn, time_to_expiry_txn, 
                                   risk_free_rate_txn, volatility_txn, n_txn)

# Imprimir el resultado
print(txn_crr_price)
## [1] 5.672842

Creando un modelo de arbol binomial opcion CALL CRR para TXN

s <- s_txn # Precio actual de las acciones
k <- 175 # Precio Strike
tt <- 0.25 # Tiempo de vencimiento (Años)
r <- 0.0112584 # Tasa de riesgo
d <- 0.0293/0.25 # Tasa yield
v <- v_hist # Volatilidad
nstep <- 3 # Numero de pasos en el arbol binomial

# Calcular el precio de la opcion y la informacion asociada.
result <- binomopt(s, k, v, r, tt, d, nstep, american = FALSE, putopt = FALSE, returntrees = TRUE, returnparams = TRUE)

# Calcular el precio de la opcion de compra Europea
europea_call_option_price <- binomopt(s, k, v, r, tt, d, nstep, american = FALSE, putopt = FALSE, returntrees = TRUE, returnparams = TRUE)[[1]]

# Acceder a los parametros devueltos
oppricretree <- result$oppricretree
delta <- result$delta
bond <- result$bond

# Imprima o use estos parametros segun sea necesario (tiempo de retorno 0 delta, gamma y theta en los vectores griegos)
print(oppricretree)
## NULL
print(delta)
##         [,1]      [,2]      [,3]
## [1,] 0.25239 0.4920126 0.9591363
## [2,] 0.00000 0.0000000 0.0000000
## [3,] 0.00000 0.0000000 0.0000000
# Imprimir precios de opciones
cat("Precio opcion Call Europea", europea_call_option_price, "\n")
## Precio opcion Call Europea 2.920046

Trazamos arbol binomial para opcion de compra europea

binomplot(s, k, v, r, tt, d, nstep, putopt = FALSE, american = FALSE, 
          plotvalues= TRUE, plotarrows= TRUE, drawstrike= TRUE, pointsize= 3, ylimval=c(0,0),
          saveplot= FALSE, saveplotfn='TXN CRR Plots.png', 
          crr= TRUE, jarrowrudd= FALSE, titles = TRUE, specifyupdn = FALSE, 
          returnprice = TRUE, logy = FALSE)

## [1] 3.523129
# Creando un modelo de arbol binomial opcion PUT CRR para TXN
s <- s_txn # Precio actual de las acciones
k <- 177.5 # Precio Strike
tt <- 0.25 # Tiempo de vencimiento (Años)
r <- 0.0112584 # Tasa libre de riesgo
d <- 0.0293/0.25 # Tasa yield
v <- v_hist # Volatilidad
nstep <- 3 # Numero de pasos en el arbol binomial

# Calcular el precio de la opcion y la informacion asociada.
result <- binomopt(s, k, v, r, tt, d, nstep, american = FALSE, 
                   putopt = FALSE, returntrees = TRUE, 
                   returnparams = TRUE)

# Calcular el precio de la opcion de venta Europea
europea_put_option_price <- binomopt(s, k, v, r, tt, d, nstep, 
                                      american = FALSE, putopt = TRUE, 
                                      returntrees = TRUE, returnparams = TRUE)[[1]]

# Accediendo a los parametros devueltos
oppricretree <- result$oppricretree
delta <- result$delta
bond <- result$bond

# Parametros segun sea necesario
print(oppricretree)
## NULL
print(delta)
##           [,1]      [,2]      [,3]
## [1,] 0.2282623 0.4449777 0.8674458
## [2,] 0.0000000 0.0000000 0.0000000
## [3,] 0.0000000 0.0000000 0.0000000
print(bond)
##           [,1]      [,2]     [,3]
## [1,] -35.33984 -73.38939 -152.406
## [2,]   0.00000   0.00000    0.000
## [3,]   0.00000   0.00000    0.000
# Imprimir precios de opciones
cat("Precio opcion PUT Europea:", europea_put_option_price, "\n")
## Precio opcion PUT Europea: 18.05578

Trazar el arbol binomial para la opcion de venta europea

binomplot(s, k, v, r, tt, d, nstep, putopt = TRUE, american = FALSE,           
          plotvalues= TRUE, plotarrows= TRUE, drawstrike= TRUE, pointsize= 3, ylimval=c(0,0),
          saveplot= FALSE, saveplotfn='TXN CRR Plots.png', 
          crr= TRUE, jarrowrudd= FALSE, titles = TRUE, specifyupdn = FALSE, 
          returnprice = TRUE, logy = FALSE)

## [1] 17.98426

FTNT

Modelo Cox Ross Rubinstein para FTNT

Funcion para calcular el precio de la opcion usando logica similar a CRR

crr_option_price <- function(S0, X, T, r, sigma, n, type = "call") {
  delta_t <- T / n
  u <- exp(sigma * sqrt(delta_t))
  d <- 1 / u
  p <- (exp(r * delta_t) - d) / (u - d)
  
  
  # Generar precios de acciones al vencimiento
  ST <- S0 * u^(n:0) * d^(0:n)
  
  # Calcular los pagos de las opciones al vencimiento
  payoff <- pmax(ST - X, 0)  # Para una opcion call
  
  # Induccion hacia atras para calcular el precio de la opcion en t=0
  for (i in (n - 1):0) {
    payoff <- exp(-r * delta_t) * (p * payoff[2:(i + 2)] + (1 - p) * payoff[1:(i + 1)])
  }
  
  return(payoff[1])
}

Establecemos los Parametros

underlying_price_ftnt <- s_ftnt
strike_price_ftnt <- 64
time_to_expiry_ftnt <- 0.25
risk_free_rate_ftnt <- 0.0112584
dividend_yield_ftnt <- 0
volatility_ftnt <- v_hist
n_ftnt <- 3   # Numero de periodos

# Calcular el precio de la opcion de compra de FTNT utilizando un modelo similar al CRR
ftnt_crr_price <- crr_option_price(underlying_price_txn, 
                                  strike_price_ftnt, time_to_expiry_ftnt, 
                                  risk_free_rate_ftnt, volatility_ftnt, n_ftnt)

# Imprimir el resultado
print(ftnt_crr_price)
## [1] 104.2312

Creando un modelo de arbol binomial opcion CALL CRR para FTNT

s <- s_ftnt # Precio actual de las acciones
k <- 64 # Precio Strike
tt <- 0.25 # Tiempo de vencimiento (Años)
r <- 0.0112584 # Tasa de riesgo
d <- 0 # Tasa yield
v <- v_hist # Volatilidad
nstep <- 3 # Numero de pasos en el arbol binomial

# Calcular el precio de la opcion y la informacion asociada.
result <- binomopt(s, k, v, r, tt, d, nstep, american = FALSE, putopt = FALSE, returntrees = TRUE, returnparams = TRUE)

# Calcular el precio de la opcion de compra Europea
europea_call_option_price <- binomopt(s, k, v, r, tt, d, nstep, american = FALSE, putopt = FALSE, returntrees = TRUE, returnparams = TRUE)[[1]]

# Acceder a los parametros devueltos
oppricretree <- result$oppricretree
delta <- result$delta
bond <- result$bond

# Imprima o use estos parametros segun sea necesario (tiempo de retorno 0 delta, gamma y theta en los vectores griegos)
print(oppricretree)
## NULL
print(delta)
##           [,1]      [,2]      [,3]
## [1,] 0.5624264 0.8018775 1.0000000
## [2,] 0.0000000 0.3050813 0.5889496
## [3,] 0.0000000 0.0000000 0.0000000
# Imprimir precios de opciones
cat("Precio opcion Call Europea", europea_call_option_price, "\n")
## Precio opcion Call Europea 3.794328

Trazamos arbol binomial para opcion de compra europea

binomplot(s, k, v, r, tt, d, nstep, putopt = FALSE, american = FALSE, 
          plotvalues= TRUE, plotarrows= TRUE, drawstrike= TRUE, pointsize= 3, ylimval=c(0,0),
          saveplot= FALSE, saveplotfn='FTNT CRR Plots.png', 
          crr= TRUE, jarrowrudd= FALSE, titles = TRUE, specifyupdn = FALSE, 
          returnprice = TRUE, logy = FALSE)

## [1] 3.799584

Creando un modelo de arbol binomial opcion PUT CRR para FTNT

s <- s_ftnt # Precio actual de las acciones
k <- 65 # Precio Strike
tt <- 0.25 # Tiempo de vencimiento (Años)
r <- 0.0112584 # Tasa libre de riesgo
d <- 0 # Tasa yield
v <- v_hist # Volatilidad
nstep <- 3 # Numero de pasos en el arbol binomial

# Calcular el precio de la opcion y la informacion asociada.
result <- binomopt(s, k, v, r, tt, d, nstep, american = FALSE, 
                   putopt = FALSE, returntrees = TRUE, 
                   returnparams = TRUE)

# Calcular el precio de la opcion de venta Europea
europea_put_option_price <- binomopt(s, k, v, r, tt, d, nstep, 
                                     american = FALSE, putopt = TRUE, 
                                     returntrees = TRUE, returnparams = TRUE)[[1]]

# Accediendo a los parametros devueltos
oppricretree <- result$oppricretree
delta <- result$delta
bond <- result$bond

# Parametros segun sea necesario
print(oppricretree)
## NULL
print(delta)
##           [,1]      [,2]      [,3]
## [1,] 0.5088949 0.7502071 1.0000000
## [2,] 0.0000000 0.2495497 0.4817476
## [3,] 0.0000000 0.0000000 0.0000000
print(bond)
##           [,1]      [,2]      [,3]
## [1,] -29.49088 -46.25684 -64.93905
## [2,]   0.00000 -13.94415 -28.95747
## [3,]   0.00000   0.00000   0.00000
# Imprimir precios de opciones
cat("Precio opcion PUT Europea:", europea_put_option_price, "\n")
## Precio opcion PUT Europea: 3.659965

Trazamos el arbol binomial para la opcion de venta europea

binomplot(s, k, v, r, tt, d, nstep, putopt = TRUE, american = FALSE,           
          plotvalues= TRUE, plotarrows= TRUE, drawstrike= TRUE, pointsize= 3, ylimval=c(0,0),
          saveplot= FALSE, saveplotfn='FTNT CRR Plots.png', 
          crr= TRUE, jarrowrudd= FALSE, titles = TRUE, specifyupdn = FALSE, 
          returnprice = TRUE, logy = FALSE)

## [1] 3.655497

DLTR

Modelo Cox Ross Rubinstein para DLTR

Funcion para calcular el precio de la opcion usando logica similar a CRR

crr_option_price <- function(S0, X, T, r, sigma, n, type = "call") {
  delta_t <- T / n
  u <- exp(sigma * sqrt(delta_t))
  d <- 1 / u
  p <- (exp(r * delta_t) - d) / (u - d)
  
  
  # Generar precios de acciones al vencimiento
  ST <- S0 * u^(n:0) * d^(0:n)
  
  # Calcular los pagos de las opciones al vencimiento
  payoff <- pmax(ST - X, 0)  # Para una opcion call
  
  # Induccion hacia atras para calcular el precio de la opcion en t=0
  for (i in (n - 1):0) {
    payoff <- exp(-r * delta_t) * (p * payoff[2:(i + 2)] + (1 - p) * payoff[1:(i + 1)])
  }
  
  return(payoff[1])
}

Establecemos los Parametros

underlying_price_dltr <- s_dltr
strike_price_dltr <- 120
time_to_expiry_dltr <- 0.25
risk_free_rate_dltr <- 0.0112584
dividend_yield_dltr <- 0
volatility_dltr <- v_hist
n_dltr <- 3   # Numero de periodos

# Calcular el precio de la opcion de compra de FTNT utilizando un modelo similar al CRR
dltr_crr_price <- crr_option_price(underlying_price_dltr, 
                                   strike_price_dltr, time_to_expiry_dltr, 
                                   risk_free_rate_dltr, volatility_dltr, n_dltr)

# Imprimir el resultado
print(dltr_crr_price)
## [1] 9.634682

Creando un modelo de arbol binomial opcion CALL CRR para DLTR

s <- s_dltr # Precio actual de las acciones
k <- 120 # Precio Strike
tt <- 0.25 # Tiempo de vencimiento (Años)
r <- 0.0112584 # Tasa de riesgo
d <- 0 # Tasa yield
v <- v_hist # Volatilidad
nstep <- 3 # Numero de pasos en el arbol binomial

# Calcular el precio de la opcion y la informacion asociada.
result <- binomopt(s, k, v, r, tt, d, nstep, american = FALSE, putopt = FALSE, returntrees = TRUE, returnparams = TRUE)

# Calcular el precio de la opcion de compra Europea
europea_call_option_price <- binomopt(s, k, v, r, tt, d, nstep, american = FALSE, putopt = FALSE, returntrees = TRUE, returnparams = TRUE)[[1]]

# Acceder a los parametros devueltos
oppricretree <- result$oppricretree
delta <- result$delta
bond <- result$bond

# Imprima o use estos parametros segun sea necesario (tiempo de retorno 0 delta, gamma y theta en los vectores griegos)
print(oppricretree)
## NULL
print(delta)
##          [,1]      [,2]      [,3]
## [1,] 0.649692 0.8861093 1.0000000
## [2,] 0.000000 0.3956076 0.7637076
## [3,] 0.000000 0.0000000 0.0000000
# Imprimir precios de opciones
cat("Precio opcion Call Europea", europea_call_option_price, "\n")
## Precio opcion Call Europea 8.779688

Trazamos árbol binomial para opcion de compra europea

binomplot(s, k, v, r, tt, d, nstep, putopt = FALSE, american = FALSE, 
          plotvalues= TRUE, plotarrows= TRUE, drawstrike= TRUE, pointsize= 3, ylimval=c(0,0),
          saveplot= FALSE, saveplotfn='DLTR CRR Plots.png', 
          crr= TRUE, jarrowrudd= FALSE, titles = TRUE, specifyupdn = FALSE, 
          returnprice = TRUE, logy = FALSE)

## [1] 8.820299
# Creando un modelo de arbol binomial opcion PUT CRR para DLTR
s <- s_dltr # Precio actual de las acciones
k <- 122 # Precio Strike
tt <- 0.25 # Tiempo de vencimiento (Años)
r <- 0.0112584 # Tasa libre de riesgo
d <- 0 # Tasa yield
v <- v_hist # Volatilidad
nstep <- 3 # Numero de pasos en el arbol binomial

# Calcular el precio de la opcion y la informacion asociada.
result <- binomopt(s, k, v, r, tt, d, nstep, american = FALSE, 
                   putopt = FALSE, returntrees = TRUE, 
                   returnparams = TRUE)

# Calcular el precio de la opcion de venta Europea
europea_put_option_price <- binomopt(s, k, v, r, tt, d, nstep, 
                                     american = FALSE, putopt = TRUE, 
                                     returntrees = TRUE, returnparams = TRUE)[[1]]

# Accediendo a los parametros devueltos
oppricretree <- result$oppricretree
delta <- result$delta
bond <- result$bond

# Parametros segun sea necesario
print(oppricretree)
## NULL
print(delta)
##           [,1]      [,2]      [,3]
## [1,] 0.5940462 0.8323980 1.0000000
## [2,] 0.0000000 0.3378826 0.6522714
## [3,] 0.0000000 0.0000000 0.0000000
print(bond)
##           [,1]      [,2]       [,3]
## [1,] -65.86102 -97.73232 -121.88559
## [2,]   0.00000 -36.32515  -75.43557
## [3,]   0.00000   0.00000    0.00000
# Imprimir precios de opciones
cat("Precio opcion PUT Europea:", europea_put_option_price, "\n")
## Precio opcion PUT Europea: 5.433456

Trazamos el arbol binomial para la opcion de venta europea

binomplot(s, k, v, r, tt, d, nstep, putopt = TRUE, american = FALSE,           
          plotvalues= TRUE, plotarrows= TRUE, drawstrike= TRUE, pointsize= 3, ylimval=c(0,0),
          saveplot= FALSE, saveplotfn='DLTR CRR Plots.png', 
          crr= TRUE, jarrowrudd= FALSE, titles = TRUE, specifyupdn = FALSE, 
          returnprice = TRUE, logy = FALSE)

## [1] 5.454619

PUNTO 1. B: VALUACION DE OPCIONES CALL Y PUT (Volatilidad Implicita)

TXN

Modelo Cox Ross Rubinstein para TXN

Funcion para calcular el precio de la opcion usando logica similar a CRR

crr_option_price <- function(S0, X, T, r, sigma, n, type = "call") {
  delta_t <- T / n
  u <- exp(sigma * sqrt(delta_t))
  d <- 1 / u
  p <- (exp(r * delta_t) - d) / (u - d)
  
  
  # Generar precios de acciones al vencimiento
  ST <- S0 * u^(n:0) * d^(0:n)
  
  # Calcular los pagos de las opciones al vencimiento
  payoff <- pmax(ST - X, 0)  # Para una opcion call
  
  # Induccion hacia atras para calcular el precio de la opcion en t=0
  for (i in (n - 1):0) {
    payoff <- exp(-r * delta_t) * (p * payoff[2:(i + 2)] + (1 - p) * payoff[1:(i + 1)])
  }
  
  return(payoff[1])
}

Establecemos los Parametros

underlying_price_txn <- s_txn
strike_price_txn <- 175
time_to_expiry_txn <- 0.25
risk_free_rate_txn <- 0.0112584
dividend_yield_txn <- 0.0293/0.25
volatility_txn <- 0.2697/0.25
n_txn <- 3   # Numero de periodos

# Calcular el precio de la opcion de compra de TXN utilizando un modelo similar al CRR
txn_crr_price <- crr_option_price(underlying_price_txn, 
                                  strike_price_txn, time_to_expiry_txn, 
                                  risk_free_rate_txn, volatility_txn, n_txn)

# Imprimir el resultado
print(txn_crr_price)
## [1] 69.25294

Creando un modelo de arbol binomial opcion CALL CRR para TXN

s <- s_txn # Precio actual de las acciones
k <- 175 # Precio Strike
tt <- 0.25 # Tiempo de vencimiento (Años)
r <- 0.0112584 # Tasa de riesgo
d <- 0.0293/0.25 # Tasa yield
v <- 0.2697/0.25 # Volatilidad implicita
nstep <- 3 # Numero de pasos en el arbol binomial

# Calcular el precio de la opcion y la informacion asociada.
result <- binomopt(s, k, v, r, tt, d, nstep, american = FALSE, putopt = FALSE, returntrees = TRUE, returnparams = TRUE)

# Calcular el precio de la opcion de compra Europea
europea_call_option_price <- binomopt(s, k, v, r, tt, d, nstep, american = FALSE, putopt = FALSE, returntrees = TRUE, returnparams = TRUE)[[1]]

# Acceder a los parametros devueltos
oppricretree <- result$oppricretree
delta <- result$delta
bond <- result$bond

# Imprima o use estos parametros segun sea necesario (tiempo de retorno 0 delta, gamma y theta en los vectores griegos)
print(oppricretree)
## NULL
print(delta)
##           [,1]      [,2]      [,3]
## [1,] 0.5372886 0.7530015 0.9902809
## [2,] 0.0000000 0.2552346 0.4465091
## [3,] 0.0000000 0.0000000 0.0000000
# Imprimir precios de opciones
cat("Precio opcion Call Europea", europea_call_option_price, "\n")
## Precio opcion Call Europea 32.16549

Trazar arbol binomial para opcion de compra europea

binomplot(s, k, v, r, tt, d, nstep, putopt = FALSE, american = FALSE, 
          plotvalues= TRUE, plotarrows= TRUE, drawstrike= TRUE, pointsize= 3, ylimval=c(0,0),
          saveplot= FALSE, saveplotfn='TXN CRR Plots.png', 
          crr= TRUE, jarrowrudd= FALSE, titles = TRUE, specifyupdn = FALSE, 
          returnprice = TRUE, logy = FALSE)

## [1] 32.36876
# Creando un modelo de arbol binomial opcion PUT CRR para TXN
s <- s_txn # Precio actual de las acciones
k <- 177.5 # Precio Strike
tt <- 0.25 # Tiempo de vencimiento (Años)
r <- 0.0112584 # Tasa libre de riesgo
d <- 0.0293/0.25 # Tasa yield
v <- 0.2621/0.25 # Volatilidad implicita
nstep <- 3 # Numero de pasos en el arbol binomial

# Calcular el precio de la opcion y la informacion asociada.
result <- binomopt(s, k, v, r, tt, d, nstep, american = FALSE, 
                   putopt = FALSE, returntrees = TRUE, 
                   returnparams = TRUE)

# Calcular el precio de la opcion de venta Europea
europea_put_option_price <- binomopt(s, k, v, r, tt, d, nstep, 
                                     american = FALSE, putopt = TRUE, 
                                     returntrees = TRUE, returnparams = TRUE)[[1]]

# Accediendo a los parametros devueltos
oppricretree <- result$oppricretree
delta <- result$delta
bond <- result$bond

# Parametros segun sea necesario
print(oppricretree)
## NULL
print(delta)
##           [,1]      [,2]      [,3]
## [1,] 0.5204509 0.7389192 0.9902809
## [2,] 0.0000000 0.2367893 0.4157844
## [3,] 0.0000000 0.0000000 0.0000000
print(bond)
##           [,1]       [,2]       [,3]
## [1,] -56.45585 -104.13510 -177.33355
## [2,]   0.00000  -21.31971  -50.22167
## [3,]   0.00000    0.00000    0.00000
# Imprimir precios de opciones
cat("Precio opcion PUT Europea:", europea_put_option_price, "\n")
## Precio opcion PUT Europea: 45.55725

Trazar el arbol binomial para la opcion de venta europea

binomplot(s, k, v, r, tt, d, nstep, putopt = TRUE, american = FALSE,           
          plotvalues= TRUE, plotarrows= TRUE, drawstrike= TRUE, pointsize= 3, ylimval=c(0,0),
          saveplot= FALSE, saveplotfn='TXN CRR Plots.png', 
          crr= TRUE, jarrowrudd= FALSE, titles = TRUE, specifyupdn = FALSE, 
          returnprice = TRUE, logy = FALSE)

## [1] 45.81891

FTNT

Modelo Cox Ross Rubinstein para FTNT

Funcion para calcular el precio de la opcion usando logica similar a CRR

crr_option_price <- function(S0, X, T, r, sigma, n, type = "call") {
  delta_t <- T / n
  u <- exp(sigma * sqrt(delta_t))
  d <- 1 / u
  p <- (exp(r * delta_t) - d) / (u - d)
  
  
  # Generar precios de acciones al vencimiento
  ST <- S0 * u^(n:0) * d^(0:n)
  
  # Calcular los pagos de las opciones al vencimiento
  payoff <- pmax(ST - X, 0)  # Para una opcion call
  
  # Induccion hacia atras para calcular el precio de la opcion en t=0
  for (i in (n - 1):0) {
    payoff <- exp(-r * delta_t) * (p * payoff[2:(i + 2)] + (1 - p) * payoff[1:(i + 1)])
  }
  
  return(payoff[1])
}

Establecemos los Parametros

underlying_price_ftnt <- s_ftnt
strike_price_ftnt <- 64
time_to_expiry_ftnt <- 0.25
risk_free_rate_ftnt <- 0.0112584
dividend_yield_ftnt <- 0
volatility_ftnt <- 0.9990/0.25
n_ftnt <- 3   # Numero de periodos

# Calcular el precio de la opcion de compra de FTNT utilizando un modelo similar al CRR
ftnt_crr_price <- crr_option_price(underlying_price_txn, 
                                   strike_price_ftnt, time_to_expiry_ftnt, 
                                   risk_free_rate_ftnt, volatility_ftnt, n_ftnt)

# Imprimir el resultado
print(ftnt_crr_price)
## [1] 2481.554

Creando un modelo de arbol binomial opcion CALL CRR para FTNT

s <- s_ftnt # Precio actual de las acciones
k <- 64 # Precio Strike
tt <- 0.25 # Tiempo de vencimiento (Años)
r <- 0.0112584 # Tasa de riesgo
d <- 0 # Tasa yield
v <- 0.9990/0.25 # Volatilidad implicita
nstep <- 3 # Numero de pasos en el arbol binomial

# Calcular el precio de la opcion y la informacion asociada.
result <- binomopt(s, k, v, r, tt, d, nstep, american = FALSE, putopt = FALSE, returntrees = TRUE, returnparams = TRUE)

# Calcular el precio de la opcion de compra Europea
europea_call_option_price <- binomopt(s, k, v, r, tt, d, nstep, american = FALSE, putopt = FALSE, returntrees = TRUE, returnparams = TRUE)[[1]]

# Acceder a los parametros devueltos
oppricretree <- result$oppricretree
delta <- result$delta
bond <- result$bond

# Imprima o use estos parametros segun sea necesario (tiempo de retorno 0 delta, gamma y theta en los vectores griegos)
print(oppricretree)
## NULL
print(delta)
##           [,1]      [,2]      [,3]
## [1,] 0.8563284 0.9433359 1.0000000
## [2,] 0.0000000 0.5805661 0.7637439
## [3,] 0.0000000 0.0000000 0.0000000
# Imprimir precios de opciones
cat("Precio opcion Call Europea", europea_call_option_price, "\n")
## Precio opcion Call Europea 45.87916

Trazar arbol binomial para opcion de compra europea

binomplot(s, k, v, r, tt, d, nstep, putopt = FALSE, american = FALSE, 
          plotvalues= TRUE, plotarrows= TRUE, drawstrike= TRUE, pointsize= 3, ylimval=c(0,0),
          saveplot= FALSE, saveplotfn='TXN CRR Plots.png', 
          crr= TRUE, jarrowrudd= FALSE, titles = TRUE, specifyupdn = FALSE, 
          returnprice = TRUE, logy = FALSE)

## [1] 45.87936
# Creando un modelo de arbol binomial opcion PUT CRR para FTNT
s <- s_ftnt # Precio actual de las acciones
k <- 65 # Precio Strike
tt <- 0.25 # Tiempo de vencimiento (Años)
r <- 0.0112584 # Tasa libre de riesgo
d <- 0 # Tasa yield
v <- 1.0010/0.25 # Volatilidad implicita
nstep <- 3 # Numero de pasos en el arbol binomial

# Calcular el precio de la opcion y la informacion asociada.
result <- binomopt(s, k, v, r, tt, d, nstep, american = FALSE, 
                   putopt = FALSE, returntrees = TRUE, 
                   returnparams = TRUE)

# Calcular el precio de la opcion de venta Europea
europea_put_option_price <- binomopt(s, k, v, r, tt, d, nstep, 
                                     american = FALSE, putopt = TRUE, 
                                     returntrees = TRUE, returnparams = TRUE)[[1]]

# Accediendo a los parametros devueltos
oppricretree <- result$oppricretree
delta <- result$delta
bond <- result$bond

# Parametros segun sea necesario
print(oppricretree)
## NULL
print(delta)
##           [,1]      [,2]      [,3]
## [1,] 0.8548152 0.9422399 1.0000000
## [2,] 0.0000000 0.5770899 0.7587509
## [3,] 0.0000000 0.0000000 0.0000000
print(bond)
##           [,1]       [,2]      [,3]
## [1,] -9.324416 -27.257708 -64.93905
## [2,]  0.000000  -3.690735 -15.42971
## [3,]  0.000000   0.000000   0.00000
# Imprimir precios de opciones
cat("Precio opcion PUT Europea:", europea_put_option_price, "\n")
## Precio opcion PUT Europea: 46.13138

Trazar el arbol binomial para la opcion de venta europea

binomplot(s, k, v, r, tt, d, nstep, putopt = TRUE, american = FALSE,           
          plotvalues= TRUE, plotarrows= TRUE, drawstrike= TRUE, pointsize= 3, ylimval=c(0,0),
          saveplot= FALSE, saveplotfn='FTNT CRR Plots.png', 
          crr= TRUE, jarrowrudd= FALSE, titles = TRUE, specifyupdn = FALSE, 
          returnprice = TRUE, logy = FALSE)

## [1] 46.13121

DLTR

Modelo Cox Ross Rubinstein para DLTR

Funcion para calcular el precio de la opcion usando logica similar a CRR

crr_option_price <- function(S0, X, T, r, sigma, n, type = "call") {
  delta_t <- T / n
  u <- exp(sigma * sqrt(delta_t))
  d <- 1 / u
  p <- (exp(r * delta_t) - d) / (u - d)
  
  
  # Generar precios de acciones al vencimiento
  ST <- S0 * u^(n:0) * d^(0:n)
  
  # Calcular los pagos de las opciones al vencimiento
  payoff <- pmax(ST - X, 0)  # Para una opcion call
  
  # Induccion hacia atras para calcular el precio de la opcion en t=0
  for (i in (n - 1):0) {
    payoff <- exp(-r * delta_t) * (p * payoff[2:(i + 2)] + (1 - p) * payoff[1:(i + 1)])
  }
  
  return(payoff[1])
}

Establecemos los Parametros

underlying_price_dltr <- s_dltr
strike_price_dltr <- 120
time_to_expiry_dltr <- 0.25
risk_free_rate_dltr <- 0.0112584
dividend_yield_dltr <- 0
volatility_dltr <- 0.2788/0.25
n_dltr <- 3   # Numero de periodos

# Calcular el precio de la opcion de compra de FTNT utilizando un modelo similar al CRR
dltr_crr_price <- crr_option_price(underlying_price_dltr, 
                                   strike_price_dltr, time_to_expiry_dltr, 
                                   risk_free_rate_dltr, volatility_dltr, n_dltr)

# Imprimir el resultado
print(dltr_crr_price)
## [1] 61.31284

Creando un modelo de arbol binomial opcion CALL CRR para DLTR

s <- s_dltr # Precio actual de las acciones
k <- 120 # Precio Strike
tt <- 0.25 # Tiempo de vencimiento (Años)
r <- 0.0112584 # Tasa de riesgo
d <- 0 # Tasa yield
v <- 0.2788/0.25 # Volatilidad implicita
nstep <- 3 # Numero de pasos en el arbol binomial

# Calcular el precio de la opcion y la informacion asociada.
result <- binomopt(s, k, v, r, tt, d, nstep, american = FALSE, putopt = FALSE, returntrees = TRUE, returnparams = TRUE)

# Calcular el precio de la opcion de compra Europea
europea_call_option_price <- binomopt(s, k, v, r, tt, d, nstep, american = FALSE, putopt = FALSE, returntrees = TRUE, returnparams = TRUE)[[1]]

# Acceder a los parametros devueltos
oppricretree <- result$oppricretree
delta <- result$delta
bond <- result$bond

# Imprima o use estos parametros segun sea necesario (tiempo de retorno 0 delta, gamma y theta en los vectores griegos)
print(oppricretree)
## NULL
print(delta)
##           [,1]      [,2]      [,3]
## [1,] 0.6450422 0.8461651 1.0000000
## [2,] 0.0000000 0.3675350 0.6339054
## [3,] 0.0000000 0.0000000 0.0000000
# Imprimir precios de opciones
cat("Precio opcion Call Europea", europea_call_option_price, "\n")
## Precio opcion Call Europea 31.12264

Trazar arbol binomial para opcion de compra europea

binomplot(s, k, v, r, tt, d, nstep, putopt = FALSE, american = FALSE, 
          plotvalues= TRUE, plotarrows= TRUE, drawstrike= TRUE, pointsize= 3, ylimval=c(0,0),
          saveplot= FALSE, saveplotfn='DLTR CRR Plots.png', 
          crr= TRUE, jarrowrudd= FALSE, titles = TRUE, specifyupdn = FALSE, 
          returnprice = TRUE, logy = FALSE)

## [1] 31.13137
# Creando un modelo de arbol binomial opcion PUT CRR para DLTR
s <- s_dltr # Precio actual de las acciones
k <- 122 # Precio Strike
tt <- 0.25 # Tiempo de vencimiento (Años)
r <- 0.0112584 # Tasa libre de riesgo
d <- 0 # Tasa yield
v <- 0.2578/0.25 # Volatilidad implicita
nstep <- 3 # Numero de pasos en el arbol binomial

# Calcular el precio de la opcion y la informacion asociada.
result <- binomopt(s, k, v, r, tt, d, nstep, american = FALSE, 
                   putopt = FALSE, returntrees = TRUE, 
                   returnparams = TRUE)

# Calcular el precio de la opcion de venta Europea
europea_put_option_price <- binomopt(s, k, v, r, tt, d, nstep, 
                                     american = FALSE, putopt = TRUE, 
                                     returntrees = TRUE, returnparams = TRUE)[[1]]

# Accediendo a los parametros devueltos
oppricretree <- result$oppricretree
delta <- result$delta
bond <- result$bond

# Parámetros segun sea necesario
print(oppricretree)
## NULL
print(delta)
##           [,1]      [,2]      [,3]
## [1,] 0.6256859 0.8320784 1.0000000
## [2,] 0.0000000 0.3477302 0.6059329
## [3,] 0.0000000 0.0000000 0.0000000
print(bond)
##           [,1]      [,2]      [,3]
## [1,] -49.39049 -83.95240 -121.8856
## [2,]   0.00000 -23.80776  -55.9229
## [3,]   0.00000   0.00000    0.0000
# Imprimir precios de opciones
cat("Precio opcion PUT Europea:", europea_put_option_price, "\n")
## Precio opcion PUT Europea: 25.8292

Trazar el arbol binomial para la opcion de venta europea

binomplot(s, k, v, r, tt, d, nstep, putopt = TRUE, american = FALSE,           
          plotvalues= TRUE, plotarrows= TRUE, drawstrike= TRUE, pointsize= 3, ylimval=c(0,0),
          saveplot= FALSE, saveplotfn='DLTR CRR Plots.png', 
          crr= TRUE, jarrowrudd= FALSE, titles = TRUE, specifyupdn = FALSE, 
          returnprice = TRUE, logy = FALSE)

## [1] 25.83415

Observacion:

Se evidencia que la valuacion con volatilidad implicita para CALL y PUT es mucho mayor que la valuacion con volatilidad historica de la serie.

Punto 2: VALUACION DE OPCIONES CALL Y PUT CON STRIKE EXTREMOS Y SU VOLITALIDAD IMPLICITA

TXN

Modelo Cox Ross Rubinstein para TXN

Funcion para calcular el precio de la opcion usando logica similar a CRR

crr_option_price <- function(S0, X, T, r, sigma, n, type = "call") {
  delta_t <- T / n
  u <- exp(sigma * sqrt(delta_t))
  d <- 1 / u
  p <- (exp(r * delta_t) - d) / (u - d)
  
  
  # Generar precios de acciones al vencimiento
  ST <- S0 * u^(n:0) * d^(0:n)
  
  # Calcular los pagos de las opciones al vencimiento
  payoff <- pmax(ST - X, 0)  # Para una opcion call
  
  # Induccion hacia atras para calcular el precio de la opcion en t=0
  for (i in (n - 1):0) {
    payoff <- exp(-r * delta_t) * (p * payoff[2:(i + 2)] + (1 - p) * payoff[1:(i + 1)])
  }
  
  return(payoff[1])
}

Parametros

underlying_price_txn <- s_txn
strike_price_txn <- 150
time_to_expiry_txn <- 0.25
risk_free_rate_txn <- 0.0112584
dividend_yield_txn <- 0.0293/0.25
volatility_txn <- 1.0210/0.25
n_txn <- 3   # Numero de periodos

# Calcular el precio de la opcion de compra de TXN utilizando un modelo similar al CRR
txn_crr_price <- crr_option_price(underlying_price_txn, 
                                  strike_price_txn, time_to_expiry_txn, 
                                  risk_free_rate_txn, volatility_txn, n_txn)

# Imprimir el resultado
print(txn_crr_price)
## [1] 2640.822

Creando un modelo de arbol binomial opcion CALL CRR para TXN

s <- s_txn # Precio actual de las acciones
k <- 150 # Precio Strike
tt <- 0.25 # Tiempo de vencimiento (Años)
r <- 0.0112584 # Tasa de riesgo
d <- 0.0293/0.25 # Tasa yield
v <- 1.0210/0.25 # Volatilidad implicita
nstep <- 3 # Numero de pasos en el arbol binomial

# Calcular el precio de la opcion y la informacion asociada.
result <- binomopt(s, k, v, r, tt, d, nstep, american = FALSE, putopt = FALSE, returntrees = TRUE, returnparams = TRUE)

# Calcular el precio de la opcion de compra Europea
europea_call_option_price <- binomopt(s, k, v, r, tt, d, nstep, american = FALSE, putopt = FALSE, returntrees = TRUE, returnparams = TRUE)[[1]]

# Acceder a los parametros devueltos
oppricretree <- result$oppricretree
delta <- result$delta
bond <- result$bond

# Imprima o use estos parametros segun sea necesario (tiempo de retorno 0 delta, gamma y theta en los vectores griegos)
print(oppricretree)
## NULL
print(delta)
##           [,1]      [,2]      [,3]
## [1,] 0.8440094 0.9322126 0.9902809
## [2,] 0.0000000 0.5924774 0.7823281
## [3,] 0.0000000 0.0000000 0.0000000
# Imprimir precios de opciones
cat("Precio opcion Call Europea", europea_call_option_price, "\n")
## Precio opcion Call Europea 118.0296

Trazar árbol binomial para opcion de compra europea

binomplot(s, k, v, r, tt, d, nstep, putopt = FALSE, american = FALSE, 
          plotvalues= TRUE, plotarrows= TRUE, drawstrike= TRUE, pointsize= 3, ylimval=c(0,0),
          saveplot= FALSE, saveplotfn='TXN CRR Plots.png', 
          crr= TRUE, jarrowrudd= FALSE, titles = TRUE, specifyupdn = FALSE, 
          returnprice = TRUE, logy = FALSE)

## [1] 117.9818
# Creando un modelo de arbol binomial opcion PUT CRR para TXN
s <- s_txn # Precio actual de las acciones
k <- 115 # Precio Strike
tt <- 0.25 # Tiempo de vencimiento (Años)
r <- 0.0112584 # Tasa libre de riesgo
d <- 0.0293/0.25 # Tasa yield
v <- 1.3164/0.25 # Volatilidad implicita
nstep <- 3 # Numero de pasos en el arbol binomial

# Calcular el precio de la opcion y la informacion asociada.
result <- binomopt(s, k, v, r, tt, d, nstep, american = FALSE, 
                   putopt = FALSE, returntrees = TRUE, 
                   returnparams = TRUE)

# Calcular el precio de la opcion de venta Europea
europea_put_option_price <- binomopt(s, k, v, r, tt, d, nstep, 
                                     american = FALSE, putopt = TRUE, 
                                     returntrees = TRUE, returnparams = TRUE)[[1]]

# Accediendo a los parametros devueltos
oppricretree <- result$oppricretree
delta <- result$delta
bond <- result$bond

# Parametros segun sea necesario
print(oppricretree)
## NULL
print(delta)
##           [,1]      [,2]      [,3]
## [1,] 0.9075977 0.9608097 0.9902809
## [2,] 0.0000000 0.7139262 0.8786021
## [3,] 0.0000000 0.0000000 0.0000000
print(bond)
##           [,1]       [,2]       [,3]
## [1,] -12.92676 -46.349926 -114.89216
## [2,]   0.00000  -5.631857  -31.41266
## [3,]   0.00000   0.000000    0.00000
# Imprimir precios de opciones
cat("Precio opcion PUT Europea:", europea_put_option_price, "\n")
## Precio opcion PUT Europea: 91.17965

Trazar el arbol binomial para la opcion de venta europea

binomplot(s, k, v, r, tt, d, nstep, putopt = TRUE, american = FALSE,           
          plotvalues= TRUE, plotarrows= TRUE, drawstrike= TRUE, pointsize= 3, ylimval=c(0,0),
          saveplot= FALSE, saveplotfn='TXN CRR Plots.png', 
          crr= TRUE, jarrowrudd= FALSE, titles = TRUE, specifyupdn = FALSE, 
          returnprice = TRUE, logy = FALSE)

## [1] 91.09124

FTNT

Modelo Cox Ross Rubinstein para FTNT

Funcion para calcular el precio de la opcion usando logica similar a CRR

crr_option_price <- function(S0, X, T, r, sigma, n, type = "call") {
  delta_t <- T / n
  u <- exp(sigma * sqrt(delta_t))
  d <- 1 / u
  p <- (exp(r * delta_t) - d) / (u - d)
  
  
  # Generar precios de acciones al vencimiento
  ST <- S0 * u^(n:0) * d^(0:n)
  
  # Calcular los pagos de las opciones al vencimiento
  payoff <- pmax(ST - X, 0)  # Para una opcion call
  
  # Induccion hacia atras para calcular el precio de la opcion en t=0
  for (i in (n - 1):0) {
    payoff <- exp(-r * delta_t) * (p * payoff[2:(i + 2)] + (1 - p) * payoff[1:(i + 1)])
  }
  
  return(payoff[1])
}

Parametros

underlying_price_ftnt <- s_ftnt
strike_price_ftnt <- 45
time_to_expiry_ftnt <- 0.25
risk_free_rate_ftnt <- 0.0112584
dividend_yield_ftnt <- 0
volatility_ftnt <- 1.9766/0.25
n_ftnt <- 3   # Numero de periodos

# Calcular el precio de la opcion de compra de FTNT utilizando un modelo similar al CRR
ftnt_crr_price <- crr_option_price(underlying_price_txn, 
                                   strike_price_ftnt, time_to_expiry_ftnt, 
                                   risk_free_rate_ftnt, volatility_ftnt, n_ftnt)

# Imprimir el resultado
print(ftnt_crr_price)
## [1] 116969.4

Creando un modelo de arbol binomial opcion CALL CRR para FTNT

s <- s_ftnt # Precio actual de las acciones
k <- 45 # Precio Strike
tt <- 0.25 # Tiempo de vencimiento (Años)
r <- 0.0112584 # Tasa de riesgo
d <- 0 # Tasa yield
v <- 1.9766/0.25 # Volatilidad implicita
nstep <- 3 # Numero de pasos en el arbol binomial

# Calcular el precio de la opcion y la informacion asociada.
result <- binomopt(s, k, v, r, tt, d, nstep, american = FALSE, putopt = FALSE, returntrees = TRUE, returnparams = TRUE)

# Calcular el precio de la opcion de compra Europea
europea_call_option_price <- binomopt(s, k, v, r, tt, d, nstep, american = FALSE, putopt = FALSE, returntrees = TRUE, returnparams = TRUE)[[1]]

# Acceder a los parametros devueltos
oppricretree <- result$oppricretree
delta <- result$delta
bond <- result$bond

# Imprima o use estos parametros segun sea necesario (tiempo de retorno 0 delta, gamma y theta en los vectores griegos)
print(oppricretree)
## NULL
print(delta)
##           [,1]      [,2]      [,3]
## [1,] 0.9811361 0.9943298 1.0000000
## [2,] 0.0000000 0.8518390 0.9387614
## [3,] 0.0000000 0.0000000 0.0000000
# Imprimir precios de opciones
cat("Precio opcion Call Europea", europea_call_option_price, "\n")
## Precio opcion Call Europea 61.84102

Trazar arbol binomial para opcion de compra europea

binomplot(s, k, v, r, tt, d, nstep, putopt = FALSE, american = FALSE, 
          plotvalues= TRUE, plotarrows= TRUE, drawstrike= TRUE, pointsize= 3, ylimval=c(0,0),
          saveplot= FALSE, saveplotfn='TXN CRR Plots.png', 
          crr= TRUE, jarrowrudd= FALSE, titles = TRUE, specifyupdn = FALSE, 
          returnprice = TRUE, logy = FALSE)

## [1] 61.84197
# Creando un modelo de arbol binomial opcion PUT CRR para FTNT
s <- s_ftnt # Precio actual de las acciones
k <- 35 # Precio Strike
tt <- 0.25 # Tiempo de vencimiento (Años)
r <- 0.0112584 # Tasa libre de riesgo
d <- 0 # Tasa yield
v <- 1.5938/0.25 # Volatilidad implicita
nstep <- 3 # Numero de pasos en el arbol binomial

# Calcular el precio de la opcon y la informacion asociada.
result <- binomopt(s, k, v, r, tt, d, nstep, american = FALSE, 
                   putopt = FALSE, returntrees = TRUE, 
                   returnparams = TRUE)

# Calcular el precio de la opcion de venta Europea
europea_put_option_price <- binomopt(s, k, v, r, tt, d, nstep, 
                                     american = FALSE, putopt = TRUE, 
                                     returntrees = TRUE, returnparams = TRUE)[[1]]

# Accediendo a los parametros devueltos
oppricretree <- result$oppricretree
delta <- result$delta
bond <- result$bond

# Parametros segun sea necesario
print(oppricretree)
## NULL
print(delta)
##           [,1]      [,2]      [,3]
## [1,] 0.9664966 0.9914645 1.0000000
## [2,] 0.0000000 0.8092281 0.9377012
## [3,] 0.0000000 0.0000000 0.0000000
print(bond)
##           [,1]       [,2]      [,3]
## [1,] -2.925092 -13.078027 -34.96718
## [2,]  0.000000  -1.316393  -9.61713
## [3,]  0.000000   0.000000   0.00000
# Imprimir precios de opciones
cat("Precio opcion PUT Europea:", europea_put_option_price, "\n")
## Precio opcion PUT Europea: 29.81624

Trazar el arbol binomial para la opcion de venta europea

binomplot(s, k, v, r, tt, d, nstep, putopt = TRUE, american = FALSE,           
          plotvalues= TRUE, plotarrows= TRUE, drawstrike= TRUE, pointsize= 3, ylimval=c(0,0),
          saveplot= FALSE, saveplotfn='FTNT CRR Plots.png', 
          crr= TRUE, jarrowrudd= FALSE, titles = TRUE, specifyupdn = FALSE, 
          returnprice = TRUE, logy = FALSE)

## [1] 29.81943

DLTR

Modelo Cox Ross Rubinstein para DLTR

Funcion para calcular el precio de la opcion usando logica similar a CRR

crr_option_price <- function(S0, X, T, r, sigma, n, type = "call") {
  delta_t <- T / n
  u <- exp(sigma * sqrt(delta_t))
  d <- 1 / u
  p <- (exp(r * delta_t) - d) / (u - d)
  
  
  # Generar precios de acciones al vencimiento
  ST <- S0 * u^(n:0) * d^(0:n)
  
  # Calcular los pagos de las opciones al vencimiento
  payoff <- pmax(ST - X, 0)  # Para una opcion call
  
  # Induccion hacia atras para calcular el precio de la opcion en t=0
  for (i in (n - 1):0) {
    payoff <- exp(-r * delta_t) * (p * payoff[2:(i + 2)] + (1 - p) * payoff[1:(i + 1)])
  }
  
  return(payoff[1])
}

Parametros

underlying_price_dltr <- s_dltr
strike_price_dltr <- 100
time_to_expiry_dltr <- 0.25
risk_free_rate_dltr <- 0.0112584
dividend_yield_dltr <- 0
volatility_dltr <- 0.9131/0.25
n_dltr <- 3   # Numero de periodos

# Calcular el precio de la opcon de compra de FTNT utilizando un modelo similar al CRR
dltr_crr_price <- crr_option_price(underlying_price_dltr, 
                                   strike_price_dltr, time_to_expiry_dltr, 
                                   risk_free_rate_dltr, volatility_dltr, n_dltr)

# Imprimir el resultado
print(dltr_crr_price)
## [1] 1259.507

Creando un modelo de arbol binomial opcion CALL CRR para DLTR

s <- s_dltr # Precio actual de las acciones
k <- 100 # Precio Strike
tt <- 0.25 # Tiempo de vencimiento (Años)
r <- 0.0112584 # Tasa de riesgo
d <- 0 # Tasa yield
v <- 0.9131/0.25 # Volatilidad implicita
nstep <- 3 # Numero de pasos en el arbol binomial

# Calcular el precio de la opcion y la informacion asociada.
result <- binomopt(s, k, v, r, tt, d, nstep, american = FALSE, putopt = FALSE, returntrees = TRUE, returnparams = TRUE)

# Calcular el precio de la opcion de compra Europea
europea_call_option_price <- binomopt(s, k, v, r, tt, d, nstep, american = FALSE, putopt = FALSE, returntrees = TRUE, returnparams = TRUE)[[1]]

# Acceder a los parametros devueltos
oppricretree <- result$oppricretree
delta <- result$delta
bond <- result$bond

# Imprima o use estos parametros segun sea necesario (tiempo de retorno 0 delta, gamma y theta en los vectores griegos)
print(oppricretree)
## NULL
print(delta)
##           [,1]      [,2]      [,3]
## [1,] 0.8640266 0.9533392 1.0000000
## [2,] 0.0000000 0.6076881 0.8194165
## [3,] 0.0000000 0.0000000 0.0000000
# Imprimir precios de opciones
cat("Precio opcion Call Europea", europea_call_option_price, "\n")
## Precio opcion Call Europea 86.95916

Trazar arbol binomial para opcion de compra europea

binomplot(s, k, v, r, tt, d, nstep, putopt = FALSE, american = FALSE, 
          plotvalues= TRUE, plotarrows= TRUE, drawstrike= TRUE, pointsize= 3, ylimval=c(0,0),
          saveplot= FALSE, saveplotfn='DLTR CRR Plots.png', 
          crr= TRUE, jarrowrudd= FALSE, titles = TRUE, specifyupdn = FALSE, 
          returnprice = TRUE, logy = FALSE)

## [1] 86.96948
# Creando un modelo de arbol binomial opcion PUT CRR para DLTR
s <- s_dltr # Precio actual de las acciones
k <- 105 # Precio Strike
tt <- 0.25 # Tiempo de vencimiento (Años)
r <- 0.0112584 # Tasa libre de riesgo
d <- 0 # Tasa yield
v <- 0.8398/0.25 # Volatilidad implicita
nstep <- 3 # Numero de pasos en el arbol binomial

# Calcular el precio de la opcion y la informacion asociada.
result <- binomopt(s, k, v, r, tt, d, nstep, american = FALSE, 
                   putopt = FALSE, returntrees = TRUE, 
                   returnparams = TRUE)

# Calcular el precio de la opcion de venta Europea
europea_put_option_price <- binomopt(s, k, v, r, tt, d, nstep, 
                                     american = FALSE, putopt = TRUE, 
                                     returntrees = TRUE, returnparams = TRUE)[[1]]

# Accediendo a los parametros devueltos
oppricretree <- result$oppricretree
delta <- result$delta
bond <- result$bond

# Parametros segun sea necesario
print(oppricretree)
## NULL
print(delta)
##           [,1]      [,2]      [,3]
## [1,] 0.8423415 0.9434061 1.0000000
## [2,] 0.0000000 0.5758139 0.7941569
## [3,] 0.0000000 0.0000000 0.0000000
print(bond)
##           [,1]     [,2]       [,3]
## [1,] -22.80944 -55.9273 -104.90154
## [2,]   0.00000 -10.2810  -37.42915
## [3,]   0.00000   0.0000    0.00000
# Imprimir precios de opciones
cat("Precio opcion PUT Europea:", europea_put_option_price, "\n")
## Precio opcion PUT Europea: 62.33633

Trazar el arbol binomial para la opcion de venta europea

binomplot(s, k, v, r, tt, d, nstep, putopt = TRUE, american = FALSE,           
          plotvalues= TRUE, plotarrows= TRUE, drawstrike= TRUE, pointsize= 3, ylimval=c(0,0),
          saveplot= FALSE, saveplotfn='DLTR CRR Plots.png', 
          crr= TRUE, jarrowrudd= FALSE, titles = TRUE, specifyupdn = FALSE, 
          returnprice = TRUE, logy = FALSE)

## [1] 62.34584

PARTE 3: Creacion de coberturas.

Despues de analizar los puntos anteriores, decidimos que es importante realizar una cobertura con la estrategia “Straddle” que consiste en la compra de una Call y una Put con igual strike y plazo al vencimiento. Si evidenciamos un movimiento significativo en cualquier direccion obtendremos una utilidad.

Long Straddle para TXN

prices_txn <- seq(150,215,1) # Vector de precios
strike_txn <- 175 # Precio strike  
premium_call_txn <- 3.8 # Precio opcion call
premium_put_txn <- 4.05 # Precio opcion put 

# payoff al vencimiento opcion call 
intrinsicValuesCall_txn <- prices_txn - strike_txn - premium_call_txn
payoffLongCall_txn <- pmax(-premium_call_txn,intrinsicValuesCall_txn)

# payoff al vencimiento opcion put
intrinsicValuesPut_txn <- strike_txn - prices_txn - premium_put_txn
payoffLongPut_txn <- pmax(-premium_put_txn,intrinsicValuesPut_txn)

# El payoff de la estrategia es la suma de las opciones call y put
# Se necesita la suma elemento por elemento
payoff_txn <- rowSums(cbind(payoffLongCall_txn,payoffLongPut_txn))

Creamos un dataFrame con todas las variables para trazarlo con ggplot

results_txn <- data.frame(cbind(prices_txn,payoffLongCall_txn,payoffLongPut_txn,payoff_txn))

ggplot(results_txn, aes(x=prices_txn)) + 
  geom_line(aes(y = payoffLongCall_txn, color = "LongCall")) + 
  geom_line(aes(y = payoffLongPut_txn, color="LongPut"))+
  geom_line(aes(y=payoff_txn, color = 'Payoff')) +
  scale_colour_manual("", 
                      breaks = c("LongCall", "LongPut", "Payoff"),
                      values = c("darkred", "darkblue", "darkgreen")) + ylab("Payoff")+
  ggtitle("Long Straddle Payoff TXN")  

Long Straddle para FTNT

prices_ftnt <- seq(35,95,1) # Vector de precios
strike_ftnt <- 64 # Precio strike  
premium_call_ftnt <- 3.55 # Precio opcion call
premium_put_ftnt <- 3.7 # Precio opcion put 

# payoff al vencimiento opcion call 
intrinsicValuesCall_ftnt <- prices_ftnt - strike_ftnt - premium_call_ftnt
payoffLongCall_ftnt <- pmax(-premium_call_ftnt,intrinsicValuesCall_ftnt)

# payoff al vencimiento opcion put
intrinsicValuesPut_ftnt <- strike_ftnt - prices_ftnt - premium_put_ftnt
payoffLongPut_ftnt <- pmax(-premium_put_ftnt,intrinsicValuesPut_ftnt)

# El payoff de la estrategia es la suma de las opciones call y put
# Se necesita la suma elemento por elemento
payoff_ftnt <- rowSums(cbind(payoffLongCall_ftnt,payoffLongPut_ftnt))

Creamos un DataFrame con todas las variables para trazarlo con ggplot

results_ftnt <- data.frame(cbind(prices_ftnt,payoffLongCall_ftnt,payoffLongPut_ftnt,payoff_ftnt))

ggplot(results_ftnt, aes(x=prices_ftnt)) + 
  geom_line(aes(y = payoffLongCall_ftnt, color = "LongCall")) + 
  geom_line(aes(y = payoffLongPut_ftnt, color="LongPut"))+
  geom_line(aes(y=payoff_ftnt, color = 'Payoff')) +
  scale_colour_manual("", 
                      breaks = c("LongCall", "LongPut", "Payoff"),
                      values = c("darkred", "darkblue", "darkgreen")) + ylab("Payoff")+
  ggtitle("Long Straddle Payoff FTNT")

Long Straddle para DLTR

prices_dltr <- seq(100,165,1) # Vector de precios
strike_dltr <- 120 # Precio strike  
premium_call_dltr <- 2.62 # Precio opcion call
premium_put_dltr <- 2.86 # Precio opcion put 

# payoff al vencimiento opcion call 
intrinsicValuesCall_dltr <- prices_dltr - strike_dltr - premium_call_dltr
payoffLongCall_dltr <- pmax(-premium_call_dltr,intrinsicValuesCall_dltr)

# payoff al vencimiento opcion put
intrinsicValuesPut_dltr <- strike_dltr - prices_dltr - premium_put_dltr
payoffLongPut_dltr <- pmax(-premium_put_dltr,intrinsicValuesPut_dltr)

# El payoff de la estrategia es la suma de las opciones call y put
# Se necesita la suma elemento por elemento
payoff_dltr <- rowSums(cbind(payoffLongCall_dltr,payoffLongPut_dltr))
payoff_dltr
##  [1] 14.52 13.52 12.52 11.52 10.52  9.52  8.52  7.52  6.52  5.52  4.52  3.52
## [13]  2.52  1.52  0.52 -0.48 -1.48 -2.48 -3.48 -4.48 -5.48 -4.48 -3.48 -2.48
## [25] -1.48 -0.48  0.52  1.52  2.52  3.52  4.52  5.52  6.52  7.52  8.52  9.52
## [37] 10.52 11.52 12.52 13.52 14.52 15.52 16.52 17.52 18.52 19.52 20.52 21.52
## [49] 22.52 23.52 24.52 25.52 26.52 27.52 28.52 29.52 30.52 31.52 32.52 33.52
## [61] 34.52 35.52 36.52 37.52 38.52 39.52

Creamos un DataFrame con todas las variables para trazarlo con ggplot

results_dltr <- data.frame(cbind(prices_dltr,payoffLongCall_dltr,payoffLongPut_dltr,payoff_dltr))

ggplot(results_dltr, aes(x=prices_dltr)) + 
  geom_line(aes(y = payoffLongCall_dltr, color = "LongCall")) + 
  geom_line(aes(y = payoffLongPut_dltr, color="LongPut"))+
  geom_line(aes(y=payoff_dltr, color = 'Payoff')) +
  scale_colour_manual("", 
                      breaks = c("LongCall", "LongPut", "Payoff"),
                      values = c("darkred", "darkblue", "darkgreen")) + ylab("Payoff")+
  ggtitle("Long Straddle Payoff DLTR")

Los beneficios que nos brinda esta estrategia de cobertura es que es neutral en cuanto a la direccion del movimiento del precio del activo subyacente. Esto significa que podemos obtener ganancias independientemente de si el precio del activo subyacente aumenta o disminuye, siempre y cuando el movimiento sea lo suficientemente significativo para superar el costo de ambas opciones.

La estrategia de Straddle ofrece flexibilidad en cuanto a la duracion de la posicion.

La estrategia de Straddle se beneficia de un aumento en la volatilidad del activo subyacente y es por esta razon, ante unas volatilidades extremas, podemos cubrirnos mejor.

LABORATORIO #4

TEMA:BSM Y SWAPS

En este capitulo valoraremos opciones CALL y PUT de la base de datos de 2 acciones. Adicional, se realizará una estrategia de inversión con SWAPS para una inversión de 100 millones de dólares.

PUNTO 1: Estrategias de inversión con Black Scholes Merton

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

Cargamos las librerias

library(tidyquant)
library(xts)

#Descargamos los datos

getSymbols("TXN", from=as.Date("2019-05-27"), to=as.Date("2024-05-28"), src="yahoo", interval="daily")
## [1] "TXN"
getSymbols("FTNT", from=as.Date("2019-05-27"), to=as.Date("2024-05-28"), src="yahoo", interval="daily")
## [1] "FTNT"
#Crear la columna de precio de cierre
txn= Ad(TXN)
ftnt= Ad(FTNT)
mean(txn)
## [1] 148.8528

#Calcular el retorno de la accion

r_txn= diff(log(txn))
r_ftnt= diff(log(ftnt))
plot(r_txn, type="l")

plot(r_ftnt, type="l")

Media y Desviación de los precios

mu_txn=mean(txn)
sigma_txn=sd(txn)

mu_ftnt=mean(ftnt)
sigma_ftnt=sd(ftnt)

Generar el proceso MBG

set.seed(123) #Establecer una semilla
t=1 #Periodo de tiempo
n=360 #Numero de pasos de tiempo (dias de negociacion)
dt=t/n # Tamaño del paso del tiempo
time=seq(0,t,by=dt) # Vector de tiempo
N=10000

Generar una trayectoria de proceso de MBG para txn

W=c(0, cumsum(sqrt(dt)*rnorm(n))) 
S_txn=exp((mu_txn-0.5*sigma_txn^2)*dt+sigma_txn*W*sqrt(dt)) 

Graficar la trayectoria del precio

plot(time,S_txn, type="l", col="blue", xlab="Tiempo", ylab="Precio", main="Movimiento Brawniano")

Calcular el pronostico de la variable

p_inicial_txn=as.double(last(txn))

Calcular el pronóstico

pron_txn=p_inicial_txn*S_txn

plot(time, pron_txn, type="l", col="blue", xlab="Tiempo", ylab="Precio", main="Simulacion Proceso MBG")

A un mes y me arroja el valor de “K”

strike_txn=last(pron_txn) #1año
strike_txn=pron_txn[30] #1 mes
strike_txn
## [1] 90.20805

Calcular opcion CALL de TXN

Formula: Call=S0(Nd1)-kexp(-rT)N(d2)

s0_txn=as.double(last(txn))
vencimiento=30
v=vencimiento/n
r= 0.004368 #TES de USA a 1 mes
k_pte_txn=strike_txn*exp(-sigma_txn*v)

# Calcular ND1 y ND2 de txn (Cantidad)

nd1_txn=(log(s0_txn/strike_txn)+(mu_txn+sigma_txn^2/2)*v)/(sigma_txn*sqrt(v))
nd2_txn=nd1_txn-sigma_txn*sqrt(v)
C_txn=s0_txn*nd1_txn-strike_txn*exp(-r*v)*nd2_txn 
C_txn
## [1] 1309.26
#Definicion de parametros
t=1 
n=360 # #de dias en un año (Iteraciones)
dt=t/n 
r= 0.004368 #TES de USA a 1 mes
time=seq(0,t,by=dt) 
mu_txn
## [1] 148.8528
sigma_txn 
## [1] 26.91555
s0_txn<-as.double(last(txn))

Proceso de simulacion

set.seed(123) #Establecer una semilla
simul_txn=200 # #de simulaciones
simulaciones_txn=matrix(0,nrow=n+1,ncol=simul_txn)

#Crear vector que contenga los valores promedio (valores mas probables)
most_probable_values_txn=numeric(simul_txn)

Generacion de las simulaciones

for(i in 1:simul_txn) {
  W_txn=c(0, cumsum(sqrt(dt)*rnorm(n))) 
  S_txn=exp((mu_txn-0.5*sigma_txn^2)*time+sigma_txn*W*sqrt(time))
  simulaciones_txn[,i]=S_txn*s0_txn
  most_probable_values_txn[i]=mean(simulaciones_txn[,i])
}

confidence_interval_txn=quantile(most_probable_values_txn, c(0.05,0.95))

plot.new()
matplot(simulaciones_txn, type="l",xlab="Tiempo",ylab="Valor", main="Simulaciones de proceso MBG accion txn")

cat("95% Confidence Interval:",confidence_interval_txn, "\n")
## 95% Confidence Interval: 1.252025 1.252025
most_probable_txn=mean(most_probable_values_txn) 
cat("Most Probable Value action TXN:",most_probable_txn, "\n")
## Most Probable Value action TXN: 1.252025
coef_variacion_txn=sd(txn)/mean(txn)*100

Generar una trayectoria de proceso de MBG para ftnt

W=c(0, cumsum(sqrt(dt)*rnorm(n))) 
S_ftnt=exp((mu_ftnt-0.5*sigma_ftnt^2)*dt+sigma_ftnt*W*sqrt(dt)) 

Graficar la trayectoria del precio

plot(time,S_ftnt, type="l", col="blue", xlab="Tiempo", ylab="Precio", main="Movimiento Brawniano")

Calcular el pronostico de la variable

p_inicial_ftnt=as.double(last(ftnt))

#Calcular el pronostico
pron_ftnt=p_inicial_ftnt*S_ftnt

plot(time, pron_ftnt, type="l", col="blue", xlab="Tiempo", ylab="Precio", main="Simulacion Proceso MBG")

A un mes y me arroja el valor de “K (Strike)

strike_ftnt=last(pron_ftnt) # 1año
strike_ftnt=pron_ftnt[30] # 1 mes
strike_ftnt
## [1] 32.31254

Calcular opcion CALL de TXN

Formula: Call=S0(Nd1)-kexp(-rT)*N(d2)

s0_ftnt=as.double(last(ftnt))
vencimiento=30
v=vencimiento/n
r= 0.004368 #TES de USA a 1 mes
k_pte_ftnt=strike_ftnt*exp(-sigma_ftnt*v)

Calcular ND1 y ND2 de txn (Cantidad)

nd1_ftnt=(log(s0_ftnt/strike_ftnt)+(mu_ftnt+sigma_ftnt^2/2)*v)/(sigma_ftnt*sqrt(v))
nd2_ftnt=nd1_ftnt-sigma_ftnt*sqrt(v)
C_ftnt=s0_ftnt*nd1_ftnt-strike_ftnt*exp(-r*v)*nd2_ftnt 
C_ftnt
## [1] 279.5544

Definicion de parametros

t=1 
n=360 # #de dias en un año (Iteraciones)
dt=t/n 
r= 0.004368 #TES de USA a 1 mes
time=seq(0,t,by=dt) 
mu_ftnt
## [1] 45.81298
sigma_ftnt
## [1] 18.92744
s0_ftnt<-as.double(last(ftnt))

#Proceso de simulacton
set.seed(123) #Establecer una semilla
simul_ftnt=200 # #de simulaciones
simulaciones_ftnt=matrix(0,nrow=n+1,ncol=simul_ftnt)

Crear vector que contenga los valores promedio (valores mas probables)

most_probable_values_ftnt=numeric(simul_ftnt)

Generacion de las simulaciones

for(i in 1:simul_ftnt) {
  W_ftnt=c(0, cumsum(sqrt(dt)*rnorm(n))) 
  S_ftnt=exp((mu_ftnt-0.5*sigma_ftnt^2)*time+sigma_ftnt*W*sqrt(time))
  simulaciones_ftnt[,i]=S_ftnt*s0_ftnt
  most_probable_values_ftnt[i]=mean(simulaciones_ftnt[,i])
}

confidence_interval_ftnt=quantile(most_probable_values_ftnt, c(0.05,0.95))

plot.new()
matplot(simulaciones_ftnt, type="l",xlab="Tiempo",ylab="Valor", main="Simulaciones de proceso MBG accion ftnt")

cat("95% Confidence Interval:",confidence_interval_ftnt, "\n")
## 95% Confidence Interval: 0.5007883 0.5007883
most_probable_ftnt=mean(most_probable_values_ftnt) 
cat("Most Probable Value action FTNT:",most_probable_ftnt, "\n")
## Most Probable Value action FTNT: 0.5007883
coef_variacion_ftnt=sd(ftnt)/mean(ftnt)*100

Calcular opcion PUT de TXN

P_txn=strike_txn*exp(-mu_txn*v)*(-nd2_txn)-s0_txn*(-nd1_txn)
P_txn
## [1] 1112.092

Calcular opcion PUT de FTNT

P_ftnt=strike_ftnt*exp(-mu_ftnt*v)*(-nd2_ftnt)-s0_txn*(-nd1_ftnt)
P_ftnt
## [1] 708.0525

Calcular las griegas de txn

nd1_txn <- (log(s0_txn/strike_txn) + (r*sigma_txn^2)*v)/(sigma_txn*sqrt(v))
delta_txn <- pnorm(nd1_txn)
gamma_txn <- dnorm(nd1_txn)/(s0_txn*sigma_txn*sqrt(v))
theta_txn <- -(s0_txn*dnorm(nd1_txn)*sigma_txn/(2*sqrt(v))+r*strike_txn*exp(-r*v)*pnorm(nd2_txn))
vega_txn <- s0_txn*dnorm(nd1_txn)*sqrt(v)

print(paste("Delta:", delta_txn))
## [1] "Delta: 0.55404302572819"
print(paste("Gamma:", gamma_txn))
## [1] "Gamma: 0.000255412551522219"
print(paste("Theta:", theta_txn))
## [1] "Theta: -3670.37930307621"
print(paste("Vega:", vega_txn))
## [1] "Vega: 22.7277121310585"

Calcular las griegas de ftnt

nd1_ftnt <- (log(s0_ftnt/strike_ftnt) + (r*sigma_ftnt^2)*v)/(sigma_ftnt*sqrt(v))
delta_ftnt <- pnorm(nd1_ftnt)
gamma_ftnt <- dnorm(nd1_ftnt)/(s0_ftnt*sigma_ftnt*sqrt(v))
theta_ftnt <- -(s0_ftnt*dnorm(nd1_ftnt)*sigma_ftnt/(2*sqrt(v))+r*strike_ftnt*exp(-r*v)*pnorm(nd2_ftnt))
vega_ftnt <- s0_ftnt*dnorm(nd1_ftnt)*sqrt(v)

print(paste("Delta:", delta_ftnt))
## [1] "Delta: 0.556147064579532"
print(paste("Gamma:", gamma_ftnt))
## [1] "Gamma: 0.00117832320570355"
print(paste("Theta:", theta_ftnt))
## [1] "Theta: -794.418636322641"
print(paste("Vega:", vega_ftnt))
## [1] "Vega: 6.99526493466747"

OPCIONES BLACK SCHOLES MERTON MODIFICANDO TASA DE INTERES TXN

Función con parámetros iniciales

Definición de la función black_scholes_merton

#Definimos los precios de las opciones con vencimiento a 30 dias
Stcall_txn = 212.5
Stput_txn = 187.5

black_scholes_merton <- function(So, K, r, VencimientoDias, sigma, Stcall_txn, Stput_txn) {
  
  Ano <- 360
  
  #Definir los vencimientos a partir de un número de días establecido
  vencimiento = seq(from = vencimiento, by = 30, length.out = 6)
  
  #Definir un conjunto de Volatilidad a partir de un valor sigma inicial
  sigma_txn = seq(from = sigma_txn, by = 0.05, length.out = 6)
  
  ## Cálculo del vencimiento
  T <- vencimiento / Ano
  
  
  #Definir d1 y d2
  d1_txn <- (log(s0_txn/strike_txn) + (r + ((sigma_txn^2)/2)) * T) / (sigma_txn * sqrt(T))
  d2_txn <- (log(s0_txn/strike_txn) + (r - ((sigma_txn^2)/2)) * T) / (sigma_txn * sqrt(T))
  
    # Definir N1 y N2 para la posición Call y Put
  Nd1_txn <- pnorm(d1_txn)
  Nd2_txn <- pnorm(d2_txn)
  Nd1P_txn <- pnorm(-d1_txn)
  Nd2P_txn <- pnorm(-d2_txn)
  
  #Valoración Call
  Call_txn <- s0_txn * Nd1_txn - (strike_txn * exp(-r * T) * Nd2_txn)
  
  #Valoración Put
  Put_txn <- (strike_txn * exp(-r * T) * Nd2P_txn) - s0_txn * Nd1P_txn
  
  ##Crear vector de varios precios st a partir de un stc dado  
  st_txn <- seq(from = Stcall_txn, by = 10, length.out = 21)
  num_filas <- length(st_txn)
  num_columnas <- length(sigma_txn)
  
  ## Matriz resultados de la Valoración Call
  resultadosCall_txn <- matrix(NA, nrow = num_filas, ncol = num_columnas)
  
  
  
  for (i in 1:num_filas) {
    for (j in 1:num_columnas) {
      resultado <- (st_txn[i] * pnorm((log(st_txn[i]/strike_txn) + (r + ((sigma_txn[j]^2)/2)) * T[j]) / (sigma_txn[j] * sqrt(T[j]))) - strike_txn * exp(-r * T[j]) * pnorm((log(st_txn[i]/strike_txn) + (r - ((sigma_txn[j]^2)/2)) * T[j]) / (sigma_txn[j] * sqrt(T[j])))) /
        Call_txn[j]
      resultadosCall_txn[i, j] <- resultado
    }
  }
  
  #Definir el nombre de las columnas
  colnames(resultadosCall_txn) <- paste("Vto a", vencimiento, "dias")
  
  ##Crear vector de varios precios st a partir de un stp dado
  stp_txn <- seq(from = Stput_txn, by = 10, length.out = 21)
  
  #matriz de resultados de la valoración Put
  resultadosPut_txn <- matrix(NA, nrow = num_filas, ncol = num_columnas)
  
  for (i in 1:num_filas) {
    for (j in 1:num_columnas) {
      resultado <- (strike_txn * exp(-r * T[j]) * pnorm(-(log(stp_txn[i]/strike_txn) + (r - ((sigma_txn[j]^2)/2)) * T[j]) / (sigma_txn[j] * sqrt(T[j])))
                    - stp_txn[i] * pnorm(-(log(stp_txn[i]/strike_txn) + (r + ((sigma_txn[j]^2)/2)) * T[j]) / (sigma_txn[j] * sqrt(T[j])))) /
        Put_txn[j]
      resultadosPut_txn[i, j] <- resultado
    }
  }
  
  colnames(resultadosPut_txn) <- paste("Vto a", vencimiento, "dias")
  
  #incluir columna de los valores de St para la posición Call en la matriz de resultados
  CallTable_txn <- cbind(st_txn, resultadosCall_txn)
  
  # definir la tabla como un dataframe para evitar error en el tipo de datos
  CallTable_txn <- as.data.frame(CallTable_txn)
  
  #Proceso similar al anterior realizado ahora para la posición Put
  PutTable_txn <- cbind(stp_txn, resultadosPut_txn)
  PutTable_txn <- as.data.frame(PutTable_txn)
  
  # Graficar Call
  colores <- rainbow(num_columnas)
  matplot(1:num_filas, resultadosCall_txn, type = "l", col = colores, lty = 1, xlab = "Indice", ylab = "Valor", main = "Grafico de Lineas de Resultados Call")
  legend("topleft", legend = colnames(resultadosCall_txn), 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_txn, type = "l", col = colores, lty = 1, xlab = "Indice", ylab = "Valor", main = "Grafico de Lineas de Resultados Put")
  legend("topright", legend = colnames(resultadosPut_txn), col = colores, lty = 1, cex = 0.4)
  grid()
  png(filename = "PutPlot.png")
  dev.off()
  
  return(list(CallTable_txn = CallTable_txn, PutTable_txn = PutTable_txn))
}

# Llamada a la función con valores específicos y gráficas
resultado <- black_scholes_merton(So = 165.31, K = 165, r = 0.05160, VencimientoDias = 60, sigma = 0.2, Stcall = 21.19, Stput = 65.31)

print(resultado$CallTable)
##    st_txn Vto a 30 dias Vto a 60 dias Vto a 90 dias Vto a 120 dias
## 1   21.19     0.1063714     0.1063862     0.1063862      0.1063862
## 2   31.19     0.1565758     0.1565920     0.1565920      0.1565920
## 3   41.19     0.2067809     0.2067979     0.2067979      0.2067979
## 4   51.19     0.2569865     0.2570037     0.2570037      0.2570037
## 5   61.19     0.3071925     0.3072096     0.3072096      0.3072096
## 6   71.19     0.3573988     0.3574154     0.3574154      0.3574154
## 7   81.19     0.4076053     0.4076213     0.4076213      0.4076213
## 8   91.19     0.4578119     0.4578271     0.4578271      0.4578271
## 9  101.19     0.5080187     0.5080329     0.5080330      0.5080330
## 10 111.19     0.5582256     0.5582388     0.5582388      0.5582388
## 11 121.19     0.6084327     0.6084446     0.6084446      0.6084446
## 12 131.19     0.6586398     0.6586505     0.6586505      0.6586505
## 13 141.19     0.7088470     0.7088563     0.7088563      0.7088563
## 14 151.19     0.7590543     0.7590622     0.7590622      0.7590622
## 15 161.19     0.8092617     0.8092680     0.8092680      0.8092680
## 16 171.19     0.8594691     0.8594739     0.8594739      0.8594739
## 17 181.19     0.9096766     0.9096797     0.9096797      0.9096797
## 18 191.19     0.9598842     0.9598856     0.9598856      0.9598856
## 19 201.19     1.0100918     1.0100914     1.0100914      1.0100914
## 20 211.19     1.0602994     1.0602973     1.0602973      1.0602973
## 21 221.19     1.1105071     1.1105031     1.1105031      1.1105031
##    Vto a 150 dias Vto a 180 dias
## 1       0.1063862      0.1063862
## 2       0.1565920      0.1565920
## 3       0.2067979      0.2067979
## 4       0.2570037      0.2570037
## 5       0.3072096      0.3072096
## 6       0.3574154      0.3574154
## 7       0.4076213      0.4076213
## 8       0.4578271      0.4578271
## 9       0.5080330      0.5080330
## 10      0.5582388      0.5582388
## 11      0.6084446      0.6084446
## 12      0.6586505      0.6586505
## 13      0.7088563      0.7088563
## 14      0.7590622      0.7590622
## 15      0.8092680      0.8092680
## 16      0.8594739      0.8594739
## 17      0.9096797      0.9096797
## 18      0.9598856      0.9598856
## 19      1.0100914      1.0100914
## 20      1.0602973      1.0602973
## 21      1.1105031      1.1105031
print(resultado$PutTable)
##    stp_txn Vto a 30 dias Vto a 60 dias Vto a 90 dias Vto a 120 dias
## 1    65.31     1.0000645             1             1              1
## 2    75.31     1.0000580             1             1              1
## 3    85.31     1.0000520             1             1              1
## 4    95.31     1.0000463             1             1              1
## 5   105.31     1.0000409             1             1              1
## 6   115.31     1.0000358             1             1              1
## 7   125.31     1.0000309             1             1              1
## 8   135.31     1.0000262             1             1              1
## 9   145.31     1.0000217             1             1              1
## 10  155.31     1.0000174             1             1              1
## 11  165.31     1.0000132             1             1              1
## 12  175.31     1.0000092             1             1              1
## 13  185.31     1.0000053             1             1              1
## 14  195.31     1.0000014             1             1              1
## 15  205.31     0.9999977             1             1              1
## 16  215.31     0.9999941             1             1              1
## 17  225.31     0.9999906             1             1              1
## 18  235.31     0.9999872             1             1              1
## 19  245.31     0.9999838             1             1              1
## 20  255.31     0.9999805             1             1              1
## 21  265.31     0.9999773             1             1              1
##    Vto a 150 dias Vto a 180 dias
## 1               1              1
## 2               1              1
## 3               1              1
## 4               1              1
## 5               1              1
## 6               1              1
## 7               1              1
## 8               1              1
## 9               1              1
## 10              1              1
## 11              1              1
## 12              1              1
## 13              1              1
## 14              1              1
## 15              1              1
## 16              1              1
## 17              1              1
## 18              1              1
## 19              1              1
## 20              1              1
## 21              1              1

OPCIONES BLACK SCHOLES MERTON MODIFICANDO TASA DE INTERES FTNT

Función con parámetros iniciales

Definimos los precios de las opciones con vencimiento a 30 dias

#OPCIONES BLACK SCHOLES MERTON MODIFICANDO TASA DE INTERES FTNT

# Función con parámetros iniciales

#Definimos los precios de las opciones con vencimiento a 30 dias
Stcall_ftnt = 65
Stput_ftnt = 55

black_scholes_merton <- function(So, K, r, VencimientoDias, sigma, Stcall_ftnt, Stput_ftnt) {
  
  Ano <- 360
  
  #Definir los vencimientos a partir de un número de días establecido
  vencimiento = seq(from = vencimiento, by = 30, length.out = 6)
  
  #Definir un conjunto de Volatilidad a partir de un valor sigma inicial
  sigma_ftnt = seq(from = sigma_ftnt, by = 0.05, length.out = 6)
  
  ## Cálculo del vencimiento
  T <- vencimiento / Ano
  
  
  #Definir d1 y d2
  d1_ftnt <- (log(s0_ftnt/strike_ftnt) + (r + ((sigma_ftnt^2)/2)) * T) / (sigma_ftnt * sqrt(T))
  d2_ftnt <- (log(s0_ftnt/strike_ftnt) + (r - ((sigma_ftnt^2)/2)) * T) / (sigma_ftnt * sqrt(T))
  
  # Definir N1 y N2 para la posición Call y Put
  Nd1_ftnt <- pnorm(d1_ftnt)
  Nd2_ftnt <- pnorm(d2_ftnt)
  Nd1P_ftnt <- pnorm(-d1_ftnt)
  Nd2P_ftnt <- pnorm(-d2_ftnt)
  
  #Valoración Call
  Call_ftnt <- s0_ftnt * Nd1_ftnt - (strike_ftnt * exp(-r * T) * Nd2_ftnt)
  
  #Valoración Put
  Put_ftnt <- (strike_ftnt * exp(-r * T) * Nd2P_ftnt) - s0_ftnt * Nd1P_ftnt
  
  ##Crear vector de varios precios st a partir de un stc dado  
  st_ftnt <- seq(from = Stcall_ftnt, by = 10, length.out = 21)
  num_filas <- length(st_ftnt)
  num_columnas <- length(sigma_ftnt)
  
  ## Matriz resultados de la Valoración Call
  resultadosCall_ftnt <- matrix(NA, nrow = num_filas, ncol = num_columnas)
  
  
   
  for (i in 1:num_filas) {
    for (j in 1:num_columnas) {
      resultado <- (st_ftnt[i] * pnorm((log(st_ftnt[i]/strike_ftnt) + (r + ((sigma_ftnt[j]^2)/2)) * T[j]) / (sigma_ftnt[j] * sqrt(T[j]))) -
                      strike_ftnt * exp(-r * T[j]) * pnorm((log(st_ftnt[i]/strike_ftnt) + (r - ((sigma_ftnt[j]^2)/2)) * T[j]) / (sigma_ftnt[j] * sqrt(T[j])))) /
        Call_ftnt[j]
      resultadosCall_ftnt[i, j] <- resultado
    }
  }
  
  #Definir el nombre de las columnas
  colnames(resultadosCall_ftnt) <- paste("Vto a", vencimiento, "dias")
  
  ##Crear vector de varios precios st a partir de un stp dado
  stp_ftnt <- seq(from = Stput_ftnt, by = 10, length.out = 21)
  
  #matriz de resultados de la valoración Put
  resultadosPut_ftnt <- matrix(NA, nrow = num_filas, ncol = num_columnas)
  
  for (i in 1:num_filas) {
    for (j in 1:num_columnas) {
      resultado <- (strike_ftnt * exp(-r * T[j]) * pnorm(-(log(stp_ftnt[i]/strike_ftnt) + (r - ((sigma_ftnt[j]^2)/2)) * T[j]) / (sigma_ftnt[j] * sqrt(T[j])))
                    - stp_ftnt[i] * pnorm(-(log(stp_ftnt[i]/strike_ftnt) + (r + ((sigma_ftnt[j]^2)/2)) * T[j]) / (sigma_ftnt[j] * sqrt(T[j])))) /
        Put_ftnt[j]
      resultadosPut_ftnt[i, j] <- resultado
    }
  }
  
  colnames(resultadosPut_ftnt) <- paste("Vto a", vencimiento, "dias")
  
  #incluir columna de los valores de St para la posición Call en la matriz de resultados
  CallTable_ftnt <- cbind(st_ftnt, resultadosCall_ftnt)
  
  # definir la tabla como un dataframe para evitar error en el tipo de datos
  CallTable_ftnt <- as.data.frame(CallTable_ftnt)
  
  #Proceso similar al anterior realizado ahora para la posición Put
  PutTable_ftnt <- cbind(stp_ftnt, resultadosPut_ftnt)
  PutTable_ftnt <- as.data.frame(PutTable_ftnt)
  
  # Graficar Call
  colores <- rainbow(num_columnas)
  matplot(1:num_filas, resultadosCall_ftnt, type = "l", col = colores, lty = 1, xlab = "Indice", ylab = "Valor", main = "Grafico de Lineas de Resultados Call")
  legend("topleft", legend = colnames(resultadosCall_ftnt), 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_ftnt, type = "l", col = colores, lty = 1, xlab = "Indice", ylab = "Valor", main = "Grafico de Lineas de Resultados Put")
  legend("topright", legend = colnames(resultadosPut_ftnt), col = colores, lty = 1, cex = 0.4)
  grid()
  png(filename = "PutPlot.png")
  dev.off()
  
  return(list(CallTable_ftnt = CallTable_ftnt, PutTable_ftnt = PutTable_ftnt))
}

# Llamada a la función con valores específicos y gráficas
resultado <- black_scholes_merton(So = 165.31, K = 165, r = 0.05160, VencimientoDias = 60, sigma = 0.2, Stcall = 21.19, Stput = 65.31)

print(resultado$CallTable)
##    st_ftnt Vto a 30 dias Vto a 60 dias Vto a 90 dias Vto a 120 dias
## 1    21.19     0.3442828     0.3453765     0.3453949      0.3453953
## 2    31.19     0.5074438     0.5083785     0.5083942      0.5083945
## 3    41.19     0.6707013     0.6713821     0.6713934      0.6713937
## 4    51.19     0.8340212     0.8343866     0.8343927      0.8343928
## 5    61.19     0.9973859     0.9973919     0.9973920      0.9973920
## 6    71.19     1.1607846     1.1603978     1.1603913      1.1603912
## 7    81.19     1.3242102     1.3234041     1.3233907      1.3233904
## 8    91.19     1.4876577     1.4864107     1.4863900      1.4863896
## 9   101.19     1.6511237     1.6494176     1.6493893      1.6493888
## 10  111.19     1.8146054     1.8124248     1.8123887      1.8123880
## 11  121.19     1.9781005     1.9754323     1.9753880      1.9753872
## 12  131.19     2.1416075     2.1384399     2.1383873      2.1383864
## 13  141.19     2.3051250     2.3014477     2.3013867      2.3013856
## 14  151.19     2.4686519     2.4644556     2.4643860      2.4643848
## 15  161.19     2.6321871     2.6274637     2.6273854      2.6273840
## 16  171.19     2.7957300     2.7904719     2.7903847      2.7903831
## 17  181.19     2.9592798     2.9534802     2.9533841      2.9533823
## 18  191.19     3.1228359     3.1164886     3.1163834      3.1163815
## 19  201.19     3.2863979     3.2794971     3.2793828      3.2793807
## 20  211.19     3.4499652     3.4425057     3.4423822      3.4423799
## 21  221.19     3.6135375     3.6055144     3.6053815      3.6053791
##    Vto a 150 dias Vto a 180 dias
## 1       0.3453953      0.3453953
## 2       0.5083945      0.5083945
## 3       0.6713937      0.6713937
## 4       0.8343928      0.8343928
## 5       0.9973920      0.9973920
## 6       1.1603912      1.1603912
## 7       1.3233904      1.3233904
## 8       1.4863896      1.4863896
## 9       1.6493888      1.6493888
## 10      1.8123880      1.8123880
## 11      1.9753872      1.9753872
## 12      2.1383864      2.1383864
## 13      2.3013856      2.3013856
## 14      2.4643847      2.4643847
## 15      2.6273839      2.6273839
## 16      2.7903831      2.7903831
## 17      2.9533823      2.9533823
## 18      3.1163815      3.1163815
## 19      3.2793807      3.2793807
## 20      3.4423799      3.4423799
## 21      3.6053791      3.6053791
print(resultado$PutTable)
##    stp_ftnt Vto a 30 dias Vto a 60 dias Vto a 90 dias Vto a 120 dias
## 1     65.31     0.9997335     0.9999954     0.9999999      1.0000000
## 2     75.31     0.9990997     0.9999844     0.9999997      1.0000000
## 3     85.31     0.9985132     0.9999742     0.9999995      1.0000000
## 4     95.31     0.9979657     0.9999646     0.9999993      1.0000000
## 5    105.31     0.9974511     0.9999556     0.9999992      1.0000000
## 6    115.31     0.9969647     0.9999470     0.9999990      1.0000000
## 7    125.31     0.9965028     0.9999388     0.9999989      1.0000000
## 8    135.31     0.9960624     0.9999310     0.9999987      1.0000000
## 9    145.31     0.9956411     0.9999234     0.9999986      1.0000000
## 10   155.31     0.9952370     0.9999162     0.9999984      1.0000000
## 11   165.31     0.9948483     0.9999092     0.9999983      1.0000000
## 12   175.31     0.9944736     0.9999025     0.9999982      1.0000000
## 13   185.31     0.9941117     0.9998959     0.9999981      1.0000000
## 14   195.31     0.9937615     0.9998896     0.9999979      1.0000000
## 15   205.31     0.9934221     0.9998834     0.9999978      1.0000000
## 16   215.31     0.9930927     0.9998774     0.9999977      1.0000000
## 17   225.31     0.9927725     0.9998716     0.9999976      1.0000000
## 18   235.31     0.9924610     0.9998659     0.9999975      1.0000000
## 19   245.31     0.9921576     0.9998603     0.9999974      1.0000000
## 20   255.31     0.9918617     0.9998549     0.9999973      0.9999999
## 21   265.31     0.9915729     0.9998495     0.9999972      0.9999999
##    Vto a 150 dias Vto a 180 dias
## 1               1              1
## 2               1              1
## 3               1              1
## 4               1              1
## 5               1              1
## 6               1              1
## 7               1              1
## 8               1              1
## 9               1              1
## 10              1              1
## 11              1              1
## 12              1              1
## 13              1              1
## 14              1              1
## 15              1              1
## 16              1              1
## 17              1              1
## 18              1              1
## 19              1              1
## 20              1              1
## 21              1              1

Seleccione una opcion Call y una Put cercanas al promedio del precio de la accion en el periodo de la muestra y genere la siguiente estrategia:

-Largo en la accion. -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.

PYG PARA TXN

mu_txn=mean(txn)
k_txn=150
  
Preciostxn<- data.frame(txn$TXN.Adjusted)

# Inicializar el PyG diario
pyg_txn <- numeric(length(Preciostxn$TXN.Adjusted) - 1)

# Calcular el PyG diario
for (i in 1:(length(Preciostxn$TXN.Adjusted) - 1)) {
  Sttxn <- Preciostxn$TXN.Adjusted[i]
  St1txn <- Preciostxn$TXN.Adjusted[i + 1]

  # Largo en la accion
  largo_acciontxn <- (St1txn - Sttxn)
  
  # Largo en la call
  largo_calltxn <- max((St1txn - k_txn), 0) - max((Sttxn - k_txn), 0)
  
  # Corto en la put
  corto_puttxn <- -max((k_txn - St1txn), 0) + max((k_txn - Sttxn), 0)
  
  # PyG diario de la estrategia
    pyg_txn[i] <- largo_acciontxn + largo_calltxn + corto_puttxn
}

PYGtxn <- data.frame(Dia = 1:length(pyg_txn), PyG = pyg_txn)
knitr::kable(PYGtxn, caption = "PYG TXN")
PYG TXN
Dia PyG
1 1.6351471
2 2.2440491
3 -1.9656677
4 1.4959717
5 6.8712311
6 0.6262054
7 1.2350769
8 1.7047577
9 2.5397034
10 0.5218506
11 -4.5054016
12 1.4612274
13 -6.7320099
14 -1.0263214
15 7.5147552
16 0.4523621
17 2.4527283
18 -0.6784058
19 0.7132111
20 -2.1744690
21 5.1316528
22 2.4875488
23 -1.9134979
24 4.2270813
25 -1.9656982
26 -0.2087250
27 -0.3305054
28 -1.4264221
29 1.4786377
30 1.4959717
31 0.1391449
32 2.7832642
33 2.6440887
34 -2.0178680
35 -2.6092834
36 2.4179535
37 -2.2788086
38 1.6004028
39 3.2877197
40 15.5341492
41 -2.8703003
42 1.4090271
43 3.1485748
44 -1.1549683
45 -6.1771240
46 -2.7298584
47 -2.8523560
48 -8.5570679
49 3.6222992
50 3.0098724
51 6.2821655
52 -6.4746552
53 -0.9274597
54 5.7046967
55 -4.7947693
56 -1.3124237
57 5.1972809
58 3.1147919
59 -0.5074615
60 3.0273285
61 -1.4524078
62 -8.6095428
63 2.4148560
64 0.8924561
65 0.9799500
66 1.4524078
67 0.3150024
68 -3.5173187
69 4.9872589
70 3.8847656
71 0.4899597
72 0.0175018
73 -0.1049805
74 2.6948242
75 2.8699188
76 -1.0675049
77 -2.1873932
78 2.0999146
79 -0.4374695
80 -0.8399811
81 -3.7797699
82 1.9248657
83 -3.4297791
84 3.3773193
85 0.6474762
86 -1.6974182
87 3.6748047
88 -1.1374664
89 -3.0623779
90 3.2548676
91 2.5198669
92 -2.2573395
93 -6.7721710
94 4.3047333
95 0.5075073
96 4.1297913
97 -0.5949554
98 3.3947906
99 -3.8322754
100 1.1024170
101 -1.1724396
102 2.5723419
103 -4.1297302
104 -16.8341217
105 -0.9449310
106 3.6748047
107 -0.8924561
108 0.5074768
109 -2.8209686
110 0.3526154
111 0.0881348
112 5.1658936
113 -1.9570312
114 0.8815308
115 -0.7757416
116 0.3349609
117 -3.5790405
118 1.6572571
119 -1.0578156
120 -1.4986725
121 0.7581177
122 -0.1939392
123 -0.0881653
124 -2.8385162
125 -0.2292175
126 1.6044312
127 3.5261841
128 0.2115631
129 4.5840454
130 -2.6799011
131 -2.5036011
132 -1.8336639
133 4.4606628
134 0.8110504
135 2.8738556
136 -0.6523438
137 -1.1107178
138 4.1432495
139 4.1432648
140 1.0049744
141 0.7581024
142 0.0352631
143 -1.3046722
144 0.0881500
145 4.4959259
146 -0.7052307
147 -0.0353088
148 -0.0881348
149 0.1586761
150 -1.6044464
151 1.1107788
152 2.2567749
153 -3.0325317
154 -1.5691528
155 4.3196106
156 0.6170654
157 2.7680664
158 -2.3449249
159 -0.0881805
160 1.2694550
161 -2.6446533
162 1.7454987
163 2.7151794
164 -1.4810333
165 4.3724670
166 1.6044312
167 -6.5763702
168 -7.4226379
169 3.0501556
170 -4.4958954
171 -0.3019104
172 -6.6948700
173 4.8835449
174 5.4518280
175 10.6017151
176 0.1420746
177 -6.7837067
178 1.6870728
179 1.8645935
180 3.0544281
181 0.6925964
182 -1.0654907
183 -1.7225800
184 3.3563232
185 -2.9478912
186 -5.2386627
187 -12.5729218
188 -5.4340668
189 0.7280884
190 -10.0512390
191 1.7935791
192 8.5773010
193 -9.1633301
194 9.3054199
195 -7.6893768
196 -2.7703247
197 -14.4197540
198 12.5729065
199 -9.9801788
200 -15.9292297
201 15.1123352
202 -22.2689667
203 22.4642792
204 -10.9213562
205 2.7880707
206 -7.0501099
207 1.4917603
208 12.2887421
209 -11.0101624
210 15.2721710
211 -12.8925323
212 2.6992340
213 -3.7114563
214 -5.3985596
215 9.1100159
216 -3.6226654
217 15.9469452
218 -4.7947083
219 6.9434967
220 -4.4040985
221 -0.0354919
222 5.8247070
223 -5.2741699
224 6.0555573
225 3.8358154
226 -3.5872040
227 -8.3286896
228 9.1278381
229 -2.6992645
230 6.1621399
231 3.2852936
232 -2.7348328
233 9.1633606
234 -5.9135437
235 -9.7718506
236 1.4138947
237 1.8613129
238 1.5749512
239 2.2013550
240 2.4160614
241 -0.2147217
242 -5.7091675
243 -4.6890564
244 2.2908020
245 -3.7762756
246 11.0603943
247 -3.1140747
248 8.5906525
249 -7.1947021
250 -0.0536499
251 4.1163025
252 3.7405090
253 -3.4899445
254 5.1364899
255 -1.5749512
256 8.6084900
257 8.1252899
258 2.4519501
259 5.1185303
260 2.5414124
261 -1.3244019
262 -1.2885742
263 -12.1521759
264 -1.1453705
265 0.4653778
266 3.3645935
267 0.1968842
268 -0.4295654
269 -1.9507599
270 0.6085205
271 2.4877167
272 -4.7069702
273 1.9149628
274 -3.0246124
275 2.5055847
276 3.9373779
277 -3.8836365
278 1.8075562
279 6.6577606
280 -1.6644440
281 1.1812134
282 2.0939484
283 0.1789703
284 -3.0603638
285 5.4944000
286 0.4653168
287 0.0536957
288 3.0603943
289 4.8143005
290 -1.9686584
291 -5.2796478
292 -6.2461090
293 1.0559845
294 4.4563293
295 -3.5615082
296 2.7024994
297 -3.3337708
298 -2.4147339
299 3.1895905
300 5.2438965
301 0.8469543
302 1.8741608
303 -0.3244019
304 3.3338165
305 1.1352081
306 4.6853180
307 -2.6850891
308 0.3604736
309 1.6759033
310 1.8560486
311 -1.4956665
312 0.1621704
313 3.1715546
314 1.2434387
315 1.1532593
316 1.4236755
317 -1.7300110
318 3.6040649
319 -2.4146729
320 5.0636292
321 4.8294983
322 -10.7581635
323 -2.1624451
324 -7.9829865
325 6.5594025
326 -4.4870148
327 -1.4776611
328 3.8923645
329 3.8022461
330 -1.7299347
331 1.2974854
332 -3.1354980
333 -3.0274963
334 3.0094299
335 -6.2890778
336 2.7570801
337 2.9373627
338 6.5232849
339 -0.7929382
340 2.3246918
341 3.8203430
342 -6.8838043
343 5.3880768
344 -0.4144592
345 5.2259521
346 2.3605957
347 5.1358032
348 7.1900940
349 -0.7387695
350 -3.0995178
351 -0.3963928
352 1.0270386
353 -4.2527771
354 0.1261292
355 -8.4695129
356 3.7662354
357 3.1355896
358 -7.2261658
359 2.1083374
360 -7.4243164
361 7.6410217
362 -2.9039917
363 1.8331604
364 3.0854492
365 8.5848694
366 6.4068298
367 3.9566956
368 -2.7587891
369 -8.5848389
370 7.6410828
371 -2.1779785
372 3.9021606
373 3.0128479
374 -5.1001282
375 -3.5391235
376 6.7517395
377 -0.8167419
378 1.0889587
379 3.5028992
380 -3.1762390
381 2.5228882
382 4.1018066
383 4.0655518
384 -1.3975525
385 -1.3431091
386 8.2400818
387 -0.4175415
388 0.7078552
389 -7.1146545
390 -1.3793945
391 -2.5228271
392 -0.8893433
393 4.1018677
394 -0.4718933
395 1.0345459
396 2.5046692
397 -2.9765930
398 0.1633606
399 -2.7950134
400 1.1978455
401 -0.3085327
402 -0.5263367
403 2.7586975
404 2.5954285
405 -3.4665833
406 2.1598206
407 1.4701538
408 6.7516785
409 5.8443298
410 0.2721558
411 1.7968750
412 -1.6153870
413 0.5445251
414 -4.5737610
415 9.0749512
416 -1.5609436
417 3.2125244
418 -4.1562500
419 0.1996460
420 -2.6317444
421 -15.4999390
422 11.4343872
423 -4.6014709
424 12.3618774
425 4.1814880
426 -11.2663269
427 6.2448425
428 -3.7797241
429 9.4768372
430 -2.6111755
431 1.2234802
432 8.8742371
433 0.7669067
434 2.0450745
435 -4.0719604
436 -3.6884766
437 3.3598328
438 -9.6046753
439 -0.4382324
440 11.9419250
441 -16.1781921
442 3.1772156
443 9.8602600
444 -5.0761414
445 -7.8517761
446 -13.4027405
447 8.5638428
448 -10.6454163
449 15.0643921
450 -1.7165222
451 10.0977173
452 -2.5198975
453 2.4468994
454 4.0718689
455 4.0354919
456 -9.1116333
457 2.9580383
458 7.5231018
459 -2.4103088
460 0.2191162
461 -0.7487183
462 17.7303162
463 -3.6884766
464 -0.4382629
465 5.5692749
466 5.6057739
467 8.8925171
468 -4.2727966
469 -2.7389221
470 3.8527527
471 0.4199829
472 -5.4779968
473 -2.1727905
474 -1.6616821
475 5.1857910
476 -2.2642517
477 -8.8925476
478 -3.2684631
479 6.6282654
480 -5.6605530
481 5.5144958
482 4.6380615
483 -2.0999451
484 -15.3199768
485 7.3039246
486 -7.8767090
487 -3.1396790
488 0.4223022
489 4.8104553
490 4.8105469
491 6.4078064
492 -10.4838867
493 2.1114502
494 -12.1179810
495 4.3881531
496 7.8583069
497 -4.4799500
498 -3.5986938
499 5.2327881
500 6.5731506
501 -0.5325317
502 6.7567444
503 0.0184021
504 -0.6242676
505 1.4137878
506 1.2668762
507 -1.5056152
508 3.2131348
509 -8.7213440
510 7.4728088
511 -2.7908325
512 -2.9744568
513 -0.8812561
514 2.8458862
515 1.2301941
516 2.9193115
517 -3.0295105
518 -1.6157532
519 -0.1468506
520 -8.4091492
521 5.5815735
522 1.7075195
523 -1.7258606
524 4.6085205
525 -0.8078003
526 6.1690979
527 2.4786987
528 -1.0649414
529 -2.6806641
530 2.5154114
531 -1.8543701
532 -2.6072693
533 -2.8274841
534 3.7272034
535 3.0295105
536 -1.3219604
537 0.1468201
538 -5.5448608
539 -3.9291992
540 0.2203674
541 2.8091431
542 11.8792725
543 -18.9664612
544 7.3113403
545 2.6033325
546 -5.7789307
547 3.1755981
548 5.5019836
549 1.4585571
550 0.1846924
551 -2.5479126
552 5.6127625
553 1.4400940
554 -0.3692627
555 -4.6341858
556 -1.4771118
557 -0.2768860
558 -3.0094910
559 1.5323792
560 2.1233215
561 -6.5174561
562 -4.6526794
563 2.2893982
564 -0.1292419
565 5.3173523
566 -0.0553894
567 0.4985352
568 -0.2216187
569 4.7081299
570 1.6800537
571 -0.9599915
572 -4.7265320
573 1.9570923
574 0.8677063
575 -0.7754822
576 -1.2185059
577 -0.6093140
578 4.0249634
579 6.1481628
580 2.0863342
581 4.4126282
582 -1.2554016
583 -1.0524292
584 -6.7574463
585 0.6831055
586 5.4650879
587 5.0773010
588 3.6556702
589 -0.5908203
590 -10.0438538
591 -3.3602905
592 -1.5878296
593 2.9171448
594 -6.2589111
595 6.4251099
596 0.9415894
597 1.6986694
598 -0.1293030
599 -3.4525757
600 -9.0283813
601 -2.5479431
602 9.9515991
603 3.6187744
604 0.8492737
605 6.1296997
606 2.1232910
607 3.5263672
608 -4.0987549
609 2.0863342
610 -5.9450989
611 -18.2414856
612 1.4216614
613 1.4118042
614 -0.0185547
615 3.4738159
616 -0.2786255
617 3.5667419
618 4.2540894
619 -1.9319763
620 -2.9165649
621 -7.0034180
622 2.9351196
623 2.7493591
624 -1.5789795
625 -1.3190002
626 1.9505920
627 7.2448730
628 3.1394958
629 -4.9414368
630 0.2600708
631 1.7833557
632 -9.9199219
633 11.3689270
634 -3.7339478
635 -1.1331177
636 3.3809204
637 -0.3714600
638 2.2848816
639 8.2108765
640 -4.9042053
641 -5.5544434
642 4.8299255
643 -5.1270752
644 -5.5173645
645 5.8888245
646 -9.6599426
647 -3.6038513
648 -3.8267822
649 3.9568481
650 1.0402222
651 0.8731079
652 8.2481079
653 -1.3746948
654 -0.5387268
655 -2.6006470
656 -1.7462769
657 3.9568787
658 0.3714905
659 -7.3934937
660 -0.1115112
661 -13.5981750
662 6.5390320
663 3.1209106
664 2.5821533
665 -3.4924316
666 5.3129578
667 -8.7868042
668 -7.3935242
669 -9.0097656
670 4.0682983
671 5.0157166
672 -8.1365356
673 8.1179810
674 -6.5390320
675 6.7879944
676 4.1139832
677 3.3659668
678 12.2483215
679 -22.9071655
680 -7.7978210
681 -2.7488403
682 5.0115356
683 7.6295166
684 -11.3133850
685 -11.7060547
686 -3.6090088
687 6.9188538
688 3.8709106
689 -6.7132263
690 3.9082031
691 -0.0934753
692 -1.9635010
693 7.3864136
694 2.3000488
695 -1.5520020
696 -5.0489807
697 5.2546387
698 1.6829224
699 -1.9073486
700 -9.5181274
701 4.5813904
702 9.5742493
703 0.5423279
704 -4.4692383
705 -6.8067017
706 10.4718933
707 7.4985962
708 4.0016785
709 3.0481262
710 0.6731567
711 3.5342712
712 -6.1148071
713 9.5929871
714 1.2902222
715 1.4585876
716 9.9669800
717 -6.6571045
718 -7.4238281
719 -2.6179199
720 1.1780701
721 -10.3410034
722 0.1309509
723 0.6544800
724 -6.5261841
725 -4.0578613
726 1.9821472
727 3.9456177
728 -2.7114258
729 5.4229126
730 4.6749573
731 0.6731262
732 -4.0952148
733 -7.3302612
734 1.1219482
735 -10.2287598
736 1.7764893
737 12.0800476
738 -10.4718628
739 7.0124207
740 -2.7301636
741 6.9001160
742 -11.1262817
743 -3.1629028
744 -4.7255859
745 6.2129517
746 -6.6835938
747 2.2780151
748 7.2295227
749 -2.3345032
750 12.1998291
751 -8.8109741
752 -5.0456848
753 4.1231689
754 0.2259216
755 -3.8971558
756 4.0477295
757 7.7567444
758 7.2294617
759 -2.2780762
760 -4.4054565
761 4.3302002
762 -8.2649536
763 -8.6039734
764 3.9348755
765 -8.4345093
766 -7.1353455
767 -7.1542358
768 -8.0014343
769 1.0354919
770 3.4641724
771 -8.5662842
772 -2.2026978
773 6.1375122
774 -1.6190491
775 -2.7487793
776 9.0557556
777 -0.6213074
778 -2.7487183
779 -2.5981140
780 1.6379089
781 -9.6205444
782 1.0543518
783 3.2193909
784 7.3048401
785 1.5814514
786 -3.7089539
787 1.6944885
788 -0.3200684
789 6.7023926
790 5.0643921
791 -1.6379089
792 9.3570251
793 1.2989807
794 2.2780457
795 -4.9703064
796 -1.3178711
797 -4.4431763
798 20.1448059
799 7.9261780
800 8.1299133
801 -0.1705627
802 -2.9942322
803 11.8442993
804 2.7289429
805 -1.1560059
806 -2.8426208
807 -9.6460266
808 10.2524719
809 -2.0088501
810 6.2917175
811 0.0378723
812 -3.8659668
813 -12.6022949
814 3.3164062
815 -3.8092346
816 -9.4943237
817 2.0466919
818 -0.6253662
819 9.7028503
820 -14.8196106
821 -2.9374390
822 -2.2740784
823 -2.8994751
824 1.8003540
825 -5.9884949
826 0.1895447
827 5.1546326
828 4.9082947
829 4.4155273
830 -0.3032227
831 -15.0281067
832 4.9461975
833 -4.9082642
834 4.9082642
835 1.8761597
836 -0.3600464
837 -5.2304688
838 -1.2886963
839 -2.5204468
840 -1.5729065
841 0.4737549
842 3.9607849
843 -8.2436829
844 -6.9549561
845 9.5891418
846 10.0628967
847 5.0220337
848 -2.3878479
849 -13.7583313
850 -4.7187805
851 -6.3295593
852 -3.6007080
853 5.2872925
854 -11.3705444
855 5.0219727
856 0.9854431
857 2.1604614
858 2.0276489
859 11.3706055
860 3.6575317
861 0.9665222
862 -8.1299744
863 -2.1035156
864 11.1555176
865 -1.3944092
866 4.3361511
867 -8.4239502
868 -3.7631531
869 11.7095642
870 5.8069458
871 4.6227417
872 -5.9598083
873 18.5289001
874 9.1689758
875 -3.9158936
876 0.2483215
877 -7.8509827
878 3.6294250
879 -0.3438721
880 -5.3103333
881 9.2072144
882 3.3619080
883 -3.6484680
884 -7.7745056
885 -0.0381775
886 14.2882385
887 -5.6541443
888 0.3056030
889 -0.5157471
890 -5.8261108
891 -1.1270447
892 4.9856262
893 -4.0114136
894 6.1508484
895 0.0382385
896 -3.2091370
897 -11.0982666
898 -0.8787231
899 -3.7058105
900 -2.9034729
901 5.0429382
902 -7.6981506
903 -0.6112366
904 -1.1461182
905 -4.9474182
906 7.3160400
907 0.3820801
908 -3.8395386
909 11.3848267
910 -4.2788696
911 15.7209473
912 2.9035034
913 3.2855530
914 0.8977966
915 -1.4135132
916 1.6809082
917 -6.8958130
918 -3.1327515
919 -5.4058228
920 3.9541321
921 9.8757019
922 -2.1585083
923 -3.8204041
924 -1.7956238
925 2.1777039
926 -1.6737366
927 7.8491516
928 9.4074402
929 5.0404053
930 -4.6748962
931 -2.4817200
932 4.7902832
933 -13.4474182
934 -2.9049377
935 1.5390320
936 1.7699280
937 -0.7118835
938 4.1554871
939 -4.6556091
940 -1.4620972
941 -8.7726440
942 -1.8468018
943 3.8861084
944 -5.1558533
945 3.0780945
946 1.3659363
947 1.3851013
948 3.6744995
949 3.0781250
950 -5.0596008
951 -1.9046631
952 8.0030823
953 -5.3482056
954 -3.4627991
955 4.3285217
956 3.5398560
957 -2.5779419
958 5.2712708
959 -2.7317810
960 6.6370850
961 -1.4428406
962 -4.0207520
963 7.6183167
964 -1.4813843
965 -4.7325439
966 0.8464966
967 6.8294983
968 6.1562195
969 3.4051208
970 -3.5590210
971 -7.2335510
972 -6.1561890
973 1.7698975
974 2.5009460
975 0.8657227
976 -4.4632874
977 3.0011902
978 -0.2501221
979 2.0585022
980 0.5194702
981 -6.2331848
982 -0.8849792
983 0.7695618
984 -2.1546936
985 -12.5240173
986 -9.4843750
987 1.5582886
988 3.7129211
989 -1.0003662
990 -5.2712402
991 -1.1350403
992 -2.0200195
993 9.2278442
994 -3.1017761
995 -2.3651428
996 0.0969238
997 -3.6445923
998 1.3764038
999 6.5525513
1000 -3.6445923
1001 3.7996826
1002 8.6656494
1003 0.5816345
1004 1.4539185
1005 -2.1712646
1006 -5.1761169
1007 4.9435120
1008 12.9306335
1009 0.5040588
1010 -5.1761475
1011 3.7415466
1012 -1.1244202
1013 -9.6349792
1014 0.1938782
1015 3.1793213
1016 0.4458923
1017 -3.1793518
1018 6.6882629
1019 6.5331726
1020 -0.5621948
1021 1.8804626
1022 -2.5783691
1023 -4.6527100
1024 -7.5218811
1025 4.1681213
1026 -9.5962524
1027 2.0743408
1028 14.6560059
1029 -2.6171265
1030 3.5476379
1031 6.2617493
1032 -0.5040588
1033 -6.2616882
1034 -3.3150330
1035 -2.1712952
1036 11.1277161
1037 -1.2019348
1038 6.8821106
1039 1.4539490
1040 -4.4006958
1041 4.9435120
1042 0.5428162
1043 -0.0193787
1044 -7.2698364
1045 8.5299683
1046 -0.8336182
1047 4.2455750
1048 -19.5413513
1049 3.3344727
1050 3.6897278
1051 3.1821289
1052 -3.1821289
1053 -11.5768127
1054 -1.2494202
1055 -6.5595703
1056 1.0151367
1057 -4.3534851
1058 1.0541992
1059 0.5661621
1060 -2.6550598
1061 8.3555908
1062 -4.5291748
1063 -4.7634888
1064 0.0780640
1065 1.4251709
1066 2.8502808
1067 -1.6398926
1068 5.3100891
1069 -8.2775574
1070 4.3340454
1071 1.7374878
1072 3.8849487
1073 -2.8502502
1074 -2.2841187
1075 3.4554443
1076 -0.1756897
1077 -3.2992859
1078 -6.5205078
1079 -0.0975952
1080 2.3036194
1081 -4.5877686
1082 1.6984558
1083 3.2993164
1084 -6.6962280
1085 0.4099731
1086 0.6051941
1087 -2.0303345
1088 -3.3188477
1089 -0.1756897
1090 1.1518250
1091 -5.7395935
1092 0.3514099
1093 1.8546448
1094 -0.1562195
1095 1.8351440
1096 -5.2710571
1097 1.4056091
1098 -5.5834045
1099 3.6897278
1100 -0.5466309
1101 1.8351440
1102 -0.6442871
1103 -4.5487366
1104 -4.3925476
1105 3.0260010
1106 -0.0780945
1107 -4.7634888
1108 -1.7179871
1109 -6.1105347
1110 -2.9088440
1111 1.1713562
1112 -10.0150452
1113 4.3340149
1114 -1.7375183
1115 -2.6005859
1116 2.9749146
1117 2.2853699
1118 8.1564026
1119 5.7527771
1120 -5.3784485
1121 -1.7928467
1122 -2.6990967
1123 -3.8417664
1124 7.7229614
1125 -2.6006165
1126 7.9987793
1127 3.8220825
1128 0.0394287
1129 5.3784790
1130 1.8125000
1131 -4.1569824
1132 0.9850464
1133 -0.6698303
1134 -1.9504089
1135 0.5910034
1136 0.5910645
1137 -0.9653625
1138 4.9253540
1139 4.3540039
1140 -0.3349304
1141 -2.3641663
1142 3.2113342
1143 -1.2806091
1144 5.7922363
1145 -4.0387878
1146 7.6638489
1147 13.7318726
1148 -0.2758179
1149 -2.4035645
1150 2.1277466
1151 -6.5408936
1152 3.2113647
1153 2.8172913
1154 5.0632629
1155 0.8274536
1156 0.9653625
1157 -2.4823608
1158 -2.3641663
1159 -4.9647522
1160 -4.4722290
1161 1.2412109
1162 6.7772522
1163 0.1773376
1164 -2.7187805
1165 -3.2507629
1166 -1.4382019
1167 -1.9504395
1168 -2.8764038
1169 8.8459473
1170 13.2787170
1171 2.3247986
1172 -0.9653625
1173 -8.4125061
1174 -5.2208862
1175 -6.5605774
1176 3.8417664
1177 -5.3414917
1178 -3.8323975
1179 -0.8538208
1180 -0.9729919
1181 -0.5957336
1182 -1.0523987
1183 0.7942810
1184 2.8594055
1185 4.3486328
1186 -2.6210938
1187 -8.3994446
1188 2.0253906
1189 5.6393738
1190 -0.6553040
1191 4.6862488
1192 2.6607971
1193 2.6806641
1194 -3.4550781
1195 1.2112732
1196 1.2708435
1197 -3.7728271
1198 8.5186157
1199 7.3867798
1200 2.7601013
1201 -3.5742493
1202 2.4423828
1203 6.7513733
1204 -5.8975220
1205 3.7529602
1206 1.2112732
1207 -4.2096863
1208 -3.0579529
1209 2.7402649
1210 -6.5726318
1211 -4.8649597
1212 6.3939209
1213 5.1826477
1214 -0.2184143
1215 -3.2366638
1216 -5.8379211
1217 9.8489990
1218 2.6608582
1219 -2.0651550
1220 -5.5797729
1221 -0.0397034
1222 -3.5941162
1223 -2.0452576
1224 3.8919678
1225 7.9427490
1226 -9.0150452
1227 4.5273743
1228 -9.6702881
1229 0.0397339
1230 2.4622192
1231 -3.7529297
1232 -4.0309448
1233 -7.9229126
1234 7.4463196
1235 4.0508118
1236 18.5463257
1237 0.8737183
1238 4.4280701
1239 3.5940857
1240 -5.6989136
1241 -2.4225464
1242 1.1914368
1243 6.1754761
1244 5.4804993
1245 4.6000061
1246 2.5599976
1247 2.7400208
1248 3.4599915
1249 1.5400085
1250 6.6199951
1251 8.7999878
1252 -1.1199951
1253 0.1000061
1254 8.3599854
1255 -0.3800049
1256 7.0599976
1257 -10.5000000
1258 3.7799988

PYG PARA FTNT

mu_ftnt=mean(ftnt)
k_ftnt=50
  
Preciosftnt<- data.frame(ftnt$FTNT.Adjusted)

# Inicializar el PyG diario
pyg_ftnt <- numeric(length(Preciosftnt$FTNT.Adjusted) - 1)

# Calcular el PyG diario
for (i in 1:(length(Preciosftnt$FTNT.Adjusted) - 1)) {
  Stftnt <- Preciosftnt$FTNT.Adjusted[i]
  St1ftnt <- Preciosftnt$FTNT.Adjusted[i + 1]

  # Largo en la accion
  largo_accionftnt <- (St1ftnt - Stftnt)
  
  # Largo en la call
  largo_callftnt <- max((St1ftnt - k_ftnt), 0) - max((Stftnt - k_ftnt), 0)
  
  # Corto en la put
  corto_putftnt <- -max((k_ftnt - St1ftnt), 0) + max((k_ftnt - Stftnt), 0)
  
  # PyG diario de la estrategia
    pyg_ftnt[i] <- largo_accionftnt + largo_callftnt + corto_putftnt
}

PYGftnt <- data.frame(Dia = 1:length(pyg_ftnt), PyG = pyg_ftnt)
knitr::kable(PYGftnt, caption = "PYG FTNT")
PYG FTNT
Dia PyG
1 -0.5680008
2 0.0920010
3 -1.4279995
4 -1.1320000
5 1.1280003
6 0.2719994
7 0.1760006
8 0.0919991
9 0.3439999
10 0.5200005
11 0.4039993
12 -0.1520004
13 -0.3599987
14 -0.4720001
15 0.1679993
16 0.8040009
17 -0.0080013
18 -0.3239994
19 -0.1159992
20 -0.3880005
21 0.1520004
22 0.6000004
23 0.0319996
24 0.1439991
25 0.3680000
26 0.2919998
27 0.0200005
28 -0.1359997
29 0.8000011
30 0.1999969
31 1.2040024
32 0.2599983
33 0.1240005
34 -0.0999985
35 0.7119980
36 -0.0399971
37 0.3639984
38 0.0760002
39 0.0239983
40 -0.4119987
41 -0.4959984
42 0.0079994
43 -0.9600029
44 -0.2079964
45 -0.8520012
46 -0.5160007
47 2.8119984
48 -2.0759964
49 0.4799995
50 -0.2400017
51 1.1640015
52 -0.3360023
53 -0.5359993
54 0.6879997
55 -1.2799988
56 -0.2439995
57 0.2239990
58 0.2000008
59 -0.5960007
60 0.9199982
61 -0.0879974
62 -0.5600014
63 0.3120003
64 -0.1079979
65 -1.2040024
66 0.0480003
67 0.4840012
68 -0.4600010
69 0.0760002
70 0.8679981
71 -0.1159973
72 -0.4360008
73 0.0799999
74 0.2560005
75 -0.5920010
76 -0.1040001
77 0.6240005
78 -0.0879993
79 -0.2320004
80 -0.1800003
81 -0.0760002
82 0.4120007
83 0.0079994
84 0.0039997
85 -0.1719990
86 -1.0559998
87 0.2159996
88 0.1159992
89 -0.5599995
90 0.6879997
91 0.0480003
92 0.1280003
93 -0.5920010
94 0.6240005
95 -0.1159992
96 0.6239986
97 0.0600014
98 -0.2520008
99 -0.3640003
100 0.4559994
101 -0.9399986
102 -0.1120014
103 0.3040009
104 0.4080009
105 1.1599979
106 -0.1919975
107 -0.0680008
108 0.1759987
109 0.7480011
110 -0.4239998
111 3.4279976
112 0.7040024
113 -0.1000023
114 0.5880013
115 0.4239998
116 0.8240013
117 -0.1119995
118 1.6159973
119 -0.1279984
120 0.1800003
121 0.5680008
122 0.9199982
123 0.4920006
124 -1.0480003
125 0.2280006
126 0.3159981
127 0.5320015
128 -0.3079987
129 0.3439980
130 -0.0480003
131 -0.4759979
132 -0.0480003
133 -0.0919991
134 0.5359993
135 -0.5279999
136 0.1040001
137 -0.1200027
138 0.2360001
139 0.1040001
140 0.4960022
141 0.6399994
142 -0.3559990
143 0.6599998
144 0.6119995
145 -1.0439987
146 0.3599968
147 -0.0159988
148 0.1840019
149 -0.3160019
150 -0.2000008
151 -0.0760002
152 1.1680031
153 0.6119995
154 0.3159981
155 -0.0439987
156 0.7119980
157 0.3240013
158 -0.0639992
159 0.9479980
160 0.0120010
161 0.1320000
162 0.8160019
163 -0.6400032
164 0.0600014
165 0.0600014
166 0.5119972
167 -0.4319992
168 -1.4239998
169 1.2439995
170 -0.1079979
171 0.4239998
172 -1.1879997
173 0.4519997
174 1.4360008
175 -0.1200027
176 0.6200027
177 -1.6879997
178 0.6479988
179 -0.5639992
180 0.0319977
181 0.6800003
182 0.0359993
183 0.1040001
184 -0.0999985
185 -0.4799995
186 -1.4080009
187 -2.3120003
188 -1.4599991
189 0.4840012
190 -1.4480019
191 -0.2319984
192 3.2159996
193 -2.6280022
194 1.4080009
195 -1.2200012
196 -1.7999992
197 -4.9440002
198 1.4319992
199 -1.1079979
200 -4.8560009
201 2.7320004
202 -2.7759991
203 0.9279995
204 -0.6000004
205 3.8560009
206 -0.5000000
207 0.3959999
208 5.5519981
209 -1.1359978
210 1.0000000
211 -0.8640022
212 1.4680023
213 0.0879974
214 -0.2799988
215 0.1800003
216 0.2080002
217 2.5760002
218 -0.4760017
219 0.9960022
220 -2.9000015
221 1.0839996
222 1.8840027
223 0.1999969
224 0.1599998
225 1.0839996
226 -0.2439995
227 -4.4679985
228 1.2519989
229 -1.4879990
230 1.0719986
231 0.9480019
232 -0.0800018
233 1.2320023
234 -0.3120003
235 -1.3600006
236 0.5439987
237 1.1440010
238 1.1599998
239 9.4640007
240 0.6879997
241 1.4479980
242 -0.8279991
243 -0.4920006
244 0.3600006
245 2.1480026
246 0.4959984
247 0.0600014
248 0.3199997
249 -0.8959999
250 -0.2960014
251 -2.0439987
252 -2.5520020
253 1.4080009
254 1.8120003
255 2.2200012
256 -0.3240013
257 -0.4200020
258 -1.3239975
259 0.3600006
260 -1.1879997
261 -0.6360016
262 0.6879997
263 -2.3639984
264 -0.5559998
265 2.2279968
266 0.3280029
267 -0.5000000
268 0.0639992
269 0.4279976
270 2.4640007
271 -2.3199997
272 -1.0960007
273 0.6000023
274 -0.5120010
275 -0.4319992
276 1.5200005
277 0.7799988
278 -0.3120003
279 0.5040016
280 -0.6960030
281 3.3560028
282 1.2999992
283 -1.5200005
284 -5.8719978
285 1.3439980
286 -2.0639992
287 -0.7880020
288 0.7080002
289 2.2680016
290 -0.4519997
291 0.2519989
292 0.3479996
293 -0.8479996
294 1.4440002
295 -1.2919998
296 1.3680000
297 -0.0359993
298 0.6199989
299 -0.0320015
300 0.2440033
301 0.5159988
302 -0.2439995
303 -3.4039993
304 -1.6480026
305 -0.1159973
306 0.0439987
307 0.2960014
308 0.0639992
309 0.6240005
310 0.3039970
311 -0.1639977
312 1.6320000
313 -0.7520027
314 0.5400009
315 0.0880013
316 1.5760002
317 -2.0600014
318 -0.5319977
319 0.5079994
320 -0.5960007
321 0.8320007
322 -4.7600021
323 -1.2239990
324 -0.8880005
325 0.6760025
326 -0.1400032
327 -0.6359978
328 1.1359978
329 0.0760002
330 -0.5079994
331 -0.6320000
332 0.7719994
333 0.2240028
334 0.3359985
335 -1.3639984
336 0.0919991
337 0.5239983
338 0.2000008
339 -0.0839996
340 0.2840004
341 0.9759979
342 -1.5480003
343 1.0840034
344 -0.3160019
345 0.9560013
346 0.3799973
347 1.8160019
348 1.0799980
349 0.6920013
350 -0.1879997
351 0.6440010
352 -0.0839996
353 -1.0880013
354 1.4799995
355 -1.0159988
356 -0.7280006
357 0.8880005
358 -2.8800011
359 0.4200020
360 -2.1119995
361 -0.3800011
362 -3.0520020
363 0.0880013
364 0.7280006
365 1.5319977
366 1.3080025
367 -0.9200020
368 -0.0399971
369 -2.3240013
370 1.3159981
371 -0.3959999
372 0.9280014
373 0.3199997
374 0.6800003
375 -0.6959991
376 0.1399994
377 0.4360008
378 -0.4160004
379 0.6040001
380 0.5079994
381 1.5719986
382 -0.2239990
383 -0.2360001
384 0.0960007
385 1.2840004
386 0.6839981
387 0.1119995
388 1.4320030
389 -2.5279999
390 0.8879967
391 0.3200035
392 0.9319992
393 0.4519997
394 0.6040001
395 1.2360001
396 3.7719994
397 0.0439987
398 2.4760017
399 -0.7639999
400 -0.1800003
401 -0.2000008
402 -0.7039986
403 0.1959991
404 0.2039986
405 -1.1879997
406 -1.5279999
407 -1.4519997
408 2.0559998
409 1.9560013
410 0.0120010
411 1.8959999
412 -2.0040016
413 -0.1479988
414 -0.4000015
415 0.6720009
416 0.8320007
417 -0.2120018
418 0.5880013
419 0.2360001
420 -0.8680000
421 -1.5320015
422 1.0839996
423 -1.5119972
424 1.4559975
425 2.1679993
426 -1.1559982
427 2.4280014
428 -0.6040001
429 1.5799980
430 0.2120018
431 0.5439987
432 0.6760025
433 0.6879959
434 0.0640030
435 0.5359955
436 0.5839996
437 1.6960068
438 -0.6320038
439 -0.6319962
440 0.4319992
441 -0.7400055
442 0.3400040
443 1.7639999
444 0.0359955
445 -1.3879929
446 -2.3800049
447 1.4560013
448 -0.5439987
449 3.8239975
450 1.8759995
451 2.8280029
452 0.3279953
453 1.4720001
454 -1.0039978
455 -2.7439957
456 -3.8400040
457 0.5719986
458 1.8520050
459 -1.2200012
460 -1.9080048
461 -0.0279999
462 4.6160049
463 0.3600006
464 -0.9360046
465 1.2360001
466 0.7880020
467 1.9520035
468 1.3639984
469 -0.7399979
470 1.5000000
471 0.4159927
472 -0.2119980
473 1.1800003
474 -0.2880020
475 2.4880066
476 0.1879959
477 0.0520020
478 -1.3359985
479 -0.3520050
480 -0.3040009
481 0.2400055
482 0.8559952
483 -1.0599976
484 -1.2959976
485 -1.0159988
486 3.5039978
487 -0.4199982
488 1.4399948
489 1.0400009
490 -1.1480026
491 2.1040039
492 -2.9919968
493 0.8879929
494 -3.7919998
495 0.5440063
496 2.9879990
497 -0.6080017
498 -0.0360031
499 1.3400040
500 1.8880005
501 -0.5960007
502 0.8959961
503 0.6000061
504 0.4559937
505 0.2520065
506 0.8799973
507 -1.4199982
508 0.5519943
509 -0.3959961
510 2.5520020
511 0.7119980
512 1.5279999
513 -0.7360001
514 1.3720016
515 -0.0040054
516 1.0080032
517 -0.5599976
518 0.0839996
519 2.6839981
520 -1.3280029
521 1.7040024
522 1.5920029
523 -0.7360001
524 -0.0279999
525 0.8159943
526 2.0040054
527 -1.5200043
528 -2.0199966
529 1.6599960
530 2.2800064
531 1.2439957
532 0.8720016
533 -0.1600037
534 1.5520020
535 -0.4079971
536 0.5000000
537 -0.4800034
538 0.1839981
539 0.8560028
540 -0.7239990
541 2.8840027
542 0.3239975
543 2.4400024
544 1.9839935
545 -1.3479996
546 -0.4799957
547 0.2200012
548 1.0079956
549 -0.7879944
550 4.9519958
551 5.2559967
552 2.5040054
553 -1.5999985
554 1.4639969
555 -1.0279999
556 -0.2839966
557 -0.6920013
558 2.7959976
559 1.4680023
560 -2.7560043
561 -1.5239944
562 -2.3640060
563 1.2239990
564 0.8640060
565 3.8320007
566 -3.0720062
567 2.4760056
568 1.6399994
569 2.3720016
570 1.3319931
571 -1.6999969
572 -2.6679993
573 2.1719971
574 2.5160065
575 -2.4440002
576 -1.9520035
577 0.6159973
578 -0.0999985
579 -5.4280014
580 1.4640045
581 0.3799973
582 1.0120010
583 -1.8280029
584 -0.9679947
585 1.0119934
586 0.8080063
587 3.5680008
588 0.5439987
589 -4.5320053
590 -5.0759964
591 0.3799973
592 1.2840042
593 2.3839951
594 -3.6520004
595 3.8600006
596 1.3120041
597 3.1279984
598 -0.9800034
599 -0.1479950
600 -0.0879974
601 1.4079971
602 1.4840012
603 0.5919952
604 4.5800018
605 2.1520081
606 0.5319977
607 0.3559875
608 0.3800049
609 -1.3519897
610 -3.7120056
611 -0.8079987
612 2.7079926
613 3.5839996
614 -4.8919983
615 1.7279968
616 0.5960083
617 3.3919983
618 1.1159973
619 4.0000000
620 -0.8520050
621 -6.3599854
622 1.4879913
623 2.1159973
624 -2.8159943
625 2.3520050
626 0.1359863
627 0.8640137
628 -0.4000092
629 -4.6839905
630 -1.3280029
631 2.3040009
632 -2.3400116
633 6.3640137
634 -4.4760132
635 -10.7399979
636 3.1400070
637 -4.1160049
638 -4.3119965
639 10.0800018
640 2.0799942
641 -2.4079971
642 6.4840012
643 -0.4120026
644 -6.3199997
645 8.3920059
646 -5.5440063
647 4.3639984
648 -1.3199921
649 3.4879913
650 3.5640106
651 0.3439941
652 7.4599915
653 -0.6679993
654 0.2960052
655 -2.7839966
656 -0.1520081
657 -10.5119934
658 -4.3919983
659 -7.4599991
660 4.2039948
661 0.2639999
662 4.0200043
663 -0.4600067
664 -1.1080017
665 -5.1639938
666 1.8639984
667 -1.6279984
668 -0.5240021
669 -0.8679962
670 -6.5360031
671 0.6880035
672 -6.9680023
673 -0.7200012
674 -0.5719986
675 4.9759979
676 6.0320053
677 1.9759979
678 3.0800018
679 -5.1520004
680 6.9319992
681 -2.8440018
682 3.0559998
683 5.9920044
684 -1.7920074
685 -6.0359955
686 0.0319977
687 4.8280029
688 -0.8240051
689 -3.9279938
690 -2.2760010
691 -2.9800034
692 -5.1559982
693 12.7760010
694 3.4080048
695 7.8199921
696 -2.6759949
697 2.7919922
698 -3.3840027
699 -0.3559875
700 -17.6360092
701 -5.8159943
702 4.2399979
703 -0.2679977
704 -3.0520020
705 -1.4759979
706 3.1520004
707 5.6879959
708 2.3759995
709 6.5960007
710 -2.1760025
711 4.4640045
712 -1.7039948
713 5.7119904
714 -1.1920013
715 2.3200073
716 3.5800018
717 -2.2200012
718 -0.0760040
719 -1.0919952
720 3.0719910
721 -1.9199982
722 -3.9279938
723 2.4199982
724 -0.9160004
725 -3.1040039
726 0.8119965
727 4.3040009
728 -3.6399994
729 -0.5359955
730 1.9080048
731 2.1559906
732 -7.7279968
733 -6.7879944
734 7.6799927
735 -6.7959976
736 -2.4720001
737 3.3320007
738 -7.8560028
739 1.2040024
740 -2.1959991
741 0.3359985
742 -1.1399994
743 -7.2600021
744 -8.4599991
745 6.6280060
746 -0.3320007
747 2.2799988
748 5.9560013
749 -2.3920059
750 2.8960037
751 -4.8919983
752 1.8320007
753 4.0479965
754 0.4359970
755 -0.2119980
756 0.5920029
757 2.7919998
758 1.4280014
759 -1.4920044
760 -2.0319977
761 5.6640015
762 -2.6320038
763 0.1320038
764 3.3639984
765 -1.9400024
766 1.1880035
767 -6.0760040
768 -8.7279968
769 1.0960007
770 3.3160019
771 -5.5160065
772 2.1040039
773 4.8079987
774 -1.0279999
775 2.2239990
776 4.6600037
777 -0.5600052
778 -3.1199951
779 -0.2400055
780 -1.1799927
781 1.5799942
782 3.2600021
783 1.7399979
784 3.5000000
785 2.1600037
786 -0.8400040
787 -5.3199997
788 -1.4199982
789 -2.5400009
790 5.1600037
791 -4.4400024
792 2.4000015
793 0.8799973
794 4.4400024
795 -1.2600021
796 -0.4599991
797 -9.4800034
798 3.3400040
799 2.9400024
800 0.5000000
801 0.8199997
802 0.6199951
803 5.0200043
804 -20.5400009
805 1.5599976
806 -0.1399994
807 -2.2600021
808 3.4000015
809 -2.7399979
810 3.5400009
811 -0.4199982
812 -2.2800064
813 -2.0199966
814 0.6800003
815 -1.9599991
816 -1.9400024
817 0.5400009
818 -0.8600006
819 1.4199982
820 -2.5999985
821 -1.7600021
822 0.7000046
823 -0.7000046
824 -0.2799988
825 0.0999985
826 2.1000061
827 1.5999985
828 2.5199966
829 3.7600021
830 4.5000000
831 -7.9400024
832 0.1399994
833 -2.2399979
834 -0.8000031
835 0.6400070
836 0.0599976
837 -1.9400024
838 -2.1199951
839 -0.3000031
840 -0.5999985
841 0.4199982
842 2.9400024
843 -0.6800003
844 -1.0000000
845 3.6599960
846 3.4400024
847 1.8199997
848 0.3000031
849 -4.5400009
850 -0.4800034
851 -5.2999954
852 -0.7400055
853 1.9800034
854 -2.1399994
855 4.6599960
856 2.2000046
857 0.4599991
858 -0.4000015
859 4.3199997
860 2.3000031
861 2.0399933
862 -0.8599930
863 1.0399933
864 2.1800003
865 0.1200027
866 -1.4800034
867 -6.3799973
868 -14.5999985
869 2.3399963
870 1.5200043
871 5.4799957
872 -1.4399948
873 9.0199966
874 3.4800034
875 -1.2200012
876 1.3600006
877 -3.0200043
878 -1.0999985
879 -3.9799957
880 0.3399963
881 -0.0800018
882 2.1399994
883 -0.8799973
884 -1.6599960
885 -0.9800034
886 3.1399994
887 4.4400024
888 -3.5400009
889 -3.8800049
890 -1.6399994
891 1.5000000
892 2.6200027
893 -1.5599976
894 3.0199966
895 2.1399994
896 -0.8799973
897 -4.2000046
898 -0.5000000
899 -3.8799973
900 0.9800034
901 -0.9200058
902 -1.7199936
903 -0.8400040
904 -0.3600006
905 -1.3799973
906 2.6999969
907 -0.6399994
908 -0.7399979
909 -0.4400024
910 -1.6999969
911 2.4799957
912 1.4400024
913 -1.9800034
914 0.7600021
915 -0.7999954
916 0.9399948
917 2.4599991
918 -3.4399948
919 0.0799942
920 1.7000046
921 2.4799957
922 1.1600037
923 1.3399963
924 2.9000015
925 -1.0199966
926 -3.3000031
927 2.5800018
928 1.5000000
929 1.5199966
930 -1.6999969
931 -2.0199966
932 3.5799942
933 11.7200012
934 -3.6399994
935 3.5800018
936 1.0800018
937 2.0799942
938 3.2400055
939 -2.8400040
940 -1.5000000
941 -1.8600006
942 1.0000000
943 0.7400055
944 -3.4400024
945 1.5199966
946 -0.3600006
947 -2.0000000
948 2.4000015
949 2.4000015
950 0.9400024
951 -1.8800049
952 2.8400040
953 -3.6800003
954 -2.3800049
955 1.0200043
956 3.2399979
957 -1.0000000
958 2.9800034
959 -1.3199997
960 0.6399994
961 1.8399963
962 -2.5000000
963 4.0800018
964 -0.5199966
965 1.9799957
966 0.5799942
967 1.0800018
968 2.0000000
969 1.3000031
970 -0.3000031
971 -0.6799927
972 -1.6399994
973 0.7399902
974 2.7800140
975 0.1799927
976 0.3800049
977 2.3999939
978 -0.6399994
979 -0.7200012
980 0.2200012
981 -1.0000000
982 -0.8399963
983 -0.2400055
984 -1.0599976
985 -6.1600037
986 0.4600067
987 -0.6800003
988 -0.0200043
989 -0.4799957
990 -2.7400055
991 -1.8999939
992 1.3799973
993 6.8199921
994 2.9800110
995 0.6399994
996 1.2200012
997 0.9799957
998 0.5399933
999 1.5800018
1000 -0.5000000
1001 0.2400055
1002 -0.5800018
1003 2.9799957
1004 -0.2200012
1005 -2.8600006
1006 -3.0000000
1007 1.1600037
1008 1.1999969
1009 1.5400085
1010 -0.4199982
1011 0.6199951
1012 -1.0200043
1013 6.2799988
1014 -3.4599915
1015 -4.9600067
1016 3.8800049
1017 -1.9799957
1018 3.6599884
1019 1.3000031
1020 1.9800110
1021 4.2199860
1022 -1.6199951
1023 -2.2399902
1024 -1.1000061
1025 1.5000000
1026 -0.5400085
1027 -1.0599976
1028 5.2000122
1029 1.3399963
1030 1.5199890
1031 1.0000000
1032 -1.8599854
1033 -0.7000122
1034 0.6800079
1035 0.0599976
1036 6.3600006
1037 0.9199982
1038 -3.1999969
1039 3.0599976
1040 1.3399963
1041 2.7200012
1042 -0.0800018
1043 -3.0999908
1044 -1.9800110
1045 0.9200134
1046 -1.7800140
1047 2.1399994
1048 -2.1599884
1049 -1.3600006
1050 0.4400024
1051 1.8399963
1052 0.6199951
1053 -7.4199982
1054 2.8800049
1055 -37.9800034
1056 1.8600006
1057 1.7399979
1058 2.4199982
1059 1.5600052
1060 -1.7600021
1061 -0.0400009
1062 -0.9800034
1063 -1.9799957
1064 -1.5400009
1065 -0.5000000
1066 2.4599991
1067 -0.1399994
1068 1.7399979
1069 -2.0799942
1070 1.3199997
1071 -0.2200012
1072 3.8600006
1073 1.1800003
1074 -2.0200043
1075 1.3199997
1076 2.0800018
1077 0.6399994
1078 1.8799973
1079 1.8000031
1080 2.0000000
1081 -3.1399994
1082 -1.7600021
1083 0.9599991
1084 -4.1599960
1085 -1.1399994
1086 -0.0200043
1087 -0.5799942
1088 -2.7400055
1089 -1.0799942
1090 -0.2600021
1091 -1.3600006
1092 1.4199982
1093 0.9199982
1094 0.1600037
1095 -0.0999985
1096 -2.0400009
1097 1.2999954
1098 -0.4799957
1099 3.8199997
1100 -0.8400040
1101 -0.2199936
1102 -0.8600006
1103 -1.9400024
1104 -0.4800034
1105 2.7600021
1106 -0.9799957
1107 -1.9600067
1108 0.2000046
1109 -2.8199997
1110 -0.5200043
1111 2.8800049
1112 -3.2000046
1113 -0.4399948
1114 1.0799942
1115 0.1200027
1116 1.6999969
1117 0.2800064
1118 0.5599976
1119 -14.2200012
1120 -0.7600021
1121 -1.1599960
1122 1.4400024
1123 -1.1400070
1124 2.3000031
1125 -1.0400009
1126 2.0400009
1127 -0.5199966
1128 -1.2800064
1129 1.6800003
1130 1.3000031
1131 1.3400040
1132 0.7799988
1133 0.9199982
1134 0.6200027
1135 -1.9000015
1136 1.6199951
1137 -2.0799942
1138 -0.1399994
1139 -0.4800034
1140 0.5400009
1141 -1.3799973
1142 -1.0200043
1143 1.6800003
1144 2.9599991
1145 2.8000031
1146 0.6199951
1147 3.4000015
1148 1.5600052
1149 -3.4400024
1150 3.2999954
1151 -0.6199951
1152 2.1199951
1153 1.5200043
1154 1.0599976
1155 -0.9199982
1156 0.1200027
1157 -1.7400055
1158 -1.5000000
1159 0.1399994
1160 1.0800018
1161 -0.0999985
1162 5.8399963
1163 -3.7199936
1164 3.9399948
1165 1.7600021
1166 0.3799973
1167 -0.8799973
1168 -2.7600021
1169 1.5800018
1170 -1.0199966
1171 3.5199966
1172 3.5000076
1173 3.3999939
1174 -1.1199951
1175 1.1399994
1176 0.6599884
1177 0.5200043
1178 -4.4400024
1179 3.9199982
1180 -0.0199890
1181 -0.7000122
1182 2.7800140
1183 5.0999908
1184 -4.3600006
1185 5.1800079
1186 -0.3600006
1187 -1.7200012
1188 2.9599915
1189 -1.2399902
1190 -3.5599976
1191 -1.1399994
1192 -5.1400146
1193 3.2400055
1194 1.3600006
1195 1.5200043
1196 3.0999908
1197 -0.8799896
1198 -0.8000031
1199 2.6600037
1200 1.8999939
1201 -4.6999969
1202 4.5599976
1203 3.5000000
1204 -3.4400024
1205 0.2200012
1206 -0.2400055
1207 -2.3199921
1208 -4.2799988
1209 -2.6399994
1210 1.6600037
1211 0.4799957
1212 0.1600037
1213 1.3999939
1214 -0.5399933
1215 -0.8200073
1216 -0.8800049
1217 -0.3600006
1218 2.0800018
1219 -0.9799957
1220 2.0599976
1221 4.9400024
1222 -4.1799927
1223 3.3600006
1224 -5.0400085
1225 -0.3399963
1226 -0.1800079
1227 0.1800079
1228 -3.5400085
1229 -3.4399872
1230 -0.5000000
1231 0.3600006
1232 -1.2600098
1233 -1.2599945
1234 0.5799942
1235 2.2200089
1236 1.2999878
1237 -2.8399963
1238 0.3000031
1239 0.2400055
1240 -2.2400055
1241 0.6999969
1242 3.3399963
1243 -12.6399918
1244 -0.1399994
1245 1.2399979
1246 0.4000015
1247 -3.0400009
1248 0.0999985
1249 2.9400024
1250 1.1399994
1251 1.0599976
1252 1.0200043
1253 0.3799973
1254 1.8199997
1255 -2.0599976
1256 0.5199966
1257 -1.2799988
1258 0.8399963

PUNTO 2: Estrategias de inversión con SWAPS

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.

Tenemos los siguientes parámetros del mercado:

alpha <- 0.1   # Velocidad de reversión
beta <- 0.0105   # Media a largo plazo (semestral) (Secured Overnight Financing Rate (SORF))
sigma <- 0.01  # Volatilidad
r0 <- 0.026     # Tasa inicial SORF (semestral)
T <- 5         # Periodo de simulación en años
dt <- 1/2      # Paso de tiempo en años (semestral)
n <- T / dt    # Número de pasos de tiempo

Simulación usando el modelo de Vasicek

set.seed(123)  # Semilla
r <- numeric(n + 1)
r[1] <- r0

for (i in 2:(n + 1)) {
    dr <- alpha * (beta - r[i-1]) * dt + sigma * sqrt(dt) * rnorm(1)
    r[i] <- r[i-1] + dr
}

rates <- r[-1]  # Quitamos la tasa inicial para obtener solo las tasas futuras

2.Establecemos los flujos de pago

inversion <- 100
Tasa_fija <- 0.0333
Pago_fijo <- inversion * Tasa_fija* dt

Flujos_fijos <- rep(Pago_fijo, n)
Flujos_flotantes <- inversion * rates * dt

3. Valuamos los pagos: Descontamos los flujos de pagos futuros al presente.

Tasa_descuento <- r0
f_descuento <- exp(-Tasa_descuento * seq(dt, T, by = dt))

Valor_presente_fijo <- sum(Flujos_fijos * f_descuento)
Valor_presente_flotante <- sum(Flujos_flotantes * f_descuento)

4. Obtenemos los flujos y el análisis de la posición.

diferencias <- Flujos_flotantes - Flujos_fijos
diferencias_valor_presente <- sum(diferencias * f_descuento)

if (diferencias_valor_presente > 0) {
    ventaja <- "Pagador de la tasa flotante"
} else {
    ventaja <- "Pagador de la tasa fija"
}

cat("Valor presente de los pagos fijos.:", Valor_presente_fijo, "\n")
## Valor presente de los pagos fijos.: 15.5119
cat("Valor presente de los pagos flotantes:", Valor_presente_flotante, "\n")
## Valor presente de los pagos flotantes: 13.48283
cat("Valor presente de las diferencias.:", diferencias_valor_presente, "\n")
## Valor presente de las diferencias.: -2.029069
cat("Ventaja:", ventaja, "\n")
## Ventaja: Pagador de la tasa fija

Conclusión de la posición:

La persona que obtiene ventaja en la posición después de realizar las valoraciones es el pagador de la tasa fija.