Datos_TRM = read.table("C:/Users/Felipe/OneDrive - INSTITUTO TECNOLOGICO METROPOLITANO - ITM/Derivados Financieros/TRM/basetrm.txt", header = TRUE)

# Guardar el archivo como un archivo HTML
library(knitr)
## Warning: package 'knitr' was built under R version 4.3.2
# Convertir la tabla a HTML
html_TRM <- kable(Datos_TRM, format = "html")

# Guardar el código HTML en un archivo
write(html_TRM, "tabla_trm.html")

head(Datos_TRM)
##       Fecha     TRM
## 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
# Transformacion al formato de fecha adecuado
Datos_TRM[,"Fecha"]<-as.Date(Datos_TRM[,"Fecha"],format = "%d/%m/%Y")
class(Datos_TRM[,"Fecha"])
## [1] "Date"

Graficacion de datos del precio de la TRM 2000-2024

plot(Datos_TRM[,"Fecha"],Datos_TRM[,"TRM"], type = "l", col="skyblue", main = "Serie Historica TRM 2000 - 2024")

Acorde al grafico, se puede inferir que la serie de tiempo analizada de los precios históricos de la TRM desde los 2000 a la fecha del año 2024, presentan un comportamiento de variación irregular, es decir, son cambios en la serie de corto plazo que por su aleatoriedad son difíciles modelarlos para proyecciones futuras. Esto por ejemplo se observa que entre los 10 primeros años la serie presentaba una tendencia con con precios aleatorios decrecientes, pero a partir del 2010 al 2024 los precios de la TRM presentan históricamente un tendencia irregular creciente.

plot(Datos_TRM[-1,"Fecha"], diff(log(Datos_TRM[,"TRM"])), type = "l", col="pink", 
     main = "Serie Historica Rendimientos diarios de la TRM")

Se puede observar del grafico anterior que en la mayor parte de este se mantiene una volatilidad constante desde aproximadamente el año 2000 al 2009 lo que se concluye que tuvo una estabilidad en el mercado, en los años siguientes se observa que tiene cambios positivos lo que nos puede indicar que la moneda se esta fortaleciendo y creciendo en su valor. Un caso de este es en el 2020 ya que se presento una pandemia lo que ocasiono que todo el mercado creciera y así incrementaran los valores de los productos.

Distribución de frecuencias

hist(Datos_TRM[,"TRM"], breaks = 30, col="yellow", main = "Histograma de los Precios de la TRM", freq = FALSE)

La grafica nos muestra unas fluctuaciones en sus precios entre los valores de 1500 y 5000, en este rango de precios se mantuvo la TRM en los periodos 2000-2024,se puede observar que ha tenido un crecimiento de precios constante debido a cambios en la política y un aumento en la tasa de inflación, se puede diferenciar que entre el rango de precios de 1500 y 3000 en estos periodos fue el mayor constacia

Rtos_TRM<-diff(log(Datos_TRM[, "TRM"]))
hist(Rtos_TRM, breaks = 50, col = "brown", main = "Histograma de Rendimientos TRM", 
     freq = FALSE, xlim = c(-0.02,0.02))

Con el grafico anterior se puede inferir que los rendimientos de la TRM estuvieron entre un aproximado de -0,02 y 0.02 teniendo mayor constancia en los rendimientos cercanos a 0, evidenciando un alza en un rendimiento cercano a cero pero en una tendencia negativa esto en consecuencia a las volatilidades que presento la TRM en los diferentes años

Datos estadísticos de la TRM entre el periodo 2000 - 2024

max(Datos_TRM[,"TRM"])
## [1] 5061.21
min(Datos_TRM[,"TRM"])
## [1] 1652.41
print("Media de la TRM entre 2000 - 2024")
## [1] "Media de la TRM entre 2000 - 2024"
mean((Datos_TRM[,"TRM"]))
## [1] 2660.824
print("Desviacion Estandar de la TRM")
## [1] "Desviacion Estandar de la TRM"
sd((Datos_TRM[,"TRM"]))
## [1] 762.3418

En términos estadísticos se evidencia que el máximo valor alcanzado de este periodo de la TRM es de 5061,21 y por su parte el menor valor alcanzada es de 1652,41, evidenciando las volatilidades que se tuvieron. Por otra parte, el valor mas constante en estos periodos de la TRM fue de 2660,824 y una dispersión de los precios de la TRM de 762,34

# Es necesario el paquete de "moments" para identificar el sesgo y la curtosis
library(moments)
print("Sesgo")
## [1] "Sesgo"
skewness(Datos_TRM[,"TRM"])
## [1] 0.896888
print("Curtosis")
## [1] "Curtosis"
kurtosis(Datos_TRM[,"TRM"])
## [1] 3.041658

Dado el valor del sesgo con su cercanía a uno se puede inferir que es un sistema de datos sesgado es decir que implica una desviación sistemática de la objetividad o imparcialidad. Adicionalmente, su valor de curtosis al ser un valor positivo de 3,041658 se infiere que tiene una concentración mayor alrededor de la media recalcando sus valores atípicos.

# Percentiles de los valores de la TRM (2000-2024)
quantile(Datos_TRM[,"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.380 1791.625 1838.275 2389.750 3054.020 3856.000 4093.180 4802.480

Datos estadísticos de los rendimientos de la TRM

max(Rtos_TRM)
## [1] 0.05930667
min(Rtos_TRM)
## [1] -0.05621935
print("Media Rendimientos de la TRM")
## [1] "Media Rendimientos de la TRM"
mean(Rtos_TRM)
## [1] 8.36742e-05
print("Desviacion estandar de los Rendimientos de la TRM")
## [1] "Desviacion estandar de los Rendimientos de la TRM"
sd(Rtos_TRM)
## [1] 0.005923667
skewness(Rtos_TRM)
## [1] 0.2697665
print("Curtosis")
## [1] "Curtosis"
kurtosis(Rtos_TRM)
## [1] 12.81127
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.016723469 -0.008985171 -0.005719345  0.000000000  0.001295553  0.005983632 
##          95%          99% 
##  0.009561866  0.019031630
# Estimación de un intervalo de predicción del 90% para los rendimientos de la TRM
quantile(Rtos_TRM, c(0.05,0.95))
##           5%          95% 
## -0.008985171  0.009561866
# ¿Qué probabilidad hay de tener una perdida mayor al 1% en un día?

breaks<-c(min(Rtos_TRM)-0.0000001,-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.04072604

Supuesto de normalidad

# En este caso, se utilizara el promedio aritmetico de los rendimientos de la TRM
hist(Rtos_TRM, breaks = 50, col = "cornsilk", main = "Histograma
     de los rendiemientos", 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="cadetblue")

En la siguiente grafica podemos observar como los rendimientos han variado a lo largo del tiempo, tienen tendencia creciente debido a que estos han sido la mayoría positivos debido a cambios estacionales o situaciones sociales.

# Comparacion de cuantiles
qqnorm((Rtos_TRM),col="aquamarine")
qqline(Rtos_TRM)

# Comparación de percentiles empiricos con los normales teoricos
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.0136968356 -0.0115264995 -0.0096598907 -0.0075078103 -0.0039117784
##  [6] -0.0014170696 -0.0006607018  0.0000836742  0.0040791268  0.0076751587
## [11]  0.0098272391  0.0116938478  0.0138641839
quantile(Rtos_TRM, cuantiles)
##           1%         2.5%           5%          10%          25%          40% 
## -0.016723469 -0.012630315 -0.008985171 -0.005719345 -0.001425601  0.000000000 
##          45%          50%          75%          90%          95%        97.5% 
##  0.000000000  0.000000000  0.001295553  0.005983632  0.009561866  0.013183574 
##          99% 
##  0.019031630

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

# Estimación de un intervalo de predicción del 90% para los rendimientos de la TRM
qnorm(c(0.05,0.95),mean = mean(Rtos_TRM),sd=sd(Rtos_TRM))
## [1] -0.009659891  0.009827239
# ¿Qué probabilidad hay de tener una perdida mayor al 1% en un dia?
pnorm(-0.01,mean =mean(Rtos_TRM),sd=sd(Rtos_TRM))
## [1] 0.04435248

Simulación de montecarlo

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 = "lightpink", main="TRM Simulada")

hist(TRM_SIMULADA[3,],15, main = "Histograma Simulacion TRM 21 de Febrero de 2024", col="aquamarine")

Transfromacion de datos para reconocer la tendencia de posiciones del mercado

TRM_SimuTrp<- t(TRM_SIMULADA)
St<-subset(TRM_SimuTrp, select = 3)
k<-subset(TRM_SimuTrp, select = 1)
largo<- ifelse(St > k, St-k,0)
corto<- ifelse(St < k, k-St,0)
largo_cant<-sum(largo != 0)
corto_cant<-sum(corto != 0)

Posiciones porcentuales en compra de la TRM

Porcentaje_largo<-(largo_cant/10000)*100
print(Porcentaje_largo)
## [1] 50.34

Posiciones procentuales en venta de la TRM

Porcentaje_corto<-(corto_cant/10000)*100
print(Porcentaje_corto)
## [1] 49.66

Representación grafica

Comparacion <- data.frame(Posiciones = c("Posicion en largo/Compra","Posicion en corto/Venta" ),
                          Resultado = c(Porcentaje_largo,Porcentaje_corto))
total<-rep(100, nrow(Comparacion))
barplot(t(as.matrix(Comparacion[,-1])),col = c("gold","cadetblue"),legend.text = TRUE,args.legend = list(x="topright"),
        names.arg = Comparacion$Posiciones,main = "Comparacion entre las Posiciones del Mercado de la TRM",
        xlab = "Posiciones",ylab = "Porcentaje",ylim = c(0,50),beside = TRUE,width = 0.5)
abline(h=50, col="black", lty=2)
legend("topright", legend = c(Porcentaje_largo,Porcentaje_corto),col = c("gold","cadetblue"),lty = 1)

Tiempo = 1:10000
plot(Tiempo, largo,type = "l",col="blue", xlab = "Simulaciones", ylab = "Posiciones", main = "Largo vs Corto")
lines(Tiempo, corto, col="aquamarine")
legend("topright", legend = c("Largo", "Corto"),col = c("blue","aquamarine"),lty = 1)

¿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.

Teniendo en cuenta que la TRM presento altas volatilidades en este tiempo consideramos no necesario acortar la información de datos, ya que en estos veinticuatro años transcurridos evidenciamos la tendencia que presento la TRM presentando una secuencia en los últimos años positiva en ganancia, es decir, con la información dada las posiciones de compra/larga fue la mas conveniente para la inversión ante la TRM.

Condiciones a evaluar

¿Cual es la probabilidad de obtener una perdida de hasta un 3% en un dia?

Probabilidad_perdida<-pnorm(-0.03,mean =mean(Rtos_TRM),sd=sd(Rtos_TRM))
print(Probabilidad_perdida)
## [1] 1.901571e-07

¿Cual es la probabilidad de ganar hasta un 5% en un dia?

Probabilidad_ganacia<- 1 - pnorm(0.05,mean =mean(Rtos_TRM),sd=sd(Rtos_TRM))
print(Probabilidad_ganacia)
## [1] 0

La probabilidad de perder en un dia hasta el 3% es muy baja y por otro lado, la probabilidad de ganar en un dia hasta el 5% es nula, la TRM debido a sus volatilidades no indica rendimientos en un porcentaje tan elevado en un dia.

¿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?

#Probabilidad:
Inversion = 10000000
Ganancia = 500000
Perdida = -500000

Proporcion_ganancia = Ganancia/Inversion
print(Proporcion_ganancia)
## [1] 0.05

La probabilidad dado los datos indicados de obtener perdidas es del 50%

Simulación Montecarlo del derivado de la TRM entre 5/9/2023 - 23/2/2024

Datos estadisticos del derivado de la TRM

# Derivado de la TRM entre 5/9/2023 - 23/2/2024
TRM_futuros = read.table("C:/Users/Felipe/OneDrive - INSTITUTO TECNOLOGICO METROPOLITANO - ITM/Derivados Financieros/TRM/furutostrm.txt", header = TRUE)

# Guardar el archivo como un archivo HTML
library(knitr)

# Convertir la tabla a HTML
html_TRM_futuros <- kable(TRM_futuros, format = "html")

# Guardar el código HTML en un archivo
write(html_TRM_futuros, "tabla_trm.html")

head(TRM_futuros)
##       Fecha Pcierre
## 1  5/9/2023 4269.00
## 2  6/9/2023 4269.95
## 3  7/9/2023 4228.60
## 4  8/9/2023 4205.56
## 5 11/9/2023 4170.10
## 6 12/9/2023 4156.60
# Rendimientos del derivado
Rtos_futurosTRM<-diff(log(TRM_futuros[,"Pcierre"]))
# Valor promedio de los rendimientos
Media_futuro<- mean(Rtos_futurosTRM)
Media_futuro
## [1] -0.0007339315
# Desviacion de los rendimientos
desvi_futuro<- sd(Rtos_futurosTRM)
desvi_futuro
## [1] 0.01170066
Numero_iteraciones=10000
TRM_futuros_Simu=matrix(,90,Numero_iteraciones)
TRM_futuros_Inicial=TRM_futuros[length(TRM_futuros[,"Pcierre"]), "Pcierre"]
TRM_futuros_Simu[1,]=TRM_futuros_Inicial

for(j in 1:Numero_iteraciones){
  for(i in 2:90){
    TRM_futuros_Simu[i,j]=TRM_futuros_Inicial*exp(rnorm(1,mean = Media_futuro,sd=desvi_futuro)) 
  }
}

FuturoTRM_SIMULADA_TRANS<-t(TRM_futuros_Simu)

matplot(TRM_futuros_Simu,type = "l", col = "aquamarine", main="Futuros TRM  SIMULADA")

Variables

Numero_contratos = 10
Nominal_contrato = 50000    
Precio_inicial = 4198
Exposicion_Total = Numero_contratos*Nominal_contrato*Precio_inicial
Exposicion_Contrato = Exposicion_Total/Numero_contratos
Garantia_Inicial = 0.35
Valor_garantia_inicial = Exposicion_Total*Garantia_Inicial  
Valor_garantia_minima   = Valor_garantia_inicial*0.18

Liquidación del derivado (Futuros de la TRM)

Liq_futuros<-TRM_futuros
Diferencia<-diff((TRM_futuros[,"Pcierre"]))
Diferencia <- append(0, Diferencia)
Liq_futuros<-cbind(Liq_futuros,(Diferencia*Numero_contratos*Nominal_contrato))
colnames(Liq_futuros)<-c("Fecha","Pcierre","Liq_Diaria")

margen<-matrix()
ColumnaA<-matrix()
length(ColumnaA)
## [1] 1
Llamado_margen<-matrix()

for (i in 1:(nrow(Liq_futuros))) {
  ColumnaA[1]=Valor_garantia_inicial
  ColumnaA[i+1] <- ColumnaA[i] + Liq_futuros$Liq_Diaria[i+1]
  Llamado_margen[i] <- if(ColumnaA[i]<Valor_garantia_minima){Valor_garantia_inicial-ColumnaA[i]}
  else{0}
  margen[i]<-ColumnaA[i]+Llamado_margen[i]
}
ColumnaA
##  [1] 734650000 735125000 714450000 702930000 685200000 678450000 663025000
##  [8] 649800000 629650000 638150000 635350000 655950000 654325000 711150000
## [15] 707250000 737900000 724650000 714100000 757850000 789150000 816950000
## [22] 894150000 806750000 777830000 806375000 808500000 797150000 781600000
## [29] 774950000 789525000 745900000 707850000 719200000 684150000 642650000
## [36] 662150000 692650000 670650000 666650000 637450000 631450000 696400000
## [43] 700650000 663700000 687150000 699355000 669650000 621100000 633850000
## [50] 663950000 619300000 646325000 655050000 632025000 634900000 640300000
## [57] 611450000 600100000 590650000 605550000 592225000 555650000 563650000
## [64] 548000000 582000000 584600000 577950000 590950000 601550000 583550000
## [71] 569590000 581550000 588050000 606950000 580100000 565450000 586250000
## [78] 578375000 571000000 579235000 579650000 558550000 583150000 597650000
## [85] 587550000 595055000 590250000 571700000 569900000 572650000 568725000
## [92] 564150000 564600000 566680000 570825000 571650000 578650000 587975000
## [99]        NA
Llamado_margen
##  [1] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
## [39] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
## [77] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
margen<-na.omit(margen)


Liq_futuros<-cbind(Liq_futuros,margen,Llamado_margen,Diferencia)

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

#Base un mes (30 dias)
head(Liq_futuros$margen,30)
##  [1] 734650000 735125000 714450000 702930000 685200000 678450000 663025000
##  [8] 649800000 629650000 638150000 635350000 655950000 654325000 711150000
## [15] 707250000 737900000 724650000 714100000 757850000 789150000 816950000
## [22] 894150000 806750000 777830000 806375000 808500000 797150000 781600000
## [29] 774950000 789525000
#Se calcula la probabilidad con un intervalo de prediccion del 90%
qnorm(c(0.10,0.90),mean = mean(head(Liq_futuros$margen,30)),sd=sd(head(Liq_futuros$margen,30)))
## [1] 647285028 817573972

La probabilidad de perder mas de 10.000.000 COP en un mes

Probabilidad_perder_porce <- 10000000/150000000

pnorm(-Probabilidad_perder_porce,mean =mean(Rtos_futurosTRM),sd=sd(Rtos_futurosTRM))
## [1] 8.75492e-09

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

El margen minimo es de $130.000.000 la probabilidad de ser llamado al margen es de 0% debido a que el valor minimo del margen es de $647.285.028, si queremos ser llamados al margen la garantía minima debe ser menor a este.