DESARROLLO

A continuación se mostrará el código de ejecución en R-Studio y el análisis correspondiente a cada cálculo.

library(quantmod)
library(zoo)
library(TTR)
library(xts)

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

library(knitr)

head(datos)
##        Fecha     TRM
## 1 21/02/2000 1947.41
## 2 22/02/2000 1943.83
## 3 23/02/2000 1941.54
## 4 24/02/2000 1944.18
## 5 25/02/2000 1947.72
## 6 26/02/2000 1947.28
class(datos[,"Fecha"])
## [1] "character"
#Se convierte a formato de fecha la columna "Fecha"
datos[,"Fecha"]<-as.Date(datos[,"Fecha"],format = "%d/%m/%Y")
class(datos[,"Fecha"])
## [1] "Date"

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

Calculamos los rendimientos diarios continuos:

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

Gráficos

Precio de la TRM

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

Rendimientos diarios de la TRM

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

Histograma de precios

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

Histograma de rendimientos

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

Histograma con la distribución normal

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

Aquí podemos ver como la distribución tiende a ser mesocúrtica con respecto a la normal.

Estadística básica

Sobre el precio

library(fBasics)
library(moments)

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

Sobre los rendimientos

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

Análisis técnico y estadístico

Los cálculos estadísticos que hemos realizado nos ofrecen un panorama más detallado sobre el comportamiento de la TRM a lo largo del período.

. El sesgo en los rendimientos fue de 0.2699 lo que nos indica que existe una leve asimetría dentro de la distribución normal.Indicando que la distribución tiene unas colas levemente más pesadas a la derecha. Dentro del supuesto de la normalidad.

· La curtosis es mayor es de 9.7943, es decir, es mayor a 3 y nos indica que hay un exceso de curtosis dentro de la distribución.Si una distribución tiene una curtosis positiva, significa que tiene un pico más pronunciado en comparación con la distribución normal. Esto nos indica que los valores de los datos están más concentrados alrededor de la media y hay menos valores atípicos.

· Aquí la distribución ya tiende a ser mesocúrtica.

Media y Desviación estándar

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

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

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

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

Periodo de estancamiento: También nos puede indicar una media cercana a cero y una baja desviación estándar podrían indicar periodos de estancamiento económico.

Comparación de cuantiles

qqnorm(Rtos_TRM)
qqline(Rtos_TRM)

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

Simulación MONTECARLO

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

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

TRM_SIMULADA[1,]=TRM_Inicial

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


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

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

base=t(TRM_SIMULADA)

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

#Largo
posicion_largo=sum(posicion>0)
posicion_largo
## [1] 5044
#Corto
posicion_corto=sum(posicion<0)
posicion_corto
## [1] 4956
#Probabilidad de las posiciones
prob_largo = posicion_largo/(posicion_largo+posicion_corto)
prob_largo
## [1] 0.5044
prob_corto = posicion_corto/(posicion_largo+posicion_corto)
prob_corto
## [1] 0.4956
#Calculamos los promedios de los cortos y los largos
posicion_largo= posicion[posicion > 0]

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

prom_corto= abs(mean(posicion_corto)) #Valor absoluto
prom_corto
## [1] 18.51428
#Payoffs = Compensación
payoff_corto<-(prom_corto*10000)
payoff_corto
## [1] 185142.8
payoff_largo<-(prom_largo*10000)
payoff_largo
## [1] 190243.8

SOLUCIÓN DE PREGUNTAS DEL EJERCICIO - PARTE 1

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

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

Descargamos los datos históricos de la TRM para el período de tiempo desde la página del Banco de la República.

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

Calculamos los parámetros de la distribución normal como la media y desviación estándar basados en los rendimientos.

Luego realiamos el análisis estádístico básico donde tenemos en cuenta la media, desvición, sesgo y curtosis principalmente para analizar si la distribución de los precios es mesocúrtica o leptocúrtica y si los valores están o no muy alejados de la media.

Luego hacemos un análisis gráfico donde hacemos histograma de frecuencias, gráfico de precios y rendimientos.

Podemos utilizar los parámetros anteriores para asignar probabilidades a pronósticos que queremos hacer.

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

R/: No es estrictamente necesario acortar la información cuando se analiza un período de 20 años de variación en la (TRM), especialmente si el objetivo es comprender la evolución a largo plazo de esta variable y su comportamiento estadístico a lo largo del tiempo. Sin embargo, la nececesidad de acortar la información puede depender de varios factores, incluyendo la volatilidad de la TRM y la relevancia de los datos para la toma de decisiones.

Por otro lado, si la TRM ha experimentado una alta volatilidad en los últimos 20 años, puede ser beneficioso acortar la información para centrarnos en períodos más recientes donde los datos son más relevantes y representativos de las condiciones actuales del mercado.

3.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.009679389  0.009838594

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.990732e-07

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

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

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

inversion=10000000
perdida=-500000
ganancia=500000
#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.

SIMULACIÓN DE MONTECARLO- EJERCICIO DE FUTUROS

Usted toma una posición corta en 10 contratos de futuros de la TRM (TRMH24F) y que tienen un precio actual de4198 COP por cada USD. Sabiendo que cada contrato es de 50.000 USD y que usted deposita 150.000.000 de COP en la cuenta de margen, realice una 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:

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

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

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

Calculamos los rendimientos diarios continuos, la media y desviación estándar.

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

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

Simulación del futuro TRMH24F

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

TRM_SIMULADA1[1,]=TRM_Inicial1

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

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

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

base1=t(TRM_SIMULADA1)

Posición en futuro TRMH24F

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

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

Probabilidades para cada posición

prob_largo1 = posicion_largo1/(posicion_largo1+posicion_corto1)
prob_largo1
## [1] 0.4719
prob_corto1 = posicion_corto1/(posicion_largo1+posicion_corto1)
prob_corto1
## [1] 0.5281

Calculamos los promedios de los cortos y los largos

posicion_largo1= posicion1[posicion1 > 0]

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

prom_corto1= abs(mean(posicion_corto1)) #Valor absoluto
prom_corto1
## [1] 43.75392
payoff_corto1<-(prom_corto1*50000)
payoff_corto1
## [1] 2187696
payoff_largo1<-(prom_largo1*50000)
payoff_largo1
## [1] 2052605

Cálculo margen y Liquidación del contrato

Numero_de_contratos = 10
Precio_inicial = 4198
Nominal_contrato = 50000    
Exposicion_Total = Numero_de_contratos*Nominal_contrato*Precio_inicial
Exposicion_Contrato = Exposicion_Total/Numero_de_contratos
Valor_garantía_minima = 130000000
Valor_cuenta_de_margen=150000000

Solución a las preguntas sobre futuros

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

media1=0.01
desvest=0.03

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

#Intervalo de predicción

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

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

prob_perdida <- 10000000/150000000

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

3.Si el margen mínimo es de 130.000.000 COP ¿Cuál es la probabilidad de ser llamado al margen?

prob_margen_call <- mean(cuenta_margen < Valor_garantía_minima)
prob_margen_call*100
## [1] 25.03

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