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)
# 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í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 |
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.
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.
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.
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.
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
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
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í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
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í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.
# 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
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_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
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
Utilidad_POR_USD_Observada=TRM_OBSERVADA-Precio_Entrega
Utilidad_total_observada= Cuotas_USD*Utilidad_POR_USD_Observada
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,]
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")
| 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")
| 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)
```