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

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

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

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

Debemos instalar Plotly

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

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

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

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

Distribucion de frecuencias

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

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

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

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

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

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

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

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

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

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

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

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

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

Variabilidad del Precio de la TRM:

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

Tendencias y Patrones Observados:

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

Eventos Excepcionales:

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

Interpretación de la Media:

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

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

# Importar paquetes necesarios

#install.packages("magrittr")
#install.packages("dplyr")
#install.packages("stats")
library(magrittr)  # Para usar el operador %>%
library(dplyr)     # Para manipulación de datos
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
library(stats)     # Para funciones estadísticas
# Definir los datos
valor_activo <- 500000  # Valor del activo en USD
prob_perdida <- 0.03    # Probabilidad de pérdida hasta 3%
prob_ganancia <- 0.05   # Probabilidad de ganancia hasta 5%

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

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

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

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

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

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

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

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

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

Simulacion montecarlo

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

View(Datos_futuroTRM)

# Parámetros del problema

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

precio_actual <- 4198

deposito_cop <- 150000000

mu <- 0.01/25

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

garantia_inicial<-150000000

mantenimiento <- 130000000

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

futuro_SIMULADA=matrix(,25,Numero_iteraciones)

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

  for(i in 2:25){

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

  }

}
 
 

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

# Calcular el promedio de cada fila
promedio_SM <-data.frame(Promedio = rowMeans(futuro_SIMULADA)) 
n <- 25
Diferencia_pf <- -diff(promedio_SM$Promedio)
liquidacion_diaria <- Diferencia_pf*valor_contrato*contratos 

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

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

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


# Calcular los datos restantes
for (i in 2:n) {
  valores_cuenta_margen[i] <- valores_cuenta_margen[i-1] + liquidacion_diaria
}
## Warning in valores_cuenta_margen[i] <- valores_cuenta_margen[i - 1] +
## liquidacion_diaria: número de items para para sustituir no es un múltiplo de la
## longitud del reemplazo

## Warning in valores_cuenta_margen[i] <- valores_cuenta_margen[i - 1] +
## liquidacion_diaria: número de items para para sustituir no es un múltiplo de la
## longitud del reemplazo

## Warning in valores_cuenta_margen[i] <- valores_cuenta_margen[i - 1] +
## liquidacion_diaria: número de items para para sustituir no es un múltiplo de la
## longitud del reemplazo

## Warning in valores_cuenta_margen[i] <- valores_cuenta_margen[i - 1] +
## liquidacion_diaria: número de items para para sustituir no es un múltiplo de la
## longitud del reemplazo

## Warning in valores_cuenta_margen[i] <- valores_cuenta_margen[i - 1] +
## liquidacion_diaria: número de items para para sustituir no es un múltiplo de la
## longitud del reemplazo

## Warning in valores_cuenta_margen[i] <- valores_cuenta_margen[i - 1] +
## liquidacion_diaria: número de items para para sustituir no es un múltiplo de la
## longitud del reemplazo

## Warning in valores_cuenta_margen[i] <- valores_cuenta_margen[i - 1] +
## liquidacion_diaria: número de items para para sustituir no es un múltiplo de la
## longitud del reemplazo

## Warning in valores_cuenta_margen[i] <- valores_cuenta_margen[i - 1] +
## liquidacion_diaria: número de items para para sustituir no es un múltiplo de la
## longitud del reemplazo

## Warning in valores_cuenta_margen[i] <- valores_cuenta_margen[i - 1] +
## liquidacion_diaria: número de items para para sustituir no es un múltiplo de la
## longitud del reemplazo

## Warning in valores_cuenta_margen[i] <- valores_cuenta_margen[i - 1] +
## liquidacion_diaria: número de items para para sustituir no es un múltiplo de la
## longitud del reemplazo

## Warning in valores_cuenta_margen[i] <- valores_cuenta_margen[i - 1] +
## liquidacion_diaria: número de items para para sustituir no es un múltiplo de la
## longitud del reemplazo

## Warning in valores_cuenta_margen[i] <- valores_cuenta_margen[i - 1] +
## liquidacion_diaria: número de items para para sustituir no es un múltiplo de la
## longitud del reemplazo

## Warning in valores_cuenta_margen[i] <- valores_cuenta_margen[i - 1] +
## liquidacion_diaria: número de items para para sustituir no es un múltiplo de la
## longitud del reemplazo

## Warning in valores_cuenta_margen[i] <- valores_cuenta_margen[i - 1] +
## liquidacion_diaria: número de items para para sustituir no es un múltiplo de la
## longitud del reemplazo

## Warning in valores_cuenta_margen[i] <- valores_cuenta_margen[i - 1] +
## liquidacion_diaria: número de items para para sustituir no es un múltiplo de la
## longitud del reemplazo

## Warning in valores_cuenta_margen[i] <- valores_cuenta_margen[i - 1] +
## liquidacion_diaria: número de items para para sustituir no es un múltiplo de la
## longitud del reemplazo

## Warning in valores_cuenta_margen[i] <- valores_cuenta_margen[i - 1] +
## liquidacion_diaria: número de items para para sustituir no es un múltiplo de la
## longitud del reemplazo

## Warning in valores_cuenta_margen[i] <- valores_cuenta_margen[i - 1] +
## liquidacion_diaria: número de items para para sustituir no es un múltiplo de la
## longitud del reemplazo

## Warning in valores_cuenta_margen[i] <- valores_cuenta_margen[i - 1] +
## liquidacion_diaria: número de items para para sustituir no es un múltiplo de la
## longitud del reemplazo

## Warning in valores_cuenta_margen[i] <- valores_cuenta_margen[i - 1] +
## liquidacion_diaria: número de items para para sustituir no es un múltiplo de la
## longitud del reemplazo

## Warning in valores_cuenta_margen[i] <- valores_cuenta_margen[i - 1] +
## liquidacion_diaria: número de items para para sustituir no es un múltiplo de la
## longitud del reemplazo

## Warning in valores_cuenta_margen[i] <- valores_cuenta_margen[i - 1] +
## liquidacion_diaria: número de items para para sustituir no es un múltiplo de la
## longitud del reemplazo

## Warning in valores_cuenta_margen[i] <- valores_cuenta_margen[i - 1] +
## liquidacion_diaria: número de items para para sustituir no es un múltiplo de la
## longitud del reemplazo

## Warning in valores_cuenta_margen[i] <- valores_cuenta_margen[i - 1] +
## liquidacion_diaria: número de items para para sustituir no es un múltiplo de la
## longitud del reemplazo
print(valores_cuenta_margen)
##  [1] 150000000 149104834 148209668 147314502 146419336 145524171 144629005
##  [8] 143733839 142838673 141943507 141048341 140153175 139258009 138362843
## [15] 137467677 136572512 135677346 134782180 133887014 132991848 132096682
## [22] 131201516 130306350 129411184 128516019
# Calcular el intervalo de predicción del 90%
intervalo_prediccion_90 <- quantile(valores_cuenta_margen, c(0.05, 0.95))

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

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

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

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

Practica 2

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

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

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

library(knitr)
library(moments)
library(quantmod)
## Loading required package: xts
## Loading required package: zoo
## 
## Attaching package: 'zoo'
## The following objects are masked from 'package:base':
## 
##     as.Date, as.Date.numeric
## 
## ######################### Warning from 'xts' package ##########################
## #                                                                             #
## # The dplyr lag() function breaks how base R's lag() function is supposed to  #
## # work, which breaks lag(my_xts). Calls to lag(my_xts) that you type or       #
## # source() into this session won't work correctly.                            #
## #                                                                             #
## # Use stats::lag() to make sure you're not using dplyr::lag(), or you can add #
## # conflictRules('dplyr', exclude = 'lag') to your .Rprofile to stop           #
## # dplyr from breaking base R's lag() function.                                #
## #                                                                             #
## # Code in packages is not affected. It's protected by R's namespace mechanism #
## # Set `options(xts.warn_dplyr_breaks_lag = FALSE)` to suppress this warning.  #
## #                                                                             #
## ###############################################################################
## 
## Attaching package: 'xts'
## The following objects are masked from 'package:dplyr':
## 
##     first, last
## Loading required package: TTR
## Registered S3 method overwritten by 'quantmod':
##   method            from
##   as.zoo.data.frame zoo
# Calcular estadísticas de la TRM
max_TRM <- max(datos[,"TRM"])
min_TRM <- min(datos[,"TRM"])
media_TRM <- mean(datos[,"TRM"])
SD_TRM <- sd(datos[,"TRM"])
sesgo_TRM <- skewness(datos[,"TRM"])
curtosis_TRM <- kurtosis(datos[,"TRM"])
percentiles_TRM <- quantile(datos[,"TRM"], c(0.01, 0.05, 0.1, 0.5, 0.75, 0.90, 0.95, 0.99))

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

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


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


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

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

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

TRM PROYECTADA

Utilizaremos el MGB para realizar la siguiente simulación

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

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

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

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


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

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


# Mostrar la tabla
kable(tabla_Analisis_simulacion, caption = "Estadísticas simulacion")
Estadísticas simulacion
Estadística simulacion
media 4434.4984304
desviación estándar 186.1137883
sesgo 0.0385956
curtosis 2.0506747
mínimo 3524.5570397
máximo 5491.9482945

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

Distribución empirica

# Cargar biblioteca plotly
library(plotly)

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

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

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

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

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

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

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

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

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

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

print("Volatilidad de cada cuota  en millones de COP")
## [1] "Volatilidad de cada cuota  en millones de COP"
print(volatilidad_cuotas/1000000)
## [1] 10.74673 15.11002 18.45477 21.16425 23.27924

UTILIDAD POR USD

proporcion_cobertura=0.7
Precio_Entrega=4066

Utilidad_POR_USD=TRM[-1,]-Precio_Entrega


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

UTILIDAD TOTAL

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

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

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

Cuotas_COP_CON_C=Cuotas_COP-Utilidad_total

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

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

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

print("Volatilidad de cada cuota con cobertura  en millones de COP")
## [1] "Volatilidad de cada cuota con cobertura  en millones de COP"
print(volatilidad_cuotas_COP_CON_C/1000000)
## [1] 3.224018 4.533006 5.536432 6.349275 6.983773

RESULTADOS

Valor real observado del pago de cuotas en cop

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

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

Cuota_Real_COP=TRM_OBSERVADA*Cuotas_USD


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

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

Beneficio real observado

Utilidad_POR_USD_Observada=TRM_OBSERVADA-Precio_Entrega
Utilidad_total_observada= Cuotas_USD*Utilidad_POR_USD_Observada

Valor real con cobertura

Valor_Observado_Cuotas_con_cobertura=Cuota_Real_COP-Utilidad_total_observada

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

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

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

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

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

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

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

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

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

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

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

Margen inicial en dolares

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

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

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

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

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


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


TESUSA_2020_2022=TESUSA[Inicio_muestra_USA :Fin_muestra_USA,]

MODELO VASICEK

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

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

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

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

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

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

# Mostrar un resumen de los resultados
cat("### Resumen de la simulación de tasas\n\n")
## ### Resumen de la simulación de tasas
cat("Se simularon", iteraciones, "escenarios para", periodos, "periodos.\n\n")
## Se simularon 10 escenarios para 10 periodos.
# Mostrar solo una muestra de las tasas simuladas en lugar de todas
muestras <- sample(1:iteraciones, 10)  # Seleccionar tres muestras aleatorias
cat("### Muestra de tasas simuladas\n\n")
## ### Muestra de tasas simuladas
cat("#### Mercado estadounidense\n\n")
## #### Mercado estadounidense
knitr::kable(tasas_us_simuladas[muestras, ], caption = "Muestra de tasas simuladas para el mercado estadounidense")
Muestra de tasas simuladas para el mercado estadounidense
0.0373 0.0514894 0.0518650 0.0520643 0.0564592 0.0714130 0.0654065 0.0686408 0.0797017 0.0847675
0.0373 0.0591369 0.0718710 0.0720221 0.0698280 0.0730876 0.0884171 0.0951976 0.0909711 0.0876440
0.0373 0.0479806 0.0567433 0.0603299 0.0593482 0.0613851 0.0734379 0.0816829 0.0777082 0.0796319
0.0373 0.0536151 0.0658982 0.0729190 0.0674907 0.0697274 0.0720607 0.0672881 0.0702667 0.0768160
0.0373 0.0437900 0.0495220 0.0654735 0.0668978 0.0756953 0.0792507 0.0924838 0.0786165 0.0768345
0.0373 0.0424094 0.0598340 0.0763320 0.0870405 0.0815579 0.0832124 0.0913111 0.0991611 0.0905193
0.0373 0.0540253 0.0720540 0.0738143 0.0750167 0.0716409 0.0804835 0.0919482 0.0864370 0.0899266
0.0373 0.0525855 0.0640206 0.0699252 0.0795217 0.0714469 0.0742653 0.0843795 0.0809416 0.0763255
0.0373 0.0547757 0.0534433 0.0737473 0.0811255 0.0814366 0.0883334 0.0861480 0.0881492 0.0800912
0.0373 0.0499775 0.0736957 0.0661179 0.0701174 0.0799401 0.0697889 0.0658811 0.0778357 0.0728513
cat("\n\n")
cat("#### Mercado colombiano\n\n")
## #### Mercado colombiano
knitr::kable(tasas_col_simuladas[muestras, ], caption = "Muestra de tasas simuladas para el mercado colombiano")
Muestra de tasas simuladas para el mercado colombiano
0.1258525 0.1271613 0.1160417 0.1206805 0.0960940 0.1166023 0.1076736 0.0857861 0.0958338 0.0772894
0.1258525 0.1511902 0.1235029 0.1272274 0.1951721 0.1761576 0.1390159 0.1163592 0.1490038 0.1043031
0.1258525 0.1285465 0.0985670 0.0662524 0.0519514 0.0937741 0.0854880 0.0768802 0.0874107 0.0456157
0.1258525 0.0968218 0.0736876 0.0838389 0.0930695 0.1120763 0.1046392 0.1195298 0.1227023 0.0782517
0.1258525 0.1132868 0.1073738 0.1285650 0.1110370 0.0912172 0.0787851 0.0738601 0.0617853 0.0448429
0.1258525 0.1243698 0.1210776 0.0759014 0.0726586 0.0902479 0.1164018 0.1165971 0.1013048 0.0876041
0.1258525 0.1083825 0.1365133 0.1227019 0.1022927 0.1016274 0.1153410 0.1366698 0.1134112 0.0757684
0.1258525 0.1038013 0.1260427 0.1210169 0.1130416 0.1206288 0.1035616 0.1118398 0.1192822 0.0990573
0.1258525 0.0930779 0.0984722 0.0853723 0.1073490 0.0960360 0.0824207 0.0505193 0.0253353 0.0528797
0.1258525 0.0952905 0.1235880 0.1031903 0.0984470 0.0785721 0.0775088 0.0670492 0.0755298 0.0641944
## function to find ZCB price using Vasicek model
VasicekZCBprice <- 
function(r0, k, theta, r0_us, T){
  b.vas <- (1/k)*(1-exp(-T*k)) 
  a.vas <- (theta-r0_us^2/(2*k^2))*(T-b.vas)+(r0_us^2)/(4*k)*b.vas^2
  return(exp(-a.vas-b.vas*r0))
}
 
 
r0 <- seq(0.00, 0.20, 0.05)
n <- length(r0)
yield <- matrix(0, 10, n)
for(i in 1:n){
  for(T in 1:10){
    yield[T,i] <- -log(VasicekZCBprice(r0[i], k, theta, r0_us, T))/T
  }
}
 
maturity <- seq(1, 10, 1)
matplot(maturity, yield, type="l", col="black", lty=1, main="Yield Curve USA")
abline(h=theta, col="red", lty=2)

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

```