Práctica de Probabilidad y Estadística

1. Preguntas iniciales

Descargue la TRM desde el año 2000 hasta el día de hoy y responda las siguientes preguntas asignando probabilidades basadas en frecuencia y bajo el supuesto de que los rendimientos siguen una distribución normal:

1.1 ¿Cómo se analiza estadísticamente el precio de la TRM en este lapso de información?

Para analizar estadísticamente el precio de la TRM en el lapso de tiempo desde el año 2000 hasta el día de hoy, se pueden utilizar diversas herramientas y técnicas estadísticas. Una de las más comunes es el análisis de la distribución de frecuencias, que permite identificar la frecuencia con la que se presentan los diferentes valores de la TRM en el periodo de tiempo analizado.

Además, se puede utilizar el análisis de la media y la desviación estándar para determinar la tendencia central y la dispersión de los datos. En este caso, se puede calcular la media y la desviación estándar de los precios de la TRM en el periodo de tiempo analizado, lo que permitirá tener una idea de la tendencia general de los precios y de la variabilidad de los mismos. También se puede utilizar el análisis de la distribución normal para determinar la probabilidad de que los precios de la TRM se encuentren en un rango determinado. Para ello, se puede calcular la media y la desviación estándar de los precios de la TRM y utilizar la tabla de distribución normal para determinar la probabilidad de que los precios se encuentren en un rango específico.

1.2 ¿Es necesario acortar la información teniendo en cuenta que la TRM ha variado tanto en 20 años? Sustente su respuesta con fundamentos financieros o económicos.

No es necesario acortar la información de la TRM en el lapso de tiempo desde el año 2000 hasta el día de hoy, a pesar de que la TRM ha variado mucho en estos 20 años. Esto se debe a que la TRM es un indicador económico importante que refleja la relación entre el peso colombiano y otras monedas extranjeras, y su variación a lo largo del tiempo es relevante para el análisis de la economía colombiana.

Además, la TRM es un indicador que se utiliza en diversos sectores de la economía, como el comercio internacional, la inversión extranjera y la deuda externa, entre otros. Por lo tanto, contar con información detallada y completa de la TRM en el lapso de tiempo desde el año 2000 hasta el día de hoy es fundamental para el análisis y la toma de decisiones en estos sectores.

2. Análisis estadístico de las Tasas

A continuación se analiza la serie diaria TRM desde 2000-01-01 hasta 2024-20-02, la cual está contenida en la base de datos Datos_TRM.txt que se descargó de la página del Banco de la República y que contiene un total de 8817 registros en dos variables, Fecha y TRM.

# Cargando la base de datos: Leer un archivo .txt
Datos_TRM <- read.delim("Datos_TRM.txt")
head(Datos_TRM)
tail(Datos_TRM)
# Convertir a formato de fecha la columna 'Fecha'
Datos_TRM[, "Fecha"] <- as.Date(Datos_TRM[, "Fecha"], format = "%d/%m/%Y")
# class(Datos_TRM[,'Fecha'])

2.1 graficar datos

Se muestra la gráfica de la serie histórica TRM:

# gráfica
plot(Datos_TRM[, "Fecha"], Datos_TRM[, "TRM"], type = "l", main = "Serie Historica TRM",
    col = "red", xlab = "Fecha", ylab = "Datos TRM")

# agregar líneas verticales en las fechas deseadas
abline(v = as.numeric(as.Date(c("2000-01-01", "2005-01-01", "2010-01-01", "2015-01-01",
    "2020-01-01", "2025-01-01"))), col = "blue", lty = 3, lwd = 1)

# agregar líneas horizontales en los valores deseados
abline(h = c(2000, 3000, 4000, 5000), col = "blue", lty = 3, lwd = 1)

En la gráfica se observa que la TRM entre los años 2000 y 2003 aumentó de $2000 a $3000; luego tuvo tendencia descentente hasta aproximadamente 2008 llegando al un mínimo cercano a $1000; a partir de ahí y hasta 2015 se mantuvo cercana a $1700; luego se comportó ascendentemente hasta llega a un máximo de $5000 pesos en 2023.

A continuación se presenta la gráfica de la Serie histórica de rendimientos diarios:

plot(Datos_TRM[-1, "Fecha"], diff(log(Datos_TRM[, "TRM"])), type = "l", main = "Serie Historica rendimientos diarios TRM",
    col = "lightgreen", xlab = "Fecha", ylab = "Rendimientos diarios TRM")

# agregar líneas verticales en las fechas deseadas
abline(v = as.numeric(as.Date(c("2000-01-01", "2005-01-01", "2010-01-01", "2015-01-01",
    "2020-01-01", "2025-01-01"))), col = "gray", lty = 3, lwd = 1)

# agregar líneas horizontales en los valores deseados
abline(h = c(-0.06, -0.04, -0.02, 0, 0.02, 0.04, 0.06), col = "gray", lty = 3, lwd = 1)

Se observa que en el periodo los rendimientos diarios en su mayoría oscilaron entre -0.02 y 0.02, salvo algunas excepciones notables, a saber, en 2008, en 2016, en 2020 (pandemia) y en 2023.

2.2 Distribución de frecuencias

Se muestra el Histograma de precios:

hist(Datos_TRM[, "TRM"], breaks = 30, col = "lightblue", main = "Histograma de precios",
    freq = FALSE, xlab = "Precios TRM", ylab = "Densidad")

Se observa una distribución de precios no simétrica sino sesgada hacia la izquierda, en donde la mayoría de precios se acumulan en los precios menores (de $1500 a $4000 aproximadamente) y aparece una cola derecha con los precios más grandes (desde $4000 hasta $5000 aproximadamente)

Se muestra el Histograma de rendimientos:

Rtos_TRM <- diff(log(Datos_TRM[, "TRM"]))

hist(Rtos_TRM, breaks = 50, col = "cyan", main = "Histograma de rendimientos", freq = FALSE,
    xlim = c(-0.02, 0.02), xlab = "Rendimientos TRM", ylab = "Densidad")

Se observa una distribución de rendimientos simétrica, en donde la mayoría de rendimientos se acumulan en el centro (cerca al cero) en el intervalo -0.01 a 0.01 aproximadamente.

2.3 Estadísticas Básicas de la TRM

Estadísticas de la TRM Valor
Mínimo 1652.41
Máximo 5061.21
Media 2660.9662788
Desviación estándar 762.4160933
Sesgo 0.8964715
Curtosis 3.0402949
print("Percentiles de la TRM")
[1] "Percentiles de la TRM"
round(quantile(Datos_TRM[, "TRM"], c(0.01, 0.05, 0.1, 0.5, 0.75, 0.9, 0.95, 0.99)),
    4)
      1%       5%      10%      50%      75%      90%      95%      99% 
1762.380 1791.626 1838.278 2389.750 3054.380 3857.076 4093.152 4802.480 
  • Se observa que la tasa TRM oscila entre $1652 y $5061 aproximadamente, con un valor medio de $2661. La mediana es $2390, que es superior a la media, lo que es indicativo de asimetría.

  • El sesgo y la curtosis corresponden a una distribución con asimetría y presencia de cola derecha.

  • Para los percentiles, por ejemplo, el percentil 75 indica que el 75% de los precios de TRM más pequeños son inferiores o iguales a $3054, o bien, el 25% de los precios más altos de TRM son superiores a $3054.

2.4 Estadísticas Básicas de los Rendimientos

Estadísticas de los rendimientos Valor
Mínimo -0.0562194
Máximo 0.0593067
Media 8.3664705^{-5}
Desviación estándar 0.0059233
Sesgo 0.2697866
Curtosis 12.8127257
print("Percentiles de los rendimientos")
[1] "Percentiles de los rendimientos"
round(quantile(Rtos_TRM, c(0.01, 0.05, 0.1, 0.5, 0.75, 0.9, 0.95, 0.99)), 4)
     1%      5%     10%     50%     75%     90%     95%     99% 
-0.0167 -0.0090 -0.0057  0.0000  0.0013  0.0060  0.0096  0.0190 
  • Se observa que los rendimientos de la TRM oscilan entre -0.056 y 0.059 aproximadamente, con un valor medio de 0 aproximadamente y con mediana también 0, lo que es indicativo de simetría.

  • El sesgo corresponde a una distribución con simetría aproximada, y la curtosis a una distribución leptocúrtica, es decir, más alta en el centro que la distribución normal.

  • Para los percentiles, por ejemplo, el percentil 75 indica que el 75% de los rendimientos de TRM más pequeños son inferiores o iguales a 0.0013, o bien, el 25% de los rendimientos más altos de TRM son superiores a 0.0013.

2.5 Aplicaciones de asignación de probabilidad basada en frecuencia

2.5.1 Estimación de un intervalo de predicción del 90% para los rendimientos de la TRM

round(quantile(Rtos_TRM, c(0.05, 0.95)), 5)
      5%      95% 
-0.00898  0.00956 

2.5.2 ¿Qué probabilidad hay de tener una pérdida mayor al 1% en un día?

breaks <- c(min(Rtos_TRM) - 1e-07, -0.01)
corte <- cut(Rtos_TRM, breaks)
tabla <- table(corte)
print(tabla)
corte
(-0.0562,-0.01] 
            359 
probabilidad <- tabla/length(Rtos_TRM)
print(probabilidad)
corte
(-0.0562,-0.01] 
     0.04072142 

Se observa que en 359 días hubo una pérdida mayor al 1%, lo que corresponde a una probabilidad de 0.04%.

2.6 Supuesto de normalidad

¿Qué tipo de distribución teórica siguen los rendimientos diarios de la TRM? ¿Es válido el supuesto de normalidad para los rendimientos diarios de la TRM?

En este caso, para la estimación de los parámetros de la distribución normal se utiliza el promedio aritmético de los rendimientos de la TRM como estimador del valor esperado y la desviación estándar histórica de los rendimientos como estimador de la desviación.

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")

En el histograma anterior se ve que la distribución de rendimientos se comporta aproximadamente normal.

2.6.1 Comparación de cuantiles

qqnorm(Rtos_TRM)
qqline(Rtos_TRM)

El gráfico QQ-plot muestra que en la zona central los rendimientos se superponen con la línea de igualdad de cuantiles, lo que es indicativo de normalidad. (Nótese que en las esquinas se presenta desviación de la normalidad, pero estas zonas no son tan determinantes).

2.6.2 Comparación de percentiles empíricos con los normales teóricos

cuantiles <- c(0.01, 0.025, 0.05, 0.1, 0.25, 0.4, 0.45, 0.5, 0.75, 0.9, 0.95, 0.975,
    0.99)
empiricos <- qnorm(cuantiles, mean = mean(Rtos_TRM), sd = sd(Rtos_TRM))
teoricos <- quantile(Rtos_TRM, cuantiles)

tabla_resultados <- data.frame(Percentiles_Empiricos = round(empiricos, 3), Percentiles_Teoricos = round(teoricos,
    3))

print(tabla_resultados)
      Percentiles_Empiricos Percentiles_Teoricos
1%                   -0.014               -0.017
2.5%                 -0.012               -0.013
5%                   -0.010               -0.009
10%                  -0.008               -0.006
25%                  -0.004               -0.001
40%                  -0.001                0.000
45%                  -0.001                0.000
50%                   0.000                0.000
75%                   0.004                0.001
90%                   0.008                0.006
95%                   0.010                0.010
97.5%                 0.012                0.013
99%                   0.014                0.019

Se observa que los percentiles empíricos y teóricos son aproximadamente iguales, lo que es indicativo de normalidad.

2.7 Aplicaciones de asignación de probabilidad bajo el supuesto de que los rendimientos de la TRM siguen una distribución normal

2.7.1 Estimación de un intervalo de predicción del 90% para los rendimientos de la TRM

round(qnorm(c(0.05, 0.95), mean = mean(Rtos_TRM), sd = sd(Rtos_TRM)), 5)
[1] -0.00966  0.00983

2.7.2 ¿que probabilidad hay de tener una perdida mayor al 1% en un día?

round(pnorm(-0.01, mean = mean(Rtos_TRM), sd = sd(Rtos_TRM)), 5)
[1] 0.04434

Hay una probabilidad del 4.4% de tener una perdida mayor al 1% en un día.

2.8 Simulación de montecarlo

Supongamos que los rendimientos diarios de la TRM siguen una distribución normal y que la media es estimada como el promedio de los rendimientos diarios observados de la TRM y que la desviación estandar es estimada como la volatilidad histórica de los rendimientos diarios.

2.8.1 Realice una simulación con 10.0000 iteraciones para el valor de la TRM para el martes 24 de febrero de 2024 (dos días adelante de la ultima fecha de la muestra)

Numero_iteraciones = 10000
TRM_SIMULADA = matrix(, 3, Numero_iteraciones)
TRM_Inicial = Datos_TRM[length(Datos_TRM[, "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 (10000 iteraciones montecarlo)",
    ylab = "TRM simulada")

hist(TRM_SIMULADA[2, ], 15, main = "HISTOGRAMA SIMULACION TRM 24 DE FEBRERO DE 2024",
    col = "gray")

3. Preguntas

3.1 Sabiendo que el valor del activo es al día de hoy, estime un intervalo de confianza del 95% para el valor en pesos de una importación de 500.000 USD. ¿Cuál es la probabilidad de obtener una perdida de hasta un 3% en un día? y la probabilidad de ganar hasta un 5% en un día?

qnorm(c(0.05, 0.95), mean = mean(Rtos_TRM), sd = sd(Rtos_TRM))
[1] -0.009659348  0.009826677

Probabilidad de obtener una perdida de hasta un 3% en un día.

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

Probabilidad de ganar hasta un 5% en un día.

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

3.2 ¿Si usted invierte 10.000.000 COP cual es la probabilidad de obtener perdidas entre -500.000 Y 500.000 COP en un día?

inversion = 1e+07
perdida = -5e+05
ganancia = 5e+05
# Suponiendo una distribución 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 cálculos, la probabilidad es de 1.

3.3 Simulación de Montecarlo

Usted toma una posición corta en 10 contratos de futuros de la TRM y que tienen un precio actual de 3918 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 simulación de Montecarlo con 10.000 iteraciones bajo el supuesto de que los rendimientos continuos mensuales del futuro, siguen una distribución normal con media de 1% y desviación estándar del 3%, para determinar:

# Parámetros de la simulación
Numero_iteraciones <- 10000
TRM_SIMULADA <- matrix(, 3, Numero_iteraciones)
TRM_Inicial <- Datos_TRM[nrow(Datos_TRM), "TRM"]
n_contratos <- 10
precio_contrato <- 50000
precio_actual <- 3918
monto_margen <- 1.5e+08
mean_retorno <- 0.01
std_retorno <- 0.03
margin_call <- 1.3e+08

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_retorno, sd = std_retorno))
    }
}

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

# View(TRM_SIMULADA)
base = t(TRM_SIMULADA)

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

# Largo
posicion_largo = sum(posicion > 0)
cat("posición largo", posicion_largo, "\n")
posición largo 6359 
# Corto
posicion_corto = sum(posicion < 0)
cat("posición corto", posicion_corto, "\n")
posición corto 3641 
# Probabilidad de las posiciones
prob_largo = posicion_largo/(posicion_largo + posicion_corto)
cat("probabilidad largo", prob_largo, "\n")
probabilidad largo 0.6359 
prob_corto = posicion_corto/(posicion_largo + posicion_corto)
cat("probabilidad corto", prob_corto, "\n")
probabilidad corto 0.3641 
# Calculamos los promedios de los cortos y los largos
posicion_largo = posicion[posicion > 0]
prom_largo = mean(posicion_largo)
cat("promedio largo", prom_largo, "\n")
promedio largo 110.3009 
posicion_corto = posicion[posicion < 0]
prom_corto = abs(mean(posicion_corto))  #Valor absoluto
cat("promedio corto", prom_corto, "\n")
promedio corto 80.27697 
# Payoffs = Compensación
payoff_largo <- (prom_largo * 10000)
cat("payoff largo", payoff_largo, "\n")
payoff largo 1103009 
payoff_corto <- (prom_corto * 10000)
cat("payoff corto", payoff_corto, "\n")
payoff corto 802769.7 

Probalilidad de que los precios de la TRM_Simulada se mayor o menor al precio actual=3918

# probalilidad de que los precios de la TRM_Simulada se mayor o menor al precio
# actual=3918
frecuencia_acumulada_simulada <- cumsum(table(TRM_SIMULADA))

probabilidad_mayor <- 1 - frecuencia_acumulada_simulada[precio_actual]/length(TRM_SIMULADA)
cat("probabilidad mayor = ", probabilidad_mayor, "\n")
probabilidad mayor =  0.8694 
probabilidad_menor <- frecuencia_acumulada_simulada[precio_actual]/length(TRM_SIMULADA)
cat("probabilidad menor = ", probabilidad_menor, "\n")
probabilidad menor =  0.1306 

Probabilidades en corto y en largo

TRM_SIMULADA_T <- t(TRM_SIMULADA)
corto <- data.frame((TRM_SIMULADA_T[, 1] - TRM_SIMULADA_T[, 3]))
colnames(corto) <- c("Corto")

largo <- data.frame((TRM_SIMULADA_T[, 3] - TRM_SIMULADA_T[, 1]))
colnames(largo) <- c("Largo")

TRM_SIMULADA_T_Flujos <- cbind(TRM_SIMULADA_T, corto, largo)

# View(TRM_SIMULADA_T_Flujos)

# probabilidad de ir en corto o en largo
probabilidad_largo <- mean(largo > 0)
cat("probabilidad en largo = ", probabilidad_largo, "\n")
probabilidad en largo =  0.6359 
probabilidad_corto <- mean(corto > 0)
cat("probabilidad en corto =", probabilidad_corto, "\n")
probabilidad en corto = 0.3641 

3.3.1 Un intervalo de predicción del 90% del valor de la cuenta de margen para dentro de un mes

qnorm(c(0.05, 0.95), mean = mean(TRM_SIMULADA[3, ]), sd = sd(TRM_SIMULADA[3, ]))
[1] 3764.703 4152.800