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%